행렬
한 줄 정의
숫자를 가로세로 표로 늘어놓은 것. 2차원
1. 비유로 이해하기
숫자를 담는 그릇을 아파트로 생각하면, 행렬은 한 동(棟)이다. 3층 건물에 각 층마다 방이 네 개 있는 식이다.
방을 찾아가려면 “몇 층, 몇 번째” 두 가지를 대야 한다. 필요한 정보가 둘이라서 2차원이다.
[[5, 3, 8, 1], ← 0행
[2, 7, 4, 9], ← 1행
[6, 1, 0, 3]] ← 2행
↑
0열
2. 왜 필요한가
벡터를 여러 개 쌓으면 행렬이다
벡터 하나로는 하나만 다룰 수 있다. 여러 개를 한꺼번에 다루려면 쌓아야 한다.
| 무엇 | 모양 |
|---|---|
| 흑백 사진 한 장 | 28×28 행렬. 각 칸이 픽셀의 밝기 |
| 토큰 여러 개의 임베딩 | (토큰 수 × 768) 행렬. 한 줄이 토큰 하나 |
| 엑셀 표 | (행 수 × 열 수). 가장 익숙한 행렬 |
문장 “안녕 세상”을 처리한다면 이렇게 된다.
토큰 2개 → 각 토큰마다 숫자 768개 → (2, 768) 행렬
딥러닝 계산의 거의 전부가 행렬 곱이다
모델 안에서 벌어지는 일을 아주 크게 줄이면 행렬을 곱하는 것의 반복이다. GPU가 AI 계산에 쓰이는 이유도 이것이다. GPU는 행렬 곱을 아주 많이, 동시에 하도록 만들어진 칩이다.
그래서 행렬의 모양(shape)이 계속 문제가 된다. 곱할 수 있는 모양과 없는 모양이 정해져 있기 때문인데, 이건 아래 5번에서 자세히 본다.
펴기(Flatten)
행렬을 벡터로 납작하게 펴는 일도 자주 한다. 손글씨 이미지를 다루는 코드에서 Flatten이 하는 일이 그것이다.
행렬 (28, 28) ──Flatten──▶ 벡터 (784,)
사진 한 장 숫자 784개 한 줄
층층이 쌓인 방들을 복도 하나에 쭉 늘어세우는 셈이다. 담긴 숫자는 그대로고 모양만 바뀐다.
3. 어디서 만났나
이 용어는 수업에서 정식으로 다루기 전에 따로 정리한 것이다.
다만 1회차에서 LLM이 무엇인지 배울 때, “대량의 텍스트를 학습해 패턴을 익힌다”는 그 학습과 계산이 전부 행렬 곱으로 이뤄진다. 겉으로 드러나지 않았을 뿐 바닥에 깔려 있던 개념이다.
4. 헷갈리는 개념
| 이 용어 | 비슷하지만 다른 것 | 차이 |
|---|---|---|
| 행렬 | 벡터 | 벡터는 한 줄, 행렬은 여러 줄을 쌓은 표 |
| 행렬 | 텐서 | 텐서는 차원 수에 제한이 없다. 행렬은 딱 2차원인 텐서다 |
| 행렬 | 엑셀 표 | 모양은 같지만 엑셀은 칸마다 글자도 날짜도 들어간다. 행렬은 숫자만 |
| 행 | 열 | 행(行)은 가로줄, 열(列)은 세로줄 |
5. 많이들 오해하는 지점
ㄱ. “행렬 곱은 같은 자리끼리 곱하는 것”
가장 비싼 오해다. 같은 자리끼리 곱하는 연산도 따로 있지만(요소별 곱), 행렬 곱은 그게 아니다.
행렬 곱은 왼쪽의 가로줄과 오른쪽의 세로줄을 짝지어, 하나씩 곱해서 전부 더한다.
왼쪽의 한 행 [1, 2, 3]
오른쪽의 한 열 4
5
6
→ 1×4 + 2×5 + 3×6 = 32
여기서 중요한 결론이 나온다. 왼쪽의 가로줄 길이와 오른쪽의 세로줄 길이가 같아야 짝이 지어진다. 즉 왼쪽의 열 개수 = 오른쪽의 행 개수여야 곱할 수 있다.
안 맞으면 바로 에러다. 딥러닝을 하면 지겹도록 보게 되는 메시지가 이것이다.
RuntimeError: mat1 and mat2 shapes cannot be multiplied (32x768 and 512x10)
└─ 768 ≠ 512
읽는 법은 간단하다. 앞 숫자쌍의 뒤 숫자와 뒤 숫자쌍의 앞 숫자가 같은지 보면 된다.
ㄴ. 행과 열을 반대로 읽는다
행(行)은 가로줄, 열(列)은 세로줄이다. shape (3, 4)는 3행 4열, 즉 가로줄이 3개이고 각 줄에 4칸이 있다.
한자로 기억하면 덜 헷갈린다. 열(列)은 줄지어 서 있는 모양이라 세로다. 사람이 줄 서 있는 걸 떠올리면 된다.
ㄷ. “행렬은 표니까 행과 열을 바꿔도 같은 것”
다르다. 행과 열을 바꾸는 것을 전치(transpose)라고 하는데, 모양 자체가 달라진다. (3, 4)를 전치하면 (4, 3)이다.
그리고 위에서 봤듯 곱할 수 있느냐가 모양으로 정해지므로, 전치는 계산 결과를 완전히 바꾼다. 실제로 딥러닝 코드에서 모양이 안 맞을 때 전치로 맞추는 일이 자주 있는데, 이건 “형식만 맞추는 것”이 아니라 무엇과 무엇을 짝지을지를 바꾸는 일이다.