딥러닝 코드를 처음 열어보면 numpy.dot() 또는 torch.matmul() 같은 함수가 곳곳에 등장한다. 이 함수들이 무슨 일을 하는지 모른 채 넘어가면 모델이 왜 그런 형태인지 감이 잡히지 않는다. 이 글은 행렬 곱셈이 신경망 내부에서 어떤 역할을 맡는지, 그 메커니즘을 정확히 짚어준다. 수식을 두려워할 필요 없다. 도구의 작동 원리를 이해하면, 딥러닝 학습이 훨씬 빠르게 자리를 잡는다.
가중치 행렬과 입력 벡터의 선형 변환 메커니즘
신경망의 각 층(layer)에서 일어나는 일을 한 문장으로 정리하면 이렇다. 입력 벡터에 가중치 행렬을 곱해 새로운 벡터를 만든다. 이것이 선형 변환(linear transformation)이다.
구체적으로 살펴보자. 이미지 픽셀 784개를 나열한 열벡터 x (크기 784×1)가 있다고 하자. 첫 번째 은닉층의 가중치 행렬 W는 크기 128×784다. 행렬 곱 Wx를 계산하면 결과는 128×1 벡터, 즉 128개의 새로운 숫자가 된다. 각 숫자는 784개 입력값의 가중합(weighted sum)이다.
왜 이 구조를 쓰는가? 행렬 곱은 모든 입력 특성(feature)이 모든 출력 뉴런에 동시에 영향을 줄 수 있는 가장 효율적인 방법이다. 각 뉴런에 대해 루프를 돌리는 대신, 행렬 하나로 전체 연산을 한 번에 처리한다. 실제 GPU 가속의 핵심도 여기에 있다. 병렬 처리에 최적화된 행렬 연산 덕분에 수백만 파라미터를 동시에 계산할 수 있다.
편향(bias) 항까지 더하면 전체 변환은 Wx + b 형태가 된다. 행렬 곱이 선형 변환을 담당하고, 벡터 b가 평행 이동을 담당한다. 그 뒤에 ReLU나 시그모이드 같은 활성화 함수(activation function)가 비선형성을 추가해야 층을 여러 개 쌓는 것이 의미를 갖는다. 선형 변환만 여러 번 연속으로 적용하면 수학적으로 하나의 선형 변환과 동일하기 때문이다.
선형 변환을 벡터 공간 관점에서 이해하는 방법은?
기하학적으로 보면 행렬 곱은 공간을 늘리고, 회전하고, 압축하는 작업이다. 784차원 공간에 흩어진 점들(이미지 데이터)을 128차원 공간으로 옮기는 일이 첫 번째 층에서 벌어진다.
이때 핵심 개념 두 가지가 등장한다.
- 행렬의 열공간(column space): 변환 후 데이터가 실제로 존재할 수 있는 공간의 범위. 784차원 입력이 128차원으로 줄어드는 과정에서 일부 정보는 필연적으로 사라진다.
- 행렬의 영공간(null space): 변환했을 때 영벡터(0, 0, …)가 되는 입력들의 집합. 이 방향의 정보는 학습 과정에서 "버려진다."
신경망이 학습을 거치면서 가중치 행렬 W의 값이 조정된다는 뜻은, 공간 자체의 기하학적 성질이 바뀐다는 뜻이다. 고양이 사진과 강아지 사진이 변환 후 128차원 공간에서 서로 멀리 떨어지도록 공간을 "비틀어가는" 것이 학습의 실체다.
특이값 분해(SVD, Singular Value Decomposition)는 이 관점을 수치적으로 분석하는 도구다. 행렬을 세 개의 단순한 변환(회전, 축 방향 늘이기, 다시 회전)으로 분해한다. 딥러닝을 깊이 공부할수록 SVD가 계속 등장하는데, 가중치 행렬이 공간을 어떻게 변형하는지 파악하는 언어가 바로 SVD이기 때문이다.
신경망 층 구조와 행렬 연산 방식 비교
층이 깊어질수록 행렬 크기와 역할이 어떻게 달라지는지 정리하면 다음과 같다.
| 층 위치 | 입력 크기 | 가중치 행렬 크기 | 출력 크기 | 주요 역할 |
|---|---|---|---|---|
| 입력층 → 은닉층 1 | 784×1 | 128×784 | 128×1 | 특성 추출 시작, 고차원 압축 |
| 은닉층 1 → 은닉층 2 | 128×1 | 64×128 | 64×1 | 패턴 조합, 추상화 증가 |
| 은닉층 2 → 출력층 | 64×1 | 10×64 | 10×1 | 클래스 분류 점수 계산 |
각 층을 거칠 때마다 행렬 곱이 한 번씩 실행된다. 세 층짜리 네트워크라도 순전파(forward pass) 한 번에 행렬 곱이 세 번 연속으로 일어난다는 뜻이다. 역전파(backpropagation)에서는 기울기(gradient)를 계산하기 위해 전치 행렬(Wᵀ)을 사용한다. 선형대수가 단순히 "입력을 처리하는 곳"에만 쓰이는 게 아니라, 학습 자체가 행렬 연산 위에서 돌아가는 구조다.
배치 학습에서 행렬 연산이 작동하는 방식은?
실제 학습에서는 데이터를 하나씩 넣지 않는다. 32개, 64개, 128개씩 묶어서 한꺼번에 처리하는 미니배치(mini-batch) 방식을 쓴다. 이때 입력이 열벡터 x (784×1)가 아니라 행렬 X (784×32)가 된다. 가중치 행렬은 변하지 않는다. WX를 계산하면 출력은 128×32 행렬, 즉 32개 데이터의 결과가 동시에 나온다.
이 구조가 학습 속도를 결정한다. 데이터 32개를 루프로 하나씩 처리하면 행렬 곱이 32번 일어나지만, 배치 행렬 연산으로는 한 번에 끝난다. GPU는 이 "큰 행렬 곱 하나"에 매우 최적화되어 있다. 배치 크기를 조정하는 이유도, 모델 학습이 느린 이유도 결국 이 행렬 연산의 효율성 문제로 귀결된다.
초심자가 여기서 자주 막히는 부분이 있다. 행렬 곱의 차원 규칙이다. A(m×k) × B(k×n) = C(m×n). 앞 행렬의 열 수와 뒤 행렬의 행 수가 같아야 한다. 이 규칙을 머릿속에 새겨두면 "shape mismatch" 오류가 왜 나는지 바로 파악할 수 있다.
기하학적으로 해석하는 신경망의 고차원 선형 사상
고차원에서 선형 사상(linear map)이 어떤 역할을 하는지는 2차원이나 3차원 예시로 감을 잡고, 거기서 차원만 확장하는 방식으로 접근하는 것이 현실적이다.
2×2 행렬을 평면 위의 화살표(벡터)에 곱하면 그 화살표가 늘어나거나, 방향이 바뀌거나, 뒤집힌다. 이때 크기만 바뀌고 방향이 보존되는 특별한 벡터를 고유벡터(eigenvector)라 하고, 그 변화 비율을 고유값(eigenvalue)이라 부른다. 784차원 가중치 행렬에도 같은 원리가 적용된다. 주의할 점은, 고차원에서는 이 기하학적 직관이 시각적으로 보이지 않는다는 것이다. 수치 계산이 직관을 대신한다.
딥러닝 학습에서 고유값과 관련된 실용적인 개념 하나를 짚어두면 좋다. 헤시안 행렬(Hessian matrix)의 고유값은 손실 함수(loss function)의 곡률을 나타낸다. 고유값이 크면 그 방향으로 경사가 급하고, 작으면 완만하다. 경사 하강법(gradient descent)이 수렴하기 어려운 이유 중 하나가 이 고유값 분포의 불균형이다. 선형대수를 "계산 도구"로만 보지 않고 기하학적으로 해석하면, 왜 학습률(learning rate) 조정이 중요한지까지 연결된다.
모두의AI 인터랙티브 연습문제로 익히는 선형대수 기초
개념을 읽는 것과 직접 계산해보는 것 사이의 거리가 생각보다 크다. 행렬 곱의 차원 규칙을 알아도, 실제로 3×3 행렬과 3×2 행렬을 손으로 곱해보기 전까지는 잘 굳지 않는다. 틀렸을 때 즉각적인 피드백이 없으면 오개념이 그대로 쌓인다.
모두의AI의 선형대수 인터랙티브 연습문제는 이 간극을 메우기 위해 설계되었다. 개념 설명 직후 손으로 풀어볼 문제가 이어지고, 답을 입력하면 바로 피드백이 돌아온다. 특히 "행렬 곱의 가능 여부 판단 → 직접 계산 → 딥러닝 맥락 적용"의 세 단계로 연결되어, 추상적인 선형대수가 실제 신경망 코드에 어떻게 닿는지 감각적으로 익힐 수 있다.
수학이 어렵게 느껴지는 이유 중 하나는 "계산 맞혔는지 모르고 넘어가는" 경험이 반복되기 때문이다. 피드백 없는 독학은 자신감이 쌓이지 않는다. 개념 정립 후 즉각 피드백으로 이어지는 구조가 학습 속도를 실질적으로 바꾼다.
자주 묻는 질문
선형대수를 모르면 딥러닝 코드를 실행할 수 없나요?
코드 실행 자체는 가능하다. 하지만 모델 구조를 설계하거나, 오류를 디버깅하거나, 결과를 해석할 때 벽에 부딪힌다. "shape mismatch" 오류 하나를 고치는 데 걸리는 시간이 확연히 달라진다. 도구를 쓰려면 도구의 작동 원리를 알아야 한다.
행렬 곱과 원소별 곱셈(element-wise multiplication)은 어떻게 다른가요?
행렬 곱은 행과 열 간의 내적(dot product)을 계산해 구조를 완전히 바꾼다. 원소별 곱셈은 같은 위치의 숫자끼리만 곱하므로 행렬 크기가 그대로 유지된다. 신경망에서 두 방식 모두 등장하지만 역할이 전혀 다르다. 가중치 계산에는 행렬 곱, 어텐션 마스킹 같은 연산에는 원소별 곱셈이 쓰인다.
벡터와 행렬의 차이를 모르는 수준에서 시작해도 괜찮나요?
충분히 괜찮다. 벡터는 숫자를 일렬로 나열한 것, 행렬은 그 벡터들을 행이나 열로 쌓아 놓은 것이라고 이해하면 출발점으로 충분하다. 이 글에서 다룬 내용은 그 위에서 한 걸음씩 쌓이는 구조다.
전치 행렬(transpose)이 역전파에서 왜 필요한가요?
역전파에서는 출력 쪽의 기울기를 입력 쪽으로 "거꾸로" 전달해야 한다. 순전파 때 W (m×n)를 곱했다면, 역방향에서는 Wᵀ (n×m)를 곱해야 차원이 맞는다. 전치 행렬은 선형 변환의 "역방향 통로"를 여는 수학적 장치다.
고유값 분해와 SVD 중 먼저 공부해야 하는 것은?
고유값 분해를 먼저 익히는 것이 순서상 자연스럽다. 정방 행렬에서 방향과 크기를 분리하는 개념을 잡은 뒤, 직사각형 행렬로 확장한 것이 SVD다. 딥러닝의 가중치 행렬은 대부분 직사각형이므로 실용적으로는 SVD가 더 자주 쓰이지만, 고유값 분해의 직관 없이 SVD를 배우면 공식만 외우게 된다.
행렬 곱은 딥러닝의 연산 기반이다. 입력을 새로운 공간으로 옮기고, 패턴을 추출하고, 기울기를 역방향으로 전달하는 모든 과정이 가중치 행렬과의 곱셈으로 이루어진다. 이 메커니즘을 손으로 한 번 계산해본 사람과 그렇지 않은 사람은 모델 구조를 읽는 방식이 다르다. 모두의AI의 연습문제는 그 "한 번"을 피드백과 함께 경험할 수 있도록 만들어졌다. 개념을 읽었다면, 이제 계산해볼 차례다.
더 보기: mdooai.com
Top comments (0)