Linear Algebra는 ML, AL 을 할 때 기초가 되는 학문입니다. 정말 방대한 분량이라서 아주아주아주 소량만 슬쩍 소개하는 걸로 포스팅합니다.
선형대수학을 도대체 왜 쓰는 걸까?
일단, 사람이 세상을 바라보는 것과 현재 셀프 진화하고 있는 컴퓨터가 데이터를 이해하는 것은 다릅니다.
사람이 화면에 떠다니는 이미지, 동영상, 음악 을 볼 때는 감각적으로 이해합니다. 눈과 귀가 메인이 되는데,
컴퓨터는 트랜지스터가 켜지고 꺼지는 1과 0으로만 이해합니다.
사람이 보는 데이터를 컴퓨터에게 이해시키기 위해서는 숫자가 필요합니다. 그것도 상당히 많은 숫자들의 나열이 필요합니다.
숫자들의 나열 array를 벡터라고 할 수 있고, 이 벡터가 컴퓨터가 보는 세상입니다.
선형대수학은 벡터를 다루는 학문이고,
이 벡터가 컴퓨터가 비정형화된 데이터(이미지, 영상 등)을 표시하는 방식이기에 필요합니다.
그래서 선형대수학은 반드시 필요.... 선형대수학의 활용도가 어디냐 라고 물어보면 텍스트 처리에도 사용되고, 이미지 처리에도, 영상 처리에도, 주파수 처리 등에도 사용되기 때문에 광범위합니다
추가적으로 인공지능에서는 이 벡터를 feature vector라고도 부릅니다.
Vector?
선형대수학에서는 데이터 형태에 따라서 scalar, vector, matrix, tensor 등으로 나눕니다.
스칼라 scalar는 단일 숫자 값을 의미합니다. 0차원.
벡터 vector. 길이와 방향이 있는 값입니다. m x 1 로 나타내는 값.
행렬 matrix 는 2차원의 배열이고. 엑셀 처럼 행과 열의 형태입니다. m x n 형태로 되어 있고. 벡터들을 합쳐서 표기했다고 보면 됩니다. 행을 특성 행렬 feature matrix라고 합니다.
텐서 tensor. 3차원. 인간의 뇌 이미지처럼. 전면부, 측면부, 두정엽부터 목, 척추까지 내려가는 두면부.. 이렇게 3차원을 데이터로 나타낸 값을 텐서라고 합니다. 뇌의 어떤 부위가 활성화 되었다 할 때 3차원 데이터로 나타냅니다.
텐서 이외의 값도 생각해야하는데, 사실 tensor 넘어가면 값을 머릿 속으로 계산하기 쉽지 않습니다. (이미 3차원 계산도 복잡함...) 3차원에 시간 축까지 추가해서 한 차원을 더 넣고 계산하면ㅎㅎ
하단의 코드는 3차원을 numpy 라이브러리를 활용해서 x, y, z축으로 계산해 본 결과입니다.
# 3d
three_dimension = np.arange(1, 28).reshape(3, 3, 3)
print(three_dimension)
three_dimension_axis_0 = np.sum(three_dimension, axis=0)
three_dimension_axis_1 = np.sum(three_dimension, axis=1)
three_dimension_axis_2 = np.sum(three_dimension, axis=2)
print('axis=0 : ', three_dimension_axis_0)
print('axis=1 : ', three_dimension_axis_1)
print('axis=2 : ', three_dimension_axis_2)
x축 기준으로 계산하고, y축 기준으로 계산하고, z축 기준으로 계산한 값들입니다. 이 값들을 어떻게 계산하는지까진 이해하고 넘어가야...
... Neural Network 할 때 1 x 3 x 3 x 5 뭐 이런 식으로 차원이 4개 정도 나올 때 다음 층 어떻게 쌓을 지 고민할 수 있습니다...(아마도)
Non-Numerical Data
이미지나 텍스트의 데이터를 벡터로 어떻게 표시할 지 입니다. 일단, 이미지 데이터 같은 경우 다음의 흑백 이미지의 경우에는 0과 1의 숫자 array로 표기합니다.
이 그림을 다음과 같이 해당하는 픽셀에 따라 0과 1로 표시합니다. 숫자 array 로 표기해서 해당 이미지를 나타낼 수 있습니다. 그런데 저 하단의 이미지는 컴퓨터만 이해하겠죠.
1 | 0 | 1 | 0 | 1 |
1 | 1 | 0 | 1 | 1 |
0 | 1 | 1 | 1 | 0 |
1 | 0 | 1 | 0 | 1 |
1 | 1 | 0 | 1 | 1 |
문제는 텍스트 데이터는 어떻게 표시할 것인지입니다. 해당 문서에 나온 단어를 다 합한 값으로 나타내는 방법도 있지만,
sentence_1 = {"하나" : 5,
"는" : 10,
"둘이지" : 2,
"셋이" : 10,
}
일단 기본적인 one-hot encoding 방식이 있습니다.
원 핫 인코딩은 각 단어를 벡터로 표시하는 것을 의미합니다.
sentence_example = "아버지가 방에 들어가신다. 아버지 가방에 들어가신다."
를 벡터로 나타내면
아버지가 = [1, 0, 0, 0, 0]
방에 = [0, 1, 0, 0, 0]
들어가신다. = [0, 0, 1, 0, 0]
아버지 = [0, 0, 0, 1, 0]
가방에 = [0, 0, 0, 0, 1]
(m x 1 이라서 세워서 표시해야 하지만 일단 이렇게 가로로 표시ㅠ)
단점은. 0으로 가득찬 벡터 array를 마주하게 됩니다. 위키피디아 같은 도큐먼트를 통째로 원 핫 인코딩하면 0이 몇 개나 나올지...
문장이 많으면 많을 수록 표현하기도 어렵습니다.
그리고 더 단점은 이렇게 표기해서 의미 있는 정보를 얻을 수 있지도 않다는 겁니다.
유사도는 dot product(벡터 간 곱하기)를 통해서 측정하는데. 각 벡터를 곱하더라도 0과 같이 무의미한 숫자를 마주하게 됩니다.
예를 들어, 강아지와 고양이 이렇게 벡터를 곱하고, 강아지와 사과 간 벡터를 곱해도 모두 0 이라는 스칼라 값을 가지면. 해당 벡터로 단어가 얼마나 유사한지 계산하기 어렵습니다. 이걸 해결하기 위해 많은 방법들이 있는데 일단 여기선 패스.
중요 용어들
1. 벡터 임베딩 Vector Embedding
의미있는 데이터를 만들기 위해 벡터를 다른 벡터 차원으로 집어넣는 걸 의미합니다. 3x1 를 2x1 형태로 변환. 2차원 배열을 3차원 배열로 넣거나 혹은 vice versa...
2. 행렬 인수분해 Matrix Factorization
사용되는 기법으로 Singular Value Decomposition가 있습니다.
이런 것들을 할 때 사이즈가 항상 맞아야 합니다. 특징 matrix 간 곱해서 의미 있는 값을 도출해야 하는데,
각 행렬을 곱해서 행렬를 구하는 건 쉽지만, 반대로 한 행렬을 분해해서 다른 여러 개의 행렬를 나타내는 건 어렵습니다.
예를 들어,
3x3 행렬과 3x1 (input)인 행렬 곱을 구하면 output 값을 계산하는 건 쉽겠죠, 이 경우엔 3 x 1 형태로 나오겠죠.
하지만 반대로 구해야 할 경우가 있습니다....예를 들어, 추천 알고리즘👨🔬🧐
다음과 같이 영화의 추천 알고리즘을 구하려고 4 x 5 형태의 데이터가 있습니다. 4는 사용자이고, 5는 영화 값들.
각 사용자마다 선호하는 영화에 체크가 되어 있습니다. 해당 값을 행렬로 표기하고,
해당 데이터의 특징인 연령(children or adults), 영화의 특징(선호도, 스케일 등)을 feature 값으로 뽑아내고
각 matrix를 factored 합니다. 예를 들어, Singular Value Decomposition 을 한다면 해당 위의 행렬을.
4x3 행렬 * 3x3 행렬 * 3x5 행렬 로 쪼개야 합니다.
행렬을 의미 있는 더 작은 행렬로 만드는 것입니다.
혹은 4(사용자)x2(특징) 행렬 값 * 2(특징)x5(영화) 행렬 값 으로 나눠서 계산할 수 있습니다. 다음 하단의 그림과 같이요
마무리
이 외에도 Eigenvector, Eigenvalue 값도 중요 용어입니다. 차원 축소할 때 등장하는 단어입니다. 차원 축소해서 데이터에서 중요한 특징을 파악하기 때문에 eigenvector와 eigenvalue 값을 구하는 것도 선형대수학에서 다룹니다, 이 부분은 구글링이나 chatGPT... :-)
Linear Algebra는 정말 정말 방대한 분야입니다. 쓰기 시작하면 끝도 없고, 배우기 시작하면 끝도 없는. 일단 ML에서 자주 등장하는 벡터 개념만 정리했습니다... 화이팅🥹
Reference
https://developers.google.com/machine-learning/recommendation/collaborative/basics?hl=ko
'NLP-writing' 카테고리의 다른 글
한국어 텍스트 데이터 전처리 (5) | 2023.05.07 |
---|---|
미적분 - 경사 하강법(gradient descent) (0) | 2023.04.27 |
3. Probability - 베이지안Bayesian (0) | 2023.03.26 |
2 정규표현식을 익히자 Regular Expression with Python (0) | 2023.03.20 |
1. 자연어 처리란 무엇일까? (0) | 2023.02.25 |