Transformer_Attention Mechanism

Kim Jin Seong·2022년 1월 14일
0

Transformer

목록 보기
2/4
post-thumbnail

한빛미디어 출판 "구글 BERT의 정석 " 책을 참고해서 작성하는 개인 공부 자료입니다.
혹시 내용에 저작권 등 문제가 있다면 알려주시면 감사하겠습니다.

! 내용에 신뢰도가 떨어지거나 상당부분 요약 되어 있을 가능성이 있음 !
! 제가 수식 보는 것을 싫어하기 때문에 꼭 필요하지 않다면 생략되있을 가능성이 높습니다 !


What is Transformer?

트랜스포머는 자연어 처리에서 주로 사용하는 딥러닝 아키텍쳐 중 하나로 출현 이후 RNN과 LSTM은 트랜스포머로 대체되었고, BERT, GPT, T5 등 다양한 자연어처리( NLP ) 모델에 적용되었다.

RNN 기반 모델의 장기 의존성의 한계를 극복하고자 제안된 아키텍쳐로 RNN에서 사용한 순환 방식을 사용하지 않고 순수하게 Attention만을 사용한 모델이며, 트랜스포머는 Self-Attention이라는 특수한 형태의 어텐션을 사용한다.

이번 포스팅에서는 Transformer 모델의 핵심인 Self-Attention에 대해 정리해보겠다.


Seq2Seq Model

기본적으로 Attention 메커니즘은 RNN 기반 Seq2Seq 모델의 장기 의존성 문제를 해결하기 위해 고안된 아이디어이다.

흐름 이해를 위해 Seq2Seq 모델을 간단하게 설명하자면, RNN의 출력이 바로 이전 입력까지만 고려해 생기는 정확도가 저하 문제( Vanishing Gradient )를 보완하기 위한 모델이다.

Encoder Decoder Network 라고도 불리는 Seq2Seq 모델은 두 개의 RNN 블럭으로 구성되며, Encoder라고 불리는 RNN 블럭에서는 입력 시퀀스를 읽어 전체 단어를 참고해 생성된 문맥의 함축적인 정보를 담고 있는 단일 벡터( Context Vector )를 출력하고, Decoder라고 불리는 RNN 블럭에서는 Encoder의 출력인 Context Vector를 읽어 출력 시퀀스를 생성한다.

  1. Encoder에서 입력 시퀀스( 원문 )를 상태 벡터로 변환 -> 전체 맥락 파악context vector
  2. 크기가 1인 목표 시퀀스( 번역문, 시작 문자 ) 생성<SOS>
  3. 상태 벡터와 크기가 목표 시퀀스를 Decoder에 넣어 다음 단어에 대한 예측치 생성softmax
  4. 예측치를 참고해 다음 단어의 표본 생성
  5. 목표 시퀀스에 샘플링된 단어 병합concat
  6. 시퀀스 종료 문자( 끝 문자 )를 생성할 때까지 반복<EOS>

출처: https://jalammar.github.io/visualizing-neural-machine-translation-mechanics-of-seq2seq-models-with-attention/

정리하면, 인코더에서 입력 문장에 대한 전체 문맥을 판단한 결과 값인 Convext Vector를 디코더에 입력해 번역된 단어를 한 개씩 순차적으로 출력하는 모델이다.

이 같은 특성 때문에 시퀀스 길이와 순서를 자유롭게 한 서로 다른 언어간의 번역과 같은 문제에 유리한데, Seq2Seq 역시 RNN 기반의 모델의 고질적인 문제인 긴 시퀀스에서의 성능 문제에서는 벗어나지 못했다.


Attention Mechanism

Seq2Seq 모델에는 크게 두 가지 문제가 있다.

  1. 하나의 고정 벡터에 문장의 모든 정보를 압축했을 때의 정보 손실
  2. Vanishing Gradient

Attention은 이 현상을 보정하기 위해 등장한 기법인데, Seq2Seq 모델의 Encoder-Decoder 구조를 기본으로 하고 추가로, 디코더에서 출력 단어를 에측하는 매 시점( time step )마다, 인코더에서의 전체 입력 문장의 표현( 모든 단어의 상태 표현 )을 다시 한 번 참고하는 것이다.

다만, 모두 동일한 비율로 참고하는 것이 아니라, 해당 시점에서 예측해야 할 단어와 연관성 있는 입력 단어 부분을 좀 더 집중( Attention! )해서 보게 되는 것이다.

이것이 바로 어텐션 메커니즘의 기본 아이디어이다.

출처: https://jalammar.github.io/visualizing-neural-machine-translation-mechanics-of-seq2seq-models-with-attention/

지금부터 트랜스포머 모델에서 사용하는 Self-Attention 기법을 통해 자세한 내용을 알아보자


Self-Attention

어텐션 함수는 주어진 Query에 대해서 모든 Key의 유사도를 각각 구하는 함수이다. 이후 이 유사도를 가중치로 해 키와 맵핑되어 있는 각각의 Value를 반영한 값을 모두 합( 가중합 )해준 결과를 반환한다.

어텐션 메커니즘 아이디어를 이용하면 입력 단어( 원문 표현 )와 예측해야 할 단어( 번역 표현 )의 대응 관계에 대한 정보를 얻을 수 있는데, 스스로의 언어에 대해서는 관계를 나타낼 수 없었다.

예를 들어 다음과 같은 문장이 있다고 가정해 보자.

A dog ate the food because it was hungry

여기에서 it은 dog / food를 의미할 수 있는데, 문장을 자세히 살펴보면 dog를 뜻하는 표현이라는 것을 쉽게 알 수 있다. 이렇듯 문장 내 단어 간의 관계에 대한 표현을 얻기 위한 아이디어가 Self-Attention이다.

정리하면 기존 Attention 모델의 Query와 Key는 서로 다른 문장에서 추출해 각 문장에 있는 단어 간 연관 정도를 도출해내는 과정이고, Self-Attention 모델의 Query와 Key는 한 문장에 안에 있는 단어들 간 연관 정도를 도출해내는 과정이라는 정도로 볼 수 있다.

Query, Key, Value의 의미를 유념하며 셀프 어텐션의 작동 원리를 알아보자


입력문장을 'I am good'이라고 가정해보자

Embedding

최초에 문장이 입력되면 먼저 각 단어의 임베딩( 각 단어를 표현하는 벡터 값 )을 추출하게 된다.

xI=x_I= [1.76, 2.22, ..., 6.66]
xam=x_{am}= [7.77, 0.631, ..., 5.35 ]
xgood=x_{good}= [11.44, 10.10, ..., 3.33]

이제 이 임베딩 벡터들을 합쳐 입력 행렬 또는 임베딩 행렬을 생성하게 되는데, 이 경우 임베딩 차원을 512라고 가정한다면 입력 행렬의 차원은 [ 3( 단어의 수 )x512( 임베딩 차원 ) ]가 된다.
이제 이 입력행렬로부터 쿼리( Q ), 키( K ), 밸류( V ) 행렬을 생성한다.

이 세 가지 행렬은 임의의 값을 가진 가중치 행렬 WQW^Q, WKW^K, WVW^V과의 곱으로 생성되며, 학습을 통해 최적의 가중치 행렬이 생성되면 더 정확한 쿼리, 키 ,밸류 값을 얻게 된다.

이때 쿼리, 키, 밸류 벡터의 차원의 길이가 64라고 가정하고 셀프 어텐션의 작동 원리를 이해해 보겠다.

이 벡터 차원의 길이는 후에 나올 병렬 처리를 위한 멀티 헤드의 개수에 위해 결정되는데, 여기서는 8개의 병렬 처리를 위해 입력 행렬의 차원( 512 )을 병렬 처리를 위한 헤드의 개수( 8개 )를 나눈 값인 64를 사용한다 라고만 간단히 알아두고 넘어가자.

기본적으로 셀프 어텐션에서는 문장 내 각 단어끼리의 연결 관계를 나타내기 위한 표현을 얻기 위한 목적이 있다.

특정 단어가 문장 내에 있는 단어와 어떤 연관이 있는지를 이해하면 좀 더 좋은 표현을 학습시키는데 도움이 있기 때문인데, 이제 Q, K, V 벡터를 이용해 이 표현을 얻기 위한 과정을 알아보자.

Score Matrix

일단 문장 내의 각 단어끼리와의 연관도를 나타내는 스코어 행렬을 구하는 과정을 거치며, 연산 최종 결과는 다음과 같이 각각 얼마나 연관 되어 있는지 나타내는 값들의 행렬로 나오게 된다.
첫 행의 단어 "I"를 예로 들면 "I"와 90%, "am"과 7%, "good"과 3%의 연관성을 갖고 있다는 것을 알 수 있는데, 도출 과정은 다음과 같다.


첫 번째QKTQ\cdot K^T과 같이 Q행렬과 K의 전치 행렬의 내적 연산( Dot Product )을 수행한다.
연산 결과로 위와 같은 행렬이 나오게 되는데, 첫 번째 행의 연관도. 즉, "I"와 다른 전체 단어와 내적 값을 예시로 보면 "I"와 110, "am"과 90, "good"과 80으로 나타나는데 자신인 "I"와의 연관성이 제일 높고 차례로 "am", "good"과의 연관성이 높다고 해석할 수 있다.

결론적으로 이는 문장의 각 단어가 다른 모든 단어와 얼마나 유사한지 판단하는데 도움을 준다.


두 번째로는 위해 키 벡터 차원의 제곱근 값으로 나눠주며 스케일링을 진행하게 되는데, 기존의 Dot Product를 진행하면 쿼리 및 키 벡터의 차원에 따라 커지는 경향이 있어 학습에 방해를 줄 수도 있다.

그렇기 때문에 내적이 큰 값으로 폭발적으로 증가하는 것을 방지하기 위해 스케일링을 진행하고 결과적으로 안정적인 경삿값을 얻는다.

이전 예제에서는 키 벡터의 차원을 64로 가정했기 때문에 64의 제곱근 값인 8로 나눠줘 값을 확정한다.
이 단계까지 진행한 유사도 값은 비정규화된 형태이다.

즉, 다소 명확하지 않은 값을 가지고 있기 때문에 어떤 특정 프로세스를 처리해 더 명확한 값을 도출해야 하는 상태라고 볼 수 있다.


세 번째로는 이전 단계에서 말했듯이 좀 더 명확한 값을 도출해내기 위한 정규화 작업을 진행한다.

Softmax 함수를 적용해 각각 0과 1사이의 값을 갖게 하는 문장 내에 있는 각 단어와 얼마나 연관되어 있는지 알 수 있는 행렬을 얻을 수 있는데 이를 바로 스코어 행렬( Score Matrix )이라고 한다.


Attention Matrix

지금까지 쿼리, 키 행렬에 대해 내적을 계산하고, 소프트맥스 함수를 사용해 내적값에 대한 정규화 작업을 진행했고, 이제 남은 마지막 과정은 어텐션( Z ) 행렬을 계산하는 것이다.

어텐션 행렬은 문장의 각 단어에 대한 벡터 값을 갖는데, 앞에서 계산한 스코어 행렬에 밸류 행렬( V )를 곱하면 어텐션 행렬을 구할 수 있다.
첫 번째 행인 "I"의 어텐션 스코어를 보면 "I"에 대한 밸류 벡터 값 90%, "am"에 대한 밸류 벡터 값 7%, "good"에 대한 밸류 벡터 값 3%가 반영되어 있는 결과값이 나오는데 당연한 이야기이지만, 밸류 행렬에서 "I"에 해당하는 밸류 벡터 값과 가장 가까운 값이 나온 것을 알 수 있다.

차례로 계산된 "am", "good"도 같은 분위기로 진행이 되는데 이와 같은 연산 방법을 기반으로 가중치 행렬 WQW^Q, WKW^K, WVW^V의 값을 학습한 셀프 어텐션 방법을 적용하면 단어가 문장 내에 있는 다른 단어와 얼마나 연관성이 있는지 알 수 있게 되는 것이다.

요약하면 다음과 같다.

  1. 쿼리 행렬( Q )과 키 행렬( K )간의 내적을 계산하고 유사도 값을 산출한다.
  2. 유사도 값을 행렬의 차원의 제곱근으로 나누어 스코어 행렬을 구한다.
  3. 스코어 행렬에 소프트맥스 함수를 적용해 정규화한다.
  4. 마지막으로 스코어 행렬에 밸류 행렬( V )를 곱해 어텐션 행렬( Z )를 산출한다.

이상으로 Attention Mechanism에 대한 정리를 마치겠다.

profile
Data Study

0개의 댓글