Positional Encoding
![](https://velog.velcdn.com/images/chanu48/post/ac6c0cd3-79bc-4ff8-81b7-c1168e85f84f/image.png)
- 모든 위치값은 sequence의 길이나 input에 상관없이 모두 동일
- 예시에서 두 문장은 길이도 구성 단어도 다르지만, 위치 벡터는 모두 동일
Sin & Cos 함수
위치 벡터는 의미 정보가 변질되지 않도록 너무 큰 값을 가지면 안된다.
- Sin, Cos 함수는 -1 ~ 1 사이값을 가지며 조건을 만족
두 함수는 주기 함수이므로 토큰의 위치 벡터가 같아질 수 있다?
- positional encoding은 스칼라 값이 아닌, 벡터 값이다.
- 위치 벡터값이 같아지는 문제를 해결하기 위해, 다양한 주기의 sin & cos 함수를 동시에 사용
PE(pos,2i)=sin(pos/100002i/dmodel)
PE(pos,2i+1)=cos(pos/100002i/dmodel)
왜 Sin, Cos을 둘 다 사용할까?
- 한 함수만 사용한다면 단어 벡터들 사이의 차이가 매우 미미할 것이다.
- 서로 다른 frequency를 갖는 sin, cos 함수를 번갈아 이용해 충분히 다른 PE값을 갖게 함
Masking
![](https://velog.velcdn.com/images/chanu48/post/be93b9b6-333a-4a79-824d-76507e3a1488/image.png)
![](https://velog.velcdn.com/images/chanu48/post/c2a80366-fbb7-4313-88fb-7db9be7fb496/image.png)
![](https://velog.velcdn.com/images/chanu48/post/5552f652-e3c8-4451-bb4a-b38522f57357/image.png)
- 입력 문장에 토큰이 있는 경우 신경 쓰지 않기 위해 적용
- softmax 후 해당 값이 0으로 되며 단어간 유사도에 영향을 미치지 않게 함
look-ahead mask
디코더의 첫 번째 서브층(masked multi-head self-attention)에서 일어남
![](https://velog.velcdn.com/images/chanu48/post/739d81a2-600a-45d3-bc47-48e1ab30b8fd/image.png)
![](https://velog.velcdn.com/images/chanu48/post/e95f4f39-0678-45c9-a1f1-bcf7b6d47d54/image.png)
- 마스킹 된 후의 어텐션 스코어 행렬의 각 행을 보면 자기 자신과 그 이전 단어들만을 참고할 수 있음
💡 트랜스포머에는 총 세 가지 어텐션이 존재하며, 모두 multi-head attention을 수행하고,
multi-head attention 함수 내부에서 scaled dot-product attention 함수를 호출하는데 각 어텐션 시 함수에 전달하는 마스킹
1) 인코더의 self-attention : padding mask를 전달
2) 디코더의 첫번째 서브층인 masked self-attention : look-ahead mask를 전달
3) 디코더의 두번째 서브층인 encoder-decoder attention : padding mask를 전달