일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- SQLD
- SQL
- 이것이 코딩테스트다
- sklearn
- 머신러닝
- IRIS
- 코딩테스트
- 데이터 전처리
- pandas
- 이코테
- 데이터분석준전문가
- matplotlib
- 데이터분석
- Deep Learning Specialization
- 통계
- Python
- 데이터 분석
- 회귀분석
- 딥러닝
- 태블로
- 파이썬
- r
- Google ML Bootcamp
- ADsP
- ML
- tableau
- scikit learn
- pytorch
- 자격증
- 시각화
- Today
- Total
함께하는 데이터 분석
[NLP] Transformer② 본문
Positional Encoding
앞서 포스팅한 Transformer① 모델에서 한 가지 부족한 부분은 입력 문장에서 단어들의 순서를 고려하지 않았다는 것
이것을 추가하기 위해 Transformer 모델은 각각의 입력 임베딩에 "positional encoding"이라고 불리는 하나의 벡터를 추가
이 벡터들은 모델이 학습하는 특정한 패턴을 따르는데, 이 패턴은 모델이 각 단어의 위치와 시퀀스 내의 다른 단어 간의 위치 차이에 대한 정보를 알 수 있게 해 줌
이 벡터들을 추가하기로 한 배경에는 이 값들을 단어들의 임베딩에 추가하는 것이 query/key/value 벡터들로 나중에 투영되었을 때 단어들 간의 거리를 늘릴 수 있다는 점
모델에게 단어의 순서에 대한 정보를 주기 위해, 위치 별로 특정한 패턴을 따르는 positional encoding 벡터들을 추가
만약 임베딩의 사이즈가 4라고 가정하면, 실제로 각 위치에 따른 positional encoding은 아래와 같은 것
위는 크기가 4인 임베딩의 positional encoding에 대한 실제 예시
실제로는 이 패턴이 어떻게 될 것인가?
위의 그림에서 각 행은 하나의 벡터에 대한 positional encoding에 해당
첫 번째 행은 우리가 입력 문장의 첫 번째 단어의 임베딩 벡터에 더할 positional encoding 벡터.
각 행은 사이즈 512인 벡터이며 각 셀의 값은 1과 -1 사이를 가짐
위의 그림은 이 셀들의 값들에 대해 색깔을 다르게 나타내어 positional encoding 벡터들이 가지는 패턴을 볼 수 있도록 시각화한 것
이는 20개의 단어와 그의 크기 512인 임베딩에 대한 positional encoding의 실제 예시
그림에서 볼 수 있듯이 이 벡터들은 중간 부분이 반으로 나뉘어 있는데, 왼쪽 반은 사인함수에 의해 생성되었고, 오른쪽 반은 코사인 함수에 의해 생성되었기 때문
그 후 이 두 값들은 연결되어 하나의 positional encoding 벡터를 이루고 있음
The Residuals
인코더를 넘어가기 전, 구조에서 한 가지를 더 언급하고 넘어가야 하는 부분은 각 인코더 내의 sub-layer가 residual connection으로 연결되어 있으며, 그 후에는 layer-normalization 과정을 거친다는 것
이 벡터들과 layer-normalization 과정을 시각화하면 다음과 같음
이것은 디코더 내에 있는 sub-layer들에도 똑같이 적용되어 있음
만약 우리가 2개의 인코더와 디코더로 이루어진 단순한 형태의 Transformer를 생각해 본다면 다음과 같은 모양일 것
The Decoder Side
이때까지 인코더 쪽의 대부분의 개념들에 대해 이야기했기 때문에 사실 디코더의 각 부분이 어떻게 작동하는지에 대해 이미 알고 있다고 봐도 무방
하지만 이 부분들이 모여서 어떻게 같이 작동하는지에 대해서 알아보아야 함
인코더가 먼저 입력 시퀀스를 처리하기 시작
그다음 가장 윗단의 인코더의 출력은 attention 벡터들인 K와 V로 변형
이 벡터들은 이제 각 디코더의 "encoder-decoder attention" layer에서 디코더가 입력 시퀀스에서 적절한 장소에 집중할 수 있도록 도와줌
이 인코딩 단계가 끝나면 이제 디코딩 단계가 시작
디코딩 단계의 각 스텝은 출력 시퀀스의 한 element를 출력
디코딩 스텝은 디코더가 출력을 완료했다는 special 기호인 <end of sentence>를 출력할 때까지 반복
각 스텝마다의 출력된 단어는 다음 스텝의 가장 밑단의 디코더에 들어가고 인코더와 마찬가지로 여러 개의 디코더를 거쳐 올라감
인코더의 입력에 했던 것과 동일하게 임베드를 한 후 positional encoding을 추가하여 디코더에게 각 단어의 위치 정보를 더해줌
디코더 내에 있는 self-attention layer은 output sequence 내에서 현재 위치의 이전 위치들에 대해서만 attend 할 수 있음
이것은 self-attention 계산 과정에서 softmax를 취하기 전에 현재 스텝 이후의 위치들에 대해 masking(즉 그에 대해서 -inf로 치환하는 것)을 해줌으로써 가능해짐
"Encoder-Decoder Attention" layer은 multi-head self-attention과 한 가지를 제외하고는 똑같은 방법으로 작동
그 한 가지 차이점은 Query 행렬들을 그 밑의 layer에서 가져오고 Key와 Value 행렬들을 인코더의 출력에서 가져온다는 점
Linear Layer과 Softmax Layer
여러 개의 decoder를 거치고 난 후에는 소수로 이루어진 벡터 하나가 남게 됨
어떻게 이 하나의 벡터를 단어로 바꿀 수 있을까?
이것이 바로 마지막에 있는 Linear layer과 Softmax layer가 하는 역할
Linear layer은 fully-connected 신경망으로 디코더가 마지막으로 출력한 벡터를 그보다 훨씬 더 큰 사이즈의 벡터인 logits 벡터로 투영시킴
우리의 모델이 training 데이터에서 총 10,000개의 영어 단어를 학습하였다고 가정(이를 우리는 모델의 “output vocabulary”라고 부름)
그렇다면 이 경우에 logits vector의 크기는 10,000이 될 것
벡터의 각 셀은 그에 대응하는 각 단어에 대한 점수가 되고 우리는 Linear layer의 결과로써 나오는 출력에 대해서 해석을 할 수 있게 됨
그다음에 나오는 softmax layer는 이 점수들을 확률로 변환해 주는 역할을 함
셀들의 변환된 확률 값들은 모두 양수 값을 가지며 다 더하게 되면 1이 되고 가장 높은 확률 값을 가지는 셀에 해당하는 단어가 해당 스텝의 최종 결과물로서 출력되게 됨
위의 그림에 나타나 있는 것과 같이 디코더에서 나온 출력은 Linear layer와 softmax layer를 통과하여 최종 출력 단어로 변환됨
모델의 학습
지금까지는 학습된 Transformer의 전체 forward-pass 과정에 대해서 알아보았으므로 이제 모델을 학습하는 방법에 대해서 알아볼 것
학습 과정 동안, 학습이 되지 않은 모델은 정확히 같은 forward pass 과정을 거칠 것임
그러나 우리는 이것을 label 된 학습 데이터 셋에 대해 학습시키는 중이므로 우리는 모델의 결과를 실제 label 된 정답과 비교할 수 있음
이 학습 과정을 시각화하기 위해, 우리의 output vocabulary 가 “a”, “am”, “i”, “thanks”, “student”, “<eos>” (‘end of sentence’의 줄임말) 총 6개의 단어만 포함하고 있다고 가정
모델의 output vocabulary는 학습을 시작하기 전인 preprocessing 단계에서 완성
이 output vocabulary를 정의한 후에는, 우리는 이 vocabulary의 크기만 한 벡터를 이용하여 각 단어를 표현할 수 있음
이것은 one-hot encoding이라고 불리고 우리의 예제에서는 단어 “am”을 다음과 같은 벡터로 나타낼 수 있음
예제: 우리의 output vocabulary에 대한 one-hot encoding
이제 모델의 loss function에 대해서 설명할 것 – 이것은 학습 과정에서 최적화함으로써 인해 모델을 정확하게 학습시킬 수 있게 해주는 값
Loss Fuction
우리가 모델을 학습하는 상황에서 가장 첫 번째 단계라고 가정
그리고 우리는 학습을 위해 “merci”라는 불어를 “thanks”로 번역하는 간단한 예시라고 가정
이 말은 즉, 우리가 원하는 모델의 출력은 “thanks”라는 단어를 가리키는 확률 벡터란 것
하지만 우리의 모델은 아직 학습이 되지 않았기 때문에, 아직 모델의 출력이 그렇게 나올 확률은 매우 작음
학습이 시작될 때 모델의 parameter들 즉 weight들은 랜덤으로 값을 부여하기 때문에, 아직 학습이 되지 않은 모델은 그저 각 cell (word)에 대해서 임의의 값을 출력
이 출력된 임의의 값을 가지는 벡터와 데이터 내의 실제 출력값을 비교하여, 그 차이와 backpropagation 알고리즘을 이용해 현재 모델의 weight들을 조절해 원하는 출력값에 더 가까운 출력이 나오도록 만듦
그렇다면 두 확률 벡터를 어떻게 비교할 수 있을까?
간단하게 하나의 벡터에서 다른 하나의 벡터를 빼버림
하지만 여기서 하나 주의할 것은 우리가 고려하고 있는 예제가 지나치게 단순화된 경우란 것
조금 더 현실적인 예제에서는 한 단어보다는 긴 문장을 이용할 것임
예를 들어 입력은 불어 문장 “je suis étudiant”이며 바라는 출력은 “i am a student”일 것
이 말은 즉, 우리가 우리의 모델이 출력할 확률 분포에 대해서 바라는 것은 다음과 같음
- 각 단어에 대한 확률 분포는 output vocabulary 크기를 가지는 벡터에 의해서 나타내짐(우리의 간단한 예제에서는 6이지만 실제 실험에서는 3,000 혹은 10,000과 같은 숫자일 것)
- 디코더가 첫 번째로 출력하는 확률 분포는 “i”라는 단어와 연관이 있는 cell에 가장 높은 확률을 줘야 함
- 두 번째로 출력하는 확률 분포는 “am”라는 단어와 연관이 있는 cell에 가장 높은 확률을 줘야 함
- 이와 동일하게 마지막 ‘<end of sentence>‘를 나타내는 다섯 번째 출력까지 이 과정은 반복됨(‘<eos>’ 또한 그에 해당하는 cell을 벡터에서 가짐)
위의 그림은 학습에서 목표로 하는 확률 분포를 나타낸 것
모델을 큰 사이즈의 데이터 셋에서 충분히 학습을 시키고 나면, 그 결과로 생성되는 확률 분포들은 다음과 같아질 것임
학습 과정 후, 모델은 정확한 번역을 출력할 것임
물론, 우리가 예제로 쓴 문장이 학습 데이터로 써졌다는 보장은 없음
그리고 한 가지 여기서 특이한 점은, 학습의 목표로 하는 벡터들과는 달리, 모델의 출력값은 비록 다른 단어들이 최종 출력이 될 가능성이 거의 없다 해도 모든 단어가 0보다는 조금씩 더 큰 확률을 가진다는 점 – 이것은 학습 과정을 도와주는 softmax layer의 매우 유용한 성질
모델은 한 타임 스텝 당 하나의 벡터를 출력하기 때문에 우리는 모델이 가장 높은 확률을 가지는 하나의 단어만 저장하고 나머지는 버린다고 생각하기 쉬움
그러나 그것은 greedy decoding이라고 부르는 한 가지 방법일 뿐이며 다른 방법들도 존재
예를 들어 가장 확률이 높은 두 개의 단어를 저장할 수 있음(위의 예시에서는 ‘I’와 ‘student’)
그렇다면 우리는 모델을 두 번 돌리게 되고, 한 번은 첫 번째 출력이 ‘I’이라고 가정하고 다른 한 번은 ‘student’라고 가정하고 두 번째 출력을 생성해 보는 것
이렇게 나온 결과에서 첫 번째와 두 번째 출력 단어를 동시에 고려했을 때 더 낮은 에러를 보이는 결과의 첫 번째 단어가 실제 출력으로 선택됨
이 과정을 두 번째, 세 번째, 그리고 마지막 타임 스텝까지 반복해 나가고 이렇게 출력을 결정하는 방법을 우리는 “beam search”라고 부르며, 고려하는 단어의 수를 beam size, 고려하는 미래 출력 개수를 top_beams라고 부름
우리의 예제에서는 두 개의 단어를 저장했으므로 beam size가 2이며, 첫 번째 출력을 위해 두 번째 스텝의 출력까지 고려했으므로 top_beams 또한 2인 beam search를 한 것
이 beam size와 top_beams는 모두 우리가 학습 전에 미리 정하고 실험해 볼 수 있는 hyperparameter임
The Illustrated Transformer – NLP in Korean – Anything about NLP in Korean
The Illustrated Transformer
저번 글에서 다뤘던 attention seq2seq 모델에 이어, attention 을 활용한 또 다른 모델인 Transformer 모델에 대해 얘기해보려 합니다. 2017 NIPS에서 Google이 소개했던 Transformer는 NLP 학계에서 정말 큰 주목을
nlpinkorean.github.io
'데이터분석 공부 > NLP' 카테고리의 다른 글
[NLP] Transformer① (1) | 2023.02.03 |
---|