머신러닝&딥러닝

Deep Learning #7 Transformer

seungbeomdo 2023. 3. 5. 00:36

1. Transformer의 도입

1.1. Transformer의 아이디어

  • 이전 포스팅에서 Attention에 대해서 다루었다. 그런데 Attention을 공부하다보면, 결국 RNN처럼 시퀀스 순서대로 인풋들을 받을 필요가 있을까, RNN 구조를 유지하는 것이 꼭 필요할까 하는 의문이 든다.

 

  • 왜냐하면 시퀀스 데이터에 RNN과 Encoder-Decoder를 사용했던 것은 단 하나의 인풋 벡터뿐 아니라 모든 인풋 시퀀스들을 고려하기 위함이었기 때문인데, Attention만을 사용하더라도 어차피 모든 인풋 시퀀스들에 적당한 가중치들을 두고 아웃풋을 만들어낼 수 있기 때문이다.

 

  • 그래서 그냥 Attention만을 사용하자! 라는 아이디어 하에서 등장한 모델이 있는데, 그게 바로 Transformer이다. Transformer를 처음 고안한 논문의 제목이 그 유명한 "Attention is All you Need"이다.

 

  • Transformer는 더이상 RNN의 자기순환적인 구조를 가지지 않는다. 대신 인코더와 디코더 파트에서 각각 N개의 인코더와 디코더들을 두며, 주어진 인풋 시퀀스를 순서대로가 아닌 한 번에 입력하는 방식이다.

 

https://wikidocs.net/31379

 

1.2. Positional Encoding

  • 그런데 이런 식으로 시퀀스를 무시해버리면 한 가지 문제가 생긴다. 시퀀스 데이터는 인풋 벡터가 주어진 순서가 중요한 정보로 사용되는데, 시퀀스를 무시하고 한 방에 인풋 벡터들을 집어넣었으므로 순서를 고려하기 위해서는 다른 요소들도 필요하다. 이 역할을 해주는 것이 포지셔널 인코딩이다.

 

  • 포지셔널 인코딩이란, 인풋 벡터들을 입력할 때, 각 인풋 벡터가 시퀀스에서 차지하는 위치 정보를 합해서 함께 입력해주는 방식이다. 

2. Encoder

  • 그럼 이제 Transformer의 인코더-디코더는 어떻게 생겼는지 뜯어보자. 첫번째는 인코더 파트이다. 인코더 파트는 Multi-Head-Attention과 Feed-Forward, 그리고 Add&Norm으로 구성돼있다. 말이 복잡하지만 별 것 아니다.

 

2.1. Self-Attention & Multi-Head-Attention

  • 먼저 멀티 헤드 어텐션을 다루려고 하는데, 그러려면 셀프 어텐션을 먼저 이해해야 한다. 셀프 어텐션이란 인풋 시퀀스를 구성하는 벡터들 간의 유사도를 계산하는 것이라고 이해하면 조금 편하다. 

 

  • 이전 포스팅에서 Attention을 설명할 때에는, 현재 시점의 디코더 히든 스테이트가 Query, 모든 인코더 히든 스테이트가 Key, 그리고 Key와 Query의 유사도를 계산하기 위해 내적해 얻은 값을 Value라고 했다. 셀프 어텐션에서는, 인풋 시퀀스를 구성하는 각각의 인풋 벡터들이 Query이면서 동시에 Key가 된다. 

 

  • 여기서는 RNN이 아니므로, 인풋 벡터의 히든 스테이트들 간의 관계가 아니라 인풋 벡터에 뉴럴넷의 가중치 행렬을 곱한 값(activation value) 간의 관계가 된다. 그리고 각각의 인풋 벡터들의 activation value들을 다른 인풋 벡터들의 activation value와 내적해 유사도를 모두 계산하고, 그 유사도에 따라 가중치합한 결과로 어텐션의 아웃풋을 얻는다.

 

  • 셀프 어텐션을 통해서 시퀀스 내에서 각 인풋 벡터들이 갖는 관계 정보를 포착할 수 있다고 한다.

 

  • 그런데 셀프-어텐션을 하면 한 가지 문제가 있는데, 확률적으로 생성된 가중치 행렬 하나만 가지고 해서는 관계를 명확하게 파악할 수 없다는 것이다. 따라서 여러개의 셀프 어텐션을 동시에 수행해서 얻은 어텐션 아웃풋들을 concate한 것을 최종적인 어텐션 아웃풋으로 사용한다. 이게 멀티 헤드 어텐션이다.

https://wikidocs.net/31379

 

2.2. Feed-Forward & Add-Norm

  • 멀티 헤드 어텐션을 거친 후에는 익숙한 Feed-Forward 과정을 거친다. 

 

  • Add란 Feed-Forward를 거치기 이전의 값과, Feed-Forward를 거쳐서 얻은 값을 더하는 것을 다음 레이어의 인풋으로 사용하는 것을 말한다.
  • Norm은 그냥 정규화를 의미한다.

3. Decoder

  • 다음으로는 디코더가 어떻게 굴러가는지 알아보자. 디코더 파트는 Masked Multi-Head-Attention과 Encoder-Decoder-Attention, 그리고 Feed Forward, Add&Norm으로 구성된다. Feed Forward와 Add&Norm은 인코더 파트의 그것과 동일하므로 생략한다.

 

3.1. Masked Multi-Head-Attention

  • 트랜스포머에서 인코더와 디코더는 각각 N개씩 존재한다고 했다. N개의 인코더들을 거쳐 얻어진 출력값은, N개의 디코더들에 모두 한 번씩 참조된다. 따라서 주어진 현재 시점의 디코더에서 인풋은, 인코더에서의 아웃풋과 이전 시점 디코더의 아웃풋이 된다.

 

  • 그리고 인코더와 동일하게 멀티헤드 어텐션이 수행된다. 이때 Masked가 붙은 것은 다음의 이유 때문이다. train 과정에서는 모든 인풋 시퀀스가 주어져있지만, test를 할 때는 인풋 시퀀스에서 현재 단계 이전까지만 라벨이 주어져있다. train과 test의 조건이 동일하도록 하기 위해서, 현재 단계 이후의 시퀀스 값들은 음의 무한대값을 취한 상태로 멀티헤드 어텐션을 수행한다. 즉 이후의 시퀀스들은 학습시에 고려하지 않도록 하는 것이다.

 

3.2. Encoder-Decoder-Attention

  • 인코더-디코더 어텐션은 디코더 파트에서 이루어지는 멀티 헤드 어텐션이다. 하지만 인코더에서의 멀티 헤드 어텐션이나, 디코더에서의 masked 멀티 헤드 어텐션과의 차이점은 다음과 같다. 

 

  • 인코더-디코더 어텐션은 Key와 Value가 Encoder에서 얻어지고, Query는 주어진 디코더에서의 Masked 멀티 헤드 어텐션의 아웃풋이 된다. 즉 masked 멀티 헤드 어텐션과 인코더의 출력값 간의 유사도를 비교해서 얻은 가중치로 어텐션을 수행하는 것이다.

 

 

 

 

 

 

'머신러닝&딥러닝' 카테고리의 다른 글

F1-score와 AUC는 왜 필요한데?  (0) 2024.03.16
Confusion matrix란  (2) 2024.03.16
Deep Learning #6 Attention  (0) 2023.03.02
Deep Learning #5 NLP의 개요  (0) 2023.02.28
Deep Learning #4 RNN(순환신경망)  (0) 2023.02.23