Zorba blog
트랜스포머(Transformer) 모델 / 개념, 포지셔널 인코딩(Positional Encoding) 본문
트랜스포머(Transformer)
- 트랜스포머(Transformer)는 2017년 구글이 발표한 논문인 "Attention is all you need"에 나온 모델.
- 기존의 seq2seq 구조인 인코더-디코더를 따르면서도, 어텐션(Attention)만으로 구현한 모델.
- RNN을 사용하지 않고, 인코더-디코더 구조를 설계하였음에도 RNN보다 우수한 성능을 보여줌.
1. 기존 seq2seq 모델의 한계
- 기존의 seq2seq 모델은 인코더-디코더 구조로 구성되어져 있었음.
- 인코더가 입력 시퀀스를 하나의 벡터로 압축하는 과정에서 입력 시퀀스의 정보가 일부 손실된다는 단점이 있음.
- 이를 보정하기 위해 어텐션을 사용.
- But. 어텐션을 RNN의 보정을 위한 용도로서 사용하는 것이 아니라 어텐션만으로 인코더와 디코더를 만든다면?
2. 트랜스포머(Transformer)의 주요 하이퍼파라미터
- 어떠한 파라미터가 있는지 알아보자.
- 아래에서 정의하는 수치는 트랜스포머를 제안한 논문에서 사용한 수치로 사용자가 임의로 변경할 수 있는 값.
dmodel=512
- 트랜스포머의 인코더와 디코더에서의 정해진 입력과 출력의 크기를 의미.
- 임베딩 벡터의 차원 또한 dmodel 이며, 각 인코더와 디코더가 다음 층의 인코더와 디코더로 값을 보낼 때에도 이 차원을 유지.
num_layers=6
- 트랜스포머 모델에서 인코더와 디코더가 총 몇 층으로 구성되었는지를 의미.
- 논문에서는 인코더와 디코더를 각각 총 6개 쌓음.
num_heads=8
- 트랜스포머에서는 어텐션을 사용할 때, 한 번에 하는 것 보다 여러 개로 분할해서 병렬로 어텐션을 수행하고 결과값을 다시 하나로 합치는 방식을 선택. 이때 병렬의 개수를 의미.
dff = 2048
- 트랜스포머 내부에는 피드 포워드 신경망이 존재하여 해당 신경망의 은닉층의 크기를 의미.
- 피드 포워드 신경망의 입력층과 출력층의 크기는 dmodel.
3. 트랜스포머(Transformer)
- 트랜스포머는 RNN을 사용하지는 않지만 기존의 seq2seq처럼 인코더에 입력을 받고, 디코더에서 출력하는 구조.
- 이전 seq2seq 구조에서는 인코더, 디코더에서 각각의 RNN이 t개의 시점을 가지는 구조였다면, 트랜스포머에서는 인코더와 디코더라는 단위가 N개로 구성되는 구조.
- 논문에서는 인코더와 디코더의 개수를 각각 6개 사용.
- 디코더는 기존의 seq2seq 구조처럼 시작 심볼 <sos>를 입력으로 받아 종료 심볼 <eos>가 나올 때까지 연산을 진행.
- RNN은 사용하지 않지만 여전히 인코더-디코더의 구조는 유지.
4. 포지셔널 인코딩(Positional Encoding)
- 트랜스포머의 내부를 이해하기 전 우선 트랜스포머의 입력에 대해서 알아보자.
- RNN이 자연어 처리에서 유용했던 이유는 단어를 순차적으로 입력받아서 처리하는 특성으로 인해 각 단어의 위치 정보(position information)를 가질 수 있다는 점 이었음.
- But. 트랜스포머는 단어 입력을 순차적으로 받는 방식이 아니기 때문에 위치 정보를 다른 방식으로 알려줄 필요가 있음.
- 트랜스포머는 단어의 위치 정보를 얻기 위해서 각 단어의 임베딩 벡터에 위치 정보들을 더하여 모델의 입력으로 사용.
- 이를 포지셔널 인코딩(Positional encoding) 이라고 함.
- 입력으로 사용되는 임베딩 벡터들이 트랜스포머의 입력으로 사용되기 전에 포지셔널 인코딩의 값이 더해짐.
- 포지셔널 인코딩 값들은 아래의 함수를 사용하여 위치 정보를 가진 값들을 만듬.
- 트랜스포머는 사인 함수와 코사인 함수의 값을 임베딩 벡터에 더해주므로서 단어의 순서 정보를 반영함.
- 임베딩 벡터와 포지셔널 인코딩의 덧셈은 임베딩 벡터가 모여 만들어진 문장 행렬과 포지셔널 인코딩 행렬의 덧셈 연산.
- pos는 입력 문장에서의 임베딩 벡터의 위치를 나타냄. (토큰의 순서, 위치)
- i는 임베딩 벡터 내의 차원의 인덱스를 의미.(dmodel : 인코더와 디코더에서의 정해진 입력과 출력의 크기)
- 임베딩 벡터 내의 각 차원의 인덱스(i)가 짝수인 경우 사인 함수. 홀수인 경우 코사인 함수의 값을 사용.
(pos, 2i) 일 때는 사인 함수. (pos, 2i+1) 일 때는 코사인 함수 사용.
- 임베딩 행렬 + Positional Encoding 행렬 을 통해 순서 정보 보존.
- 이렇게 두 행렬을 더하게 되면 같은 단어라고 하더라도 문장 내의 위치에 따라서 트랜스포머의 입력으로 들어가는 임베딩 벡터의 값이 달라짐.
5. 어텐션(Attention)
- 트랜스포머에서 사용되는 세 가지의 어텐션.
- 첫 번째 Encoder Self-Attention은 인코더에서 이루어 짐.
- 두, 세 번째 Masked Decoder Self-Attention, Encoder-Decoder Attention은 디코더에서 이루어짐.
- Self-Attention은 본질적으로 Query, Key, Value의 출처가 동일한 경우를 말함.
- 반면, 세 번째 인코더-디코더 어텐션에서는 Query가 디코더의 벡터, key와 Value는 인코더의 벡터.
- 위 그림은 트랜스포머의 아키텍처에서 세 가지 어텐션이 각각 어디에서 이루어지는지를 보여줌.
- 각 어텐션에 "Multi-head" 라는 이름이 붙어있음.
- 뒤에서 설명하겠지만 트랜스포머가 어텐션을 병렬적으로 수행하는 방법을 의미.
'자연어처리' 카테고리의 다른 글
NLP에서의 사전 훈련(Pre-Training) (0) | 2022.06.03 |
---|---|
트랜스포머(Transformer) 모델 / 인코더, 포지션-와이즈 피드 포워드 신경망, 잔차 연결, 정규화 (0) | 2022.06.03 |
어텐션 메커니즘 (Attention Mechanism) (0) | 2022.05.31 |
시퀀스-투-시퀀스(Sequence-to-Sequence, seq2seq) (0) | 2022.05.31 |
Transformer model.generate로 텍스트를 생성하는 전략들 (0) | 2022.05.19 |