0. 주의사항

논문을 설명하려면 연재가 수십회 이어져야할것같기 때문에 논문을 다 읽고 이해한 사람 기준으로 설명한다.

한마디로 뭐하는건지 모르겠다 싶으면 논문을 봐야하는 불친절한 연재이다.

https://github.com/Mids/TransformerProect/blob/master/Transformer.py


1. Encoder 구현


viewimage.php?id=2ab4c42ef0d0&no=24b0d769e1d32ca73ced82fa11d02831fe384ecd5bf5471a0304a0eb0c93158624431c1ad6cb4c45401eab9288a8cac5e0f3345940cb9377c273839706fca6897e72

이 사진 보고 구현할거다


- Input Embedding


인풋 문장을 텐서로 바꿔준다. 구현은 안하고 토치에 있는 함수를 쓴다.

우리가 구현할건 문장이 텐서보다 짧을때 쓸모없는 뒷부분을 마스킹해주는 부분이다.


viewimage.php?id=2ab4c42ef0d0&no=24b0d769e1d32ca73ced82fa11d02831fe384ecd5bf5471a0304a0eb0c93158624431c1ad6cb4c45401eab9288a8cac5e0f3345940cb9025c62387cc06a0a689aa40


Q와 K의 사이즈를 읽어와서



소년

pad

pad

I

o

o

x

x

am

o

o

x

x

a

o

o

x

x

boy

o

o

x

x

pad

o

o x x


이런 느낌으로다가 오른쪽 여백에만 패딩을 씌워주기위한 코드다.

아래는 안씌우는 이유는 어차피 영향이 없기 때문이고 나중에 softmax할때 이상해진다고 한다.

어렴풋이 왜 안해주는지 이해는 했는데 설명은 못하겠다.

하라는대로 하자.


- Positional Encoding


인풋 문장의 각 단어의 위치를 sinusoid_table에 따른 값으로 바꿔준다.

논문을 보면


viewimage.php?id=2ab4c42ef0d0&no=24b0d769e1d32ca73ced82fa11d02831fe384ecd5bf5471a0304a0eb0c93158624431c1ad6cb4c45401eab9288a8cac5e0f3345940cbc026972185ca03aaa68948b8

이렇게 하라고 되어있다.


viewimage.php?id=2ab4c42ef0d0&no=24b0d769e1d32ca73ced82fa11d02831fe384ecd5bf5471a0304a0eb0c93158624431c1ad6cb4c45401eab9288a8cac5e0f3345940cb96229721879851a1a68968fb


이렇게 구현해줬다.

짝수는 sine, 홀수는 1빼고 cosine 넣어주는 느낌

왜 저렇게 하는지는 나도 정확하게는 이해 못했다. 뭐 학습된 길이보다 길어도 잘 동작하고 어쩌고 저쩌고~

구글이 낸 논문인데 까라면 까는거지 뭐...

무조건 내 잘못임


- Layer 6번 돌려주기

논문에 6번 돌렸다고 돼있으니 똑같이 해준다.

viewimage.php?id=2ab4c42ef0d0&no=24b0d769e1d32ca73ced82fa11d02831fe384ecd5bf5471a0304a0eb0c93158624431c1ad6cb4c45401eab9288a8cac5e0f3345940cb90249074819d02a8a6897574

잘 살펴보면 처음에 포지션 인코딩의 마스킹작업을 해주고

outputs에 임베딩된 인풋과 마스킹된 포지션 인코딩을 더해서 넣어준다.

어텐션 마스킹도 패딩추가된거로다가 하나 넣어주는데 이 때 인코더에서는 Q, K, V가 모두 같으므로(Self Attention) 그냥 inputs 두개 넣어주면 된다.

학습된 결과 저장해줄 공간도 하나 마련해주고 레이어 6번 돌리면 된다.

layer_length 같은 상수들은 코드 초반에 다음과 같이 정의해놨다.


# Global variables for configuration
input_vocab_length = 10000 # TODO: Temp vocab data length
encoder_sequence_length = 256
decoder_sequence_length = 256
hidden_depth = 256
layer_length = 6

아직 인풋이 없으니 사이즈는 임의로 넣어놓고 나중에 받아오는 부분 구현할때 바꿔줄 생각이다.



덧. 디씨 글 버그 고침