기본적인 트랜스포머는 인코더의 출력과 디코더의 셀프어텐션 값의 합을 통해 결과를 낸다
근데 BERT나 GPT는 인코더 둘 다 사용하지않고 하나만 사용한다(BERT=인코더, GPT=디코더)
왜? 이렇게 사용할까 라는 생각이 들어 찾아보니
두 모델들은 결과를 출력하는 과정을 다르게 가져갔기 때문이다.
BERT는 문장의 중간 단어를 [마스킹]을 해서 마스킹된 단어를 추측해 문맥을 알아내는 방식(Auto-Encoder)
GPT는 문장이 주어지면 다음 단어를 예측하는 방식(Auto-Regressive)
BERT의 경우 [Mask]라는 토큰(단어)가 현실에 존재하지 않아 실제로 사용하기 어렵다고한다.
(사실 문맥을 파악해서 다음 문장을 생성하는 방식에는 적합하지 않은것 같고 그나마 특정 Label의 결과를 낼수 있는 것이면 그나마 괜찮을듯 예를들면 악성 유무, 감정{행복, 슬픔 등})
GPT는 기본적으로 다음 단어를 생성하기 위해 문장이 주어지면 그 문장을 그대로 Self-Attention 과정을 수행하는 것이 아닌 Masking과정을 거친다.
(BERT의 마스킹과는 다르다)
자세한것은 좀더 공부해볼 예정이지만 간단하게 설명해보자면
다음 단어를 예측하기 위해 모든 단어는 다음에 오는 단어가 무엇인지 모르게 하는 방식
"나는 글을 쓰고있다"라는 문장을 예시로 마스킹된 Attention-Score Map을 표현하면
나는 | 글을 | 쓰고 | 있다 | |
나는 | Attention-score | Masking | Masking | Masking |
글을 | Attention-score | Attention-score | Masking | Masking |
쓰고 | Attention-score | Attention-score | Attention-score | Masking |
있다. | Attention-score | Attention-score | Attention-score | Attention-score |
정확하진 않지만 "나는"이라는 토큰은 "글을", "쓰고", "있다"라는 단어에 대한 정보를 모르게 마스킹하는 것을 의미한다.
이런 방식으로 입력된 문장에 대해 다음 단어를 예측하는 Attention Map에 대한 가중치를 학습한다.
이 때문에 GPT-3에 대한 논문을 보면 다음 단어를 예측하는 특성으로 Few-shot learning의 형태로 새로운 주제에 대한 추론이 가능했다고 한다.
그만큼 많고 다양한 문장과 토큰은 학습했다는 의미니까 대단하기도 하고
실제 일부 데이터로 훈련해본 경험이 있어서
컴퓨팅 파워도 그렇고 당연히 체크포인트를 설정했겠지만 훈련하는 과정에서 시스템이 다운되는 경우에 어떤 기분일지....
그리고 그 많은 데이터를 훈련하기 위해 훈련 속도를 빠르게 하는 방법, 데이터 전처리 방법, 데이터베이스 관리방법에 대해 궁금하긴하다.
다음에 해볼것
- "Multihead" Masked self-Attention 공부
- GPT에서 사용하는 "Attention의 Masking" 기법
- LLM에서 훈련 속도를 빠르게 하는 기법들
- 데이터 전처리 방법 혹은 임베딩 기법?
- LLM을 위한 데이터 베이스 관리 방법
많지만 천천히 해볼 예정