해당 글은 이 글, 그리고 한국어 임베딩 책(by 이기창님)을 참고하여 작성하였음을 미리 알려드립니다.
4. 어텐션 메커니즘
2) 기존 모델과 비교
CNN과 비교해보면 CNN은 일정 window만큼만 단어들을 보기 때문에 문장 전체에서의 연결성이 떨어진다. 즉, 길이가 긴 문장에서 첫번째 단어와 마지막쪽 단어간의 연관성을 파악하기가 어렵다.
RNN과 비교해보면 이전 포스트에서 언급했듯이 그래디언트 배니싱(Gradient Vanishing)문제가 일어날 가능성이 있다.
첫번째 단점을 어텐션은 문장의 모든 단어들을 weighted 로 고려한다는 점에서 극복하였고, 두번째 단점은 앞서 scaled dot-product attention에서 key 행렬 차원수의 제곱근으로 나눠 scale함으로써 극복하였다.
(scale하면, 전체적으로 값이 작아짐. 즉 내적이 작은 값과 큰 값 사이의 차이가 줄어들어 소프트맥스값이 지나치게 작아지지 않는다. 이로써 그래디언트 값이 지나치게 줄어드는 것을 방지할 수 있다. <- 소프트맥스의 그래디언트는 소프트맥스 자기자신과 1에서 자기 자신을 뺀 값이므로)
BERT(Bidirectional Encoder Representations from Transformer)
1. Motivation
GPT와의 차이점은 문장 내 단어들을 왼쪽에서 오른쪽으로 보는 방향만을 선택했고, ELMo는 일부는 양방향이지만 중간 레이어는 한 방향인 모델이다. 반면 BERT는 이름에서도 알 수 있듯이 양방향을 선택한 모델이다.
여기서 드는 의문점은 GPT 또한 BERT와 같이 트랜스포머를 사용했지만 양방향이 아니라는 점이다. 여기에 대한 답은 GPT가 언어 모델이라는 것이다. GPT demo를 보면 알 수 있듯이 GPT는 스스로 글을 만들어낸다. 이는 현재 입력한 단어 뒤를 모델이 스스로 맞추게 하는 방식인데 BERT와 같이 양방향으로 학습을 하게 되면 모델이 스스로 만들어낸다는 것이 모순이 되버린다. 따라서, GPT는 위의 그림에서 알 수 있듯이 왼쪽에서 오른쪽방향의 단방향 모델이다.
이러한 GPT의 단점(딜레마?)의 극복하기 위해 Masked Language Model이 제안되었다. 단방향으로 다음에 올 단어를 맞추는 것에서 벗어나, 문장 내에 한 단어를 마스크처리하면 이를 모델이 어떤 단어였는지 예측하는 식이다.
2. Architecture
BERT는 앞서 설명한 트랜스포머 인코더의 변형 버전이라 생각하면 된다.
BERT는 문장 끝에 [SEP], 마스크된 곳에 [MASK], 패딩하기 위해 [PAD]등의 토큰들을 사용한다.
우선 Input 토큰벡터를 참조하여 임베딩을 만든다.(Token Embeddings) 여기에 몇번째 문장인지에 대한 정보인 세그먼트 임베딩(Segment Embeddings), 토큰의 문장 내 위치 정보인 포지션 임베딩(Position Embeddings)을 더한다. 이렇게 이렇게 세 단계를 통해 더해진 각 벡터에 layer normalization을 한 후, dropout(overfitting방지)을 한 뒤 만들어진 벡터들이 모여 트랜스포머 블록의 입력 행렬이 된다. 위의 그림과 같이 11개의 토큰을 가진 문장이라면, 입력 행렬은 11X(embedding dimension)이 된다.
이러한 행렬이 들어갈 BERT의 트랜스포머 블록은 어떤 형태일까? 오리지날과 가장 큰 차이점은 Position-wise Feedforward Networks 부분이라고 한다. 우선 기존 트랜스포머 블록에서 쓰는 ReLU를 GELU(Gaussian Error Linear Units)로 바꾸었다.
그래프에서도 확인할 수 있듯이, ReLU가 0주변에서 각 방향에서 0과 x로 급격하게 변하는 것과 달리 GELU는 좀 더 스무스하게 변한다. 이러한 특징이 학습성능을 높인다.
(why?) 그래프에서 볼 수 있듯이 gelu 함수값은 x가 0과 가까운 음수일 때 x가 된다. 내가 생각하기로는 기존에 relu가 음수에서 다 0으로 함수값을 처리하는 것보다 더 나은 정보를 얻을 수 있어 그렇지 않을까 싶다. 더 생각해보고 추후에 내용을 추가해야 겠다.)
이 Position-wise Feedforward Networks 중 가장 오리지날 트랜스포머와 큰 차이가 있는 부분은 마지막 레이어이다. 이 레이어는 mask 부분 학습과 다음 문장 여부 관련 레이어로 학습이 끝나면 제거된다.
이 레이어의 input은 마지막 트랜스포머 블록의 마스크에 해당하는 토큰벡터다.
그 다음으로는 여느 다른 모델들과 마찬가지로 label one-hot vector와 output vector와의 차이(크로스엔트로피)를 줄이는 방향으로 트레이닝을 하게 된다.
(이러한 BERT를 회사에서 사용하고자 했으나..GPU 8개 사용시 트레이닝하는데에 2주정도 걸린다고 해서 포기... 데이터 크기에 따라 다르겠지만 데이터가 많을수록 잘되겠지...또 그만한 데이터도 없다. pre-trained 한국어 bert는 회사 도메인과 너무 다르다...흠)
여기까지 BERT에 대한 설명이였습니다.
다음에는 현재 제가 사용중인 fastText에 대해 다루겠습니다.
'개발 > NLP(Natural Language Processing)' 카테고리의 다른 글
[논문 리뷰] Attention Is All You Need, Transformer (0) | 2021.01.09 |
---|---|
fastText란 무엇인가? (0) | 2020.11.21 |
BERT(Pre-training of Deep Bidirectional Transformers for Language Understanding) 정리 - 1 ( Transformer, Attention) (0) | 2020.10.24 |
텍스트 유사도 Text Similarity 개요 (0) | 2020.08.11 |
Okapi BM25란 무엇인가? (TF-IDF와 비교) (2) | 2020.07.29 |
댓글