본문 바로가기
AI/Transformer

Transformer_2(기초부터 심화까지)

by 전주혁 2023. 6. 28.

저번 포스팅에서

 

Transformer의 핵심 개념인 Self-Attention

쿼리, 키, 밸류

그리고 임베딩까지 알아보았어요.

 

 

 

코드를 보며 이해하면 더 쉽겠죠?

 

 

이번 시간에는

코드를 통해 저번 시간에 배운 내용들을

이해해볼까요?

 

 

 

 

"I love AI"라는 문장으로

예시를 들어볼게요.

 

 

 

"I love AI"를 토크나이징을 해 봅시다.

토크나이징을 한다면 'I', 'love', 'AI' 로 분리가 됩니다.

 

 

 

그 후 분리된 각 단어에 ID를 할당해 줍니다.

 

 

 

 

그 다음 입력 시퀀스를 생성해 줍시다.

 

 

 

 

 

4,64 짜리 임베딩 레이어를 정의해줍니다.

 

 

embed_dim은 임베딩 벡터의 차원 수를 결정하는데,

임베딩 차원이 클수록 각 토큰을 표현하는 벡터가 더 많은 정보를 담을 수 있지만,

그만큼 모델의 파라미터 수가 증가하여 학습과 추론에 더 많은 계산이 필요합니다.

 

반면, 임베딩 차원이 작으면 모델의 파라미터 수가 줄어들어 계산 효율성이 향상되지만,

표현력이 감소할 수 있습니다.

 

 

따라서 embed_dim 설정은 표현력과 계산 효율성 사이의 균형을 찾는 것이 중요합니다!

 

 

 

 

embed_dim이 작은 경우:

장점 : 모델의 전체 크기가 작아지므로, 학습과 추론 시간이 빨라집니다.

메모리 사용량이 줄어듭니다.

 

단점 : 각 토큰을 표현하는 벡터의 정보가 제한되어, 복잡한 문제를 해결하는 데 어려움이 있을 수 있습니다.

모델의 표현력이 줄어들어 성능이 저하될 수 있습니다.

 

 

 

 

embed_dim이 큰 경우:

장점 : 각 토큰을 표현하는 벡터가 더 많은 정보를 담을 수 있어, 복잡한 문제를 해결하는 데 더 유리합니다.

모델의 표현력이 높아져 성능이 향상될 수 있습니다.

 

단점 : 모델의 전체 크기가 커지므로, 학습과 추론 시간이 느려집니다.

메모리 사용량이 증가합니다.

 

 

 

 

 

그렇게 임베딩 벡터로 변환을 하면

다음과 같은 값들이 텐서로 저장됩니다.

 

 

 

 

 

지금까지의 코드를 요약하고 넘어가자면,

 

1. 주어진 문장(sentence)을 공백을 기준으로 나누어 토크나이징합니다.
2. 각 단어에 정수 ID를 할당하기 위해 사전 정의된 word_to_idx 딕셔너리를 사용합니다.
3. 정수 ID들로 이루어진 입력 시퀀스(input_sequence)를 생성합니다.
4. 임베딩 레이어를 정의하고, 입력 시퀀스를 임베딩 벡터(embedded_input)로 변환합니다.

 

이제 embedded_input은 셀프 어텐션 메커니즘에 사용할 수 있는 형태입니다.

이전에 작성한 셀프 어텐션 클래스의 forward 메서드에 embedded_input을 전달하여 결과를 얻을 수 있습니다.

 

 

 

 

그 후 가장 중요한 Self-Attention 클래스를 정의해봅시다.

이곳에서 쿼리, 키, 밸류 값도 함께 생성해요!

 

 

코드에 대해 간단한 설명을 하자면

쿼리, 키, 밸류 선형 레이어를 정의하고,

순전파 함수에서 이들 레이어를 사용하여 입력 시퀀스 내 단어 간의 관계를 반영한

어텐션 출력을 계산합니다.

 

 

스케일드 닷 프로덕트 어텐션 계산:

attn_scores=torch.matmul(q, k.transpose(-2, -1))/(embed_dim ** 0.5)는 쿼리와 키 행렬의 내적(dot product)을 계산 후, 임베딩 차원의 제곱근으로 나눠 스케일링

이렇게 스케일링하는 이유는 큰 값의 닷 프로덕트가 softmax 함수에서 큰 차이를 발생시키지 않도록 하여 학습의 안정성을 높이기 위함입니다.

 

 

어텐션 확률 계산:

attn_probs = F.softmax(attn_scores, dim=-1)는 계산된 어텐션 점수를 이용해 어텐션 확률을 계산합니다. 

이 확률은 각 단어 간의 상대적인 관계를 나타냅니다.

 

 

어텐션 출력 계산:

attn_output = torch.matmul(attn_probs, v)는 어텐션 확률과 밸류 행렬을 곱하여 어텐션 출력을 계산합니다. 

이 출력은 입력 시퀀스 내 각 단어의 가중치가 반영된 결과물입니다.

 

 

 

 

 

 

 

임베딩 레이어를 거친 값은

self-attention을 통해

이러한 텐서들로 변환이 됩니다!

 

 

 

 

 

이번 시간을 통해

이론으로만 알고 있었던

Self-Attention,

 

키-쿼리-밸류,

 

임베딩

에 대한 이해가 더 높아졌을 거라고

믿어요!

 

혹시라도 이해가 안 되는 부분이나

궁금한 부분은 댓글 부탁드립니다!