트랜스포머는 지난 2017년 NIPS에서
Transformer: attention is all you need라는 제목의 논문으로 처음 등장 하였다.
RNN과 LSTM을 사용한 모델과는 달리 트랜스포머는 약 3년 전에 나온 어텐션 매커니즘을 기반으로 하는 새로운 구조(아키텍처)를 제안했다.
논문의 인용 수만 봐도 엄청 많이 사용되고 있고, NLP 뿐만 아니라 CV에도 활발하게 사용될 만큼 범용성이 아주 크다고 할 수 있다.
지난 attention 포스팅에 이어 직접 어텐션 매커니즘을 적용한 트랜스포머에 대해 대략적으로 알 수 있도록 인코더와 디코더를 2개의 포스팅으로 나눠 설명하려고 한다.
포스팅 이미지, 정보 등
기존의 seq2seq 구조는 인코더를 지나면 하나의 context vector를 통해 입력 문장의 정보가 압축 되었다.
물론 압축된 것이 장점일 수도 있지만, 압축 된다는 것은 정보 소실이 발생할 수 밖에 없기 때문에 만에 하나 중요한 특징이 소실 된다면 큰 단점으로 작용할 수 있다.
때문에 어텐션 매커니즘을 보정 수단으로 사용하는 것이 아니라 어텐션 만으로 인코더와 디코더를 구성하는 구조를 트랜스포머가 제안했다.
그림 1
(원래 기존의 seq2seq는 인코더와 디코더에 각각 하나의 RNN이 있고 여러 시점(t)으로 나뉜 구조를 사용했지만,
트랜스포머에선 인코더와 디코더가 여러 개로 이루어진 모습을 볼 수 있다)
그림 2
당연히 그건 아님!
기존엔 각 입력 단어를 동일한 임베딩 과정을 통해서 임베딩 벡터 생성 후,
이 벡터를 순차적으로 사용했지만, 트랜스포머는 순차적인 정보를 알 수 없다.
(즉, 단어의 위치 정보를 부여할 수 있는 별도의 방법 필요)
여기서 말하는 위치 정보를 부여하는 방법이 바로
'포지셔널 인코당(positional encoding)'이다.'i am a student'를 예로 들어 설명
그림 3위 그림에서 알 수 있듯이 문장의 첫 번째 위치하는 i와 두 번째 am, 세 번째 a, 네 번째 student에 각기 다른 값 더해줌으로써 위치 정보를 추가할 수 있다.
(포지셔널 인코딩은 사용하는 모델마다 그 길이가 다름)
ex) bert - 512(여기서 설명하진 않겠지만 각 포지셔널 인코딩 값은 sin함수와 cos함수를 사용하여 값을 구할 수 있다!)
이렇게 입력 단어 + 포지셔널 인코딩 값으로 순서 정보를 보존한다는 점에서 기존 seq2sqe와 차이가 있다.
(positional encoding + embedding vector)의 결과는 인코더에서 이루어지는 어텐션의 입력 값으로 사용된다.
그렇다면 트랜스포머를 이루는 인코더와 디코더에 대해서 더 자세히 알아보자!
아래 그림은 인코더 한 개의 내부 구조를 보여준다.
그림 4하나의 인코더는 세부적으로 2개의 sub-layer로 나눠진다.
(self-attention , FFNN)
이전 결과가 입력으로 들어오면 멀티 헤드 셀프 어텐션을 통해 좀 더 가중치를 두어야 할 단어를 파악할 수 있다. (과정은 이전 포스팅 참고)self-attention layer를 지난 결과는 FFNN층을 지나고 한 개의 인코더 결과를 내놓는다.
- self-attention은 3가지 attention 방법 중 하나이다.
즉, 'I am a student'로 예를 들면 하나의 단어(Query)에 대한 나머지 모든 단어(key)와 어텐션을 통해 유사한 단어를 찾아내는 방법
- multi-head attention
어텐션 헤드란, 하나의 어텐션 결과를 뜻한다.
multi라는 말처럼 여러 어텐션 결과를 하나로 concat한 것을 의미함! (어텐션 개수는 특정 값으로 지정 가능하다)(굳이 병렬로 어텐션을 하는 이유는,
전체에 대해 한 번에 어텐션을 사용하는 것 보다 여러 개로 나눠서 어텐션을 사용하는 게 더 효율적인 결과를 내기 때문)
- add & Norm
성능 향상을 위해 잔여 학습(Residual learning)을 이용
기울기 소실, 폭발 문제 방지를 위해 사용
즉, 이 과정은 학습의 안정성을 위한 작업