본문 바로가기

DATA SCIENCE/NLP

[NLP] ELMo (Embeddings from Language Models)

이 포스트는 책 '한국어 임베딩(자연어 처리 모델의 성능을 높이는 핵심 비결 Word2Vec에서 ELMo, BERT까지, 이기창 저)'을 기반으로 작성되었습니다.

ELMo는 문장 임베딩 기법 중 하나로, 전이 학습(transfer learning)을 NLP에 접목시킨 언어 모델이다. 단어 sequence가 얼마나 자연스러운지에 대해 확률값을 부여하며, 입력한 단어들 뒤에 어떤 단어가 올지 맞추는 방식으로 학습된다.
ELMo가 등장한 이후, 모델을 pre-train시킨 뒤 각종 downstream task (classification 등 우리가 풀고 싶은 task들)에 적용하는 방식이 일반화되었으며, 이런 과정을 pre-train model을 downstream task에 맞게 fine tuning한다고 부른다.
(논문 pdf : https://arxiv.org/pdf/1802.05365.pdf)

전이 학습 (Transfer Learning)
이미 학습된 모델 결과를 다른 모델의 입력 또는 부분으로 재사용

 

ELMo의 구성 요소는 다음과 같다.

  1. 문자 단위 CNN
    : 각 단어 내 문자들 사이의 의미적, 문법적 관계 도출
  2. 양방향 LSTM layer
    : 단어들 사이 의미적, 문법적 관계 추출
  3. ELMo layer
    : 문자 단위 CNN 출력 벡터, 양방향 LSTM layer 출력 벡터 등을 가중합하는 방식으로 계산
      → 학습 손실을 최소화하는 방향으로 업데이트되면서 학습

 

문자 단위 CNN

먼저 문자 단위 CNN 과정은 다음과 같다.

단어 시작 앞에는 <BOW>, 단어 끝에는 <EOW>를 붙이고 문자를 유니코드 id로 변환시킨다.
문자 임베딩 행렬에서 각 id에 해당하는 벡터를 참조해서 이어 붙인다. (concatenate)
행 개수 < max_characters_per_token일 경우, <EOW> 뒤에 <PAD>로 해당하는 행 벡터로 채워준다.

다음으로 convolution filter를 사용하여 feature map 생성한다. ELMo 기본 모델은 아래의 convolution filter들을 사용한다. 

  • [1*문자 임베딩 차원 수] 필터 32개
  • [2*문자 임베딩 차원 수] 필터 32개
  • [3*문자 임베딩 차원 수] 필터 64개
  • [4*문자 임베딩 차원 수] 필터 128개
  • [5*문자 임베딩 차원 수] 필터 256개
  • [6*문자 임베딩 차원 수] 필터 512개
  • [7*문자 임베딩 차원 수] 필터 1024개

이를 통해 나온 값을 통해 pooling vector를 만든다. pooling vector를 만드는 과정 중 max pooling은 pooling vector의 최대값을 선택하는 것이다.

이 pooling vector들을 이어붙인 뒤, highway network와 차원 조정을 통해 임베딩을 생성한다.
이는 문자 단위 conv layer를 통과한 단어 임베딩 차원 수가 지나치게 커 이후 layer 학습을 방해하지 않기 위함이다.

Highway Network
입력값을 변환하여 deep network learning을 빠르게 하는 학습 기법

 

양방향 LSTM, score layer

앞의 CNN에서 생성된 vector를 각각 n개(default=2)의 LSTM layer로 구성되어 있는 forward LSTM layer와 backward LSTM layer에 입력한다. 
이 때 projection_dim 변수에 따라 차원을 조절할 수도 있으며, residual connection 기법으로 일부 계산 노드를 건너뛰고 효율적으로 gradient 전파를 할 수도 있다.

가장 마지막 단에서 다음 단어를 맞추는 loss layer는 마지막 출력 hidden vector를 선형변환한 뒤, softmax를 취한다. 
확률 벡터와 정답 단어에 해당하는 index만 one-hot vector로 cross entropy를 계산한 뒤, 이를 최소화하는 방향으로 모델을 업데이트시킨다.

여기에서 softmax 확률을 구할 때, 일부 단어들만 샘플링시키는데, 한번 업데이트 시 10만 개 단어 전체를 업데이트하면 계산량이 많아 비효율적이기 때문이다. 
단어 전체에서 Negative sample인 오답 단어를 일부 샘플링하고, 정답 단어와 함께 softmax 확률을 계산한다.

fine tuning 단계에서 bi-LSTM layer가 동일 단어 sequence를 입력받아 계산을 수행한다.
하지만 먼저 모델링을 시키는 pre-train 단계에서는 forward와 backward LSTM layer에 대해 서로 다른 학습 데이터를 입력한다. forward LSTM을 학습시킬 때 뒤쪽에 있는 단어를 미리 알려주면 학습 전 정답을 알게 되는 것이나 마찬가지이기 때문에, 각각 독립적으로 학습시킨다. 
또한, pre-train을 할 때만 loss layer가 사용되며 fine tuning 단계에서는 사용되지 않는다.

 

ELMo layer

임의의 task를 수행하기 위한 문장 k번째 token ELMo 임베딩 수식은 다음과 같다.

ELMo 임베딩

여기에서 s는 downstream task 학습 과정에서 loss를 최소화하도록 업데이트되며, pre-train하는 과정에서 ELMo layer는 거치지 않는다.

 

전체 과정을 그림으로 나타내면 아래와 같다.

 

 

반응형

'DATA SCIENCE > NLP' 카테고리의 다른 글

[NLP] BERT (Bidirectional Encoder Representations from Transformer)  (0) 2020.06.24
[NLP] Transformer Network  (0) 2020.06.23
[NLP] 잠재 디레클레 할당 (LDA)  (0) 2020.06.22
[NLP] Doc2Vec  (0) 2020.05.27
[NLP] 가중 임베딩  (0) 2020.05.22