본문 바로가기
AI/Transformer

Transformer_3(기초부터 심화까지)

by 전주혁 2023. 6. 28.

저번 시간에는 간단하게

Transformer가 무엇인지

설명만 하려다

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

 

 

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

 

 

1. 키-쿼리-밸류(Key-Query-Value) 개념 및 셀프 어텐션(Self-Attention) 메커니즘


2. 임베딩(Embedding) 및 Positional Encoding


3. Multi-Head Attention


4. Layer Normalization


5. Residual Connection


6. 인코더와 디코더 구조


7. 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이라는 숫자를 사용하는지 의문이 또 드실 텐데요.

 

 

 

10000

 - Positional Encoding의 주기성을 설정하는 값입니다.

10000이라는 값은 큰 주기를 갖게 해주어 각 position에 대한 encoding이 독립적인 특성을 가질 수 있도록 도와줍니다.

또한, 이 값이 너무 작으면 인코딩된 위치 값이 서로 겹치게 되고,

너무 크면 인코딩 벡터의 차원이 커질 수 있어 계산 효율성이 떨어집니다.

따라서, 적절한 크기의 값을 설정해주는 것이 중요합니다.

논문에서는 이 값으로 10000을 사용하였습니다.

 


sin, cos 함수

- sin과 cos 함수를 사용하는 이유는 주기적이고 연속적인 값을 생성하기 위함입니다.

sin 함수와 cos 함수는 주기적인 함수이기 때문에 각 position에 대해 유사도를 측정할 수 있습니다.

또한, sin 함수와 cos 함수를 교차로 사용함으로써 인코딩 벡터의 각 차원이 독립적인 정보를 포함할 수 있게 합니다.

이를 통해 Transformer 모델이 입력 시퀀스의 순서 정보를 학습할 수 있습니다.

 

 


위와 같은 이유로 Positional Encoding에서 10000과 sin, cos 함수를 사용합니다. 이를 통해 Transformer 모델은 입력 시퀀스의 위치 정보를 포함하는 벡터를 얻을 수 있으며, 이 정보를 활용해 문장이나 문서의 구조를 이해할 수 있습니다.

 

 

 

 

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

 

 

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

 

 

위치 정보 인식

 - 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에 대해 알아 보아요!