인공지능 in 네부캠 AI 4기/딥러닝 기본

Transformer

제로타이 2022. 10. 4. 23:32

이번에느 LSTM과는 조금 다르면서 연속데이터(보통 시계열 데이터라고 부르는 모양인데, sequence는 그냥 연속이라 부르는 게 낫지 않나 하는 생각)를 다루는 모델, Transformer를 보자.
이 모델은 특히 NLP, 자연어 처리에 사용하기 적합한 모델이다. 우리가 쓰는 언어에서 한 문장은 길이가 달라지기도 하고 어순이 바뀌기도 하고, 생략이 일어나는 등의 다양한 변형이 가해질 수 있다. "나는 음식을 먹는다." 와 "나는 먹는다 음식을." 이라는 두 문장을 RNN에서는 다르게 보게 되지만 transformer는 self-attention을 이용해 이러한 문제를 해소한다.

Transformer

기본적인 구조.

재귀적인 구조 없이, 한번에 N개의 데이터를 처리한다. 참고로 NLP에서 잘 쓰인다고 해서 다른 곳에 쓰일 수 없는 것이 아니다. 다른 데이터도 잘 다루는 강점을 가지고 있는 것이 또 이 transformer다. 이미지 분류에도 활용되고, 또 요즘 핫한 DALL-E에서도 이게 활용된다!

예제를 보면서 따라가보자. 우리는 어떤 언어가 왔을 때 그것을 다른 언어로 번역하고 싶다. 즉 seq-to-seq인 것이다.

간단하게 표현한 구조

입력의 단어 갯수와 출력의 단어 갯수가 다른 것을 확인할 수 있다. 이런 것은 RNN에서는 나올 수 없는 구조이다. 
우리는 여기에서 몇 개의 단어를 어떻게 넣을 것인지, 그리고 encoder와 decoder 사이에 무슨 일이 일어나는지, decoder가 어떻게 출력을 내는지 알아야 한다. 

Encoder

encoder 속 모양

각 블록들은 이러한 구조를 가지고 있다. Feed Forward Neural Network는 익히 알고 있는 MLP와 크게 다르지 않다. 우리가 유의 깊게 봐야할 것은 바로 Self-Attention이다(그래서 논문 이름이 Attention is all you need인 듯하다).

예시대로 입력에 3개의 단어가 온다고 하면 각 단어를 특정한 벡터로 표현할 수 있다. 우리는 self-attention에서 똑같이 3개의 벡터의 모양으로 내보내 FFNN으로 보내주면 성공이다. 그런데 이때 각 벡터는 서로에게 영향을 주고받은 뒤의 벡터가 될 것이다. 즉 서로에게 의존성을 가진 채로 다음으로 넘어가게 된다는 것.

self-attention에서는 받은 단어들을 벡터로 만든 뒤 각 벡터에 Queries, Keys, Values 벡터를 새로 만든다.  우리는 이것을 통해 각 단어에 해당하는 embedding 벡터를 새로운 벡터로 만들어줄 것이다. 
이를 위해서 먼저 각 벡터의 Score, 점수를 만든다. score는 해당 벡터의 query와 다른 벡터들의 모든 key(자기 자신 포함)의 내적을 전부 계산한다. 이는 이 단어가 다른 단어들과 어떤 유사도가 있는지 평가하는 지표가 된다. 이를 통해 우리 모델은 어떤 것을 얼마나 학습해야 하는지 attention을 갖게 된다. 
나온 점수는 한번 normalize해준다. 어떻게 하는가?

8로 일단 나눔

하이퍼 파라미터로 주어지는 $d_k$의 제곱근으로 나눈다. 이것은 인간이 전달하는 하이퍼파라미터로, 점수가 너무 크지 않도록 조정하는 역할을 한다. 그 후에 소프트맥스 연산을 통해 지분으로 환산해주는 것이다. 그렇게 하면 위 사진처럼 각 단어들이 해당 단어에 대해 얼마나 지분을 가지는지 알 수 있게 된다.

마지막은 그렇게 나오는 값을 value 벡터와 곱한 후에 전부 더한 벡터를 만드는 것이다. 이게 바로 인코딩된 값이다!
정리하자면 우리는 결국 각 단어들의 value 벡터가 해당 단어에 얼마나 지분을 가지는지를 구하는 과정을 거쳤던 것이다. 근데 그 지분을 따지기 위해서 우리는 query와 key 벡터를 사용한 것이고.

정리!

방금 위에서 말한 것을 정리하면 이런 모양이 된다.
여기에서 주의할 점은 query와 key는 내적 연산을 해야하기 때문에 무조건 차원이 같아야 한다. 물론 value는 어차피 지분을 곱할 것이라 상관없다.

왜 transformer는 잘 작동할까? 이미지를 처리할 때를 생각해보자. 입력값이 고정되면 출력도 결국 고정된다. 다른 이미지를 고려하지는 않으니까. 그런데 transformer는 옆 단어들을 계속 고려하면서 인코딩이 이뤄지기 때문에 조금 더 유연한 결과가 나온다. 그래서 더 많은 표현력을 가지게 된다. 물론 그만큼 메모리 지분과 연산량은 더 크고, 한번에 처리해야 하는 단어의 갯수 자체는 고정된다는 한계점을 가지기는 한다.

Multi-headed attention

이제 앞에서 말한 attention을 많이 해보자. 방금은 query, key, value를 하나씩만 만들었지만, 이것을 n개를 만들 수도 있다! 이것이 바로 multi-headed attention이다. 이를 통해 단어마다 우리는 n개의 인코딩 벡터를 얻을 수 있게 된다. 이때 FFNN으로 넘기기 위해서는 입력과 출력의 차원을 맞춰줘야만 한다. 어차피 그 이후에 또 인코딩 블럭을 거쳐야 하기 때문에 결국 이것을 줄여야 하는 것.  

행렬!

우리에게는 행렬연산이 있다! 가령 10개의 단어가 들어오고 그에 맞춰서 우리는 각각 8개의 인코딩 벡터를 만들어냈다고 생각해보면, 우리는 결과적으로 80개의 인코딩 벡터를 가지게 될 것이다. 그리고 우리는 다시 이것을 10개로 돌리고 싶다. 그렇다면 단순하게 80, 10짜리 행렬을 곱해주면 다시 10개의 벡터로 돌아가게 된다!

Positional Encoding

또 추가적으로 여기에 positional encoding의 작업이 있다. 이것은 일종의 편향이라고 볼 수 있다. 이것을 왜 넣어주는가? 사실 이러한 연산을 거치게 되면 단어들이 들어오는 순서는 조금도 고려되지 않는다. 그것을 조정하기 위해서 편향이 추가되는 것이다. 

Decoder

encoder는 주어진 단어를 표현하는 어떤 작업이라면, decoder는 표현된 것을 통해 무언가를 생성하는 과정이다. encoder에서 어떤 정보가 decoder로 전달되는가?  
바로 key와 value를 전달한다! 여태 encoder에서는 각 단어의 query에 key를 열라 내적하고 열라 value를 곱하지 않았던가? 출력을 위한 attention을 만들기 위해서는 이것들과 decoder에 전달된 query를 이용해 연산을 진행해야 한다. 
이를 통해 우리의 모델은 자기회귀적으로 작동하게 된다. 

그렇지만 참고로 학습을 진행할 때는, 역전파를 할 때 decoder에서 사용된 key와 value가 encoder로까지 가는 것을 막기 위해 masking을 하게 된다. encoder를 제대로 학습시키기 위해서 정답값으로 만들어진 단어(미래에 만들어진)에 의해 의존되는 일이 없도록 하는 것이다. decoder는 오직 encoder에서 만들어진 key와 value를 참고해야만 하게 학습하는 것. 

이렇게 encoding, decoding을 마치면 이후에는 정말 우리가 아는 단어로 만들어주는 작업만 거치면 번역이 이뤄지는 것이다!

Vision Transformer

방금 전까지 NLP에 활용되는 transformer를 봤지만, 최근에는 다양한 영역에서 활용이 되고 있다. 이미지를 조각내어 그것을 각 단어처럼 사용해서 넣는 것이다. 
바로 좋은 예시가 바로 DALL-E.

 

 

 

으악 개어렵다

 

  • 앞서 소개한 RNN 기반의 모델들이 해결하기 힘든 문제들을 Transformer은 어떻게 다루나요?

기존 모델은 시계열 데이터를 다룰 때 이전 정보를 계속 가져오는데, 각 정보의 중요도를 명확하게 파악하는데 어려움을 겪는다. 자연어에서 많이 사용되는 대명사가 무엇을 가리키는 것인지 매번 파악해내는 것에 곤혹을 치루는 것. 이때 transformer는 단어 간의 가중치를 평가하는 연산이 들어가있어 그러한 관계 파악에 용이하다.

  • Transformer 의 Query, Key, Value 는 각각 어떤 기능을 하나요? NMT 문제에서의 예시를 구체적으로 생각해보세요.

Query는 각 단어의 가중치를 나타내기 위해 곱해지는 값, Key는 가중치 표현을 위해 곱하는 값. Value는 그러한 가중치를 고려하여 나타내지는 단어의 벡터? 말 표현이 어렵기는 한데. NMT는 Neural Machine Translation, 인공 신경망 번역을 말하는 듯한데, 이건 내가 잘 모르겠다.

'인공지능 in 네부캠 AI 4기 > 딥러닝 기본' 카테고리의 다른 글

Generative Models  (0) 2022.10.06
Recurrent Neural Networks  (0) 2022.10.04
Computer Vision Applications  (0) 2022.10.04
Modern Convolutional Neural Networks  (0) 2022.10.04
Convolutional Neural Networks  (0) 2022.10.04