트랜스포머에 대해서 복습.
일단 아래의 글을 보고 이해를 해본다.
인코더 부분
self attention layer는 특정 단어를 인코딩 하기 위해서,
특정 단어와 문장 내의 다른 단어의 관계를 보는 레이어
encoder-decoder attention는 디코더가 특정 시점에 디코드 하고 있는 단어와
관련된 정보를 입력 센텐스에서 뽑을 수 있도록 도와주는 레이어
self attention에서는 각 단어 끼리의 연관성을 계산하기 위해서 각 위치가 서로 의존하지만,
그 이후의 각 위치의 단어는 별도의 흐름을 가진다.
즉, 다른 단어 정보가 흘러가는 path에 의존하지 않음! 이 부분은 병렬 처리가 가능.
self attention을 계산하기 전에 입력 벡터로 부터 3개의 벡터(key, query, value)가 생성 된다.
생성을 위해 각각의 FC Layer(W_Q, W_K, W_V)가 필요하다.
Key, Query, Value를 구했다면,
특정 단어의 Query와 해당 단어를 포함한 다른 단어의 Key들과 내적을 구해서 어텐션 스코어를 얻는다.
이 어텐션 스코어는 해당 단어와 다른 단어들 간의 관계를 반영한다.
이후에 스코어를 8(루트64)로 나눠줌. 안정적인 그래디언트를 위함이라고 한다.
64는 K,Q,V의 차원을 의미함.
그 다음, 소프트맥스 레이어를 통과한 후 각 스코어를 0~1 사이의 확률로 변환해준다.
마지막으로 각 위치의 Value 들에 확률 값을 곱해준 뒤 합해준다.
이렇게 해당 단어의 인코딩 값을 얻게 된다.
멀티 헤드 어텐션? 여러 개의 (W_Q, W_K, W_V) 메트릭스 셋을 제공함으로써 더 다양한 관점을 가지도록 함.
즉, 각 입력 임베딩을 서로 다른, 다양한 서브스페이스에 뿌려준다(선형변환 해준다)
시퀀스(문장) 내의 단어의 순서 정보를 반영해주기 위해서 positional encoding을 추가해준다.
각 입력 벡터에 모델이 단어 위치를 학습(혹은 단어 간의 거리)하는데 도움을 주는 같은 차원의 벡터(특정 패턴을 갖는)를 더해준다.
인코더의 구조를 마스터했다.
디코더 부분
인코더의 아웃풋은 한 번 더 Key, Value 벡터로 변환되어
디코더의 encoder-decoder attention layer에서 사용된다!
이후에 각 디코더로 흘러 들어가
디코더가 입력 시퀀스의 적절한 위치의 정보를 활용할 수 있도록 도와준다.
디코더 부분의 self attention은 인코더에서와 살짝 다르다.
특정 위치의 단어를 인코딩 할 때, 그 단어 뒷 부분이 관여하지 않도록 해야한다.
따라서 특정 포지션 이후에 -inf를 넣어줌(마스킹)으로써 softmax 계산시 이후 위치가 무시되도록 해준다.
encoder-decoder layer는 바로 아래 레이어에서 받은 것을 Query를 생성하는데 사용하고,
Key, Value는 인코더의 아웃풋으로 얻어진 벡터를 이용한다. 동작은 multiheaded self-attention과 같음.
마지막으로, 디코더의 결과를 vocab 사이즈의 logit으로 변환시켜주는
FC Layer(Linear)와 소프트맥스를 거쳐 가장 적합한 단어를 선택하게 된다.
Implementation Details...
허깅페이스의 BERT 코드를 통해서 transformer의 encoder가 어떻게 구현되고 활용이 되고 있는지 배워볼 수 있다.
'DL&ML > concept' 카테고리의 다른 글
Under/overfit, Validation, Regularization, Dropout, Normalization, Ensemble etc. (0) | 2021.03.10 |
---|---|
Cross Entropy, KL-Divergence (0) | 2021.03.10 |
MAP(Maximum A Posterior) (0) | 2021.03.10 |
Likelihood & MLE(최대 우도 추정) (0) | 2021.03.10 |
One-shot learning (siamese network) (0) | 2020.10.23 |