본문 바로가기
IT 지식/인공지능_딥러닝

자연어 처리 : 트랜스포머

by 이민우 2021. 2. 22.
728x90
반응형

출처 : 동빈나 유튜브

www.youtube.com/watch?v=AA621UofTUA&t=44s

 

*해당 글은 학습을 목적으로 위의 포스팅 내용 중 일부 내용만을 요약하여 작성한 포스팅입니다.

 상세한 내용 및 전체 내용 확인은 위의 링크에서 확인하실 수 있습니다.

 

 

Transformer (Attention is all you need)

  • Tranformer는 Attention을 메인 아이디어로 활용한 모델이다.
  • 2021년 기준으로 최신 고성능 모델들은 Transformer 아키텍처를 기반으로 하고 있다.
  1.  GPT : Transformer의 디코더 아키텍처를 활용했다.
  2.  BERT : Transformer의 인코더 아키텍처를 활용했다.
  • Transformer의 등장 기점으로 자연어 처리 태스크에서 RNN 기반의 아키텍처를 잘 사용하지 않게 되었다. 물론 완전히 사용하지 않는다는 의미는 아니다.
  • Transformer는 RNN, CNN 등을 전혀 필요로 하지 않고, 오로지 Attention 기법만을 사용해 기계 번역부터 모든 자연어 처리가 가능하다.

 

 

 

기존의 Seq2Seq 모델들의 한계

 

www.youtube.com/watch?v=AA621UofTUA&t=44s

  • context vector v에 소스 문장의 정보를 압축한다. 이는 병목 현상이 발생하여 성능 하락의 원인이 된다.
  • 디코더가 context vector를 매번 참고하는 방법으로 해결할 수 있으나, 이 또한 여전히 소스 문장을 하나의 벡터에 압축해야 한다.

 

 

-그렇다면 매번 소스 문장에서의 출력 전부를 입력으로 받으면 어떨까?

-최신 GPU의 많은 메모리와 빠른 병렬 처리 지원은 이 생각을 실현 가능하게 만들었다.

 

 

 

 

www.youtube.com/watch?v=AA621UofTUA&t=44s

  • 어텐션 메커니즘은 위의 아이디어를 실제로 구현했다.
  • Seq2Seq 모델에 어텐션 매커니즘을 추가해, 디코더는 인코더의 모든 출력을 참고한다.
  • 디코더는 매번 인코더의 모든 출력 중 어떤 정보가 중요한지를 계산하여, 중요한 정보만을 선택해 활용한다.

 

*에너지 : 매번 디코더가 출력 단어를 만들 때마다 모든 j를 고려하는 것.

*가중치 : 에너지를 softmax를 통해 가장 필요로 하는 인코더 정보를 선별하는 것.

 

  • 이러한 어텐션 메커니즘을 사용하면 성능이 좋아질 뿐 아니라 어텐션을 시각화 할 수 도 있다.

 

 

 

 

Transformer

Attention is All You Need (NIPS 2017)

  • 트랜스포머는 RNN이나 CNN을 전혀 사용하지 않는다.
  • 그렇다면 문장 안에 포함된 단어에 대한 순서를 어떻게 파악할까?
  • 이를 해결하기 위해 대신 Positional Encoding을 사용한다.

 

  • 트랜스포머는 BERT와 같은 향상된 네트워크에서도 채택한 아이디어이다.
  • 트랜스포머는 인코더와 디코더로 구성되어, Attention 과정을 여러 레이어에서 반복한다.

 

 

 

트랜스포머의 동작 원리

 

1) 인코더

Encoder

  • RNN 사용 시 데이터가 모델이 들어갈 때 각 단어가 순서에 맞게 들어가기에 자동적으로 순서에 대한 정보를 갖는다.
  • 하지만 트랜스포머는 RNN을 사용하지 않기에 위치 정보를 포함하는 임베딩을 사용해야 한다. 
  • RNN이 문장의 각 단어를 임베딩하여 입력값으로 활용했다면, Transformer는 문장 전체를 임베딩하여 입력값으로 활용한다.
  • 이 때 위치 정보의 전달을 위해 트랜스포머는 Positional Encoding을 사용한다.
  • 각 단어에 대한 위치 정보를 가진 데이터를 추가함으로써 위치 정보를 별도로 기억하는 방법이다.
  • Positional Encoding은 주기 함수를 활용한 공식을 사용하여, 각 단어의 상대적인 위치 정보를 네트워크에 입력한다.

positional encoding

 

  • 이후 임베딩한 각각의 단어를 MHA에 넣어 Attention을 수행한다.
  • 이렇게 인코더 파트에서 시행한 Attention을 Self Attention이라고 한다.
  • 위의 예시와 같이 각 단어들이 서로에 대한 연관성을 Attention을 계산하여 알 수 있다.

 

  • 또한 추가적으로 Residual Learning (잔여 학습)을 사용하여 성능을 향상시켰다.
  • 특정 레이어를 건너뜀으로써 기존 정보를 포함하여 잔여된 부분만 학습하여 학습 난이도가 낮고 초기의 모델 수렴속도가 높고 Global optima를 찾기 좋아진다.

 

  • 이후 정규화를 한 후 FeedForwarding을 거치고 다시 정규화를 함으로써 인코더 레이어에서 정보 값을 추출한다.
  • 여기서 각각의 레이어는 서로 다른 파라미터를 가진다.

 

 

2) 디코더

Attention is All You Need (NIPS 2017)

  • 가장 마지막 인코더 레이어에서 나온 출력 값을 입력으로 받는다.
  • 디코더는 매번 출력마다 입력 소스 문장 중 초점을 두어야하는 단어를 찾는다.
  • 디코더도 마찬가지로 여러 개의 레이어로 구성되어 있다. 그리고 모든 레이어는 인코더의 마지막 출력 값을 입력으로 받는다.

 

  • 하나의 디코더 레이어는 두 개의 어텐션을 사용한다.
  • 첫 어텐션은 인코더의 어텐션과 마찬가지로 입력값에 대해 각 단어들의 가중치를 찾는 Self-Attention이다.
  • 두 번째 어텐션은 인코더의 정보에 대해 Attention을 수행한다.
  • 두 번째 어텐션을 Encoder-Decoder Attention이라 부른다.

 

*굳이 마지막 인코더 레이어에서 나온 값이 아니라, 인코더의 각 레이어에서 나온 출력값을 받는 방법도 있다.

 

 

 

 

 

Transformer의 Multi Head Attention

https://www.youtube.com/watch?v=AA621UofTUA&t=714s

  • 어텐션은 각 단어가 다른 단어와 얼마나 연관성이 있는지를 조사한다.
  • 이를 위해 쿼리, 키, 밸류 를 입력으로 받는다.
  • 쿼리는 무언가를 물어보는 주체 ( I )
  • 는 물음을 받는 주체 ( I, am, a, teacher)
  • 쿼리는 각각의 키에 대한 어텐션 스코어를 구해오는 방식으로 동작한다.
  • 어텐션 스코어는 Q와 K로 구한 확률값을 V와 곱하여 최종 어텐션 스코어를 얻는다.
  • 이를 Scaled Dot Product Attention이라 한다.

 

  • Multi Head Attention (MHA)는 위의 연산을 h번의 서로 다른 V, K, Q로 구분하여 연산을 수행하는 것이다.
  • h개의 서로 다른 attention 컨셉을 학습함으로써 더욱더 구분된 다양한 특징들을 학습하도록 유도한다.
  • 인코더와 디코더는 Multi-Head Attention 레이어를 사용한다.

 

  • 이후 서로 다른 attention score을 구해 concat해서 일자형으로 붙이고 Linear을 거쳐 출력한다.
  • 결과적으로 입력값과 출력값의 차원을 같게 만들어주는 과정이다.

 

  • MHA는 어디서 사용되던 같은 메카니즘으로 동작하지만, 사용되는 위치마다 K, Q, V를 어떻게 사용하는 지가 다르다.
  • EX) 인코더-디코더 어텐션에서는 디코더의 출력이 Q이고, 인코더의 출력들이 K와 V가 된다.

 

*root(d(k))는 softmax의 특성상 0 근처의 값의 기울기 손실 문제를 방지하기 위해 스케일링을 해주는 벡터이다.

 

*트랜스포머에는 세 가지 종류의 어텐션이 존재한다.

 Encoder Self-Attention : 인코더의 입력 단어들이 서로에 대해 연관성을 계산하는 과정

 Masked Decoder Self-Attention : 디코더의 단어들이 먼저 등장한 단어들에 대해서 연관성을 계산한다.

 Encoder-Decoder Attention : 디코더가 인코더의 어텐션 밸류들에 대해 연관성을 계산한다.

*Self Attention은 인코더와 디코더 모두에서 사용된다.

*그럼으로써 매번 입력 문장에서 각 단어가 다른 어떤 단어와 연관성이 높은지 계산할 수 있다.

 

 

 

 

 

트랜스 포머의 동작 원리 (하나의 단어)

 

1) 하나의 단어를 임베딩한 후 Linear 레이어를 거쳐 쿼리, 키, 밸류를 생성한다.

2) 생성한 값들로 어텐션 벨류를 구한다.

https://www.youtube.com/watch?v=AA621UofTUA&t=714s

 

*실제로는 이렇게 별도로 한 단어씩 하는 게 아니라, 행렬 곱셈 연산을 이용해 문장 전체를 한꺼번에 연산할 수 있다.

https://www.youtube.com/watch?v=AA621UofTUA&t=714s

 

3) Concat을 거쳐 차원의 수를 동일하게 유지한다.

https://www.youtube.com/watch?v=AA621UofTUA&t=714s

 

 

*마스크 행렬(Mask Matrix) : 마스크 값으로 음수 무한의 값을 넣어 softmax의 출력값을 0에 가깝게 한다.

*특정 단어들을 참고하지 않도록 만들기 위해 사용하는 방법이다.

 

 


코드 : github.com/ndb796/Deep-Learning-Paper-Review-and-Practice/blob/master/code_practices/Attention_is_All_You_Need_Tutorial_(German_English).ipynb

728x90
반응형

'IT 지식 > 인공지능_딥러닝' 카테고리의 다른 글

[논문] DenseNet  (0) 2021.03.07
[논문] ResNet  (0) 2021.03.02
[논문] AlexNet  (0) 2021.02.27
Convolutional Neural Network (합성곱 신경망, CNN)  (0) 2021.01.27