본문 바로가기

개발

2024년은 Transformer?!

최근 많은 모델에 Transformer가 결합되고 있다.

김태영 대표님이 2024년은 Transformer라고 했다.

함께 비트캠프에서 공부하고 창업을 한 동기가 Transformer, Stable Diffusion, Sora를 꼭 공부하라고 했다.

 

현재 나는 Vision 문제를 주로 맡고 있다.

SAM(TinySAM)을 통해서 과제를 해결하고 있다.

SAM Prompt 중 하나는 Text Prompt이다.

CLIP 모델을 결합했다.

(CLIP 모델은 Vision Transformer와 Transformer을 결합하여 이미지와 텍스트를 모두 처리할 수 있게 만든 모델)

framework of FastSAM

그래서 오늘은 Transformer에 대해서 다시 복습하려고 한다.

우선 AI 용어사전에 정의된 내용부터 정리를 해보겠다.

https://terms.naver.com/entry.naver?docId=6653697&cid=69974&categoryId=69974

 

Transformer

트랜스포머(Transformer)는 셀프 어텐션(self-attention) 기법을 사용하여 학습 속도를 빠르게 하고 메모리 문제를 해결한 인코더-디코더(encoder-decoder) 모델을 말한다. 앞서 나온 RNN(Recurrent Neural Network)

terms.naver.com

2024년은 Transformer!!

 

요약 : 

Transformer는 Self-attention 기법을 사용하여 학습 속도를 빠르게 하고 메모리 문제를 해결한 encoder-decoder 모델을 말한다.

 

내용 :

앞서 나온 RNN(Recurrent Neural Network)은 시퀀스 단위로 문장을 처리하기 때문에 시퀀스가 길어질수록 메모리 소비가 많이 되고 디코딩이 어려워진다는 단점이 있었고, 따라서 어텐션을 통해 decodr의 모든 hidden-state단계가 encoder의 어떤 은닉 상태와 가장 가까운지 alignmnet score를 계산하는 기법이 고안되었다. 그런데 이러한 어텐션은 단순히 정렬만 고려하므로 멀리 떨어진 문장 내 단어들의 관계를 파악할 수 없었다. 이에 트랜스포머에서는 셀프 어텐션을 사용하여 디코더뿐만 아니라 인코더의 입력으로 들어오는 문장의 단어들이 어떤 단어와 가장 관계가 있는지를 계산하였다. 계산 방법은 Query와 Key를 dot product하고 K의 차원 수만큼 제곱근으로 나눈 뒤에, sofrmax를 취해 확률값으로 바꾸고 그 값에 가중치인 Value를 내적하는 것이다.

이러한 계산 방식은 Key의 차원 수(d)만큼 제곱근으로 나누는 크기 조절(scaling)을 거쳤기 때문에 scaled dot product attention이라고 한다. 셀프 어텐션은 트랜스포머의 주요한 작동 원리이며 인코더와 디코더에서 모두 사용된다. 그리고 이를 적용한 트랜스포머의 아키텍처는 아래의 그림과 같다. 왼쪽 박스는 인코더이며 오른쪽 박스는 디코더이고, 인코더 내 블록과 디코더 내 블록이 여러 개로 구성되어 있다는 것을 나타내기 위해 Nx로 표시하였다.

구체적으로, 트랜스포머는 인코더에 들어가기 전 먼저 입력 문장에 positional encoding을 사용하여 단어들의 위치 정보를 반영하는 작업을 한다. 입력 문장에 바로 셀프 어텐션만 한다면 문장 내 단어와 다른 단어들 사이의 관계가 똑같이 처리되기 때문에 순서 정보가 중요한 문장의 의미를 파악할 수 없다. 따라서 기존의 임베딩 벡터에 좌표로 할당된 positional encoding만큼 값을 더해서 인코더에 넣어 이러한 문제에 대처할 수 있도록 하였다.

 

Positional encoding을 거친 벡터는 인코더에서 문장 내 정보들을 학습하는데, 멀티 헤드 어텐션(Multi-head attention)을 통해 여러 개의 헤드(h)에서 셀프 어텐션을 수행하고 각각 나온 어텐션 점수를 합산하여 최종 어텐션 점수를 산정한다. 트랜스포머 모델에서는 8개의 헤드로 구성하였는데, 이는 하나의 헤드에서 512차원으로 어텐션을 하지 않고 64차원으로 8번을 각각 다른 가중치로 계산해서 합친(concatenate) 것이다. 멀티 헤드 어텐션의 결과, 헤드의 차원 수가 감소되어 셀프 어텐션의 헤드 하나로만 연산한 비용과 비슷한 효과를 낼 수 있고, 여러 개의 헤드에서 병렬적으로 연산이 이루어지면서 연산 속도가 빠르며, 각 헤드에서는 단어들 사이의 관계 정보를 다양한 측면에서 학습함으로써 새로운 정보를 얻을 기회가 더 많아진다. 그 도식은 아래와 같다.

디코더에서도 인코더와 비슷한 작업을 수행하는데, 다만 인코더와 달리 masking을 통해 다음에 나오는 단어들을 가리는 Masked Multi-head attention 방식을 사용하여 진행한다. 셀프 어텐션은 문장 전체를 보는 구조로서 다음에 등장하게 될 단어를 미리 학습하기 때문에 예측 모델의 의미가 없어진다는 문제가 있다. 그런데 인코더에서는 학습만 수행하면 되므로 문제가 되지 않지만, 출력을 해야 하는 디코더에서는 문제가 되는 것이다. 따라서 Masked Multi-head attention으로 다음에 등장할 단어들에 마스킹을 해서 그 단어들을 보지 못하게 한다. 위의 왼쪽 그림의 Scaled dot-product attention에 나타난 Mask 단계의(opt.)표기는 디코더에서만 적용되는 기능임을 보여준다.

 

그리고 디코더를 통과한 벡터는 Linear layer와 softmax layer로 들어간 후 argmax를 사용해서 다음 등장할 단어에 대해 가장 확률이 높은 값을 출력한다. 트랜스포머 아키텍처는 이러한 단계를 거쳐 학습 시간을 줄이고 메모리 문제를 해결하였다.

 

역사 :

그래서 Tansformer가 뭐야?

1. RNN을 사용했을 때 시퀀스 단위로 문장을 처리해서 시퀀스가 길어질수록 메모리 소비가 많고 디코딩이 어려웠어ㅠㅠ

2. 어텐션을 통해서 디코더의 모든 은닉 상태 단계가 인코더의 어떤 은닉 상태와 가장 가까운지 정렬 점수를 계산하는 기법을 고안했어

3. 그런데 어텐션은 단순히 정렬만 고려해서 멀리 떨어진 문장 내 단어들의 관계를 파악할 수 없었지 뭐야ㅠㅠ

4. 그리하여 트랜스포머에서 셀프 어텐션을 사용해서 디코더뿐만 아니라 인코더의 입력으로 들어오는 문장의 단어들이 어떤 단어와 가장 관계가 있는지 계산했어!!

 

framework :

1. 인코더에 들어가기 전 먼저 입력 문장에 Positional encoding을 사용해서 단어들의 위치 정보를 반영해

2. 기존의 임베딩 벡터에 좌표로 할당된 Positional encoding만큼 값을 더해서 인코더에 넣어줘!! 왜냐고?!

3. 입력 문장에 바로 셀프 어텐션만 한다면 문장 내 단어와 다른 단어들 사이의 관계가 똑같이 처리되어서 순서 정보가 중요한 문장의 의미를 파악할 수 없어ㅠㅠ

4. Positional encoding을 거친 벡터는 인코더에서 문장 내 정보들을 학습해

5. Multi-head attention을 통해 여러 개의 헤드에서 셀프 어텐션을 수행하고 각각 나온 어텐션 점수를 합산해서 최종 어텐션 점수를 구해

6. 8개의 헤드로 구성했는데, 하나의 헤드에서 512차원으로 어텐션을 하지 않고 64차원으로 8번을 각각 다른 가중치로 계산해서 concatenae를 진행!!

7. 멀티 헤드 어텐션의 결과는 헤드의 차원 수가 감소되어 셀프 어텐션의 헤드 하나로만 연산한 비용과 비슷한 효과를 내고, 여러 개의 헤드에서 병렬적으로 연산이 이루어지면서 연산 속도가 빨라!!

8. 각 헤드에서는 단어들 사이의 관계 정보를 다양한 측면에서 학습함으로써 새로운 정보를 얻을 기회가 더 많아!!

9. 디코더는 masking을 통해 다음에 나오는 단어들을 가리는 Masked Multi-head attention 방식을 사용해

10. 셀프 어텐션은 문장 전체를 보는 구조로서 다음에 등장하게 될 단어를 미리 학습하기 때문에 예측 모델의 의미가 없어지는 문제가 발생해

11. 인코더에서는 학습만 수행하면 되어서 문제가 안돼~

12. 출력을 해야 하는 디코더에서는 문제가 된다ㅠㅠ

13. 그래서 Masked Multi-head attentiond으로 다음에 등장할 단어들에 마스킹을 해서 그 단어들을 보지 못하게 해!!

14. 디코더를 통과한 벡터는 Linear layer와 softmax layer로 들어간 후 argmax를 사용해서 다음 등장할 단어에 대해 가장 확률이 높은 값을 출력!!!!

 

 

결론 : 

https://www.youtube.com/watch?v=t45S_MwAcOw

강의 듣고 올게요~