AI/GPT

GPT 구조와 아키텍쳐 그리고 GPT를 알기 위해 알아야하는 것들 (1)

위시리 2024. 9. 3. 12:31

GPT는 Transformer 아키텍쳐 기반으로 구축 & self-attention 레어어로 구성

Transformer의 디코더 레이어를 쌓은 구조이며, 각 레이어는 두 개의 하위 레이어로 구성된다. 첫번째 하위 레이어는 다중 헤드 sefl-attention 메커니즘이고, 두번째 하위 레이어는 간단한 위치별 완전 연결 피드포워드 네트워크이다. 각 하위 레이어 전에 레이어 정규화가 적용되며, 각 레이어 뒤에는 잔차 연결이 이어진다. 이러한 적층 접근 방식을 통해 모델은 상당한 길이의 시퀀스를 처리 및 생성할 수 있게 되며, 탁월한 텍스트 생성 능력을 갖게 된다.

위 글에서 그러면 transformer는 무엇이고, attention과 self-attention은 무엇이며, 왜 디코더만 사용했고, 정확하게 알지 못하는 단어인 피드포워드 네트워크, 잔차 연결 등을 더 알아보자

 

1. 어텐션 메커니즘 (Attention Mechanism)

기존의 RNN 기반의 seq2seq 모델에는 2가지 단점이 있다. 

첫번째, 하나의 고정된  크기의 벡터에 모든 정보를 압축하려고 하니, 정보 손실이 발생

두번째, RNN의 고질적인 문제인 기울기 소실(vanishing gradient)문제가 발생

이는 기계 번역 분야에서 입력 문장의 길이가 길어지면 번역 품질(출력 시퀀스)이 떨어지는 현상으로 나타났다. 이러한 문제를 대안으로 등장한 기법이 바로 어텐션(attention)

 

어텐션을 함수로 표현하면 다음과 같이 표현할 수 있다.

Attention(Q, K, V) = Attention Value

어텐션 함수는 주어진 쿼리(Q)에 대해서 모든 키(K)와의 유사도를 각각 구한다. 그리고 구해낸 유사도를 키와 맵핑되어있는 각각의 값(V)에 반영한다. 그리고 유사도가 반영된 값(V)을 모두 더해서 리턴한다. 여기서 이 구해진 값을 어텐션 값(attention value)라고 하겠다. 즉, 어텐션 값은 어텐션 메커니즘에서 출력 단어 예측에 또 다른 값을 필요로 하는데 이 값을 의 한다.

이후부터의 seq2seq + attention 모델에서 Q,K,V에 해당되는 각각의 Query, Keys, Values는 각각 다음과 같다.

Q = Query : t 시점의 디코더 셀에서의 은닉 상태
K = Keys : 모든 시점의 인코더 셀의 은닉 상태들
V = Values : 모든 시점의 인코더 셀의 은닉 상태들

 

어텐션에서는 입력 시퀀스의 각 단어들에 대한 가중치를 계산한다.

위 그림에서 소프트맥스를 통해 나온 빨간 직사각형의 크기가 클 수록 다음 단어를 예측할 때 얼마나 도움이 되는지 확인할 수 있다. 각 입력 단어가 디코더의 예측에 도움이 되는 정도가 수치화되어 측정되면, 이를 하나의 정보로 담아 디코더로 전송된다. 이러한 과정을 통해 디코더는 출력 단어를 더 정확하게 예측할 확률이 높아진다.

어텐션은 입력 시퀀스에서 은닉 상태를 만들지 않고 스텝마다 인코더에서 디코더가 참고할 은닉 상태를 출력한다. 이때 모든 상태를 동시에 사용하기에는 디코더에 많은 입력이 발생하여 어떤 상태를 먼저 사용할지 우선순위를 정하는 매커니즘이 필요하게 되는데 여기서 어텐션이 등장한다. 디코더가 모든 디코딩 타임스텝(time step)마다 인코더의 각 상태에 다른 가중치 또는 어텐션을 할당한다.

즉, 이해하기로는 다음 출력을 위해 입력 이전의 출력과 이전의 은닉상태와 현재의 어텐션 값을 통해 다음 단어를 예측하는 것이 어텐션 메커니즘이다.

 

2. 트랜스포머(Transformer)

트랜스포머는 구글이 2017년도에 발표한 논문 "Attention is all you need."에서 나온 모델로 기존의 seq2seq의 구조인 인코더-디코더를 따르면서도, Attention만으로 구현한 모델이다. 

트랜스포머는 RNN을 사용하지 않지만 기존의 seq2seq 처럼 인코더에서 입력 시퀀스를 입력받고, 디코더에서 출력 시퀀스를 출력하는 인코더-디코더 구조를 유지하고 있다.

기존 seq2seq 구조에서는 인코더와 디코더에서 각각 하나의 RNN이 t개의 시점을 가지는 구조라면 트랜스포머에서는 인코더와 디코더라는 단위가 N개로 구성되는 구조이다. ("Attention is all you need." 논문에서는 6개를 사용)

 

트랜스포머에서 사용되는 3가지 어텐션

첫번째 그림인 셀프 어텐션은 인코더에서 이루어지지만, 두번째 그림인 셀프 어텐션과 세번째 그림은 인코더-디코더 어텐션은 디코더에서 이루어진다. 셀프 어텐션은 본질적으로  Query, Key, Value가 동일한 경우를 말한다. 반면, 세번째 인코더-디코더 어텐션에서는 Query가 디코더 벡터인 반면 Key와 Value가 인터더의 벡터이므로 셀프 어텐션이라고 부르지 않는다.

인코더의 셀프 어텐션 : Query = Key = Value
디코더의 마스크드 셀프 어텐션 : Query = Key = Value
디코더의 인코더-디코더 어텐션 : Query : 디코더 벡터 / Key = Value : 인코더 벡터

위 그림은 트랜스포머의 아키텍처에서 세 가지 어텐션이 각각 어디에서 이루어져 있는지를 보여준다. 앞에 Multi-head가 붙은 것은 트랜스포머가 어텐션을 병렬적으로 수행하는 방법을 의미한다.

Mulit-head Self-Attention Vs. Position-wise Feedforward Neural Network

  • Multi-head Self-Attention : 셀프 어텐션을 병렬적으로 사용
  • Position-wise FFNN : 입력값이 출력까지 한 방향으로 전달되는 구조를 가진 인공 신경망

 

Self-Attention의 의미와 이점

앞서 정리한 것처럼 어텐션 함수는 주어진 쿼리(Query)에 대해서 모든 키(Key)와의 유사도를 각각 구한다. 그리고 구한 유사도를 가중치로 하여 키와 맵핑되어있는 각각의 값(Value)에 반영한다. 그리고 유사도가 반영된 값(V)을 모두 가중합하여 리턴한다.

여기까지가 기존 어텐션의 개념이다. 그런데 어텐션 중에서는 셀프 어텐션(self-attention)이라는 것은 어텐션을 자기 자신에게 수행한다는 의미이다.

seq2seq에서 어텐션을 사용할 경우의 Q, K, V의 정의는 다음과 같다.

Q = Querys : 모든 시점의 디코더 셀에서의 은닉 상태들
K = Keys : 모든 시점의 인코더 셀의 은닉 상태들
V = Values : 모든 시점의 인코더 셀의 은닉 상태들

seq2seq에서 어텐션디코더 셀의 은닉 상태가 Q이고 인코더 셀의 은닉 상태가 K라는 점에서 Q와 K가 서로 다른 값을 가지고 있다. 그런 반면 셀프 어텐션에서는 Q, K, V가 전부 동일하다.

Q : 입력 문장의 모든 단어 벡터들
K : 입력 문장의 모든 단어 벡터들
V : 입력 문장의 모든 단어 벡터들

 

~

Multi-Head Attention 병렬 어텐션을 수행했을 때의 장점 : 여러 시각으로 정보를 수집할 수 있다.