> For the complete documentation index, see [llms.txt](https://lswkim322.gitbook.io/til/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lswkim322.gitbook.io/til/til-ml/boostcamp/u-stage-dl-basic/08-sequential-models-transformer.md).

# (08강) Sequential Models - Transformer

> **Further Reading**
>
> * [Illustrated transformer (원글)](http://jalammar.github.io/illustrated-transformer/)
> * [Illustrated transformer (번역)](https://nlpinkorean.github.io/illustrated-transformer/)
> * [Pytorch official Transformer tutorial\ <br>](https://pytorch.org/tutorials/beginner/transformer_tutorial.html)
>
> **Further Questions**
>
> * Pytorch에서 Transformer와 관련된 Class는 어떤 것들이 있을까요?

## 1. Transformer

> * N개의 단어가 인코더에서 어떻게 한번에 처리가 되는지
> * 인코더와 디코더 사이에 주고받는 정보
> * 디코더가 어떻게 Generate(생성) 하는지

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MjcKlzGhHYe2bvmxTwS%2Fuploads%2FWTHetlKcZqZoibKqrmLo%2Fimage.png?alt=media\&token=b6ac0617-285f-410d-a648-132a703a544a)

* Encoder의 1개 Layer를 살펴보면 위 그림과 같다. **Self-Attention**과 Feed Forward Neural Network로 구성되어있다.
* Self-Attention은 한 개의 단어에 대해서 다른 단어와의 관계까지 고려하는 것이 핵심이다.

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MjcKlzGhHYe2bvmxTwS%2Fuploads%2Fw4W668qG4W9XCNjyf9Fq%2Fimage.png?alt=media\&token=d24055d2-509a-49b5-9253-1a2ad8285f98)

### 1.1. Self-Attention 구조

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MjcKlzGhHYe2bvmxTwS%2Fuploads%2FcX8NY4wkpNmtHN6qRvTJ%2Fimage.png?alt=media\&token=1bcb4e4b-7bc9-4a63-ac09-08430f90859a)

* 각 단어마다 Query, Key, Value 3개의 벡터를 만들고

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MjcKlzGhHYe2bvmxTwS%2Fuploads%2F74vyBW1g8a9Bb721pYy0%2Fimage.png?alt=media\&token=3e6db51f-82e1-4b9c-add8-d84b640d850e)

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MjcKlzGhHYe2bvmxTwS%2Fuploads%2F0JF0Oq5Mf3WwoEIXqdjV%2Fimage.png?alt=media\&token=ae04a3ed-831d-4797-99f6-76def116f720)

* 대상 단어의 Query와 나머지 각 단어의 Key를 내적한 Score 벡터를 각각 구한다.

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MjcKlzGhHYe2bvmxTwS%2Fuploads%2FNzkp1Bq4DY79Uq9OXgKc%2Fimage.png?alt=media\&token=42387991-ac79-44ab-bda1-bd29f872bfb9)

* Dimention의 크기(Key 벡터의 차원)로 나눠준다. 이는 값이 너무 커지지 않게 하기 위함이다.
* Softmax -> Attention Weight
* Value 벡터와 Weighted Sum 한 값이 최종 encoding vector가 된다.  &#x20;

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MjcKlzGhHYe2bvmxTwS%2Fuploads%2FDknpORHSU6TMzTjuJh5L%2Fimage.png?alt=media\&token=aec2a7ca-f0c9-43b8-aeff-39c4e21cedba)

❓왜 Transformer가 추정이 잘 될까?

* CNN, MLP를 할 경우 Input이 Fix되면 Output도 Fix 된다.
* Transformer는 Input이 Fix되더라도 주위의 단어에 따라 Output이 달라진다.=> Flexible 하여 더 많은걸 표현하게 된다.

❕ check

* n개의 단어가 주어지면 nxn개의 Matrix가 필요하고 이를 한번에 처리할 수 있어야한다.

**✔ Multi-headed Attention (MHA)** 위 single-attention의 과정을 n번 진행하는 것이다. 하나의 encoding된 vector에 대해 n개의 query, key, value vector를 만드는 것. 이 논문에서는 8개의 attention head를 가진다.

* 동일한 seq가 주어지더라도 다른 기준으로 여러 지표를 뽑아와야할 필요가 있을 수 있다. 예를 들어 "나는 학교에서 공부를 했다." "나는 집에 와서 휴식을 취했다." 라는 문장이 있을 때 "나"에 대해 위치정보(학교, 집)의 정보가 중점이 될 수 있고, 행동("공부", "휴식")의 정보가 중점이 될 수 있다.

![](https://lswkim322.gitbook.io/~/files/v0/b/gitbook-28427.appspot.com/o/assets%2F-MjcKlzGhHYe2bvmxTwS%2F-Mk5NJC2FocES-rPOgYb%2F-Mk5NLSfkVSvRixx0CNQ%2Fimage.png?alt=media\&token=56dcc1a6-4f36-4722-bf85-dd6bf9a5ca10)

* 생성된 8개의 head-attention을 concat하여 합치고 이를 원하는 출력의 차원으로 선형변환하는 $$W^O$$를 행렬곱을 하여 Z를 구해낸다.

### 1.2. Decoder

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MjcKlzGhHYe2bvmxTwS%2Fuploads%2FZmnFsCZO43SZmBOdy0Hj%2Fimage.png?alt=media\&token=889e99d8-15d2-4c78-8f20-ce8a5b192a8f)

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MjcKlzGhHYe2bvmxTwS%2Fuploads%2FYSlBW5Wwud9xZmMrCZFH%2Fimage.png?alt=media\&token=57b2596d-21f1-43eb-9e3b-d53d2d73c916)

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MjcKlzGhHYe2bvmxTwS%2Fuploads%2F2uIe5iQ1n82GGyOItnLK%2Fimage.png?alt=media\&token=2cea7285-9055-49c3-816e-d99ce91af42a)

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MjcKlzGhHYe2bvmxTwS%2Fuploads%2F8mXxFnC2Zi2cl4m6ppqz%2Fimage.png?alt=media\&token=497d362d-0d97-4f9c-b7ae-fae8c7d848bd)

* 학습 단계에서는 마스킹하는 작업을 하여 미래의 정보를 사용하지 않도록 한다.

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MjcKlzGhHYe2bvmxTwS%2Fuploads%2FEePZrjGq4g2Lsn6DaQZc%2Fimage.png?alt=media\&token=6de03284-5ad3-4f1d-9035-a2f28eee2f3f)
