Chapter 02

행렬 곱셈

두 행렬의 곱은 앞 행렬의 행과 뒤 행렬의 열을 내적한 값으로 채워진 새 행렬이다.

챕터별 딥러닝 도식화

챕터를 하나씩 진행할 때마다 아래 도식이 조금씩 채워져요. 지금까지의 구조예요.

X1X2X3Y1Y2Y3가중치A·B행렬곱 결과

왼쪽은 행렬 A의 한 행, 오른쪽 Y1~Y3는 행렬 B의 열과 내적한 결과예요. 이게 모여 A·B 행렬곱 결과가 됩니다.

딥러닝에서 보는 행렬 곱

행렬 곱(Matrix Multiplication)은 두 개의 숫자 표(행렬)를 합쳐서 새로운 표를 만드는 계산이에요. 앞 표의 가로 한 줄(행)과 뒤 표의 세로 한 줄(열)내적(같은 자리 곱해서 더하기)하면, 결과 표의 한 칸이 채워져요.

이걸 모든 행·열 조합에 대해 반복하면 결과 행렬이 완성돼요. 예를 들어 앞 표가 2행 3열, 뒤 표가 3행 2열이면, 결과는 2행 2열짜리 표가 돼요.

행렬 곱이 가능하려면 앞 행렬의 열 개수뒤 행렬의 행 개수가 반드시 같아야 해요. 이 규칙만 기억하면 어떤 크기의 행렬이든 곱할 수 있는지 바로 알 수 있어요.

왜 행렬로 묶나요? 한 번에 하나씩 계산하는 대신, 여러 입력을 표로 묶어서 한 번에 곱하면 컴퓨터(GPU)가 동시에 처리할 수 있어요. 그래서 이미지 한 장, 문장 한 줄이 아니라 수십 장, 수십 문장을 한꺼번에 처리할 수 있어요.

딥러닝에서 선형 층(Linear Layer)은 입력에 가중치 행렬을 곱하는 것이 핵심인데, 이 곱이 바로 행렬 곱이에요. 뉴런이 10개면 내적을 10번 해야 하는데, 행렬 곱 한 번이면 10개 뉴런의 출력을 동시에 구할 수 있어요.

GPU는 이 행렬 곱을 수천~수만 개 동시에 병렬 처리하도록 만들어져 있어요. 그래서 번역기·음성 인식(말을 글자로)·이미지 인식(사진에서 물체 찾기)이 실시간에 가깝게 돌아갈 수 있어요. 휴대폰에 올리는 작은 모델도 행렬 곱을 줄이거나 압축해서 돌려요.

딥러닝의 거의 모든 연산이 행렬 곱으로 귀결돼요. 번역에서 ‘어느 단어에 집중할지’ 계산, 이미지에서 ‘선·모서리·물체’를 뽑는 합성곱, 이미지 생성 모델까지 내부를 보면 결국 행렬 곱이에요. 행렬 곱을 이해하면 딥러닝 전체의 뼈대를 이해한 거예요.

이미지 생성: 노이즈(잡음)를 단계적으로 줄여가며 그림을 만드는 모델은, 각 단계마다 행렬 곱을 반복해요. ‘지금 이 픽셀을 얼마나 바꿀지’를 행렬 곱으로 계산해요.

번역·챗봇: 문장을 숫자 행렬로 바꾼 뒤, 가중치 행렬과 곱하는 과정을 여러 번 반복해요. 이 곱하기 과정이 전체 연산의 대부분을 차지해요.

이미지 인식: 사진을 행렬로 넣고, 여러 층의 행렬 곱을 거쳐 ‘선·모서리’ → ‘눈·코’ → ‘강아지·고양이’ 같은 특징을 단계적으로 뽑아요. 휴대폰에서 돌리는 작은 모델도 같은 원리예요.

추천: 여러 사용자와 여러 상품을 숫자로 바꾼 뒤 한꺼번에 행렬 곱으로 곱해서, ‘누구에게 무엇을 추천할지’ 점수를 한 번에 구해요.

한 칸 구하기: 결과 표의 (i, j) 칸 = A의 i번째 행(가로줄)B의 j번째 열(세로줄)을 내적한 값이에요. 같은 자리끼리 곱해서 전부 더하면 돼요.

빈 칸 전략: 빈 칸이 결과 행렬에 있으면, 해당 행과 열을 찾아서 내적만 하면 돼요. 빈 칸이 A나 B에 있으면, 결과 값과 나머지 곱들을 이용해 역으로 계산할 수 있어요.

크기 확인: 곱하기 전에 반드시 앞 행렬의 열 수와 뒤 행렬의 행 수가 같은지 확인하세요. 결과 행렬의 크기는 (앞 행렬의 행 수) × (뒤 행렬의 열 수)가 돼요.

검산: 한 칸이라도 잘못 계산하면 전체가 틀어질 수 있어요. 한 행 또는 한 열만 먼저 다 구한 뒤, 그걸 기준으로 나머지를 맞춰 보면 실수를 찾기 쉬워요.

A의 한 행 × B의 한 열 (내적) → 결과 행렬의 한 칸

A
1
2
3
4
×
B
5
6
7
8
=
ABA \cdot B
19
22
43
50

해당 칸A의 2행 · B의 2열 (내적 한 번)

A의 2행[3, 4], B의 2열[6, 8]
3×6 = 18
4×8 = 32
ABA \cdot B [1,1] = 18 + 32 = 50
ABA \cdot B [0,0]191×5 + 2×7 = 19
ABA \cdot B [0,1]221×6 + 2×8 = 22
ABA \cdot B [1,0]433×5 + 4×7 = 43
ABA \cdot B [1,1]503×6 + 4×8 = 50

문제

아래 행렬곱 ABA \cdot B 에서 빈 칸(?)에 들어갈 값을 구하세요.

A
0
2
-2
1
×
B
-2
-3
2
-1
=
ABA \cdot B
4
-2
5
1 / 20