2020년 11월 10일 화요일

Mixed Precision 을 이용한 deep learning

 

Precision의 종류

  • Precision은 float type 변수의 크기에 따라 달라진다.
  • 출처 : https://www.aitimes.kr/news/articleView.html?idxno=14687
  • 위의 그림처럼 보통 많이 쓰이는 fp32를 single precision이라 하며 mixed precision 방식으로 네트워크를 학습할 때는 half precision인 fp16을 사용한다.
  • 32비트 대신 16비트의 변수를 사용하기 때문에 그만큼 계산이 빨라지고 메모리도 적게 든다.

Mixed Precision의 효과

  • Mixed Precision을 사용하면 모델의 정확도는 별로 차이가 없지만, 학습 속도를 2~4배 정도 빠르게 할 수 있다.
  • Tensorflow로 mixed precision training 했을 때 속도 향상 [1]

  • Mixed precision training 했을 때 loss 변화
    loss가 거의 차이 없이 학습된다(loss scaling이 필요하다) [2]

Mixed Precision 방식의 원리

Mixed precision 학습 과정 [3]
  1. FP32 타입의 weight를 fp16 형태로 복사한다.
  2. Input 데이터도 fp16 형태로 바꾼 후, forward pass를 계산한다.
  3. 이 과정에서 norm() 같이 큰 matrix의 reduction 연산이 들어가면 fp16 타입으로는 overflow가 날 수 있으므로 이런 연산은 fp32 타입으로 계산한다. 그 외 matrix multiplication 연산은 fp16으로 계산한다.
  4. Loss 값이 너무 작으면 fp16에서 underflow가 난다. 따라서 loss를 fp32값으로 바꾼 후, loss_scaling(loss 값에 128 같은 값을 곱해서 loss를 크게 만드는 작업)을 해준다.
  5. Loss를 fp16으로 변환 후, gradient를 계산하고, 다시 fp32로 바꾼다.
  6. Underflow를 막기 위해 곱했던 만큼 gradient를 나눠주고 원래의 weight를 update한다.

Tensor Core 란?

  • Tensor Core는 fp16 연산을 더 빠르게 해주는 GPU 내부 모듈을 말한다. [4]
  • Tenor Core는 Volta architecture 이상의 GPU에 탑재되어 있다.
  • Titan V, V100, RTX 20x 시리즈 등이 해당한다. 
  • FP16 type의 연산이 필요한 경우, 특정 조건들(vector, batch size가 8의 배수)을 만족하면 기본적으로 Tensor Core를 활용한 연산을 수행한다.[5]

Tensorflow에서 Mixed precision 쓰기

Tensorflow 1.x

아래의 빨간색 줄을 추가해준다.
opt = tf.train.MomentumOptimizer(learning_rate, momentum) 
opt = tf.train.experimental.enable_mixed_precision_graph_rewrite(opt) 
update_op = opt.minimize(loss)
[7] 참고

Nvidia GPU Cloud(NGC) container를 쓸 경우,
간단하게, export TF_ENABLE_AUTO_MIXED_PRECISION=1
환경 변수를 설정하면 알아서 mixed precision 방식으로 학습을 진행한다.

Tensorflow 2.x

opt = tf.keras.optimizers.SGD()
opt = tf.train.experimental.enable_mixed_precision_graph_rewrite(opt)
train_op = opt.minimize(loss)

를 해주면 된다. [6] 참고
또는 [5]에서처럼 Policy(dtype 결정), loss scaling을 직접 지정하여 학습할 수도 있다.

Pytorch example도 [3]의 26번 슬라이드에서 찾아볼 수 있다.


Tensor Core를 쓰고 있는지 확인해보기

[6]의 31번 슬라이드 참고


참고 자료들

2020년 11월 2일 월요일

논문 리뷰 - What Does BERT Look At? An Analysis of BERT's Attention


논문 정보 :


요약 :

  • BERT의 attention에는 공통적인 패턴이 나타난다.
  • BERT의 attention에는 coreference resolution, dependency parsing과 같은 syntactic한 정보들이 담겨 있다.

Surface-level patterns in attention:

  • 위의 그림처럼 attention이 다음(또는 이전) 토큰들에 걸리는 경우, 특정 토큰([SEP], '.')에 걸리는 경우, 많은 토큰들에 광범위하게 걸리는 패턴들이 나타났다.
  • [SEP], '.'에 attention이 많이 걸리는 이유로, 인풋 데이터에 이 토큰들이 항상 포함되기 때문이 아닐까 추측한다.
  • 또한, 어떤 attention head들에서는 동사-목적어, 소유격 대명사, 전치사 등의 관계에 attention이 크게 걸리는 현상들이 나타나는데, 이 때 관련없는 토큰들은 [SEP]에 attention이 걸리는 현상을 보인다.
  • 그리고, gradient-based measures of feature importance (Sundararajan et al., 2017)를 이용해 attention의 변화가 loss 값에 미치는 영향을 측정해봤을 때, [SEP] 토큰에 걸리는 attention의 영향은 크지 않았다.
  • 그래서 [SEP]에 걸린 attention들은 no-op(역할 없음)을 의미하는 것 같다.
  • 하부 레이어의 어떤 attention head들은 매우 broad한 attention을 갖고 있으며 이 경우 output이 거의 문장 안의 토큰들에 대한 bag-of-vectors가 된다.
  • 마지막 레이어에서 [CLS] 토큰은 매우 broad한 attention 값들을 갖고 있는데, 이 때 [CLS] 토큰을 이용해 next sentence prediction을 수행하는 것을 보면 타당하다고 생각한다.

Probing Individual Attention Heads

  • 각 attention head들을 분석하며, byte-pair 인코딩으로 인해 쪼개져 있는 token들의 attention을 더해 word 단위로 만든다.
  • Attention head들의 dependency syntax 능력을 측정했을 때, 특정 attention head들이 각각 특화된 문법적 관계(명사, 목적어 등)를 찾을 때 좋은 성능을 낸다는 것을 확인했다.
  • 의미적인 관계를 찾는 coreference resolution task에서도, 몇몇 attention head들이 rule-based 모델들과 비슷한 성능을 보여주었다.

Probing Attention Heads Combinations

  • 각 head들이 특화된 관계를 찾는 능력만을 갖고 있기 때문에 모델의 전체적인 능력은 분산되어 있다.
  • 따라서 모든 head들을 이용하여 모든 문법적 관계를 찾는 능력을 아래와 같이 측정해본다.
  • p(i|j) : 단어 i가 단어 j의 syntactic head가 될 확률이며,
    a는 layer k에서 단어 i로부터 단어 j에 걸린 attention이다.
    W, U는 학습되는 파라미터이고,
    v는 각 단어에 대한 GLoVe embedding이다.
    원 안에 +가 있는 기호는 concatenation을 뜻한다.
  • 단어 i->j, 단어 j->i 의 양방향 관계를 고려하며, 단어의 embedding 벡터를 활용하여 attention에 맞는 weight를 학습한다.
  • 실험 결과, 제안한 Attn+GloVe 모델은 상당히 좋은 성능을 보여주었으며, attention head들이 syntax knowledge를 갖고 있다는 것을 알 수 있었다.
  • Structural probe 모델은 BERT의 attention이 아닌, output representation을 이용하여 실험한 결과이다(Hewitt and Manning, 2019). 완전히 동일한 방식의 실험은 아니지만 그래도 이를 통해 attention 자체도 output representation과 비슷한 syntactic 정보가 있다는 것을 알 수 있다.
전체적으로 봤을 때, self-supervised learning으로 학습했어도, syntactic 정보를 학습하기 위해 설계한 모델(recursive neural network)이나 supervised learning으로 학습한 모델처럼 언어의 구조를 학습할 수 있다는 점을 알 수 있다.

Clustering Attention Heads

  • Jensen-Shannon Divergence를 이용하여 각 attention head들의 거리를 측정하고 이를 시각화 했다.
  • Attention의 패턴 별, layer 별로 시각화 해봤을 때, 비슷한 패턴을 보인 attention head, 같은 layer에 있는 attention들이 모여 있는 것을 알 수 있었다.

Conclusion

  • Attention에도 상당한 양의 정보가 담겨 있으며 이를 분석하면 많은 도움이 된다.

2020년 10월 7일 수요일

논문 설명 - SpanBERT : Improving Pre-training by Representing and Predicting Spans

 

논문 정보 :


요약 :

  • 목표 : BERT의 성능 향상
  • MLM과 함께 span을 같이 prediction한다.


Model 



  1. Span masking
    • 기존 BERT는 token 단위 masking을 했는데, SpanBERT에서는 여러 단어에 걸쳐 있는 token들을 같이 masking했다.
  2. Span boundary objective(SBO)
    • Span의 경계 옆에 있는 토큰들로 span 안의 토큰들을 예측한다.

    • 추가적으로 position embedding p를 이용한다. 이 p는 x_s-1 토큰과의 relative position에 대한 정보를 담고 있다.
    • 이 함수 f()는 2-layer feed-forward 구조이며, GeLU 활성 함수를 사용한다.
  3. Single-sequence training
    • 기존 BERT와 다르게 NSP 없이 한 개의 segment를 입력으로 사용한다.
    • 이로 인해 모델이 더 긴 context를 학습할 수 있고, 관련없는 context에서부터 오는 noise를 없앨 수 있다.

Experimental Setup

  • Implementation
    • 구글의 BERT를 재구현했으며 같은 corpus로 학습했다-Our BERT.
    • 다른 점은, 매 epoch마다 다른 masking을 했고, 짧은 segment는 사용하지 않았다.
    • BERT는 처음 90% step을 짧은 128개의 sequence로 학습했다고 했는데, 항상 512개의 sequence를 사용하여 학습했다.
    • SBO를 위해 200 차원의 position embedding p를 사용했다.
    • 32개의 V100 GPU에서 15일 동안 학습했다.
    • Our BERT-1seq 모델은 Our BERT 모델을 한 개의 sequence로 학습하도록 변형한 모델이다(당연히 NSP도 없다).

Results



  • 거의 모든 task에서 향상된 결과를 냈다.
  • 특히 extractive question answering에서 좋았다.
  • Single-sequence로 학습한 결과가 be-sequence로 학습했을 때보다 좋았다.

Ablation Studies

  1. Masking schemes
    • 마스킹 방법을 다르게 해서 학습해 봤다.
    • Subword, whole word, named entities, noun phrase, span 단위를 실험했다.
    • 기본 BERT와 동일하게 bi-sequence + NSP로 학습했다.
    • Span 단위로 masking했을 때 가장 좋은 결과를 냈다.
  2. Auxiliary objectives
    • Bi-sequence + NSP의 안 좋은 점, SBO의 효과를 보기 위해 실험했다.
    • Sequence 1개로 SBO를 추가적으로 사용했을 때 점점 성능이 좋아졌다.


2020년 10월 5일 월요일

논문 설명 - ALBERT : A Lite BERT for selv-supervised learning of language representations


논문 정보 :


요약 :

  • 목표 : 모델의 경량화 - 모델 크기 증가를 막는 메모리 한계를 극복하기 위해 임베딩 벡터 크기를 줄인다.
  • Transformer layer의 파라미터를 모든 레이어에서 공유하여 파라미터 개수(메모리)를 줄이고, 그만큼 모델의 크기를 늘려 SOTA를 달성한다.
  • Next sentence prediction loss 대신 sentence order prediction loss를 사용한다.


Related Works 

  • Cross-layer parameter sharing
    • Transformer(Vaswani et al, 2017) : Pretraining이 아닌 encoder-decoder를 위해 고안됐다.
    • Universal Transformer(Dehghani et al, 2018) : language modeling에 파라미터 공유를 썼고, 기존의 transformer보다 좋은 성능을 냈다고 주장하지만, 저자들의 실험에서는 아니었다.
    • Deep Equilibrium Model(Bai et al, 2019), Hao et al. 2019


The Elements of ALBERT

  1. Model architecture choices
    • 기본 구조는 BERT와 동일하다.
    1. Factorized embedding parmeterization
      • BERT, XLNET, RoBERTa 등에서 hidden layer size H를 WordPiece embedding size E와 동일하게 설정하는데 최선의 방법은 아니다.
      • 모델링 관점에서, WordPiece embedding은 context-independent representations를 학습하고, hidden layer embedding이 context-dependent representations를 배운다. 
      • BERT-like 모델들의 representation power는 context-dependent representation을 배운다는 데 있으며, H와 E의 크기를 달리하여 H >> E 로 size를 정하면 파라미터를 더 효율적으로 쓸 수 있다.
      • 실용적인 관점에서, 보통 vocab size가 굉장히 크다. 그런데 E = H인 상황에서 H의 크기를 늘리면 embedding matrix( V * E(=H) ) 의 크기가 엄청 커진다.
      • 위를 종합하여 V*H(=E) 대신, V*E, E*H(H >> E)인 matrix 두 개를 만들어 사용하면, Embedding 파라미터의 수가 V * H => V * E + E * H로 줄어들고 파라미터를 효율적으로 쓸 수 있다.
    2. Cross-layer parameter sharing
      • 파라미터의 효율성을 위해 모든 레이어들의 파라미터를 공유한다. 
    3. Inter-sentence coherence loss
      • NSP는 topic으로 맞출 수도 있고, coherence로 맞출 수도 있다. Topic으로 맞추기가 상대적으로 쉽고, 그만큼 coherence에 대해서는 학습하지 못한다.
      • 더 어려운 문제인 coherence에 대해 학습하기 위해 sentence-order prediction loss를 제안한다. 
      • Segment A, B 순이면 positive, B, A 순이면 negative로 예측해야 한다.
  2. Model setup
    • ALBERT 모델들은 모두 128의 embedding size를 가지며, parameter를 공유한다.
    • ALBERT-large 모델은 embedding size만 다른 BERT-large보다 18배 작다.
    • Hidden layer의 size를 키우며 파라미터의 개수를 늘렸고, xxlarge 모델은 12 layer와 24 layer의 성능이 거의 같아 12 layer를 사용했다.
    • ALBERT xxlarge 모델의 파라미터 수는 BERT large 모델의 70% 정도이다.


Experimental Results

  1. Experimental setup
    • BERT처럼 Bookcorpus, Wikipedia로 학습했고, "[CLS] x1 [SEP] x2 [SEP]" 형식의 입력을 사용했다.
    • Vocabulary의 수는 30000이고, sentencepiece로 tokenize했다.
    • MLM target으로 n-gram masking(Josh et al, 2019) 방식을 사용했다.
    • 배치 크기는 4096이며 learning rate가 0.00176인 LAMB optimizer를 사용했다.
    • 모든 모델은 125k step만큼 학습했다.
  2. Evaluation behcnmarks
    1. Intrinsic evaluation
      • 모델의 학습을 모니터링하기 위해 SQuAD와 RACE의 텍스트 데이터를 dev set으로 활용했다.
      • MLM과 sentence 분류 task의 성능을 지표로 활용했다.
    2. Downstream evaluation
      • GLUE, SQuAD, RACE로 모델을 평가했다.
    3. Overall comparison between BERT and ALBERT
      • ALBERT-xxlarge가 BERT-large보다 더 좋은 성능을 보였다.
      • ALBERT-large는 BERT-large보다 1.7배 빨리 학습됐으며, ALBERT-xxlarge는 BERT-large보다 3배 느렸다.
    4. Factorized embedding parameterization
      • ALBERT-base 모델을 기준으로 실험했을 때, embedding size 128이 가장 좋았다.
    5. Cross-layer parameter sharing
      • 파라미터를 공유하는 방법에 따른 성능 변화를 살펴본다.
      • 공유하지 않는 게 가장 성능이 좋고, shared-attention 방식이 성능을 조금 떨어뜨린다. 하지만 shared-FFN 방식은 성능을 많이 떨어뜨린다.
      • 이 결과는 shared-attention 방식의 모델들이 더 많은 파라미터의 개수를 갖고 있기 때문인 것으로 보이며, embedding size에 따른 성능에서도 볼 수 있듯, parameter의 수가 많을 수록 성능이 좋아진다.
    6. Sentence order prediction
      • MLM만 학습했을 때, NSP를 썼을 때, SOP를 썼을 때의 성능을 비교한다.
      • 결론적으로 SOP를 쓸 때 성능이 가장 좋다.
      • NSP를 학습했을 때 SOP는 별로 좋아지지 않지만 SOP를 학습하면 NSP도 잘 할 수 있다.
      • 이를 통해 NSP는 topic의 변화를 찾아내며, SOP가 더 어려운 문제라는 것을 알 수 있다.
    7. What if we train for the same amount of time?
      • ALBERT-xxlarge를 학습시키는데 더 오랜 시간이 걸린다. 따라서 BERT-large도 비슷한 시간만큼 학습했을 때 결과를 비교했다.
    8. Additional training data and dropout effects
      • 이제는 XLNet이나 RoBERTa처럼 데이터를 더 사용하여 실험한다.
      • ALBERT-base를 기준으로, 전반적으로 성능이 좋아졌다. SQuAD에서 성능이 나빠진 이유는, SQuAD가 Wikipedia 기반인데, 학습 시 데이터가 늘어나 Wikipedia의 비중이 적어져서 그런 것으로 보인다.
      • 그리고, 1M step까지 학습을 해도 xxlarge 모델이 training data에 overfit하지 못한 것을 발견했다. 그래서 dropout을 제거했다.
      • 그 결과 성능이 더 좋아졌다.
      • CNN을 쓸 때, batch normalization과 dropout을 같이 쓰면 성능을 저해시킨다는 결과(Szegedy et al, 2017, Li et al, 2019)가 있는데, Transformer-base 모델에서도 동일한 결과가 나온 것 같다.
    9. Current state-of-the-art on NLU tasks
      • 기존 ALBERT-xxlarge 모델에 데이터를 추가하고 dropout을 제거하고, 1M step만큼 학습한 결과, 가장 좋은 성능을 달성하였다.

Discussion

  • ALBERT-xxlarge가 BERT-large보다 파라미터의 수가 적고 좋은 결과를 보였지만, computationally expensive하다.
  • 속도 향상을 위해 sparse attention(CHild et al., 2019), block attention(Shen et al., 2018) 등을 적용해보는 것도 좋을 것 같다.
  • 더 좋은 representation을 얻기 위해 hard example mining(Mikolove et al. 2013)이나 efficient language model training(Yang et al. 2019)를 적용해보는 것도 좋을 것 같다.
  • SOP를 넘어서는 self-supervised training loss도 있을 수 있다.



2020년 9월 28일 월요일

논문 설명 - Sentence-BERT : Sentence Embeddings using Siamese BERT-Networks

 

논문 정보


Introduction

  • BERT 네트워크에 siamese, triplet 구조를 적용했다.
  • 이로 인해 기존의 BERT가 하지 못했던 large-scale의 similarity comparison, clustering, information retrieval 등을 할 수 있다.
  • BERT로 유사한 두 문장을 찾으려면 두 개의 문장을 한 개의 BERT 모델에 넣어야 유사도가 평가된다.
  • 따라서 문장이 10000개 있으면 10000 * 9999 / 2 번의 연산 후에야 랭킹을 할 수 있다.
  • Clustering이나 search에서는 각 문장을 벡터 공간에 매핑하는 작업을 보통 쓰며, BERT를 이용할 때는 출력을 평균내거나 [CLS] 토큰의 출력값을 이용한다.
  • 하지만 이랬을 때의 결과는 각 단어의 GloVe 벡터를 평균낸 것보다 좋지 않다.
  • 이에 siamese 네트워크로 문장을 벡터화할 수 있는 SBERT를 제안한다.
  • SBERT를 NLI 데이터로 fine-tuning 했다.


Model

  • BERT에서 fixed-size sentence embedding을 얻기 위해 풀링을 사용한다.
  • 방법은 총 3가지이며, [CLS]토큰 값 이용, 평균, max-over-time이 있다.
  • SNLI 데이터로 fine-tuning할 때의 구조는 위와 같다.
  • 두 문장의 출력값인 u, v 그리고 element-wise 차이값인 |u-v|를 concatenate한 후 파라미터를 추가하여 학습한다.

  • 실제 inference할 때나, regression 방식의 loss function을 쓸 때는 cosine-similarity를 이용한다. Training할 때, 계산된 cosine similarity와 gold label 간의 MSE를 minimize하는 방식으로 학습했다.
    참고 코드 링크

  • SNLI, MNLI 데이터를 이용하여 학습(fine-tuning)했다.


Evalution - Semantic Textual Similarity

  • 모델의 성능은 STS(Semantic Textual Similarity) task를 통해 평가했다.
  • 그리고 두 문장의 유사도를 계산하기 위해 cosine-similarity를 이용했다.

  1. Unsupervised STS
    • STS 데이터로는 학습하지 않는 상태의 SBERT의 성능을 평가했다.
    • 실험 결과는 cosine-similarity와 label 간의 Spearman's rank를 사용했다.
    • BERT의 출력을 썼을 때 결과가 안 좋았다.
    • Siamese 네트워크를 쓰니 결과가 좋아졌다.
    • RoBERTa 구조는 큰 차이가 없었다.
  2. Supervised STS
  3. SBERT에 사용한 학습 방법은 두가지이다. 하나는 원래 BERT를 STS 학습 데이터에 학습한 경우, 다른 하나는 NLI로 학습한 이후 STS 학습 데이터로 학습한 경우
    • STS 데이터셋의 학습용 데이터를 이용해 SBERT 모델을 학습시켰다.
    • 이 때는, regression 형태의 모델 구조, loss function을 사용했다.
    • SBERT도 성능이 좋아졌지만, BERT의 성능이 가장 많이 좋아졌다(여기서 BERT는 문장 두개를 입력으로 사용한 것 같다).
    • 그래서 성능만을 봤을 때는, 굳이 SBERT 구조를 사용할 필요가 없는 것 같다...?
    • 기여한 점이라면 단지 NLI 데이터로 먼저 학습하면 STS의 결과가 좋아진다 정도?
    • 그런데 이건 거의 당연한 거 아닌가?
    • 4.3, 4.4 생략

Evaluation - SentEval

  • 문장의 embedding을 feature로 하여 logistic regression을 하는 SentEval에 대해서 실험했다.
  • 대체적으로 가장 좋은 성능을 보였다.

Conclusion

  • BERT로 STS를 했을 경우 성능이 좋지 않았다고 한다.
  • 그래서 siamese 구조를 이용하여 fine-tuning할 수 있는 SBERT를 제안했고, significant한 성능 향상이 있었다.
  • 그리고 computationally efficient하며, BERT로 하기 힘들었던 clustering, retrieval 등을 할 수 있게 됐다.

"각 문장에 대한 BERT의 출력을 각각 pooling(avg)해서 layer를 하나 추가하고 NLI로 fine-tuning하면 sentence embedding이 좋아진다." 이다.


2020년 9월 24일 목요일

논문 설명 - RoBERTa : A Robustly Optimized BERT Pretraining Approach



논문 정보

Introduction
  • 이 논문은 BERT에 대한 replication study - 재현 연구 - 의 결과를 정리한 논문입니다.
  • 각 하이퍼 파라미터나 훈련 데이터의 크기 등이 성능에 어떤 영향을 미치는지를 평가했습니다.
  • 아직 BERT는 매우 undertrained 되어 있으며, 성능을 향상시킬 수 있는 법을 제안합니다.
    1. 더 오래, 배치 사이즈를 더 크게, 더 많은 데이터로 학습시킨다.
    2. Next Sentence Prediction loss를 없앤다.
    3. 더 긴 sequence로 학습한다.
    4. Masking을 매 번 바꾼다.
  • 이렇게 학습한 결과, GLUE와 SQuAD에서 더 좋은 성능을 얻었다고 합니다.

Experimental Setup

  1. Implementation
    • 대부분의 하이퍼 파라미터는 original BERT와 같게 했지만, peak learning rate과 warmup step 수를 변경하면서 실험했습니다.
    • 그리고 학습 결과가 Adam의 epsilon term에 굉장히 민감하며, 어떤 경우엔 더 좋은 성능을 얻거나 안정성이 향상됐습니다.
    • 그리고 배치 사이즈를 크게 할 때 beta2를 0.98로 하면 안정성이 늘어났습니다.
    • 또한 short sequence를 섞어서 학습하지 않았습니다.
    • Original BERT는 처음 90%의 학습을 짧은 sequence로 한 후에 긴 sequence로 학습했는데, 이와는 다르게 처음부터 끝까지 계속 full-length sequence로 학습했습니다.
  2. Data
    • BERT 형식의 모델들은 텍스트 데이터의 양이 많을 때 더 좋은 성능을 보였습니다.
    • 그래서 가능한 많은 데이터를 모으는 데 주력했습니다.
    • 사용한 데이터는 BookCorpus + Wikipedia - Original BERT에 사용된 데이터셋 2개, CC-News, OpenWebText, Stories로 총 160GB정도 입니다.
  3. Evaluation
    • GLUE, SQuAD, RACE task를 기준으로 평가했습니다.

Training Procedure Analysis

  1. Static vs. Dynamic Masking
    • 기존의 BERT는 preprocessing 단계에서 masking을 수행하여, 학습 단계에서 계속 같은 masking 데이터를 보게 됩니다.
    • 그래서 데이터를 10배로 복제해 매번 다른 masking을 갖도록 보완했습니다. 이 학습은 40 epoch만큼 수행됐습니다(Static masking 방법).
    • 또다른 방법으로 매번 데이터를 학습할 때마다 masking을 다르게 했습니다(Dynamic masking 방법).
    • 실험 결과 Dynamic이 조금... 더 좋다고 불 수 있습니다.
  2. Model Input Format and Next Sentence Prediction
    • 기존 BERT에서는 50%의 확률로 같은 문서에 속하지 않은 2 개의 입력이 들어왔고, 그것을 판별하는 Next Sentence Prediction loss가 있었습니다.
    • 하지만 이 loss의 효과에 대해 의문이 제기되었고,여러 방식으로 실험했습니다.
    • Segment-pair : 기존 BERT와 동일
    • Sentence-pair : segment가 아닌 sentence 단위. Sentence가 segment보다 짧으므로 배치 사이즈를 늘립니다.
    • Full-sentences : 항상 여러 개의 연속된 full sentence들을 입력으로 사용하여 document가 넘어가는 경우도 있습니다. 이 경우 중간에 separator token을 넣는다. 입력 데이터에서 알 수 있듯이 NSP가 없습니다.
    • Doc-sentences : Full-sentences와 거의 동일하지만 document를 넘어가는 경우가 없으며 이 때 입력이 짧아지는 만큼 배치 사이즈를 늘립니다. 역시 NSP가 없습니다.
    • Sentence-pair는 긴 상관관계를 찾지 못해 결과가 나빠진 것으로 보입니다. Full-sentence 결과를 보면 NSP가 없이 연속된 문장으로 학습하는 게 좋아 보입니다. 아마 BERT에서는 두개의 segment를 입력한 상태에서 NSP를 없앤 것 같습니다. 최종적으로 Doc-sentence의 결과가 가장 좋습니다. 하지만 배치 사이즈가 유동적이기에 앞으로 실험은 Full-sentence 방식으로 진행합니다.
  3. Training with large batches
    • 배치 사이즈가 크면 더 좋다(고 하는데, 8k가 2k보다 좋지는 않은 것 같습니다).
  4. Text encoding
    • GPT 방식인 byte 단위 subword vocabulary를 사용하여 BERT를 학습했습니다.
    • 그 결과 vocabulary 사이즈가 30k(BERT)에서 50k로 커졌으며, "unknown" 토큰 없이 인코딩이 가능해졌습니다.
    • 그만큼 파라미터는 15M개 늘어납니다(BERT-base).

RoBERTa
  • 같은 양의 데이터(3G 차이 나긴 하는데...)로 실험했을 때, 배치 사이즈가 커야 성능이 더 좋았습니다.
  • 그 외에, 더 많은 데이터로, 더 오래 학습했을 때 결과가 계속 좋아졌습니다.


끄읕...

2019년 12월 2일 월요일

논문 리뷰 - Knowledge Enhanced Contextual Word Representations

EMNLP를 다녀왔습니다.
재밌는 논문들이 많았는데, 앞으로 그 중 몇 개를 포스팅 해보려고 합니다.

첫번째 논문은 Knowledge Enhanced Contextual Word Representations 입니다.


논문 정보


  • 논문 링크 : https://arxiv.org/pdf/1909.04164.pdf
  • 저자 : Matthew E. Peters et al. from Allen AI, UC Irvine.
    • ELMo를 쓴 Matthew E. Peters가 1저자로 참여한 논문입니다.
  • 발표 학회 : EMNLP 2019


요약


  • 기존의 Pretrained model(BERT)에 Knowledge base(Wikipedia, Wordnet) 같은 외부 지식을 결합하는 방법을 제안
  • 이런 메카니즘을 활용한 Pretrained model은 외부 지식을 반영하는 word representation을 만들수 있음
  • 결합하는 방법은 주로 attention을 활용하였고, 많은 부분 - 특히 Knowledge에 관련된 - 은 이미 개발되거나 공개된 데이터, 알고리즘 등을 활용.
    뭔가 설명이 없이 툭 튀어나오면 이미 있는 걸 활용한 거라 생각하면 됩니다...


Introduction


  • ELMo, GPT, BERT 같은 모델들은 SOTA를 달성했지만, real world entity에 대한 기반(grounding)이 없고 factual knowledge를 알기 힘들다(Logan et al. 2019).
  • Knowledge bases(KBs)를 활용하면, raw text에서 적은 빈도로 등장하거나 long range dependency 문제로 학습이 힘든 정보들을 학습할 수 있다.
  • 우리는 여러 KB들의 정보를 pretrained model에 주입할 수 있는 KAR(Knowledge Attention and Recontextualization)이란 메카니즘을 제안한다.
  • 특정 task를 위한 모델에 외부 지식을 활용했던 이때까지의 다른 접근법들과는 다르게 이 방법으로 여러 task에 모두 활용될 수 있는 general representation을 얻을 수 있다.
  • BERT-base 모델에 KAR을 통해 Wikipedia와 Wordnet을 결합했을 때 BERT-large모델보다도 더 좋은 실험 결과를 얻었다.

KnowBert


Knowledge Bases


  • KB에 있는 K개의 entity들은 E차원의 임베딩 벡터 e_k로 표현되어 있다고 가정한다.
  • 또한 KB는, text에서 C 개의 entity 후보와 그들의 start, end index를 찾아주는 entity candidate selector를 갖고 있다고 가정한다. 
  • Entity candidate selector는 각 entity가 어떤 종류의 entity인지에 대한 prior 확률도 갖고 있다. (Prince가 가수인지, 자동차인지에 대한 확률)
  • Candidate의 숫자는 고정된 작은 수자(30)으로 제한하여 실행 시간이 KB의 크기와 상관없어진다.

KAR



  • 보통의 transformer 구조에서  H_i+1 = Transformer(H_i)이다. 하지만 특정 한 레이어에서는 knowledge를 활용하는 H_i+1 = KAR(H_i) 연산을 수행한다. 
  • KAR은 아래와 같은 구성요소들로 이루어져 있다.

Mention-span representation(번호 1, 2)
  • 처음으로, 적은 차원(200 또는 300) 차원으로 projection한다.
  • Entity candidate selector에서 받은 정보들(entity의 list, 각 entity들의 span)을 이용하여, 각 entity(그림 상의 Prince, Purple-Rain, Rain)에 해당하는 hidden vector들을 뽑아낸다(S에 해당).
  • 각 entity의 span 안에 있는 word piece들에 대한 hidden vector들을 self-attentive span pooling(Lee et al. 2017)을 이용하여 각 entity 당 하나의 hidden vector - mention-span representations, S - 로 뽑아낸다.


Entity linker(번호 3, 4)
  • Entity linker는 어떤 candidate를 이용할 지 구분하는 역할을 한다.
  • Se = Transformer(S) 를 통해 mention-span 간의 attention을 반영한 representation을 구한다.
  • This allows KnowBert to incorporate global information into each linking decision so that it can take advantage of entity-entity co-occurence and resolve which of several overlapping candidate mentions should be linked.
  • Se는 각 후보 entity를 평가하고 KB에서 얻은 entity prior를 통합하기 위해 활용된다(Kolitsas et al.).

  • 각 후보 span m 에 해당하는 mention-span vector se_m과, KB를 통해 얻은 entity의 embedding e_mk, prior p_mk로 어떤 entity가 현재의 context에 잘 맞는지 score를 매긴다(attention weight와 비슷한 개념).
  • 이 때, 2 층의 MLP를 이용하며 hidden units은 100이다.

  • 이 때, 정답 entity를 알고 있으면 entity의 scoring을 좀 더 정확히 하기 위한 학습이 가능하다. EL은 entity linker의 약자이다.
  • 위의 식에서 g는 정답 entity의 인덱스를 의미하며, 정답 entity의 임베딩 벡터와 prior를 이용해 얻은 score를 loss function에 활용한다.

Knowledge enhanced entity-span representations(번호 5)

  • 후보 entity들 중 score의 값이 일정 threshold 이하인 score들은 0으로 간주하여 무시한다.
  • Threshold 이상인 score들은 softmax normalization한다.

  • 이렇게 계산한 score와 embedding을 weighted sum을 한 후,
  • 기준의 Se에 더하여 KB의 entity embedding을 반영한 새로운 entity-span representation을 만들어낸다.

Recontextualization(번호 6, 7)
  • 이렇게 얻은 S'e를 이용하여 기존의 word piece representation을 recontextualize한다.
  • 그리고, 다시 BERT의 hidden vector size로 projection한다.
  • 여기서 W2는 맨 처음 차원을 줄이기 위해 쓰인 파라미터 W1의 matrix inverse이다.


Training Procedure



  • 우선 각 KB에서 entity embedding을 계산해야 한다. Entity embedding은 한 번 학습된 후에는 고정된다.
  • Entity linker를 학습시킬 수 있으면 다른 네트워크의 파라미터들은 고정시킨 채 미리 학습시켜 KB에 특화된 EL을 만든다.
  • 이후 최종적으로 Masked language model의 loss와 entity linker의 loss를 더하여 학습한다.
  • 여러 KB를 쓸 경우 각각 다른 레이어 사이에 배치한다.
  • Candidate mention span에 masking된 word piece가 하나라도 있을 경우 전체 entity들 word piece를 마스킹한다.

Experiments





  • Language Modeling 실험 결과. 위 실험에서 KnowBert는 BERT_base모델에 KAR을 적용한 모델이다.


  • Relation extraction task에서 좋은 성능을 기록했다.


Conclusion



  • KB를 효과적으로 language model에 반영할 수 있는 방법을 제안한다.
  • 실험을 통해 알고리즘의 효용성을 입증하였다.