Transformer, BERT에 대해 알아보자
'구글 BERT의 정석'을 읽고 주요 내용을 요약해보자
"AI"라는 단어가 일상어가 되어버렸다. 더욱이 IT 기업에서 일을 하고 있다보니, 기술의 "ㄱ"도 모르는 나 같은 사람도 AI에 대한 최소한의 이해는 필요한 시대다. 아는 분께 추천받은 《구글 BERT의 정석》이라는 책을 읽으며 핵심적인 내용을 요약해보았다. 부디 나 같은 사람들에게 조금이나마 도움이 되기를 바라며.
1. Transformer에 대해
- Transformer는 아키텍처, BERT는 모델(트랜스포머 인코더만 사용한 것)
- 순차적 태스크에서 주로 사용되는 RNN, LSTM은 길이가 길어지면 처음 정보가 마지막까지 전달되는 문제 있었음
- 이를 해결한 것이 Attention is all you need 논문에서 제안된 트랜스포머
- 트랜스포머는 순환신경망을 사용하지 않고 Self-attention을 사용.
- 인코더 디코더 구조.
- 인코더 여러개로 쌓아올려서 마지막에 encoding representation vector를 추출. Attention is all you need 논문에서는 6개.
- 셀프 어텐션의 절차
- 쿼리, 키, 밸류 각각의 행렬을 추출
- 쿼리와 키의 행렬의 유사도를 비교 (각 단어가 다른 단어와 얼마나 연관성을 갖는지)
- 멀티헤드 어텐션
- 셀프 어텐션으로 단어와 단어의 유사도를 판단하는데, 잘못 판단할 위험을 줄이기 위해 여러번 유사도 값을 구해서 그 합을 결과로 사용
- Positional Encoding
- 순차적이 아닌 병렬로 모든 정보를 입력하기 때문에 학습 시간 단축, 장기 기억 문제 해결. 단, 순서 정보를 별도로 입력해줘야 함.
- embedding matrix를 트랜스포머에 입력하기 전에 위치 인코딩을 더해줘서 위치 정보를 포함시킴
- 디코더
- 여러 레이어로 디코더 쌓을 수있고, 각 디코더는 인코더의 embedding representation과 그 전 단계 디코더의 representation을 함께 받음
- time step 에 따라 그 전 단계에서 생성된 결과와 output embedding을 함께 디코더에 입력
- 인코더와 구조가 유사하지만, masked multihead attention을 추가로 사용한다는 차이점
- 디코더에 입력할 때 time step에 따라 만들어진 단어까지만 입력하기 때문에, self attention 수행시 그 뒤 단어들은 고려해선 안 됨. 그래서 그 뒤의 단어들을 masking
- 디코더에서 얻은 representation을 선형 레이어에 입력. 거기에서 다음 단어 중 가장 확률이 높은 것을 생성
- 예측 확률 분포와 실제 확률 분포 사이의 차이를 확인하기 위해 cross entropy 사용
2. BERT
- 구글의 텍스트 임베딩 모델. Word2vec과 달리 컨텍스트 기반 임베딩 모델임.
- w2v는 "Python"이라는 단어에 대해 항상 동일한 정적 임베딩을 제공.
- BERT는 다른 단어들과의 관계를 고려하여 동적 임베딩을 구성
- 트랜스포머는 인코더 디코더 구조, BERT는 인코더만 사용.
- BERT base 모델은 768 차원의 은닉 유니. 1억 1천만개의 변수
- BERT large 모델은 1024 차원의 은닉 유닛, 3억 4천만개의 변수
- BERT의 입력 데이터는 3개 레이어로 구성. 토큰 임베딩, 세그먼트 임베딩, 위치 임베딩
- BERT는 워드피스 토크나이저를 사용하여 토큰화함. subword 토큰화 알고리즘, 맞는 단어가 없으면 subword로 분할하여 확인하는 방식. OOV 단어 처리에 효과적
- 버트는 3만 토큰의 어휘사전 사용
- 버트의 pretraining
- Masked language modeling - 랜덤하게 15% 단어를 마스킹한 뒤, 그것을 예측하도록 학습
- Next sentence prediction - 두 개 문장을 주고 다음 문장인지 분류하는 이진 분류 태스크. 두 문장 사이의 관계 학습. 질문 답변, 감정 분류, 유사문장탐지와 같은 다운스트림 태스크에서 유용.
- Toronto book corpus와 위키피디아 데이터셋으로 사전 학습. 50%는 isNext로, 50%는 notNext로. 단어 중 15%는 마스킹. 그 중 8할은 mask, 1할은 다른 단어, 1할은 그대로.