본문 바로가기
딥러닝으로 하루하루 씹어먹기

딥러닝 TA 모델 - BERT (1 - 기초. 행렬과 벡터, 내적)

by Yoo Sung Hyun 2021. 11. 21.
728x90

이전 시간으로, STT(ESPNet)를 어느정도 시작부터 끝까지 다 설명한 것 같다. 시작할때는 이 많은 걸 언제 풀어쓰나, 걱정도 됬었지만, 결국 어느정도 잘 정리가 된 것 같았다.

 

BERT는 현재 진행 중이며, 진행사항은 50%정도로, Pre-Training Model에 대한 실제 소스 분석과, Text 데이터 EDA와 전처리에 대한 고민(형태소+Wordpiece 적용 등), BERT 계열 모델들의 특성, 그리고 원래 BERT와는 소스적으로 무엇이 다른지 등등 앞단에서 벌어지는 부분들에 대한 분석이 완료 된 상태이다.

 

실제로 차주부터는 Fine-Tunning에 대한 고민들을 진행할 것이며, 예제들을 통한 소스 분석, 실제 자사 데이터로 문제 해결을 위한 PoC를 진행하고자 한다. (아마, 주제는 카테고리 분류가 최우선 과제가 될 것 같다.)

 

뭐 이런 진행되고 있는 부분들은, 내가 블로그를 정리하면서, 자동으로 진행될테니 차차 작성되길 기대해주면 고맙겠다.

https://shyu0522.tistory.com/12?category=974717 

 

LSTM Attention 이해하기 - 어텐션 기초

Attention 예제 소스가 있는 git github.com/YooSungHyun/attention-time-forecast.git YooSungHyun/attention-time-forecast attention으로 시계열 예측은 할 수 없을까. Contribute to YooSungHyun/attention-ti..

shyu0522.tistory.com

여기서 이어집니다.

서론

지금은 완전 첫 시간이라고 생각하고, 크게는 BERT, 중간 으로는 Transformer, 작게는 Attention에 대한 기술적 부분들을 접하기 위해 필요한 기초 지식들을 정리해보도록 하겠다.

 

사실 이 부분들은 조금 더 수학적인 내용이며, 완전한 수학적 개념을 이해하고싶다면, 선형대수에 관련된 부분들을 검색해보면, 더 좋은 퀄리티의 원론적인 이야기들을 확인할 수 있을 것이다.

내가 설명하고자 하는 부분들은, 이런 부분들을 어떤 시각과 큰 그림으로 접근할 것이며, 그 수학적 행위들로 얻어지는 혹은 얻고자 함은 무엇인지, 조금 더 사용성 측면에서 느낀점을 공유하고 살펴보는 시간으로 가져가보도록 하겠다.

 

행렬과 벡터

기본적인 정의를 살펴보자면,

행렬 : '차원'을 가지는 숫자배열

벡터 : 단일 열 혹은 행 행렬 (n X 1 or 1 X n)

이라고 나온다.

  1. 사실 벡터도 차원이며, 그 벡터들을 가지는 집합은 행렬이나 다름이 없다.
    • 벡터는 결국 값. 그걸 가지는 행렬은 데이터 구조라고 생각해봄은 어떨까?
  2. 행렬의 특징을 그대로 따라가며, 행렬의 연산 방식 역시 그대로 적용시킬 수 있다는 점
    • 행렬이 데이터 구조라고 한다면, 위의 설명은, 관계형 DB의 규칙 연산(join 등) 행위를, Data Type만 맞다면 아주 쉽게 수행할 수 있게 된다. 행렬에서의 구조적인 규칙 연산은 무엇이 있을까?

DB도 Join등의 규칙이 있듯이, 행렬에도 연산의 규칙이 있다.

이를테면, 행렬곱, 상수곱 등등이며, 행렬곱의 경우 [0,1]로만 이루어진 행렬을 잘 이용하면, 곱하기 0의 마법을 이용하여, 원하는 행렬의 값을 쉽게 찾아낼 수도 있을 것이다. (예를들어, 4번째값만 뽑고 싶다면, [0,0,0,1] 행렬을 행렬곱하여, SUM 해버리면, 해당 위치의 값만 나온다.)

이런 행위들 말고도, 행렬의 연산을 좀 더 똑똑하게 쓸 수 있는 수학적 방법들은 무엇이 더 있을까...!? (이를테면 wx+b 등을 만드는 행위도, 행렬곱과 전치를 이용하면 쉽게 해결할 수 있다...!)

이제 앞으로 소스를 분석하다가, 이유를 모를 행렬곱 등이 나오면, 이게 수학적인 목표가 무엇이었을지, 혹은 어떤 행위를 고차원 데이터에서 for문을 쓰지않고 쉽게 적용하고 싶었는지 접근해보도록 하자. (실제로 이런 이유인 경우도 많다.)

내적

영어로 dot-product라고 한다. (어텐션의 기본이 되는 Luong-Attention이 해당 Based 이다.)

수학적으로는 벡터의 연산 방식중에 하나다. (숫자로 따지면, 더하기, 빼기, 나누기, 곱하기 같은)

통상 연산을 생각해보자

'나'+'가' = '나가' (str + str = str)

2+4 = 6 (int + int = int)

같은 형끼리 계산해서, 같은 형이 나오는게 일반적이다.

자, 근데 여기서 비틀기 한번 들어간다.

벡터 간의 내적은 스칼라(숫자)가 나온다.

엥? 뭔소리지? 알아보자

벡터의 내적은 공식으로 이렇게 표현한다.

LaTeX 기능을 써서 작성하면, 모바일에서 수식이 깨져서, 이미지로 삽입

첫번째 공식을 보자, a 행렬을 전치한 후, b와 곱하면 된다. 근데 벡터를 1차원이라고 했으니, 1차원 예시를 보자.

LaTeX 기능을 써서 작성하면, 모바일에서 수식이 깨져서, 이미지로 삽입

a와 b가 같은 값의 행렬이라고 가정하고, 전치 후 계산하면 결국에 14라는 스칼라 값이 나온다.

내적은 그냥 결국에 전치 후 행렬의 곱을 진행하기 때문에, 벡터의 내적은 당연히 스칼라가 나올 수 밖에 없다. (확인도 쉽고, 계산도 까다로울 것이 없다.)

 

두번째 공식을 보자, 코사인 유사도에 대해서 들어본 적이 있는가?

코사인 유사도 위키

어짜피, 코사인 유사도가 위의 내적의 공식으로 유도되긴 하나, 결국엔 벡터 2개를 알고있고, 그 벡터의 내적을 구할 수 있다면, 코사인 유사도를 구할 수도 있겠다. (cos 0도(같은방향)는 양수 최대치에 수렴하고, 90도이면 0, 90도보다 크면 점점 음수 최대치로 나아간다.)

 

세번째 공식을 보자, 내적은, 벡터를 다른 벡터에 투영(Projection)한다는 의미로도 사용되는데, 2개의 벡터가 있을때, 한 벡터의 그림자를 다른 벡터에 적용하는 것이 투영이라고 생각하면 되겠으며, 이를 기하학에서는 '정사영'이라고 표현한다.

(해당 부분에서 삼각함수를 이용하여 구하므로, cos이 또 역시 사용되며 코사인 유사도의 공식에서 유도된다.)

때문에, 정사영은 한 벡터가 다른 벡터에 얼마만큼의 성분을 가지고 있으며, 얼마만큼의 값을 더 가져야 똑같이 될 수 있을지를 삼각함수를 통해 알고자한다.

 

그러면 간단한 전치와 곱을 이용한 벡터의 내적으로, 우리는 어떤걸 알고싶고, 어떤걸 알 수 있을까?

내적의 키워드는 cos과 정사영이라고 말하고 싶다.

cos값으로는 방향의 유사도를 (방향이 똑같다면, cos0도 일 것이고, 그러면 값이 1에 가깝고, 반대면 0에 가까워지므로)

정사영으로는 크기의 유사도를 판단할 수 있을 것이다. (실제 벡터의 스칼라값과 삼각함수를 통한 길이계산에 초점)

 

내적의 값이 커진다는 것은 무엇을 의미할까? (생각해보고, 아래 글을 읽자)


첫번째 공식(전치 행렬곱)의 형태로 우리는 내적을 쉽게 구할 수 있다.
두번째 공식(cos 이용)의 형태로 우리는 내적이 커지려면, cos 각도의 값이 1에 가까워야 하고, 그 것은 방향이 유사함을 의미한다.
세번째 공식(정사영 이론)의 형태로 우리는 내적이 커지려면, 정사영의 길이가 '기준' 벡터와 동일하여, 결국 최대 값의 곱이 가능한 '제곱'의 형태여야 할 것이다. (정사영의 길이가 '기준' 벡터를 넘어가거나 하면, 결국 ax+b=c에서 c를 영영 찾을 수 없는 벡터가 되어버린다.)

이로써 내적의 값이 크다는 것은, 두개의 공식의 관계를 통해, 벡터가 결국 얼마만큼 같은 곳을 잘바라보며, 방향까지도 동일한지에 대한 유사도의 척도가 될 수 있겠다.

(그리고 이건 내 뇌피셜인데, 아마 cos함수를 이용하기때문에 값이 0~1로 나올 것으로 판단되고, 이런점에서 softmax를 위한 활용적 측면에서도 유용하기 때문에 금상첨화였지 않았을까도 조심스럽게 생각해본다.)

 

Attention에서도 이야기를 하겠지만, Attention에서의 내적을 이용함은, loss로 검수하고싶은 label 값에 얼마만큼 관계가 있는 벡터들끼리 모이게 가중값을 학습시킬 것인가?에 대한 접근으로 바라본다면, 조금 더 이해가 쉽지 않을까 싶다.

 

선형대수나 기하학을 엄청 잘 아는 것도 아니고, 먼저 Attention에 대한 레퍼런스들을 가지고, 역으로 수학적인 부분들을 확인하며 일반화시키다보니, 조금은 설명이 부족하거나, 설득력이 떨어지거나, 부정확한 부분이 있을지도 모른다.

추가적인 설명이 필요하다던지, 내가 잘못 이해하고 설명한 부분이 있다면, 필히 옳바른 정보 전달을 위해 댓글로 정정해주기 바란다...

 

그래도 기하학은 기하학, 선형대수면 선형대수, 딥러닝이면 딥러닝, 연관성있게 일반화되어있는 레퍼런스를 찾기 나는 너무나도 힘들었고, 내가 최대한 이해할 수 있었던 선에서 정리해보았으니, 이런 부분들이 Attention과 Transformer를 접하는 많은 동료들에게 조금이나마 도움이 되었으면 한다.

 

다음 시간에는, 실제로 Attention에 대한 이야기들을 뜯어보면서, 내적이 어디서 사용되었고, 어떻게 배열의 shape들이 변형되는 등 Attention에 집중해서 설명해보고자 한다...!

 

ETC. 추가적으로 내가 참고했던 레퍼런스들도 남겨본다.

https://amber-chaeeunk.tistory.com/69

 

[벡터] 벡터의 연산 , 벡터의 노름 , 벡터의 내적 ( 정사영 ) , 유사도

벡터는 숫자를 원소로 가지는 배열 또는 리스트를 말하며 공간에서의 한 점을 나타낸다. (다만, 1차원상에서 한 점은 스칼라(숫자)로 본다) 벡터를 이루는 원소의 개수를 벡터의 차원이라 한다.

amber-chaeeunk.tistory.com

https://blog.naver.com/PostView.nhn?blogId=ao9364&logNo=221542210272 

 

벡터의 내적, 정사영으로 깊이 생각하기(개념편)

들어가기... 우리가 고등학교 수학 교과서에서 알 수 있는 정도로만 의미를 파악해 보면 다음과 같이 크게 ...

blog.naver.com

https://angeloyeo.github.io/2020/09/09/row_vector_and_inner_product.html

 

행벡터의 의미와 벡터의 내적 - 공돌이의 수학정리노트

 

angeloyeo.github.io

https://luv-n-interest.tistory.com/718

 

벡터(Vector) - 2(내적, Dot product, Inner product) [게임수학]

벡터를 이어서 공부할 건데 내적을 공부해 볼 생각이다. 하지만 주제가 게임 수학이니만큼... 어디에다 쓰일 수 있을지 생각해보면서 배워보자 단순히 벡터 내적이 무슨 뜻인지 부터 알아보자

luv-n-interest.tistory.com

찾다보니, 게임공학에서 벡터와 정사영을 많이 사용하는 것 같더라... 혹시 주변 지인들 중 관련인이 있다면 (유니티 등), 그런 분들에게 조언을 구해보는 것은 어떨까...!?

728x90

댓글