Transformer (트랜스포머)

hooo·2024년 1월 9일
2

자연어처리(NLP)

목록 보기
5/8

트랜스포머는 지난 2017년 NIPS에서

Transformer: attention is all you need라는 제목의 논문으로 처음 등장 하였다.

RNN과 LSTM을 사용한 모델과는 달리 트랜스포머는 약 3년 전에 나온 어텐션 매커니즘을 기반으로 하는 새로운 구조(아키텍처)를 제안했다.

논문의 인용 수만 봐도 엄청 많이 사용되고 있고, NLP 뿐만 아니라 CV에도 활발하게 사용될 만큼 범용성이 아주 크다고 할 수 있다.

지난 attention 포스팅에 이어 직접 어텐션 매커니즘을 적용한 트랜스포머에 대해 대략적으로 알 수 있도록 인코더와 디코더를 2개의 포스팅으로 나눠 설명하려고 한다.

포스팅 이미지, 정보 등

출처: https://wikidocs.net/31379




1. Transformer 등장 배경


  • 기존의 seq2seq 구조는 인코더를 지나면 하나의 context vector를 통해 입력 문장의 정보가 압축 되었다.
    물론 압축된 것이 장점일 수도 있지만, 압축 된다는 것은 정보 소실이 발생할 수 밖에 없기 때문에 만에 하나 중요한 특징이 소실 된다면 큰 단점으로 작용할 수 있다.

  • 때문에 어텐션 매커니즘을 보정 수단으로 사용하는 것이 아니라 어텐션 만으로 인코더와 디코더를 구성하는 구조를 트랜스포머가 제안했다.



2. Transformer 구조


  • 트랜스포머는 seq2seq의 기본적인 차이는 인코더와 디코더를 구성하는 부분이 다르다고 할 수 있다.

    그림 1

    (원래 기존의 seq2seq는 인코더와 디코더에 각각 하나의 RNN이 있고 여러 시점(t)으로 나뉜 구조를 사용했지만,
    트랜스포머에선 인코더와 디코더가 여러 개로 이루어진 모습을 볼 수 있다)


  • 즉, 아래와 같이 인코더, 디코더를 구성하는 부분만 다르고 입력부터 출력까자의 구조 자체는 seq2seq와 다르지 않음을 볼 수 있다.

    그림 2

그렇다면 구조만 다른걸까?

당연히 그건 아님!



* 순서 정보 보존위한 포지셔널 인코딩(positional encoding)

  • 기존엔 각 입력 단어를 동일한 임베딩 과정을 통해서 임베딩 벡터 생성 후,
    이 벡터를 순차적으로 사용했지만, 트랜스포머는 순차적인 정보를 알 수 없다.
    (즉, 단어의 위치 정보를 부여할 수 있는 별도의 방법 필요)

    여기서 말하는 위치 정보를 부여하는 방법이 바로
    '포지셔널 인코당(positional encoding)'이다.

    'i am a student'를 예로 들어 설명
    그림 3

    위 그림에서 알 수 있듯이 문장의 첫 번째 위치하는 i와 두 번째 am, 세 번째 a, 네 번째 student에 각기 다른 값 더해줌으로써 위치 정보를 추가할 수 있다.

    (포지셔널 인코딩은 사용하는 모델마다 그 길이가 다름)
    ex) bert - 512

    (여기서 설명하진 않겠지만 각 포지셔널 인코딩 값은 sin함수와 cos함수를 사용하여 값을 구할 수 있다!)

  • 이렇게 입력 단어 + 포지셔널 인코딩 값으로 순서 정보를 보존한다는 점에서 기존 seq2sqe와 차이가 있다.

  • (positional encoding + embedding vector)의 결과는 인코더에서 이루어지는 어텐션의 입력 값으로 사용된다.



그렇다면 트랜스포머를 이루는 인코더와 디코더에 대해서 더 자세히 알아보자!

2-(1) Encoder (인코더)

  • 인코더는 여러 개의 인코더로 구성되고 (num_heads 값 만큼) 여러 개의 인코더는 구조가 같기 때문에 하나의 인코더를 보면서 살펴보자

아래 그림은 인코더 한 개의 내부 구조를 보여준다.
그림 4

하나의 인코더는 세부적으로 2개의 sub-layer로 나눠진다.
(self-attention , FFNN)


이전 결과가 입력으로 들어오면 멀티 헤드 셀프 어텐션을 통해 좀 더 가중치를 두어야 할 단어를 파악할 수 있다. (과정은 이전 포스팅 참고)

self-attention layer를 지난 결과는 FFNN층을 지나고 한 개의 인코더 결과를 내놓는다.


  • 인코더에서 self-attention,multi-head attention, add & Norm
  1. self-attention은 3가지 attention 방법 중 하나이다.
    즉, 'I am a student'로 예를 들면 하나의 단어(Query)에 대한 나머지 모든 단어(key)와 어텐션을 통해 유사한 단어를 찾아내는 방법
  1. multi-head attention
    어텐션 헤드란, 하나의 어텐션 결과를 뜻한다.
    multi라는 말처럼 여러 어텐션 결과를 하나로 concat한 것을 의미함! (어텐션 개수는 특정 값으로 지정 가능하다)

(굳이 병렬로 어텐션을 하는 이유는,
전체에 대해 한 번에 어텐션을 사용하는 것 보다 여러 개로 나눠서 어텐션을 사용하는 게 더 효율적인 결과를 내기 때문)

  1. add & Norm
    성능 향상을 위해 잔여 학습(Residual learning)을 이용
    기울기 소실, 폭발 문제 방지를 위해 사용
    즉, 이 과정은 학습의 안정성을 위한 작업



하나의 인코더를 통해 나온 결과는 다음 인코더의 입력으로 사용되고 총 n개의 인코더를 지난 최종 결과는 다시 디코더에서 Decoder-Encoder attention에 사용된다.

꼭 최종 인코더의 결과가 아니어도 각 인코더의 결과만 따로 추출하여 분석에 사용하기도 한다.

또한 인코더의 구조로 모델을 만들고 NLP등 다양한 task에 활용할 수도 있다. (ex - BERT, DistilBERT 등 )




(디코더는 보류하고 attention 과정을 Query, key, Value로 설명하는 포스팅을 하겠다.)

profile
Data Science

0개의 댓글

관련 채용 정보