Summary
- 개념이해만으로 어텐션 모델을 공부했었는데 실제로 텐서 차원들 단위로 이해하는데 시간이 좀 걸렸다.
- 실습에서 bert의 인코더를 Pretrained model로 가져와서 실제 다른 task에 fine tuning 했는데 fine-tuning 개념에 대해서 좀 더 생각해보게 되었다.
Learn
- 하정우 소장님 관련 유튜브 영상(네이버 신규 AI 플랫폼 소개 관련)
- Jin coding 5강 실습
- attention 모델 deep-dive
Details
- CLS 토큰이란, 기존에는 토큰들이 문장 안에서 단어들과의 관계 정보를 얻기 위해 self-attention을 하는데 이 때 당연히 자기 토큰과의 연관성이 높게 나올수 밖에 없음. 그러다 보니 전체 문장의 의미를 이해할 필요가 있는데 이를 위해서 CLS 토큰을 추가로 넣어서 해결하였음.
- attention score 계산할 때 Q,K의 유사도 측정하는 과정에서 Transpose 작업이 필요한데, 이 때 transpose에 들어가는 작업은 matmul할 때 어떤 값을 곱해줄 것인가에 맞춰서 넣으면 됨.
import torch
a = torch.tensor([
[[[1,2,3], [2,3,4], [-1,0,1], [9,9,9]], [[5,5,5], [6,6,6], [7,7,7], [8,8,8]]],
[[[1,2,3], [2,3,4], [-1,0,1], [9,9,9]], [[5,5,5], [6,6,6], [7,7,7], [8,8,8]]]
])
print(a)
print(a.shape)
print(a.transpose(-2,-1))
print(a.transpose(-2,-1).shape)
print(a.transpose(1,2))
print(a.transpose(1,2).shape)
결과값은 아래와 같이 나온다. (shape만 넣었음)
- a.shape = 2,2,4,3
- a.transpoe(-2,-1).shape = 2,2,3,4
- a.transpose(1,2).shape = 2,4,2,3
- attention score 계산시 나오는 텐서의 구성요소는 크게 4개다.
(batch_size, head갯수, sequence의 길이, 토큰의 임베딩 차원)
배치, 헤드 갯수는 고정되고 결국은 sequence의 길이와 토큰의 임베팅 차원쪽을 transpose해서 곱해야 Attention score가 나온다.
- Fine-Tuning이란?
- 사실은 tranfer learning에 대한 개념이라고 이해하는 것이 맞고, 이전에는 특정 task에 fit된 데이터셋을 학습시켜서 모델을 만들었다면, 이 기법 이후로 전반적인 도메인에 대해 이해하고 있는 모델(pre-trained model)을 하나 만들고 특정 테스크에 대해서는 Xavier와 같은 새로운 가중치가 아니라 pre-trained model의 가중치로 시작하는 것을 의미한다.
- 여러 파인튜닝 방식이 있지만 기존 neural layer 위에 새로운 테스크를 위한 레이어를 쌓는 방식일 수도 있고 초기화 가중치를 기존 모델의 가중치로 쓰는 방법도 있다.
참고링크
- transfer learning 정리 글