0. 들어가기 전에
디코더 만들다보니까 인코더에서 이상한 점들이 몇개 보여서 싹 수정함.
이전 연재글에서 이상한점은 코드에서는 고쳐져있을겁니다.
https://github.com/Mids/TransformerProject/blob/master/Transformer.py
1. 구현
인코더와 거의 비슷하다.
차이점을 위주로 설명하자면
첫번째의 self attention에서는 마스킹을 다르게 한다.
이게 디코더의 Masked Attention인데
I | am | a | boy | pad | pad | pad | |
I | o | x | x | x | x | x | x |
am | o | o | x | x | x | x | x |
a | o | o | o | x | x | x | x |
boy | o | o | o | o | x | x | x |
pad | o | o | o | o | x | x | x |
pad | o | o | o | o | x | x | x |
pad | o | o | o | o | x | x | x |
이런느낌으로다가 전에 하던 패딩의 오른쪽 추가된거에서 대각선으로도 마스킹을 넣어준다.
이로써 디코더가 "아직 모르는 상태"인 단어에 대해서는 attention을 구하지 않게 학습된다.
두번째 어텐션에서는 지금까지 Self Attention만을 이용했던것과는 다르게 인코더의 key와 value값을 이용한다.
Query는 첫번째 어텐션의 결과물
Key, Value는 인코더의 결과물이다.
나머지는 같다고 보면 된다.
댓글 0