Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Tags
more
Archives
Today
Total
관리 메뉴

Zorba blog

트랜스포머(Transformer) 모델 / 개념, 포지셔널 인코딩(Positional Encoding) 본문

자연어처리

트랜스포머(Transformer) 모델 / 개념, 포지셔널 인코딩(Positional Encoding)

Zorba blog 2022. 6. 2. 14:50

트랜스포머(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" 라는 이름이 붙어있음.

- 뒤에서 설명하겠지만 트랜스포머가 어텐션을 병렬적으로 수행하는 방법을 의미.

Comments