이전 포스팅의 주제인 AdaLoRA 는 행렬에 대해 잘 알지 못하면 그 원리를 근본까지 이해하기 힘든 구성을 지니고 있다. 최종적으로 이해는 했지만 이를 정리해 두지 않으면 한달만 지나면 다 까먹을 것이기 때문에 기록해 둔다.
- 행렬
- 역행렬
- 전치행렬
- 대칭행렬
- 항등행렬(단위행렬)
- 대각행렬
- 직교행렬
및 행렬연산 특성에 관해서 설명한다.
1. 행렬(matrix)
행렬에 관해서 모르는 사람은 없으리라 본다. Excel 을 다뤄본 경험이 있다면 행렬이란 계념을 추상적으로 잡아둔것과 다름없다.
벡터와 행렬의 차이에 관해 모르고 있었다면, 아래 글을 살펴보라.
Can anyone please explain the the difference between a vector and a matrix?
I just took Calculus 3 last semester at my University and got comfortable with the idea of vectors, vector-valued functions, and basic vector operations like the dot and cross products. This semes...
math.stackexchange.com
1-1. 행렬의 덧셈, 뺄셈
행렬의 덧셈과 뺄셈은 따로 설명이 필요하지 않을 정도로 간단하다.
같은 크기를 지닌 행렬끼리만 덧셈, 뺄셈 연산이 가능하다.
import numpy as np
matrix_a = np.array([[1,2,3],
[4,5,6],
[7,8,9]])
matrix_b = np.array([[9,8,7],
[6,5,4],
[3,2,1]])
print(matrix_a + matrix_b)
print(matrix_a - matrix_b)
1-2. 행렬의 곱셈
행렬곱 역시 특정 조건을 갖춘 행렬간에만 수행할 수 있다.
예로, 두 행렬
앞쪽에 위치하는 행렬
행렬끼리 곱셈 연산을 수행하면 행렬의 크기는
import numpy as np
matrix_a = np.array([[80,90,60],
[75,80,90],
[90,95,65],
[99,70,70]])
matrix_b = np.array([[3,1],
[3,8],
[4,1]])
print(np.dot(matrix_a, matrix_b))
예로, 위와 같은 코드가 있다면 아래와 같이 계산된다.
몇번 보다보면 계산법을 쉽게 찾을 수 있다. 앞 행렬에 해당하는
참고로 행렬곱에서 교환법칙은 대부분 성립하지 않는다. (특수한 경우 성립하나, 일반적으로 성립 X)
2. 역행렬(inverse matrix)
역행렬(inverse matrix) 는 행렬
여기서는 '단위 행렬(unit matrix)' 혹은 '항등 행렬(identity matrix)' 이라고 불리며, 아래에서 설명하겠다.
역행렬은 항등행렬을 구하기 위해 사용된다.
3. 전치행렬(transposed matrix)
행렬
전치행렬은 행렬내의 원소를 대각선축을 기준으로 서로 위치를 바꾼것을 의미한다.
즉,

전치행렬은 아래 특성이 성립된다.
4. 대칭행렬(symmetric matrix)
행렬
따라서
또한 아래의 성질도 보유하고 있다. (
예로, 아래는 대칭행렬이다.
1, 3, 6 이 위치한 대각선축을 따라 전치해도 같은 행렬이 된다는 것을 알 수 있다.
5. 항등행렬(unit matrix)
항등행렬(단위행렬) 은 주대각선의 원소가 모두 1이며, 나머지 원소는 모두 0인 정사각 행렬을 의미한다.
6. 대각행렬(main diagonal)
주대각선에 위치한 행렬을 제외한 모든 성분이 0인 정사각 행렬을 말한다.
7. 직교행렬(orthogonal matrix)
직교행렬은 아래와 같은 특성을 지닌다.
위에서 역행렬과 원본행렬을 곱하면 항등행렬이 된다고 언급했었다. 하지만 직교행렬의 경우 역행렬과 전치행렬이 개념상 같으므로, 전치행렬과 행렬원본을 곱해도 항등행렬이 도출된다. 즉 아래와 같다.
아래의 예제를 살펴보자.
파이썬 예제 코드를 통해 위 예제의 출력값을 확인해 보자.
import numpy as np
import math
x = 3.141592
A = np.array([[math.cos(x), math.sin(x)],
[math.sin(x) * -1, math.cos(x)]])
At = np.array([[math.cos(x), math.sin(x) * -1],
[math.sin(x), math.cos(x)]])
print(np.dot(A, At))
프로그래밍 언어 특성상 부동소수점 오차 문제로 완벽히 0이 도출되진 않으나, 항등행렬을 띔을 알 수 있다.
'Artificial Intelligence > Basic' 카테고리의 다른 글
Transformer 의 CrossAttention 차이점 (0) | 2024.04.23 |
---|---|
모델 훈련시 Epoch 와 Steps 의 차이 (0) | 2024.03.05 |
batch_size 란? (0) | 2024.03.05 |
인공지능에서 Parameter 란? (0) | 2024.01.27 |
GAN의 최적 손실값 (1) | 2023.06.19 |