새소식

딥러닝

Transformer 완전 정복하기😎

  • -

트랜스포머 Transformer

1.  구조 

  • Multi-head self-attention
  • Feed-forward network
  • Layer normalization
  • Shortcut connection 
  • Positional encoding

2. Advantages of Transformer

  • Long - range relationship : Attention 덕분에 (이전 포스팅 : Non-local Filter 참조)
  • Parallelized computing : Multi-head self attention 이 병렬화를 가능하게 함. 
  • Capacity for big data : 파라미터가 엄청 많다 ( = 모델이 크다, 학습 시간이 길다)

3. Transformer 의 구성

트랜스포머는 인코더와 디코더로 구성되어 있습니다. 

 

a. Encoder

 

1) Input Embedding

 

이것은 입력에 context 를 임베딩 하는 것입니다. 이를 다른 말로 하면, 어떤 정보가 있을 때 이 정보에서 특징들을 추출해 내는 것입니다. 이때 특징이 추출되면 입력보다 dimension 이 적어집니다. 특징 추출이란 말도 많이 쓰이지만, 요새는 representation, 즉 표현 방법들을 배운다는 말도 많이 사용합니다. 그래서 representative learning 이라 하면, 이러한 encoder - decoder 구조가 등장하는 경우가 많습니다. 

 

트랜스포머는 자연어를 처리하기 위해 고안된 구조입니다. 한국어 - 영어 번역기를 생각해 봅시다. 

"나는 집에 간다" 라는 문장 하나를 input 으로 넣기 위해서는 이 문장의 구성 요소들을 모델이 이해할 수 있는 포맷, 즉 벡터로 변환해 줄 필요가 있습니다. 

word 를 vector 로 바꿔주는 과정을 input embedding 이라고 합니다. 

 

그러면 word 를 vector 로 만들 때 아무 숫자나 할당해도 되나요 ? 라고 한다면 원칙적으로는 그렇습니다.

NLP 를 하는 쪽에서는 의미론적으로 유사한 단어들끼리 가까운 벡터를 가지도록 word embedding 을 하는 과정 자체에 관한 연구도 많이 이루어지고는 있지만, 어쨌든 우리는 word 를 벡터로 바꾸는 것이 input embedding 이라는 것만 알고 넘어가면 됩니다. 

 

2) Positional Encoding

 

NeRF 에도 이와 유사한 방식의 Positional Encoding 이 사용됩니다만, 너프에서는 2D 를 Multi-dimension 으로 확장하기 위해서 이를 사용하지만, 

여기서는 입력값을 다른 값으로 바꿔주는 게 아닙니다. 구조도를 살펴보면 addition (+) 으로 표시된 것을 볼 수 있습니다. 

트랜스포머에서는 위치마다 정해진 값을 기존 input 값에 더해주는 것으로 positional encoding 을 수행합니다. 

 

그러면 positional encoding 이 왜 필요할까요 ? 

 

문장이라는 것에는 순서가 있습니다. 우리 나라 말은 <나는 집에 간다>, <나는 간다 집에>, <집에 나는 간다>... 등 문장 요소의 순서가 바뀌어도 의미 전달에 크게 문제가 없습니다만, 라틴어 기반의 언어들은 위치가 매우 중요합니다. 위치가 바뀌면 문장 자체가 성립이 되지 않는 경우가 많이 있습니다. 

 

따라서 문장의 시퀀스가 중요하기 때문에 내가 단어들을 트랜스포머에 입력하기 전에, 단어들의 순서를 붙여줄 필요가 있습니다. 

좌 : 1D&nbsp; / 우 : 2D

다만, 순서를 정한다고 1-1, 1-2... 이런 식으로 정해 주는 것은 아니고, 각각의 행 / 열 마다 삼각함수를 이용해서 고유의 값을 지정해줍니다. 

수식에 있는 것 처럼 짝수 값은 sin 을 이용해서, 홀수 값은 cos 을 이용해서 값을 도출해 냅니다. 

그래서 내가 그 포지션에서 몇 번째 element 인지에 따라서 (pos, 2i) 가 결정된 후에는 그 숫자에 따라서 PE 값이 결정됩니다. 

 

따라서 트랜스포머에서는 PE 값을 input 에 더해서 최종적인 input 을 만들어 냅니다. 

3) Multi-head attention

 

그 다음은 Multi-head attention 입니다. Multi-head attention 은 query, key, value 를 독립적으로 가지고 있습니다. 그리고 이후 나중에 값들을 합칩니다. (concatenate)

그럼 여러 개의 head 를 써서 attention 을 하는 것의 장점은 무엇일까요 ? 이는 CNN 에서 필터를 여러 개 사용하는 이유와 비슷합니다. 

CNN 에서 어떤 필터는 low-level 에서 특징을 검출하는 필터고, 어떤 필터는 대각 성분을 추출하는 필터이고, 어떤 필터는 동그라미를 찾고... 이런 식으로 필터마다 역할이 다르죠. 

Self-attention 은 입력되는 컨텐츠 사이의 상관관계를 찾는 것입니다. 이러한 상관관계, 혹은 유사도를 나누는 기준이 유일하다고 할 수는 없습니다. 

그렇기 때문에 어떤 attention 은 명사끼리의 관계를 찾는 attention 이고, 어떤 attention 은 문법에 초점을 맞추는 attention 이고... 이런 식으로 유사도라고 하는 것도 하나의 기준으로 특정하는 것 보다,
다양한 관점에서의 유사도를 계산을 하면 좀 더 high-level 의 relationship 에 대해서 표현이 가능합니다. 

 

4) Add & Layer Normalization

 

Add 는 residual 입니다. residual 방식의 가장 큰 장점은, skip connection 을 통해 backpropagation 을 할 때 vanishing gradient 문제가 많이 줄어든다는 것입니다. 

그 다음은 Layer normalization 입니다. normalize 를 한다는 것은 평균과 표준 편차를 이용해서 데이터들을 정규분포 형식으로 만들어주는 것을 의미합니다. 

 

이때 batch norm 은 같은 채널의 서로 다른 n 개 끼리 normalization 하는 것입니다.

예를 들어 배치가 여러 개 있을 때, 1번째 배치의 1번째 채널, 2번째 배치의 1번째 채널, 3번째 배치의 1번째 채널... 들 끼리 normalization 하는 것입니다. 따라서 채널끼리는 normalization 이 안 됩니다. 

반면, Layer normalization 은 배치 사이즈를 신경쓰지 않고, 배치 각각 통채로 normalization 하는 것입니다. 

 

따라서 multi-head self attention 을 통해서 나온 애들을 원본과 합친 애들을 통채로 normalization 한다고 생각하시면 됩니다. 

 

5) Feed Forward

다음으로는 Feed forward 입니다. 입력이 x라고 하면,

  1. x 에 weight 곱해주고
  2. bias 더해주고 
  3. ReLU 해 주고, 
  4. 이 과정을 한 번 더 해주는

것이 Feed forward 입니다. 이때 weight 을 곱해 주는 것은 fully - connected 레이어를 통과하는 것과 같습니다. 

여기서 중요한 것은 이 과정이 point-wise 로 이루어진다는 것입니다.

 

 * feed - forward 란 ?

데이터나 신호가 네트워크나 시스템의 여러 단계를 거쳐 한 방향으로 진행될 때 사용하는 용어이다. 주로 NN 에서 볼 수 있으며, 데이터가 입력에서 출력까지 순방향으로 전파되는 방식을 나타낸다. 

feed - forward 의 핵심 내용 :

1. 한 방향 흐름 : feed - forward 에서 가장 중요한 것은 신호나 데이터가 한 방향으로 흐른다는 것이다. 이는 신경망에서 정보가 입력 계층에서 시작하여 숨겨진 계층들을 거쳐 출력 계층으로 진행되며, 사이클이나 반복되는 경로가 없음을 의미한다. 
2. 층간의 전파 : 데이터는 입력층에서 시작하여 각 층의 뉴런들을 통해 가중치와 활성화 함수에 의해 변형되며, 이러한 변형된 데이터가 다음 층으로 전달된다. 

 

임베딩, positional encoding 은 처음 한 번만 하지만, 

multi - head attention 과 feed - forward 하고 나온 출력들은 다음 블록의 입력으로 들어가게 됩니다. 이런 블록을 6개 통과합니다. 

 

여기까지가 인코더의 구조입니다. 

 

b. Decoder

 

디코더는 인코더와 비슷하게 생겼지만 조금 다릅니다. 디코더에서는 multi-head attention 이 두 번 들어갑니다. 하지만 첫 번째 multi-head attention 은 self-attention 이고, 두 번째 multi-head attention 은 cross-attention 입니다. 

(self-attention 은 쿼리, 키, 밸류를 입력에서 다 만들어 내는 것이고, cross-attention 은 쿼리와 키, 밸류가 서로 다른 데이터로부터 만들어진 것입니다.)

 

그런데, 디코딩을 할 때에는 조금 특별한 룰이 있습니다. 바로, 토큰을 사용하는 것입니다. 

여기서 사용되는 토큰은 <SOS>와 <EOS> 가 있습니다. SOS (Start Of String)는 "이제 문장을 시작할게" 라는 의미이고, EOS (End Of String) 는 "문장을 끝낼게" 라는 의미입니다. 

 

첫 번째 단계는 Masked Multi-head attention 입니다. 

우리가 만약 정답을 가지고 있어도, 학습을 시킬 때는 정답을 알고 학습을 하면 안 됩니다. 그렇기 때문에 뒤에 있는 정보들을 다 감추고 입력을 넣어 주어야 합니다. 

따라서 similarity score를 계산할 때 알고있는 것 까지만 score 를 계산하고, 모르는 부분은 infinity 로 둡니다. 

 

 

그래서 최종적으로 나온 값에 Softmax 를 적용해서 모든 단어에 대한 값을 만들어 놓은 것을 Vocabulary 라고 합니다. 

 

4. Training Process

"나는 학생 입니다" 를 영어로 번역하는 예제를 봅시다. 

 

1. 우선 "나는 학생 입니다" 라는 문장을 인코더로 넣습니다. 

2. 인코더의 6층을 통과하고 나면 Key 와 Value 가 나옵니다. 

3. 그 후 디코더에는 <SOS> 만 넣습니다. 

4. 디코더에서는 Linear, Softmax 를 거쳤을 때 <SOS> 다음에 나올 값을 예측합니다. 

5. 만약 You 가 나오는 등 틀린 값이 나오면, Loss 값이 크겠죠 ? 

6. 그러면 이 Loss 값이 인코더와 디코더에 모두 학습이 됩니다. 

7. 그런데, 그 다음에 학습을 할 때는 디코더에게 "정답" 을 줍니다. 비록 디코더가 잘못 예측 했지만, 잘못 예측한 값(You)을 주면 앞에 있는 말들이 다 틀렸기 때문에 뒤로 갈 수록 학습이 안 됩니다. 

8. 이런 식으로 학습이 이루어집니다. 

 


위 내용은 경희대학교 소프트웨어융합학과 황효석 교수님의 2023년 <심층신경망을 이용한 로봇 인지> 수업 내용을 요약한 것입니다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.