콘텐츠로 이동

P2-3.3 행렬 곱(matrix multiplication)은 무엇을 재사용하는가

Section ID: P2-3.3 Version: v2026.09.08

행렬 곱은 처음 보면 단순한 곱셈처럼 보이지만, 실제로는 “같은 방식의 가중합(weighted sum)을 여러 번 재사용하는 계산”에 가깝습니다.

  1. 벡터의 값들을 가중치와 함께 묶어 더합니다.
  2. 하나의 새 값을 만듭니다.
  3. 같은 계산을 여러 출력에 반복합니다.
  4. 여러 입력에도 한꺼번에 적용합니다.

가중합과 차원 조건

기준 왜 중요한가
행렬 곱은 가중합을 재사용한다 출력 하나가 아니라 여러 출력을 한 번에 만들 수 있는 기본 계산이기 때문입니다.
shape가 계산 가능 여부를 정한다 안쪽 차원이 맞지 않으면 어떤 값과 어떤 가중치를 대응시킬지 정할 수 없기 때문입니다.
선형 변환은 표현을 바꾼다 신경망 층과 분류기 설명이 모두 입력을 새 표현으로 바꾸는 계산으로 이어지기 때문입니다.

위치별 곱과 행렬 곱

P2-3.1에서는 같은 모양(shape)의 벡터나 행렬을 위치별로 더할 수 있다고 했습니다. 곱셈도 위치별 곱(element-wise multiplication)으로 쓰면 다음과 같습니다.

\[ [1,\ 2,\ 3] \odot [4,\ 5,\ 6] = [4,\ 10,\ 18] \]

여기서 \(\odot\)는 같은 위치의 값끼리 곱한다는 표시입니다. 이 계산은 각 위치를 따로 처리합니다.

행렬 곱(matrix multiplication)은 다릅니다. 행렬 곱은 같은 위치끼리만 곱하는 계산이 아니라, 한쪽의 행(row)과 다른 쪽의 열(column)을 조합해 새 값을 만듭니다.

  1. 위치별 곱은 같은 위치끼리 곱합니다.
  2. 행렬 곱은 행과 열을 맞춰 곱하고 더합니다.

이 차이를 먼저 구분해야 합니다. 행렬 곱을 위치별 곱으로 오해하면 shape 오류와 계산 의미를 모두 잘못 읽게 됩니다.

가중합과 출력 하나

먼저 벡터 하나와 가중치(weight) 하나를 생각합니다.

\[ \mathbf{x} = [2,\ 3] \]
\[ \mathbf{w} = [4,\ 5] \]

두 벡터를 같은 위치끼리 곱한 뒤 더하면 하나의 숫자가 나옵니다.

\[ 2 \times 4 + 3 \times 5 = 8 + 15 = 23 \]

이 계산은 다음처럼 읽을 수 있습니다.

  1. 첫 번째 입력값에 첫 번째 가중치를 곱합니다.
  2. 두 번째 입력값에 두 번째 가중치를 곱합니다.
  3. 그 결과를 더합니다.
  4. 하나의 출력값을 만듭니다.

이것이 가중합(weighted sum)의 기본 모양입니다.

\[ y = x_1w_1 + x_2w_2 \]

AI 모델에서 입력값은 모두 같은 중요도를 갖지 않을 수 있습니다. 어떤 값은 크게 반영하고, 어떤 값은 작게 반영하고, 어떤 값은 음의 방향으로 반영할 수도 있습니다. 가중치(weight)는 이런 반영 정도를 숫자로 표현합니다.

여러 출력의 가중합

출력값 하나를 만들 때는 가중치 벡터 하나가 필요했습니다. 출력값을 두 개 만들고 싶다면 가중치 벡터도 두 개 필요합니다.

\[ \mathbf{x} = [2,\ 3] \]
\[ W = \begin{bmatrix} 4 & 1 \\ 5 & 2 \end{bmatrix} \]

여기서 \(W\)는 가중치 행렬(weight matrix)입니다. 첫 번째 열(column)은 첫 번째 출력값을 만들기 위한 가중치이고, 두 번째 열은 두 번째 출력값을 만들기 위한 가중치로 볼 수 있습니다.

\[ \mathbf{y} = \mathbf{x}W \]

계산하면 다음과 같습니다.

\[ \mathbf{y} = [2,\ 3] \begin{bmatrix} 4 & 1 \\ 5 & 2 \end{bmatrix} \]
\[ = [2 \times 4 + 3 \times 5,\ 2 \times 1 + 3 \times 2] \]
\[ = [23,\ 8] \]

이 계산은 가중합을 두 번 재사용한 것입니다.

첫 번째 출력: 2 x 4 + 3 x 5 = 23
두 번째 출력: 2 x 1 + 3 x 2 = 8

행렬 곱은 “곱하고 더한다”는 작은 계산을 여러 출력에 반복 적용합니다. 그래서 행렬 곱은 하나의 입력 벡터를 다른 모양의 출력 벡터로 바꾸는 도구가 됩니다. 이 예에서 입력 벡터의 길이는 2이고, 가중치 행렬의 shape은 (2, 2)이며, 출력 벡터의 길이도 2입니다.

입력 길이와 행렬의 행 수

행렬 곱에서는 shape이 매우 중요합니다. 입력 벡터의 값 개수와 가중치 행렬의 행(row) 수가 맞아야 합니다.

\[ [2,\ 3] \begin{bmatrix} 4 & 1 \\ 5 & 2 \end{bmatrix} \]

위 계산에서는 입력 벡터의 길이가 2이고, 행렬의 행도 2개입니다. 그래서 각 입력값이 각 행의 가중치와 대응될 수 있습니다.

반대로 다음 계산은 바로 맞지 않습니다.

\[ [2,\ 3,\ 4] \begin{bmatrix} 4 & 1 \\ 5 & 2 \end{bmatrix} \]

입력값은 3개인데, 가중치 행렬은 2개의 입력만 받을 수 있는 모양입니다.

  1. 입력 길이와 가중치 행렬의 입력 방향 크기가 맞아야 합니다.
  2. 맞지 않으면 어떤 값과 어떤 가중치를 곱할지 정할 수 없습니다.

이것이 AI 코드에서 shape 오류가 자주 발생하는 이유입니다. 행렬 곱은 수학적으로도, 코드적으로도 “모양이 맞아야 실행되는 계산”입니다.

여러 입력의 일괄 계산

행렬 곱의 힘은 입력 하나만 처리하는 데 있지 않습니다. 여러 입력을 행렬로 모아 한꺼번에 계산할 수 있습니다.

예를 들어 입력 벡터 두 개가 있다고 해 봅니다.

\[ X = \begin{bmatrix} 2 & 3 \\ 1 & 4 \end{bmatrix} \]

각 행(row)은 하나의 입력 샘플(sample)입니다.

첫 번째 샘플: [2, 3]
두 번째 샘플: [1, 4]

같은 가중치 행렬 \(W\)를 곱합니다.

\[ W = \begin{bmatrix} 4 & 1 \\ 5 & 2 \end{bmatrix} \]
\[ Y = XW \]

계산 결과는 다음과 같습니다.

\[ Y = \begin{bmatrix} 23 & 8 \\ 24 & 9 \end{bmatrix} \]

첫 번째 행은 첫 번째 샘플의 출력이고, 두 번째 행은 두 번째 샘플의 출력입니다.

  1. 여러 입력 샘플을 행렬로 묶습니다.
  2. 같은 가중치 행렬을 곱합니다.
  3. 여러 출력 샘플을 한꺼번에 얻습니다.

이것은 배치(batch) 계산의 기본 직관과 연결됩니다. 모델은 입력 하나씩만 처리할 수도 있지만, 여러 입력을 묶어 한 번에 계산하면 같은 계산 구조를 반복해서 재사용할 수 있습니다.

선형 변환과 출력 차원

선형 변환(linear transformation)은 벡터에 행렬을 곱해 다른 벡터로 바꾸는 계산으로 먼저 이해할 수 있습니다.

  1. 입력 벡터를 준비합니다.
  2. 가중치 행렬을 적용합니다.
  3. 출력 벡터를 얻습니다.

예를 들어 입력이 2개 값이고 출력이 3개 값이라면, 가중치 행렬은 입력 2개를 받아 출력 3개를 만들 수 있는 모양이어야 합니다.

\[ \mathbf{x} \in \mathbb{R}^{2} \]
\[ W \in \mathbb{R}^{2 \times 3} \]
\[ \mathbf{y} = \mathbf{x}W,\quad \mathbf{y} \in \mathbb{R}^{3} \]

이 식은 다음처럼 읽을 수 있습니다.

  1. 2개의 값으로 표현된 입력을 받습니다.
  2. 3개의 값으로 표현된 출력으로 바꿉니다.

2차원에서는 이 변화를 그림으로 볼 수 있습니다. 다음 예시는 입력 벡터 \(\mathbf{x} = [2,\ 3]\)에 단순한 행렬 \(W\)를 곱해 \(\mathbf{y} = [2,\ 4]\)로 옮기는 모습을 보여 줍니다.

행렬 곱이 벡터 위치를 바꾸는 예시

그림의 변환은 첫 번째 좌표를 유지하고 두 번째 좌표를 3에서 4로 바꿉니다.

1
2
3
입력 위치: [2, 3]
행렬 W를 적용한다.
출력 위치: [2, 4]

실제 AI 모델에서는 이런 변환이 2차원 그림보다 훨씬 많은 차원에서 일어납니다. 그래서 사람이 직접 눈으로 그리기는 어렵지만, 기본 사고는 같습니다. 입력 표현은 가중치 행렬을 지나며 다른 표현으로 이동합니다.

이 관점이 AI에서 중요합니다. 모델은 입력 표현을 그대로 두지 않고, 여러 단계의 계산을 거치며 다른 표현으로 바꿉니다.

  1. 원래 입력 표현이 있습니다.
  2. 첫 번째 변환을 거칩니다.
  3. 중간 표현을 얻습니다.
  4. 다음 변환을 거칩니다.
  5. 출력에 가까운 표현으로 이동합니다.

신경망(neural network)의 층(layer)은 이런 변환을 여러 번 쌓는 구조로 볼 수 있습니다. 다만 실제 신경망은 선형 변환만으로 구성되지 않습니다. 활성화 함수(activation function), 정규화(normalization), attention 같은 다른 계산도 함께 등장합니다.

체크리스트

  • 행렬 곱(matrix multiplication)과 위치별 곱(element-wise multiplication)을 구분할 수 있다.
  • 가중합(weighted sum)이 입력값에 가중치를 곱해 더하는 계산임을 설명할 수 있다.
  • 행렬 곱을 여러 가중합을 한꺼번에 계산하는 방식으로 읽을 수 있다.
  • 입력 벡터의 길이와 가중치 행렬의 입력 방향 크기가 맞아야 함을 설명할 수 있다.
  • 여러 샘플을 행렬로 묶어 같은 가중치 행렬을 적용하는 배치(batch) 계산의 직관을 설명할 수 있다.
  • 선형 변환(linear transformation)을 입력 표현을 다른 출력 표현으로 바꾸는 계산으로 설명할 수 있다.
  • 행렬 곱이 신경망의 층(layer), 임베딩, 분류에서 다시 등장하는 이유를 말할 수 있다.
  • 행렬 곱을 입력 -> 가중치 행렬 -> 출력의 가중합 재사용 구조로 설명할 수 있다.
  • 입력 차원, 출력 차원, 가중치 행렬 shape를 함께 읽으며 위치별 곱과 구분할 수 있다.

출처와 참고 자료

  • Marc Peter Deisenroth, A. Aldo Faisal, Cheng Soon Ong, Mathematics for Machine Learning, Cambridge University Press, 2020, 확인 날짜: 2026-07-19.
  • Ian Goodfellow, Yoshua Bengio, Aaron Courville, Deep Learning, MIT Press, 2016, 확인 날짜: 2026-07-19.
  • Charles R. Harris et al., Array Programming with NumPy, Nature, 2020, 확인 날짜: 2026-07-19.
  • NumPy Developers, numpy.matmul, NumPy User Guide, 확인 날짜: 2026-07-19. 행렬 곱의 shape 조건과 @ 연산자 의미를 확인하는 공식 참고 자료입니다.
  • Google for Developers, Neural networks: Nodes and hidden layers, Machine Learning Crash Course, 확인 날짜: 2026-07-19. 신경망 노드가 입력과 가중치의 곱을 더해 계산된다는 설명을 확인하는 공식 교육 자료입니다.