데이크루 5기

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

2023.04.03 13:19 2,727 조회

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


저번 시간

우리는

Transformer의 핵심 개념인 Self-Attention

쿼리, 키, 밸류 그리고 임베딩까지 알아보았어요.


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


이번 시간에는

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

이해해볼까요?



"I love AI"라는 문장으로

예시를 들어볼게요.




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

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




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





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





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



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

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

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

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

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

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



embed_dim이 작은 경우:

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

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

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

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



embed_dim이 큰 경우:

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

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


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

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





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

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



GPT가 알려주는

지금까지의 코드 요약입니다!



그 후 가장 중요한 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, 키-쿼리-밸류, 임베딩

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

믿어요!


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

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