0. 주의사항
논문을 설명하려면 연재가 수십회 이어져야할것같기 때문에 논문을 다 읽고 이해한 사람 기준으로 설명한다.
한마디로 뭐하는건지 모르겠다 싶으면 논문을 봐야하는 불친절한 연재이다.
https://github.com/Mids/TransformerProect/blob/master/Transformer.py
1. Encoder 구현
이 사진 보고 구현할거다
- Input Embedding
인풋 문장을 텐서로 바꿔준다. 구현은 안하고 토치에 있는 함수를 쓴다.
우리가 구현할건 문장이 텐서보다 짧을때 쓸모없는 뒷부분을 마스킹해주는 부분이다.
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에 따른 값으로 바꿔준다.
논문을 보면
이렇게 하라고 되어있다.
이렇게 구현해줬다.
짝수는 sine, 홀수는 1빼고 cosine 넣어주는 느낌
왜 저렇게 하는지는 나도 정확하게는 이해 못했다. 뭐 학습된 길이보다 길어도 잘 동작하고 어쩌고 저쩌고~
구글이 낸 논문인데 까라면 까는거지 뭐...
무조건 내 잘못임
- Layer 6번 돌려주기
논문에 6번 돌렸다고 돼있으니 똑같이 해준다.
잘 살펴보면 처음에 포지션 인코딩의 마스킹작업을 해주고
outputs에 임베딩된 인풋과 마스킹된 포지션 인코딩을 더해서 넣어준다.
어텐션 마스킹도 패딩추가된거로다가 하나 넣어주는데 이 때 인코더에서는 Q, K, V가 모두 같으므로(Self Attention) 그냥 inputs 두개 넣어주면 된다.
학습된 결과 저장해줄 공간도 하나 마련해주고 레이어 6번 돌리면 된다.
layer_length 같은 상수들은 코드 초반에 다음과 같이 정의해놨다.
input_vocab_length = 10000 # TODO: Temp vocab data length
encoder_sequence_length = 256
decoder_sequence_length = 256
hidden_depth = 256
layer_length = 6
아직 인풋이 없으니 사이즈는 임의로 넣어놓고 나중에 받아오는 부분 구현할때 바꿔줄 생각이다.
덧. 디씨 글 버그 고침
밥먹고 와서 Encoder Layer도 마저 짜서 올리겠음
잘 보려고 했는데 정작 논문링크가 안달려있어서 직접 찾아옴.
https://arxiv.org/abs/1706.03762
이제 잘 봐야지0