본문 바로가기

자연어처리(NLP)

4-1. Transformer(Self Attention) [초등학생도 이해하는 자연어처리]

반응형

 안녕하세요 '코딩 오페라'블로그를 운영하고 있는 저는 'Master.M'입니다. 현재 저는 '초등학생도 이해하는 자연어 처리'라는 주제로 자연어 처리(NLP)에 대해 포스팅을 하고 있습니다. 제목처럼 진짜 핵심 내용을 쉽게 설명하는 것을 목표로 하고 있으니 자연어 처리(NLP)에 입문하고 싶은 분들은 많은 관심 부탁드립니다. 지금부터 알아볼 내용은 'Transformer'입니다. Transformer 개념은 너무 방대하기 때문에 이번 시간에는 "Self Attention"을 집중적으로 다루겠습니다. 이후 내용들은 다음 글에서 다루도록 하겠습니다. 

 

Transformer 란?

Transformer 모델 구조

 

 본론 부터 말씀드리면 Transformer 모델은 Attention만으로 이루어진 encoder-decoder 구조의 seqence to seqence 모델입니다. 우리는 저번 시간에 "Attention"에 대한 개념을 배웠습니다. 혹시 아직 못 보신 분들은 아래 링크를 참고하시기 바랍니다. 

 

https://codingopera.tistory.com/41

 

3. Attention [초등학생도 이해하는 자연어처리]

안녕하세요 '코딩 오페라'블로그를 운영하고 있는 저는 'Master.M'입니다. 현재 저는 '초등학생도 이해하는 자연어 처리'라는 주제로 자연어 처리(NLP)에 대해 포스팅을 하고 있습니다. 제목처럼 진

codingopera.tistory.com

 

개발자들은  Attention 메커니즘을 이용하여, RNN계열 모델의 성능을 항상시켰습니다. 그러던 중 RNN계열의 모델 없이 Attention만 가지고 언어 모델을 만들어 보면 어떨까?라는 생각을 하기 시작했습니다. 이 생각을 통해 만들어진 모델이 바로 "Transformer" 모델입니다. 기존의 RNN모델의 가장 큰 단점은 네트워크를 계속 반복(순환) 업데이트하면서 연산 효율 떨어진다는 것이었습니다. 그러나 Transformer 모델을 사용하면 RNN을 사용하지 않아 연산 효율도 좋아지고, 뿐만 아니라 성능도 더욱 좋아집니다. 때문에 현재 지구상에서 가장 강력한 모델입니다. 또한 이는 NLP 뿐만 아니라 CV 등 다양한 분야에서 현재 State Of The Art (SOTA)를 달성하였습니다. 그러나 이렇게 강력한 만큼 모델이 위 사진에서 보다시피 정말 복잡합니다. 때문에 지금부터 스텝 바이 스텝으로 Transformer의 각 메커니즘에 대해 설명하도록 하겠습니다. 

 

 

1. Self Attention

Self Attention

 첫 번째 메커니즘은 Self Attention입니다. "Self Attention"이란 말 그대로 Attention을 자기 자신한테 취한다는 것입니다. 그럼 도대체 왜 이런 행위를 하는 것일까요? 그 이유는 바로 문장에서의 단어들의 연관성을 알기위해서 입니다. 위 그림에는 "The animal didn't cross the street because it was too tired."라는 문장이 있습니다. 여기서 "it"이 가리키는 단어는 무엇일까요? 사람은 문맥상 it이 animal을 가리킨다는 것을 쉽게 알 수 있습니다. 그러나 컴퓨터에게는 이러한 과정이 매우 어렵습니다. 이를 쉽게 해주는 방법이 Self Attention입니다. 

 

Query, Key and Value

 지금부터는 Self Attention의 계산 과정을 알아보도록 하겠습니다. Self Attention에서는 Query, Key, Value 라는 3가지 변수가 존재합니다. 직역하자면 Query는 "의문", Key는 "열쇠", Value는 "값"을 의미합니다. 좀 더 쉬운 예로, 예를 들어 여러분이 호텔에서 접수를 하고 키를 받아 방에 들어가 최종적으로 술을 마신다고 가정하겠습니다. 처음에 여러분은 접수처에서 호텔 직원에게 "512호 예약자인데 어떻게 들어가나요?"라고 묻는 말이 "Query"를 의미합니다. 그다음 직원이 512호의 열쇠를 주는데, 이 열쇠가 "Key"가 되고 마지막으로 512호에 들어가 안에 있는 술이 "Value"라고 이해를 하시면 됩니다. "간단히 물어보고 중간과정을 거쳐 최종 값을 얻는다." 이렇게 생각하시면 됩니다. 이 개념은 그렇게까지 중요한 것은 아니니 이해가 안 되시면 그냥 그런가 보다 하고 넘어가시면 됩니다. Self Attention의 에서 가장 중요한 개념은 Query, Key, Value의 시작 값이 동일하다는 점입니다. 때문에 Self를 붙이는 겁니다. 그러나 이 말이 Query, Key, Value이 동일하다는 말은 아닙니다. 그 이유는 위 그림과 같이 중간에 학습 weight W값에 의해 최종적인 Query, Key, Value값은 서로 다르게 됩니다. 다시 말해 "Query, Key, Value의 기원은 같으나 최종 값은 학습을 통해 달라진다."라고 이해하시면 되겠습니다. 이를 구하는 공식은 다음과 같습니다. 

 

Attention 구하는 공식

우선 처음에 Query와 Key를 내적해줍니다. 이렇게 내적 해주는 이유는 둘 사이의 연관성을 계산하기 위해서입니다. 이 내적 된 값을 "Attention score"라고 합니다. 그런데 만약 Query와 Key의 차원이 커지면 내적 값은 Attention score도 커지게 되어 모델의 학습에 어려움이 생깁니다. 때문에 이 문제를 해결하기 위해 차원 d_k의 루트만큼을 나누어 주는 스케일링 작업을 진행합니다. 여기까지의 과정을 "스케일드 닷 프로덕트 어텐션(Scaled dot-product Attention)"이라고 합니다. 그다음으로 값들을 정규화시켜주기 위해 softmax 활성 함수를 거치고, 마지막으로 보정을 위해 지금까지 계산된 score행렬과 Value행렬을 내적 해주면 최종적인 Attention 행렬을 얻을 수 있게 됩니다. 이해가 잘 안 되시나요? 이해를 돕기 위해 아래의 예시를 들어보겠습니다. 

 

Query, Key, Value

예를 들어 "I am a student."라는 문장이 있다고 가정하겠습니다. 여기서 각 단어를 Attention 메커니즘을 사용하기 위해 임베딩을 해주어야 합니다. 위에서 단어 "I"의 임베딩이 [1, 1, 1, 1]이라 했을 때 처음 I의 처음 Query, Key, Value를 각각 Q_I, original,  K_I,original,  V_I,original라고 합니다. 이 값들은 위에서 설명했듯이 Self Attention 메커니즘에서 같아야 되기 때문에 모두 [1, 1, 1, 1]로 동일합니다. 이때 각각 학습된 weight 값이 WQ, WK, WV라고 할 때. 이를 위에서 처럼 original값들과 점곱을 해주면 최종적은 Q, K, V값이 도출됩니다. 

 

보정 Attention score

이 Q, K, V값을 이용해 위에서 설명한 보정 Attention score을 주해주면 위와 같이 1.5라는 값이 나옵니다. 행렬 Q, K는 서로 점곱을 해주고, 여기서 행렬 Q, K, V의 차원은 4이므로 루트 4를 나누어준 것입니다. 

 

"I am a student."의 Self Attention

이 과정을 "I" 뿐만 아니라 모든 단어간에 Self Attention을 해주면 위 그림과 같은 결과가 나옵니다. 가운데 노란색 부분은 자기 자신에 대한 Attention이므로 당연히 값이 제일 크고, 양쪽 초록색 부분을 보면 이 역시 점수가 높습니다. 따라서 단어 "I"와 "student"사이의 상관관계가 있는 것을 확인할 수 있습니다. 

 

병렬처리된 Query, Key, Value

 마지막으로 병렬처리에 대해 설명을 하도록 하겠습니다. 위에서는 여러분들의 이해를 돕기위해 단어 하나의 Attention을 구하는 과정을 설명했는데, 실제로는 여러단어를 위 그림과 같이 병렬처리해 계산을 합니다. 병렬처리를 하면 연산속도가 빨라지는 이점이 있습니다. 

 

오늘 배운 내용에 대해 잘 이해가 안되신다거나, 부가적인 설명이 필요하시면, 아래 제 유튜브 영상을 참고하시면 됩니다.

정성스럽게 영상을 제작 했으니 꼭 한번 들러주세요 :)

https://www.youtube.com/watch?v=SR4F6WMqZ0s

 

정리

- Transformer: Attention만으로 이루어진 encoder-decoder 구조의 seqence to seqence 모델. 현재 거의 모든 분야에서 최고의 성능을 자랑.

- Attention: 모델의 성능 향상을 위해 문맥에 따라 집중할 단어를 결정하는 방식.

- Self Attention: Attention중에서 자기 자신에게 Attention 메커니즘을 행하는 방식. (Query = Key = Value)

 

Self Attention

1. 원하는 문장을 임베딩하고 학습을 통해 각 Query, Key, Value에 맞는 weight들을 구해줌.

2. 각 단어의 임베딩의 Query, Key, Value(Query = Key = Value)와 weight를 점곱(내적)해 최종 Q, K, V를 구함.

3. Attention score 공식을 통해 각 단어별 Self Attention value를 도출

4. Self Attention value의 내부를 비교하면서 상관관계가 높은 단어들을 도출

 

그 밖에 Transformer 메커니즘파이썬 코드가 궁금하신 분들은 아래 글들을 참고하시기 바랍니다.

https://codingopera.tistory.com/44

 

4-2. Transformer(Multi-head Attention) [초등학생도 이해하는 자연어처리]

안녕하세요 '코딩 오페라'블로그를 운영하고 있는 저는 'Master.M'입니다. 현재 저는 '초등학생도 이해하는 자연어 처리'라는 주제로 자연어 처리(NLP)에 대해 포스팅을 하고 있습니다. 제목처럼 진

codingopera.tistory.com

https://codingopera.tistory.com/74

 

4-4. Harvard Transformer Code 리뷰 [초등학생도 이해하는 자연어처리]

안녕하세요 '코딩 오페라'입니다.현재 저는 '초등학생도 이해하는 자연어 처리'라는 주제로 자연어 처리(NLP)에 대해 포스팅을 하고 있습니다. 제목처럼 진짜 핵심 내용을 쉽게 설명하는 것을

codingopera.tistory.com

 

 추가적으로 제가 AI 학습 관련 오픈 카카오톡방을 만들었습니다. AI와 코딩 학습에 목말라 있으신분들이라면 누구나 들어와서 즐겁게 맘껏 정보공유와 AI 공부하시면 될 것 같습니다. 링크는 다음과 같이니 꼭 한번 참석 및 홍보 부탁드리겠습니다.

https://open.kakao.com/o/ggxse9sg

 

인공지능/AI/코딩 공부방(코딩오페라)

인공지능/AI/코딩 공부방

open.kakao.com

 

 

추가적으로 Transformer에 대해 좀더 자세히 알고싶으신 분들은 아래 제 유튜브 영상을 참고하시면 됩니다.

정성스럽게 영상을 제작 했으니 꼭 한번 들러주세요 :)

 

[Transformer의 Embedding과 Positional Encoding]

https://www.youtube.com/watch?v=-z2oBUZfL2o

 

[Transformer의 Residual Connection과 Layer Normalization]

https://www.youtube.com/watch?v=eq4zlaqaDvI

 

 

  지금 까지 저희는 'Transformer의 Self Attention'에 대해 알아보았습니다. 도움이 되셨나요? 만약 되셨다면 구독 및 좋아요로 표현해 주시면 정말 많은 힘이 됩니다. 궁금한 사항 혹은 앞으로 다루어 주었으면 좋을 주제가 있으시면 댓글 남겨주시면 감사하겠습니다. 저는 '코딩 오페라'의 'Master.M'이었습니다. 감사합니다.

반응형