이번 글에서 다룰 내용
이 글에서는 행렬곱(matrix multiplication)을 변환의 합성(composition)으로 설명합니다.
- 왜 행렬곱이 단순 숫자 규칙이 아닌지 정리합니다.
- 두 변환을 연속으로 적용하면 왜 행렬곱으로 표현되는지 설명합니다.
- 곱셈 순서가 결과를 바꾸는 이유를 그래픽스와 신경망 예시로 연결합니다.
- 이후
Ax=b와 선형시스템(linear system)으로 넘어가기 위한 감각을 잡습니다.
이번 글에서 새로 나오는 용어
- 행렬곱 (matrix multiplication): 두 행렬을 하나의 더 큰 변환으로 합치는 연산입니다.
- 행렬 (matrix): 여기서는 하나의 변환을 나타내는 대상으로 봅니다.
- 선형변환 (linear transformation): 행렬곱이 무엇을 합치는지 설명하는 핵심 개념입니다.
핵심 아이디어
일반 숫자 곱셈은 순서를 바꿔도 같습니다. 하지만 행렬곱(matrix multiplication)은 보통 그렇지 않습니다. 많은 입문자가 여기서 갑자기 낯설어합니다. 이유는 간단합니다. 행렬은 숫자 하나가 아니라 변환(transformation) 이기 때문입니다.
두 행렬 A, B가 있다고 합시다. Bx를 먼저 계산하고, 그 결과에 다시 A를 적용하면 전체 결과는 A(Bx)가 됩니다. 이 전체 과정을 한 번에 나타내는 행렬이 바로 AB입니다.
A(Bx) = (AB)x
즉 행렬곱은 두 변환을 이어 붙여 하나의 더 큰 변환으로 만드는 연산입니다. 이 때문에 행렬곱을 이해하려면 숫자 곱셈이 아니라 함수 합성(function composition)에 더 가깝게 생각하는 편이 좋습니다.
이 글은 열벡터(column vector) 표기 관례를 따릅니다. 그래서 ABx에서 B가 먼저, A가 나중에 작동합니다. 다른 분야에서는 행벡터(row vector) 관례를 쓰기도 있지만, 여기서는 선형대수 입문에서 가장 흔한 관례로 통일합니다.
행렬곱의 계산식도 한 번은 보고 가는 것이 좋습니다. A가 m x n, B가 n x k일 때 (AB)의 (i, j) 성분은 A의 i번째 행과 B의 j번째 열의 내적으로 계산합니다.
(AB)ij = sum(Aik Bkj)
이 계산 규칙이 바로 "B를 먼저 적용하고, 그 결과에 A를 적용한다"는 합성과 정확히 대응합니다.
왜 순서가 중요한가
먼저 회전(rotation)한 뒤 확대(scale)하는 경우와, 먼저 확대한 뒤 회전하는 경우는 일반적으로 다릅니다. 이 차이가 바로 AB != BA가 흔한 이유입니다.
간단한 예로
A = [2 0
0 1]
B = [0 1
1 0]
를 생각해 봅시다. A는 x축 방향만 2배 확대하고, B는 두 축을 서로 바꾸는 변환입니다. 이 둘의 곱은 순서에 따라 달라집니다. 즉 "무엇을 먼저 하느냐"가 결과를 바꿉니다.
실제로 계산하면
AB = [0 2
1 0]
BA = [0 1
2 0]
입니다. 두 결과가 다르므로 AB != BA입니다.
순서가 중요하다는 사실은 실무 코드에서도 자주 드러납니다. 그래픽스 파이프라인, 좌표계 변환, 로봇 공학, 신경망 층 결합 모두 "어떤 변환을 먼저 적용하느냐"가 결과를 바꿉니다.
단계별 예시
예시 1) 두 변환의 연속 적용
벡터 x가 있다고 합시다.
- 먼저
B를 적용해 중간 결과Bx를 만듭니다. - 그다음
A를 적용해 최종 결과A(Bx)를 만듭니다.
이 전체 과정을 한 행렬로 줄인 것이 AB입니다. 그래서 AB는 "B 다음 A"를 뜻합니다. 초반에는 이 순서가 헷갈리기 쉬우니, 항상 오른쪽 행렬이 먼저 작동한다는 점을 붙잡는 것이 좋습니다.
예를 들어 x = [1; 0]이라고 하면, 먼저 Bx = [0; 1]이 되고 그 다음 A(Bx) = [0; 1]입니다. 실제로 (AB)x를 계산해도 같은 결과가 나옵니다.
예시 2) 그래픽스에서 회전과 확대
어떤 점을 먼저 회전시키고 나서 x축 방향으로만 확대한다고 해 봅시다. 이 경우 결과 모양은 먼저 확대한 뒤 회전한 경우와 달라질 수 있습니다. 그래서 그래픽스 엔진에서는 변환 행렬을 어떤 순서로 곱하는지가 매우 중요합니다. 이 감각은 다음 글의 (AB)x와 그다음 글의 Ax=b를 읽을 때도 그대로 이어집니다.
예시 3) 신경망에서 선형층 결합
활성화 함수(activation function)가 없다고 하면, 선형층 두 개를 연속으로 적용한 결과는 결국 하나의 큰 행렬로 합칠 수 있습니다.
y = A(Bx) = (AB)x
이 사실은 왜 "선형층만 여러 번 쌓아도 결국 하나의 선형변환이다"라고 말하는지 설명해 줍니다. 즉 비선형성(nonlinearity)이 없는 깊은 네트워크는 표현력이 크게 늘지 않습니다. 그래서 실제 모델에서는 활성화 함수 같은 비선형 요소가 꼭 필요합니다.
수학 주석
- 행렬곱(matrix multiplication)은 선형변환 (linear transformation)의 합성(composition)을 좌표계 안에서 표현한 것입니다.
- 결합법칙(associativity)은 성립하지만, 교환법칙(commutativity)은 일반적으로 성립하지 않습니다.
- 행렬 크기가 맞아야 곱할 수 있는 이유도, 출력 차원과 입력 차원이 이어져야 변환을 연속 적용할 수 있기 때문입니다.
즉 A가 m x n, B가 n x k 형태여야 AB가 정의되고, 결과는 m x k가 됩니다.
자주 하는 오해
행렬곱을 숫자 곱셈처럼 생각하기
이 오해 때문에 AB와 BA가 왜 다를 수 있는지 납득이 안 되는 경우가 많습니다. 행렬은 숫자가 아니라 변환이라는 점을 다시 떠올리면 훨씬 자연스럽습니다.
왼쪽에서 오른쪽 순서로 그대로 읽기
ABx를 보면 A가 먼저 보이지만, 실제로는 x에 가장 가까운 B가 먼저 작동합니다. 이 점을 놓치면 해석이 자꾸 뒤바뀝니다.
차원 맞춤을 형식 문제로만 보기
행렬 크기가 맞아야 한다는 것은 단순 문법이 아니라, 한 변환의 출력이 다음 변환의 입력으로 이어져야 한다는 구조적 조건입니다.
선형층을 많이 쌓으면 무조건 더 강해진다고 생각하기
활성화 함수가 없다면 여러 선형층은 결국 하나의 큰 선형변환으로 합쳐집니다. 그래서 깊이만 늘리고 비선형성을 넣지 않으면 표현력은 크게 늘지 않습니다.
연습 또는 확장
아래 질문을 생각해 보세요.
- 왜
2 x 3행렬과3 x 4행렬은 곱할 수 있는데, 반대 순서는 왜 항상 가능한 것이 아닐까? - 회전 후 확대와 확대 후 회전이 왜 일반적으로 다를까?
- 선형층 두 개를 하나의 행렬로 합칠 수 있다면, 비선형 활성화 함수는 왜 필요한가?
- 내가 쓰는 코드나 라이브러리는 열벡터 관례인지, 행벡터 관례인지 확인해 보기
가능하다면 간단한 넘파이(NumPy) 코드로 두 작은 행렬을 만들어 AB와 BA를 비교해 보세요.
마무리
이번 글에서는 행렬곱(matrix multiplication)을 변환 합성(composition)으로 읽었습니다.
AB는 두 변환을 차례로 적용한 결과를 하나로 합친 것입니다.- 이 글의 표기 관례에서는 오른쪽 행렬이 먼저 작동합니다.
- 순서가 중요하므로 보통
AB != BA입니다. - 그래픽스, 신경망, 좌표계 변환에서 이 원리가 계속 등장합니다.
다음 글에서는 이 흐름을 바탕으로 연립일차방정식을 Ax=b 형태로 묶어 읽어 보겠습니다.
💬 댓글
이 글에 대한 의견을 남겨주세요