지금까지 다룬 수 하나짜리 대상 대신 수를 직사각형으로 늘어놓은 것을 세웁니다. 크기 m×n과 첨자 aᵢⱼ, 덧셈과 스칼라배, Ax와 AB의 정의, 크기가 맞아야 곱해진다는 규칙, 단위행렬 I와 전치 Aᵀ, 그리고 (AB)ᵀ=BᵀAᵀ까지 손으로 계산합니다.
PALDYN Team//35 MIN READ
42MATH
초급
행렬 · 선형대수
지금까지 다룬 대상은 대체로 수 하나였습니다. 방정식의 미지수 x, 함수의 입력과 출력, 확률의 값 하나. 이번 글부터는 수를 여러 개 묶은 새 대상 하나를 세웁니다. 왜 그것이 필요한지부터 봅니다.
행렬의 쓰임
수를 가로세로로 늘어놓은 것을 행렬이라고 합니다. 정의는 이 한 줄이 전부입니다. 그래서 정의보다 먼저 볼 것은 무엇을 이렇게 적게 되는가 입니다. 세 가지를 봅니다.
성적표
이미 우리는 수를 가로세로로 늘어놓고 삽니다. 표가 그것입니다. 세 사람의 세 과목 점수를 적은 표를 봅니다.
국어
영어
수학
지수
90
75
88
민호
70
92
64
서연
85
80
95
이름과 과목 이름을 떼어 내고 수만 남기면 3×3 짜리 수의 직사각형이 됩니다.
S=907085759280886495
이름을 뗐다고 뜻이 사라진 것은 아닙니다. 첫 행이 지수, 둘째 열이 영어라는 약속만 밖에 적어 두면 됩니다. 표에서 "민호의 수학 점수"를 찾던 일이 여기서는 "둘째 행 셋째 열의 수를 읽는 일"이 됩니다. 이름을 자리로 바꾼 것이 행렬 표기의 첫째 이득입니다.
행과 열이 서로 다른 물음에 답한다는 것도 그대로 남습니다. 한 행을 가로로 훑어 평균을 내면 그 사람의 평균 점수이고, 한 열을 세로로 훑어 평균을 내면 그 과목의 평균 점수입니다. 같은 수 아홉 개를 어느 방향으로 읽느냐가 물음을 가릅니다.
흑백 이미지
화면의 그림도 수를 가로세로로 늘어놓은 것입니다. 흑백 이미지는 점 하나마다 밝기를 0(검정)부터 255(흰색)까지의 수로 갖습니다. 가로 8칸 세로 8칸짜리 작은 그림이라면 수가 64개 있는 8×8 행렬입니다.
06425512820002553090
3×3 짜리로 줄여 적으면 이렇습니다. 첫 행의 세 수는 맨 윗줄 세 점의 밝기이고, 첫 열의 세 수는 맨 왼쪽 줄 세 점의 밝기입니다. 행과 열이 곧 그림의 가로줄과 세로줄 입니다.
그림을 통째로 밝게 하는 일은 모든 수에 같은 값을 더하는 일이 되고, 좌우를 뒤집는 일은 각 행의 순서를 뒤집는 일이 됩니다. 눈으로 하던 조작이 수에 대한 조작으로 옮겨집니다. 색이 있는 그림이라면 빨강·초록·파랑의 밝기를 따로 적어 같은 크기의 행렬 세 장을 겹쳐 둡니다.
방정식의 계수
셋째 예가 이 글이 계속 따라갈 예입니다. 방정식 셋을 이렇게 적었다고 합시다.
⎩⎨⎧2x+y+3z=134y+5z=23x+z=4
이 세 줄에서 실제로 계산에 쓰는 것은 계수와 우변의 수뿐입니다. x·y·z 는 자리를 지키는 이름표고, 부호나 순서만 지키면 굳이 매번 적을 필요가 없습니다. 그래서 수들만 자리에 맞게 늘어놓으면 표기가 간결해집니다. 지난 글까지 다룬 수 하나짜리 대상 대신 수의 직사각형을 다루는 새 언어를 이번 글에서 세웁니다.
셋의 공통점은 하나입니다. 자리 자체가 뜻을 갖는다는 것 입니다. 그래서 다음 절에서 자리를 부르는 법부터 정합니다.
크기와 성분 연산
가로 방향의 줄이 행이고 세로 방향의 줄이 열입니다. 행이 m 개, 열이 n 개면 이 행렬의 크기가 m×n 이라 하고 "m 바이 n"이라 읽습니다.
첨자의 순서
행렬의 각 자리에 있는 수를 성분이라 하고 aij 로 적습니다. 첫 첨자 i 는 행, 둘째 첨자 j 는 열입니다. 순서를 뒤집으면 다른 자리를 가리키게 되므로, "행 먼저, 열 나중"은 반드시 기억해야 하는 약속입니다.
크기를 적을 때도 같은 순서입니다. 3×4 는 행이 셋이고 열이 넷이라는 뜻이지 그 반대가 아닙니다. 크기와 첨자가 같은 순서를 쓰는 덕에 헷갈릴 자리가 하나로 줄어듭니다.
행과 열의 개수가 같은 행렬은 정사각 행렬 이라고 따로 부릅니다. 뒤에 나오는 단위행렬·대각행렬·대각합처럼 대각선을 쓰는 이름은 전부 정사각 행렬에만 붙습니다 — 대각선이 한쪽 끝에서 반대쪽 끝까지 닿으려면 가로와 세로가 같아야 하기 때문입니다.
앞의 방정식 셋의 계수는 이렇게 정리됩니다.
A=201140351,b=13234
A 는 3×3, b 는 3×1 입니다. 둘째 방정식에 x 가 없다는 사실이 A 의 둘째 행 첫 자리에 놓인 0으로 적혀 있습니다. 빠진 항을 0으로 적어 두는 것이 자리를 지키는 방법입니다.
열과 행
b 처럼 열이 한 줄뿐인 행렬을 열이라 하고, 그 안의 수들을 세로로 적어 둔 것입니다. 24번 글 · 좌표평면과 직선에서 다룬 순서쌍 (x,y) 를 세로로 세워 적은 것도 이 열이고, 평면 위의 점 하나를 이렇게 세로 두 성분으로 적을 수 있다는 관점을 이 글에서는 그것까지만 씁니다. "벡터"라는 수학 대상 자체 — 덧셈과 스칼라배에 닫힌 것, 선형결합, 화살표 관점 — 는 중급 4번의 것이고, 여기서는 표기 규약만 빌려 씁니다.
행이 한 줄뿐인 1×n 행렬도 있고 행이라 부릅니다. 이 글에서는 열만 쓰지만, 뒤에서 곱을 정의할 때 "A 의 한 행"을 떼어 보는 일이 계속 나옵니다.
행렬의 덧셈
같은 크기의 행렬끼리는 자리를 맞춰 더합니다. 성분마다 따로 더하는 것이 전부입니다.
(1324)+(5768)=(610812)
크기가 다르면 더할 수 없습니다.2×2 와 2×3 은 짝지을 자리가 모자라 정의 자체가 없습니다. 뺄셈도 같은 방식이라 성분끼리 뺍니다.
스칼라배
행렬이 아닌 수 하나를 스칼라라고 부릅니다. 행렬과 구별하려고 붙인 이름입니다. 스칼라로 곱하는 것도 성분마다 합니다.
3⋅(1324)=(39612)
앞의 흑백 이미지로 말하면, 덧셈은 두 장을 겹쳐 밝기를 더하는 일이고 스칼라배는 한 장 전체의 밝기를 몇 배로 올리는 일입니다.
뺄셈은 따로 정의할 것이 없습니다.−1 을 곱한 것을 더하면 됩니다.
A−B=A+(−1)B
수를 다룰 때 뺄셈을 "음수를 더하는 것"으로 읽었던 것이 그대로 옵니다. 괄호를 푸는 규칙도 같습니다. 성분마다 따로 하는 계산이라 수의 분배법칙이 자리마다 한 번씩 적용되는 셈이기 때문입니다.
k(A+B)=kA+kB,(k+l)A=kA+lA
덧셈과 스칼라배까지는 새로 익힐 것이 없다는 뜻입니다. 수에서 하던 대로 하면 맞습니다.
이 두 연산은 크기만 맞으면 다 됩니다. 문제는 곱이 다른 규칙을 따른다는 것입니다.
행렬과 열의 곱
Ax의 정의
방정식 2x+y+3z=13 을 다시 봅니다. 왼쪽은 계수 (2,1,3) 과 미지수 (x,y,z) 를 성분끼리 곱해 더한 것입니다. 이것이 행렬과 열의 곱의 뼈대입니다.
행렬 A 와 열 x 의 곱 Ax 는 "A 의 각 행과 x 를 성분끼리 곱해 더한 값을 그 행의 자리에 놓은 것" 입니다.
A=(201435),x=123
Ax=(2⋅1+1⋅2+3⋅30⋅1+4⋅2+5⋅3)=(1323)
행 하나가 결과의 한 자리를 만듭니다. 그래서 결과의 행 개수는 A 의 행 개수와 같습니다.
크기 조건
크기가 맞아야 곱해집니다.A 가 m×n 이고 x 가 n×1 일 때에만 Ax 가 정의되고, 결과는 m×1 입니다. A 의 열 개수와 x 의 행 개수가 같아야 한다는 것이 핵심입니다. 위 예에서는 (2×3)×(3×1)=(2×1) 이었습니다.
이 조건은 억지로 붙인 것이 아닙니다. A 의 한 행에 든 수가 셋인데 x 에 든 수가 넷이면 짝지어 곱할 상대가 없는 수가 남습니다. 성분끼리 곱해 더하는 계산이 아예 끝나지 않는 것입니다.
Ax = b
이 표기를 알면 앞의 방정식 셋을 한 줄로 적을 수 있습니다.
Ax=b즉201140351xyz=13234
A 를 계수행렬이라고 부릅니다. 세 방정식이 한 줄이 되었습니다.
줄어든 것은 글자 수만이 아닙니다. 모양이 ax=b 와 같아졌습니다. 수 하나짜리 방정식이라면 양변을 a 로 나눠 x=b/a 로 끝내는데, 행렬에서 그 "나누기"에 해당하는 것이 무엇인지가 곧바로 다음 물음이 됩니다. 그 물음은 44번 · 행렬식과 역행렬이 받습니다.
행렬끼리의 곱
AB의 정의
행렬끼리의 곱은 방금 본 규칙을 그대로 확장합니다. AB 의 (i,j) 성분은 A 의 i 행과 B 의 j 열을 성분끼리 곱해 더한 것입니다.
(1324)(5768)
의 (1,1) 성분은 왼쪽의 첫 행 (1,2) 와 오른쪽의 첫 열 (5,7) 을 곱해 더한 것입니다.
AB 와 BA 가 다릅니다. 그것도 크게 다릅니다. 그러니 행렬 곱을 다룰 때는 순서를 함부로 바꾸면 안 됩니다.
AB=BA
앞 소절의 관점으로 보면 놀랄 일이 아닙니다. 옷을 입고 나서 코트를 걸치는 것과 코트를 걸치고 옷을 입는 것이 다른 것과 같습니다 — 이어서 하는 두 걸음은 순서가 뜻의 일부입니다.
크기 조건 때문에 아예 한 쪽만 정의되기도 합니다. A 가 2×3 이고 B 가 3×4 라면 AB 는 2×4 로 만들어지지만, BA 는 가운데 수가 4 와 2 로 안 맞아 정의되지 않습니다.
단위행렬과 전치
영행렬과 대각행렬
이름부터 셋 붙여 둡니다. 모든 성분이 0인 행렬을 영행렬이라 하고 O 로 적습니다. 크기가 맞으면 A+O=A 이고 AO=O 입니다. 수 계산의 0이 하던 일을 그대로 합니다.
대각선 자리 바깥이 전부 0인 정사각 행렬을 대각행렬이라고 합니다.
D=(3005)
대각행렬을 곱하면 각 자리를 그 대각 성분만큼 배로 늘리는 일이 됩니다. D(12)=(310) 처럼 첫 성분은 3배, 둘째 성분은 5배가 됩니다. 여기서는 이름만 붙여 두고 지나갑니다.
단위행렬
대각선에 1이 놓이고 나머지는 0인 정사각 행렬을 단위행렬이라 하고 I 로 적습니다. 대각 성분이 전부 1인 대각행렬이라고 해도 같은 말입니다.
I2=(1001),I3=100010001
I 는 곱에서 아무 일도 안 하는 자리를 맡습니다. 크기가 맞으면 AI=A 이고 IA=A 입니다. 수 계산의 1과 같은 역할입니다. 순서를 바꿔도 되는 드문 짝이기도 합니다.
전치
행과 열을 바꾼 것을 전치라 하고 AT 로 적습니다.m×n 행렬을 전치하면 n×m 이 되고, 성분은 (AT)ij=aji 입니다. 대각선에 대해 뒤집었다고 생각하면 됩니다.
첨자가 ij 에서 ji 로 뒤집힌 것이 정의의 전부입니다. 그래서 두 번 전치하면 제자리로 돌아옵니다.
(AT)T=A
곱과 전치를 함께 쓰면 순서가 뒤집힙니다.
(AB)T=BTAT
순서가 뒤집히는 것이 이상해 보이면 크기부터 세어 봅니다.A 가 m×n, B 가 n×p 였으면 AB 는 m×p 이고 (AB)T 는 p×m 입니다. 오른쪽 BTAT 도 (p×n)(n×m)=(p×m) 으로 같은 크기가 나옵니다. 순서를 그대로 두고 ATBT 라 적으면 (n×m)(p×n) 이라 가운데가 안 맞아 곱해지지도 않습니다. 성분끼리도 실제로 같은 값이 나오는 것은 아래 연습에서 확인합니다.
대각합
대각선 성분을 더한 값을 대각합이라 하고 trA 로 적습니다. 정사각 행렬에만 정의됩니다.
tr(1324)=1+4=5
전치해도 대각선 자리는 그대로이므로 trAT=trA 입니다. 정사각이 아닌 행렬에는 대각합이 아예 없으므로, 아래 연습처럼 AAT 를 만들어 정사각으로 바꿔 놓고 재는 일이 잦습니다. 이 이름은 여기서 붙여만 두고 지나갑니다 — 나머지 성질은 이 트랙의 뒤쪽 글이나 중급의 몫입니다.
연습 문제
연습 1 — Ax 계산
A=(1324),x=(56) 일 때 Ax 를 구하세요.
첫 행과 x: 1⋅5+2⋅6=17. 둘째 행과 x: 3⋅5+4⋅6=39. 그러므로 Ax=(1739) 입니다.
A=(2103−14),x=121 일 때 Ax 와 그 크기를 구하세요.
(2×3)×(3×1)=(2×1). 첫 성분 2⋅1+0⋅2+(−1)⋅1=1, 둘째 성분 1⋅1+3⋅2+4⋅1=11. 답은 (111) 입니다.
A=120−113,x=(4−2) 일 때 Ax 를 구하세요.
(3×2)×(2×1)=(3×1). 세 성분은 각각 1⋅4+(−1)⋅(−2)=6, 2⋅4+1⋅(−2)=6, 0⋅4+3⋅(−2)=−6. 답은 66−6 입니다.
A=1200−13,B=(21140−2) 에 대해 (AB)T 와 BTAT 가 같음을 정사각이 아닌 크기에서 확인하세요.
AB=2331−21202−6 이므로 (AB)T=2103−22312−6 입니다. 한편 BT 는 3×2, AT 는 2×3 이라 곱이 3×3 이고, 계산하면 2103−22312−6 로 같습니다. ATBT 는 (2×3)(3×2) 라 크기는 맞지만 2×2 가 나와 애초에 다른 것입니다.
A=(203−114) 의 전치를 적고 대각합 tr(AAT) 를 구하세요.
AT=2310−14 이고 크기는 3×2 입니다. AAT=(22+32+120⋅2+(−1)⋅3+4⋅12⋅0+3⋅(−1)+1⋅402+(−1)2+42)=(141117) 이므로 tr(AAT)=14+17=31 입니다.
정리
행렬은 수를 가로세로로 늘어놓은 것입니다. 표, 흑백 이미지, 방정식의 계수처럼 자리 자체가 뜻을 갖는 것을 이렇게 적습니다.
크기는 m×n (행 × 열), 성분은 aij (행 먼저, 열 나중)로 씁니다. 빠진 항은 0으로 적어 자리를 지킵니다.
덧셈과 스칼라배는 성분끼리 하는 것이라 크기만 맞으면 그대로입니다.
Ax 는 A 의 각 행과 x 를 성분끼리 곱해 더한 것입니다. A 의 열 수와 x 의 행 수가 같아야 곱해집니다. 방정식 여럿을 Ax=b 한 줄로 적을 수 있고, A 를 계수행렬이라 부릅니다.
AB 는 같은 규칙의 확장이라 (i,j) 성분이 A 의 i 행과 B 의 j 열의 곱의 합입니다. 크기 규칙은 (m×n)(n×p)=(m×p) 이고, 안쪽 두 수를 가리면 남는 바깥 두 수가 결과의 크기입니다.
곱이 이 모양인 것은 두 걸음을 한 걸음으로 적으려는 것이기 때문입니다 — A(Bx)=(AB)x.
AB=BA — 이어서 하는 두 걸음은 순서가 뜻의 일부이고, 아예 한 쪽만 정의되기도 합니다.
영행렬 O 는 덧셈의 0, 단위행렬 I 는 곱의 1입니다. 대각선 밖이 0인 정사각 행렬을 대각행렬이라 부릅니다.
전치 AT 는 행과 열을 바꿉니다. 두 번 하면 제자리이고, (AB)T=BTAT 로 순서가 뒤집힙니다 — 크기를 세어 보면 그래야만 곱이 만들어집니다.
대각선 성분의 합을 대각합 trA 라 부르고, 전치해도 값이 같습니다.
다음 글은 이 표기로 미지수 셋 이상짜리 연립방정식을 요령이 아니라 절차로 푸는 법을 세웁니다.
실수를 2^b개 격자에 사상할 때 오차의 분산이 왜 Δ²/12인지 유도하고, 그것이 비트당 6.02dB라는 SNR로 번역되는 과정을 실측과 대조했습니다. 이상치 하나가 나머지 값의 유효 비트를 어떻게 먹는지, 그리고 int4에서 성능이 무너지는 지점을 오차 예산으로 미리 계산하는 법까지.
최댓값 빼기, 로그 공간, log1p·expm1, 분산의 두 공식, 정규화의 ε, fp32 누산, 역행렬 대신 solve — 프레임워크가 몰래 해 주는 일곱 가지를 하나씩 꺼내 각각 어떤 고장을 막는지 직접 재 봤습니다. 수식을 그대로 옮긴 코드가 왜 라이브러리보다 나쁜지에 대한 목록입니다.
0.1 + 0.2가 0.3이 아닌 이유부터 시작해 머신 엡실론을 유도하고, 같은 16비트인데 fp16과 bf16이 서로 다른 지점에서 터지는 이유, 비슷한 수를 뺄 때 유효자리가 사라지는 파괴적 상쇄, 그리고 1,000만 개를 순서만 바꿔 더했을 때 오차가 백만 배 갈리는 실험까지 직접 재 봤습니다.