Introduction
Strassen 알고리즘Strassen algorithm은 n×n 행렬 두 개의 곱을 Θ(n3)에서 Θ(nlog27)≈Θ(n2.807)으로 낮춘 최초의 분할 정복 행렬 곱셈 알고리즘입니다. 이 글에서는 표준 블록 행렬 곱의 한계, Strassen의 7개 곱셈 항등식, 재귀 구조, 그리고 실전에서의 트레이드오프를 살펴봅니다.
표준 행렬 곱의 벽
n×n 행렬 A와 B의 곱 C=AB를 정의대로 계산하면 각 Cij=∑k=1nAikBkj에 n번의 곱셈이 들고, 원소가 n2개이므로 총 Θ(n3)번의 스칼라 곱셈이 필요하다.
이를 블록 행렬 곱으로 분할해 보자. n이 짝수일 때 각 행렬을 n/2×n/2 블록 네 개로 나누면
A=(A11A21A12A22),B=(B11B21B12B22)
이고, 곱은 다음과 같이 8개의 블록 곱으로 표현된다.
C=(A11B11+A12B21A21B11+A22B21A11B12+A12B22A21B12+A22B22)
이 방식의 점화식은 T(n)=8T(n/2)+Θ(n2)이며, 마스터 정리로 풀면 a=8=23=bd이므로 T(n)=Θ(n3logn)이 된다. 분할 정복이 오히려 손해를 본 셈이다. 단순한 블록 분해로는 Θ(n3)을 깰 수 없다는 것이 이전까지의 상식이었다.
Strassen의 7개 곱셈
Strassen은 여덟 번의 블록 곱셈 대신 일곱 번만 사용하는 항등식을 발견했다. 다음 일곱 개의 중간 행렬을 정의하자.
M1M2M3M4M5M6M7=(A11+A22)(B11+B22)=(A21+A22)B11=A11(B12−B22)=A22(B21−B11)=(A11+A12)B22=(A21−A11)(B11+B12)=(A12−A22)(B21+B22)
일곱 개의 행렬 곱 M1,…,M7만 계산하면, C의 네 블록을 덧·뺄셈만으로 조합할 수 있다.
C11C12C21C22=M1+M4−M5+M7=M3+M5=M2+M4=M1−M2+M3+M6
이 항등식이 왜 성립하는지는 각 Mi를 전개해 대입하면 확인할 수 있다. 예컨대 C11에 M1+M4−M5+M7을 대입하면
(A11+A22)(B11+B22)+A22(B21−B11)−(A11+A12)B22+(A12−A22)(B21+B22)=A11B11+A12B21
으로 정확히 표준 공식이 재현된다. 나머지 세 블록도 마찬가지다.
점화식과 복잡도
블록 곱 7번과 블록 덧·뺄셈 Θ(n2)의 조합이므로 점화식은 다음과 같다.
T(n)=7T(2n)+Θ(n2)
마스터 정리의 단순 형태에 a=7, b=2, d=2를 대입하면 bd=4<7=a이므로
T(n)=Θ(nlog27)≈Θ(n2.807)
log27≈2.807이라는 지수는 표준 n3보다 분명히 작다. n=1024일 때 표준 방법은 약 109번의 곱셈이 필요하지만, Strassen은 약 108.4번으로 줄어든다.
실전에서의 트레이드오프
Strassen의 점근 복잡도는 우수하지만, 실전에서 바로 표준 알고리즘을 대체하지는 않는다. 세 가지 걸림돌이 있다.
- 상수 인자가 크다. Strassen은 7번의 곱셈 대신 18번의 덧·뺄셈이 필요하다(표준 블록법은 8번의 곱셈과 4번의 덧셈). 작은 n에서는 이 상수가 곱셈 절감분을 넘어선다. 실용적인 임계값은 CPU 캐시 크기에 따라 다르지만 대개 n≥100∼1000 이상에서 이득이 시작된다.
- 수치 안정성이 떨어진다. 덧·뺄셈이 반복되면서 부동소수점 오차가 누적되어, 표준 방법보다 정밀도 손실이 크다. BLAS1 같은 수치 라이브러리는 정확성이 중요한 상황에서는 Strassen을 쓰지 않는다.
- 메모리 접근 패턴이 복잡하다. 현대 CPU는 캐시 지역성cache locality이 성능을 크게 좌우하는데, Strassen의 중간 행렬 M1,…,M7은 추가 메모리 할당과 비순차 접근을 요구한다. 블록화된 표준 알고리즘이 하드웨어에 더 잘 맞는다.
이런 이유로 NumPy, Eigen, MKL 같은 실전 라이브러리는 기본적으로 표준 방법을 쓰고, 매우 큰 행렬(수천 차원 이상)에서만 선택적으로 Strassen을 적용한다.
출처
- Strassen, V. (1969) 'Gaussian elimination is not optimal', Numerische Mathematik, 13(4), pp. 354–356.
- Cormen, T. H., Leiserson, C. E., Rivest, R. L. and Stein, C. (2022) Introduction to Algorithms. 4th edn. Cambridge, MA: MIT Press, Chapter 4.2.
- Williams, V. V. (2012) 'Multiplying matrices faster than Coppersmith–Winograd', Proceedings of the 44th Symposium on Theory of Computing (STOC), pp. 887–898.
- Duan, R., Wu, H. and Zhou, R. (2022) 'Faster matrix multiplication via asymmetric hashing', arXiv:2210.10173.