본문 바로가기
BOOSTCAMP AI TECH/4주차_자연어 처리

[BOOSTCAMP AI TECH] 19일차_Transformer

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

강의 목록

  • Transformer1
  • Transformer2

  • 요약

강의

Transformer 관련 학습 진행

 

피어세션

어제자 학습 내용 복습


  • 학습정리

Transformer

http://jalammar.github.io/illustrated-transformer/

  • LSTM이나 GRU의 성능을 개선한 Seq2Seq 모델.
  • 자연어를 입력받아 자연어를 출력하는 데 사용되는 모델로, 2017년 'Attention is all you need'에서 나온 모델이다.
  • 기존의 인코더-디코더 구조를 따르면서도, 어텐션만으로 이를 구현했다.
  • 즉, 어텐션을 기존의 RNN을 보조하기 위한 용도가 아닌, 인코더, 디코더의 역할로 사용한다.
  • N개의 인코더와 N개의 디코더로 구성된다

*Query : t 시점의 디코더 셀에서의 은닉 상태. 다른 INPUT 데이터와의 유사도 판별 기준

*Keys : 모든 시점의 인코더 셀의 은닉 상태. 특정 기준 INPUT 데이터와의 내적을 통해 유사도 측정

*Values : 모든 시점의 인코더 셀의 은닉 상태. 가중치를 실제로 적용하는 재료 벡터

 

 

Positional Encoding

https://wikidocs.net/31379

  • 트랜스포머의 입력은 RNN과 달리 순차적으로 입력을 받지 않는다.
  • 그래서 단어위 위치 정보를 RNN처럼 얻지 못하고, 이로 인해 단어의 위치 정보를 다른 방식으로 알려줄 필요가 있다.
  • 단어의 위치 정보를 얻기 위해 각 단어의 임베딩 벡터에 위치 정보들을 더하여 모델의 입력으로 사용하는데, 이를 포지셔널 인코딩이라 한다.
  • 위치 값을 만들기 위해 사인 함수와 코사인 함수를 사용한다.

 

 

Transformer의 Self Attention

  • 해당 시점에서 예측해야 할 단어와 연관이 있는 입력 단어에 더 집중하기 위해 붙여진 이름이다.
  • 각 입력 단어가 Self-Attention Layer를 거치며 각 입력 단어 별로 전체 시퀀스 데이터를 잘 반영한 Encoded 벡터를 출력한다.
  • 위의 경우 3개의 입력 단어로 이루어진 Sequence가 주어졌다.
  • I word에 해당하는 벡터가 seq2seq의 decoder에서 각 time step에서 출력되는 hidden state과 같은 역할을 해서 우리가 찾고자 하는 정보를 지니는 vector가 된다.
  • I, go, home 벡터는 인코더의 각 time step에서 만들어진 Hidden State 벡터와 같은 역할을 해서 input vector와의 내적을 통해 유사도를 구한다. 거기에 softmax를 취해 가중치를 만들고, 가중합을 계산한다.
  • 이 과정을 동일한 Set에서 수행하게 만들었는데, 이를 Self-Attention이라고 한다.

 

  • 셀프 어텐션은 기본적으로 Qeury, key, vaslue가 동일한 경우를 말한다.
  • 하지만 인코더-디코더 어텐션에서는 Query가 디코더의 벡터인 반면 K와 V는 인코더의 벡터이다. (사실상 셀프 어텐션이 아니다.)

*Input과 Encoded의 Sequence Length는 동일한다.

 

 

Scaled Dot-Product Attention

  • 단일 쿼리에서의 계산은 위와 같다. 하지만 다중 매트릭스를 받은 경우 다음과 같은 연산을 수행해야 한다.

http://jalammar.github.io/illustrated-transformer/

 

  • Self attention은 모든 q, k간의 내적을 저장해야 하기에 RNN보다 많은 메모리가 필요하다.
  • RNN은 h_t-1을 계산한 후 h_t를 계산할 수 있기에 병렬 처리가 불가능하지만, Self Attention은 어느 자리에서의 단어든 k, v로 계산하기에 정보를 한 번에 가져올 수 있다.

 

  • d(k) : 트랜스포머 연산은 특정 키 벡터와 쿼리 벡터의 연산으로 진행된다. 그리고 그 내적 값은 언제나 스칼라값으로 나오긴 하지만 연산에 참여하는 키 벡터와 쿼리 벡터의 차원의 수

 

 

Scaled Dot-Product Attention의 문제점

  • d(k)가 커지면 𝑞 𝑇k가 증가한다.

Transformer : Multi-Head-Attention

http://jalammar.github.io/illustrated-transformer/

  • Self Attention 모듈을 더 유연하게 확장한 모델
  • Self Attention 모듈은 Q, K, V를 입력으로 주면 각 벡터들을 선형 변환을 한 후 각각의 쿼리 벡터에 대해 키-벨류 벡터에 대한 어텐션 및 가중합(W)을 통해 각 쿼리 벡터에 대한 인코딩된 벡터 출력값을 얻게 된다.

 

  • Multi-Head-Attention은 이러한 연산을 병렬적으로 h번 하는 것이다.
  • 그럼으로써 여러 버전의 행렬들을 만든다.
  • 예를 들어 i 번째 어텐션에서는 QW(i), KW(i), VW(i)에 대한 어텐션 벡터를 얻게 된다.
  • 이렇게 여러 버전의 동일한 쿼리 벡터에 대한 서로 다른 버전의 인코딩 벡터를 얻어, concat하여 해당 쿼리 벡터에 대한 인코딩 벡터를 최종적으로 획득하게 된다.
  • 여러 버전의 언텐션을 수행하기 위한 선형 변환 매트릭스들을 head라고 부르는데, 다수의 버전의 어텐션을 수행한다는 의미로 Multi-Head-Attention이라고 부른다.

 

  • 동일한 시퀀스가 주어졌을 때 서로 다른 기준으로 여러 측면에서의 정보를 얻어야 하는 경우가 존재한다.
  • ex) 나는 학교에서 축구를 했다. 그리고 집에 가서 공부를 했다.
  • => 행동 측면 : 축구, 공부 / 장소 측면 : 학교, 집
  • 멀티헤드어텐션은 이러한 경우를 위해 사용하게 된다.

 

 

MHA Transformer 구동

  • 8개 헤드에서 각각 3차원 output을 얻으면 전부 concat 해서 24차원으로 만든다.
  • 그리고 선형 변환을 수행해서 최종 output Z를 얻는다.

 

  • RNN과 attention의 complexity per layer를 봤을 때 d는 하이퍼 파라미터를 건드려서 손볼 수 있지만, 입력 n은 가변적이므로 Self-Attention은 메모리를 더 요구한다.
  • 하지만 self-attention은 한 번에 벡터들을 행렬곱으로 표현하기에 gpu가 무한이라는 가정 하에 O(1)로 처리한다. RNN은 동시에 처리하지 못하고 하나하나 타임 스텝을 진행하고 넘겨받기에  O(n)이 소모된다.
  • 즉, 트랜스포머의 self-attention은 RNN보다 학습이 빠르지만 메모리가 많이 소모된다.
  • 어텐션은 O(1)이지만 RNN은 길이만큼 거쳐야 하기에 O(n)

 

 

Transformer : Block-Based Model

  • MHA를 핵심 모듈로 사용하고, 추가적인 모듈을 덧붙인 모델.
  • ADD : CNN의 Residual Connection을 본따 처음 초기값과 연산처리 후의 값을 더함으로써 경사도 손실을 해결하고 안전성을 갖춘다.
  • Norm : 주어진 다수의 샘플에 대해 평균을 0, 분산을 1로 만든 후 원하는 평균과 분산을 주입할 수  있도록 하는 선형변환으로 이루어졌다.
  • Feed Forward : 추가적인 완전 연결층을 통과시켜 각 단어의 인코딩 벡터를 변환한 후 다시 Add&Norm 수행

 

 

Transformer : Positional Encoding

http://nlp.seas.harvard.edu/2018/04/03/attention

  • input 문장의 단어 순서의 순서를 바꿔도 출력은 동일한 결과가 나온다.
  • 이는 가중치 평균을 이용하기 때문인데, 순서를 고려하기 않고 단어들의 집합에서 연산을 수행하는 것과 같다.
  • Position encoding은 각 순서를 규정, 특정짓기 위해 순서를 벡터에 상수를 더해 저장하는 방식이 아니라, 사인, 코사인같은 주기 함수를 사용한다.
  • 차원의 갯수만큼 다른 사인, 코사인 값을 갖게 함으로써 sin/cos으로 그린 PE 그래프를 그려볼 수 있다.

 

  • 내가 사고를 치자 어머니께서 '너 때문에 내가 못 산다.'고 하셨다.
  • 위 문장에서 앞의 '내'와 뒤의 '내'는 word2vec 시키면 같은 값을 가진, 즉 같은 의미의 단어로 처리된다.
  • 이를 막기 위해 단어의 순서도 함께 기억하는 방법이다.

 

 

Transformer : Warm-up Learning Rate Scheduler

  • adam 등의 과정을 통해 최적화과정에서 하이퍼 파라미터인 learning rate의 값을 학습중에 적절히 변경하여 성능을 개선한다.
  • gradient descent를 진행할 때 기울기의 절대값이 크면 작은 lr을 줘서 보폭이 너무 크지 않게하고, 완만한 경사에서는 lr을 점점 올려 보폭을 늘려준다.
  • 추가적으로 정답의 근처에 도달하면 큰 lr은 큰 보폭으로 시간과 cost를 증가시키기에 iter에 비례해서 lr을 줘야 한다.

 

 

Transformer: High-Level View

  • RNN을 완벽하게 대체했다.

 

Transformer: Encoder Self-Attention Visualization

  • 입력값은 자기 자신의 정보를 좀 더 가져가며 다음 예측 단어들을 가르킨다.
  • 다음 출력 값은 첫 헤드에서는 

 

Transformer : Decoder

  • 디코더에서 만들어진 은닉 상태 벡터가 쿼리로 사용되고, 인코딩 단의 최종 출력인 vector가 key, value로 들어가서 attention을 수행한다.
  • seq2seq with attention에서 추가적인 attention 모듈이다.
  • decoder hidden state vector를 query 벡터로 encoder의 hidden state vector 중 어느 벡터를 가중치를 걸어서 해당 정보를 서로 다른 decoder의 time step에서 가져올지에 대한 정보를 가져오는 encoder-decoder 간의 attention 모듈 (Multi-Head Attention)

 

Transformer : Masked Self-Attention

  • batch processing을 위해 뒤에 나오는 단어를 입력으로 동시에 주기는 하지만, <sos>를 쿼리로 사용해 어텐션 모듈을 수행할 때 접근 가능한 key, value에서 뒤에 나오는 단어는 제외해 주어야 한다.
  • attention은 모두가 모두를 볼 수 있도록 허용한 후 후처리로 뒤에서 나오는 단어에 대한 가중치를 0으로 만들어주고, 이후 value vector와 가중평균을 내는 방식으로 attention을 변형한 방식이다.

OOV (Out-Of-Vocabulary)

  • 기계가 문제를 푸는 과정에서 모르는 단어가 등장하면 문제를 푸는 것이 까다로워진다.
  • 이러한 상황을 OOV 문제라고 한다.
  • 하나의 단어를 더 작은 단위의 의미있는 여러 서브워드들로 분리해서 단어를 인코딩 및 임베딩하는 서브워드 분리로 문제의 완화가 가능하다.
  • 그리고 영어나 한국어의 경우는 서브워드 분리가 가능하다.

 

BPE (Byte Pair Encoding)

  • 1994년에 데이터 압축 알고리즘으로 제안되었으나, 자연어 처리의 서브워드 분리 알고리즘으로 응용된다.
  • 가장 많이 등장한 글자의 쌍을 찾아 하나의 글자로 병합하는 방식을 수행하는 알고리즘이다.
  • ex) aabcaabcaa => (aa = X) => XbcXbcX => (Xb = Y) => YcYcX => (Yc=Z) => ZZX
  • 자연어 처리에서는 글자 단위에서 점차적으로 단어 집합을 만들어내는 Bottom up 방식의 접근을 사용한다. 훈련 데이터에 있는 단어들을 모든 글자 또는 유니코드 단위로 단어 집합을 만들고, 가장 많이 등장하는 유니그램을 하나의 유니그램으로 통합한다.

  • 피어세션 회의 내용

 

  • teacher forcing : 노출편향 문제를 막기 위한 장치
  • 하지만 노출편향 문제는 모델자체에 큰 영향을 주지는 않는다.

 

F-measure에 조화평균을 사용하는 이유

  • 잘못 예측된 결과인 경우에 산술평균을 계산했을 때 높은 점수를 부여하는 경우가 있기 때문에 비교적 낮은 점수를 취하기 위해서 조화평균 사용

 

7강코드

  • gru decoder에서 모듈을 한번만 통과한다고 하면 output, hidden 값이 같은 것으로 생각
  • output이 이전의 hidden state를 모아놓은 값
  • hidden이 마지막 time step의 값

 

8강코드

  • dot attention과 concat attention은 decoder를 통과하는 방식이 다르다.

dot attention

  rnn - attention - concat - output

concat attention

  attention concat rnn - linear

 

논의

오늘 강의에서

A(Q,K,V) = softmax(QK^T)V

에서 |Q|와 |K|가 다를 수 있는지

multihead attention의 경우라면 가능 할 것


  • 해야할 일

 


 

728x90
반응형