데이크루 5기

GPT4가 알려주는 Transformer_3(기초부터 심화까지)

2023.04.03 16:37 3,559 Views

Transformer_1 : https://dacon.io/competitions/official/236091/talkboard/408068?page=1&dtype=recent

Transformer_2 : https://dacon.io/competitions/official/236091/talkboard/408069?page=1&dtype=recent


저번 시간에는 간단하게

Transformer가 무엇인지

설명만 하려다

Self-Attention, 키-쿼리-밸류, 임베딩까지 알아보았는데요



이번 시간부터 Transformer를 체계적으로 공부해봅시다!


GPT에게 Transformer 모델을 체계적으로 공부하는 방법을 물었더니



라고 하네요!


저희는 첫 시간에 딱 알맞게도 저 순서대로 진행을 했었네요.


이제부터 이 순서대로 계속 진행을 해보겠습니다!



먼저 저번 시간 배웠던

임베딩에 대해 기억하시나요?


한번 더 환기하고 가자면


임베딩(Embedding)

임베딩은 범주형 변수(예: 단어, 문자)를 고정된 크기의 연속 벡터로 변환하는 과정입니다. 

자연어 처리에서 단어와 같은 범주형 데이터를 모델이 처리하기 쉽게 만들 수 있으며,

단어 간의 의미적 관계를 나타낼 수 있습니다. 

임베딩 레이어는 일반적으로 행렬(임베딩 행렬)로 표현되며,

각 행은 단어의 고유한 정수 ID에 대응하는 벡터를 나타냅니다. 

초기에는 임베딩 행렬이 무작위 값으로 채워져 있지만,

모델이 학습되면서 이 행렬은 데이터로부터 의미 정보를 포착하는 벡터로 업데이트 됩니다.


그래서 저희는 저번 시간에 코드로

"I love AI"가

이렇게 값이 변환되는 것을

보았어요!




그 다음

오늘 처음 배우는

Positional Encoding

은 무엇이고, Transformer에서 어떻게 사용되는지 알아봅시다.


Transformer는 순환(recurrent) 및 합성곱(convolutional) 연산을 사용하지 않기 때문에,

입력 시퀀스의 순서 정보를 주입할 방법이 필요합니다. 


쉽게 말해서, Positional Encoding을 통해 입력 시퀀스의 단어들 사이의 상대적인 위치 정보를 인코딩할 수 있게 되었습니다.


Positional Encoding은 이러한 순서 정보를 제공하는 방법 중 하나로,

고정된 벡터를 각 단어의 임베딩 벡터에 더하여 위치 정보를 포함시키는 방식입니다.



Positional Encoding은 다음과 같은 특징을 갖습니다:

  • 각 위치에 대한 고유한 벡터를 생성합니다.
  • 위치에 따라 점진적으로 변화하는 값(주기적 함수, 예: 사인 함수와 코사인 함수)을 사용하여 위치 정보를 인코딩합니다.
  • 임베딩 벡터와 같은 차원을 가집니다.


Positional Encoding을 생성하기 위해, 다음 공식을 사용합니다:


PE(pos, 2i) = sin(pos / 10000^(2i / d_model))

PE(pos, 2i + 1) = cos(pos / 10000^(2i / d_model))


여기서 pos는 위치, i는 차원 인덱스, d_model은 임베딩 차원입니다.

이렇게 생성된 Positional Encoding 벡터는 입력 시퀀스의 각 단어에 해당하는 임베딩 벡터와 합산되어,

모델이 위치 정보를 활용할 수 있게 됩니다.


여기서 왜 sin, cos을 사용하고 10000이라는 숫자를 사용하는지 의문이 또 드실 텐데요.


충분히 의문이 해소되었나요?



이로 인해 아래와 같은 부분들이 개선되었습니다.


위치 정보 인식:

Transformer의 기본 구조는 위치에 대한 정보를 전혀 포함하지 않습니다.

이는 모델이 문장이나 시퀀스의 구조를 파악하는 데 어려움을 겪을 수 있음을 의미합니다. Positional Encoding을 추가함으로써,

모델은 위치 정보를 인식하고 이를 학습과정에 활용할 수 있게 됩니다.


문장 구조 이해:

Positional Encoding이 적용되면,

Transformer 모델은 문장 내 단어들의 순서와 문맥을 파악하는 데 도움을 받을 수 있습니다.

이를 통해 문장을 더 정확하게 분석하고 처리할 수 있게 됩니다.


시퀀스 간의 관계 학습:

Positional Encoding은 단어들 사이의 상대적 위치를 인코딩하기 때문에,

모델은 시퀀스 내에서 단어 간의 관계를 학습하는 데 도움을 받을 수 있습니다.

이는 문장 내 단어들의 의존 관계를 이해하는 데 큰 도움이 됩니다.




결론적으로,


Positional Encoding을 추가함으로써

Transformer 모델은 입력 시퀀스의 단어들 사이의 상대적 위치 정보를 활용하여 문장 구조와 문맥을 더 정확하게 파악할 수 있게 되어,

전반적인 성능이 향상됩니다.



그래서 Transformer_2에서 알려드린 코드에



이 부분만 추가한다면

입력 시퀀스의 단어들 사이의 상대적인 위치 정보도 추가 할 수 있습니다!


혹시 모르는 부분이 있으면 댓글 주시면 함께 알아봐요!


처음부터 지금까지 배운 것을 정리해보겠습니다.


Transformer: Transformer는 인코더와 디코더로 구성된 구조를 가지며, 자연어 처리 분야에서 뛰어난 성능을 보여주는 모델입니다. 

이 모델은 기존의 RNN 및 LSTM에 비해 병렬 처리가 가능하여 학습 속도가 빠르고, Self-Attention 메커니즘을 통해 문맥 정보를 효과적으로 학습합니다.


Self-Attention: Self-Attention은 입력 시퀀스 내의 각 단어가 다른 단어와 얼마나 관련되어 있는지를 측정하여 문맥 정보를 포착하는 메커니즘입니다. 

이를 위해 Query, Key, Value 행렬을 사용하며, 스케일드 닷 프로덕트 어텐션을 계산하여 최종 결과를 얻습니다.


쿼리-키-밸류(Query-Key-Value): 쿼리, 키, 밸류는 Self-Attention 메커니즘에서 사용되는 행렬로, 각각 다른 가중치 행렬을 곱해 생성됩니다. 

쿼리와 키의 행렬곱을 통해 어텐션 점수를 계산하고, 이를 밸류 행렬에 적용하여 최종 어텐션 결과를 얻습니다.


임베딩(Embedding): 임베딩은 범주형 변수(예: 단어, 문자)를 고정된 크기의 연속 벡터로 변환하는 과정입니다. 

임베딩을 사용하면 단어와 같은 범주형 데이터를 모델이 처리하기 쉽게 만들고, 단어 간의 의미적 관계를 나타낼 수 있습니다.


Positional Encoding: Positional Encoding은 Transformer 모델에 입력 순서 정보를 제공하는 방법입니다. 

임베딩 벡터에 위치 정보를 포함한 벡터를 더함으로써, 모델이 입력 시퀀스의 순서를 고려할 수 있게 됩니다. 

Positional Encoding은 주로 사인과 코사인 함수를 사용하여 계산되며, 이를 통해 입력 시퀀스의 위치 정보를 학습하게 됩니다.



다음 시간에는

Multi-Head Attention에 대해 알아 보아요!