2020년 12월 21일 월요일

논문 리뷰 - BETTER FINE-TUNING BY REDUCING REPRESENTATIONAL COLLAPSE

 

논문 정보 : 


요약 :

  • Pretrained 모델의 representation을 훼손하지 않으면서 fine-tuning을 잘 할 수있는 regularization 방법을 제안함
  • 기존 방법들보다 속도가 빠르고 여러 task들에서 성능이 좋음


Learning Robust Representations Through Regularized fine-tuning

  • Pretrained 모델을 특정 task에 맞게 fine-tuning 하면 representation의 generalizability가 훼손됨 : 그 상태로 다른 task에 대해 fine-tuning하면 pre-trained 모델을 fine-tuning할 때보다 성능이 낮아짐
  • 따라서 pre-trained 모델의 변화량을 제한하는 여러 시도가 있었음
  • 수식화 :
    • : 현재 representation density space
    • : 학습 후 representation density space
    • 이 둘의 차이(KL divergence)를 제한

  • p(f)를 알 수 없다… -> reformulation, approximation 등의 시도가 있어왔다.

  • SMART(Jiang et al, 2019)
  • FREELB(Zhu et al, 2019)


  • 이 논문에서 제안하는 방법 : R3F
    • g : fine-tuning 함수, f: pretraining 함수
    • 전체적인 모델(g(f(x))의 변화량을 제한
    • Forward-pass를 두 번 계산해야 한다 : g f(x+z)
      하지만 기존의 기법들은 더 많은 계산이 필요하다.

  • 추가 제약 : R4F


    • 의미 : fine-tuning 함수 g의 변화량을 제한하여 f의 변화량도 제한한다.
  • Lip(g) : 함수 g의 기울기의 상한값
    • 기본 형식 : 

    • 행렬 형식 :

  • 단순히 Lip{g}를 구하면
  • 따라서  하면 Lip{g} <= 1을 만족한다.


Experiments


  • Walltime(가장 성능이 좋은 checkpoint에 도달하는 시간)이 SMART에 비해 짧다.


  • 왼쪽 : Best 성능, 오른쪽 : median 성능




    성능의 편차가 적고, 가장 좋은 성능도 거의 비슷하다(좋을 때도 많이 있다).

  • Summarization task에서는 거의 SOTA를 기록했다.



  • 위 실험은, SST-2 task에 대해 classifier + pretrained model을 fine-tuning 후, Pretrained model을 fix한 상태로 각각의 task에 대해 fine-tuning한 실험이다.

    R3F, R4F(제일 오른쪽 2개)에서 전반적으로 좋은 결과가 나왔다.
    이 말은, R3F, R4F를 사용했을 때,
    pretrained model의 representation을 훼손하지 않고 
    fine-tuning 했다라고 볼 수 있다.


Conclusion

  • 새로운 fine-tuning 방법을 제안했다. : R3F, R4F
  • 이 방법은 pretrained representation의 generalizability를 유지했으며,
    computationally efficient하고,
    실험 결과도 SOTA를 보여주었다.


2020년 12월 15일 화요일

Github package 관련 파일들 역할

 MANIFEST.in


setup.py

  • python setup.py -sdist로 소스 distribution을 만든다.


check-manifest library

  • Version Control System(VCS)에 속한 파일들과 패캐지 파일들을 비교한다. 

2020년 11월 23일 월요일

Multi GPU(RTX 2080 ti)를 이용한 BERT Training 속도 측정

RTX 2080 ti 4개로 학습하면 대략 어느정도 걸릴 지 알아보기 위해 속도를 측정한 결과를 정리한다.

1. NVidia Deep Learning Examples ( horovod ) 



위의 저장소에서 소스를 다운받으면 간편하게 BERT multi gpu 학습을 할 수 있다.
추가적으로 automatic mixed precision도 구현되어 있다.

단점이라면 multi GPU 학습을 위해 tensorflow의 자체 기능 대신 horovod를 썼기 때문에 horovod를 따로 설치해야하는 번거로움이 있다.

--use_xla 옵션을 사용하려면 
export XLA_FLAGS="--xla_gpu_cuda_data_dir=/usr/local/cuda/"
와 같이 XLA_FLAGS 환경 변수를 세팅해줘야 한다.

Mixed precision을 쓰지 않으면 nan loss가 발생한다.

Tensorflow 버전 : 1.14
sequence_length : 512

단위 : examples/sec

Batch_size를 8의 배수로 하면 tensorcore를 쓸 수 있을 텐데 메모리 한계 때문에 쓰지 못한 것이 아쉽다.
속도를 향상시킬 방법에 대해 이슈를 제기했더니 accumulation_step을 늘려보란 답변을 받아서 해봤는데, GPU 4개 batch 7에서 89개로 조금 늘었다.

2. Google-research BERT ( tensorflow.distributed )

실험 소스, 결과 정리 : github repo

구글의 bert 코드에 tensorflow Strategy api를 추가하여 실험했다.


Horovod를 썼을 때와 비교했을 때 크게 차이가 나지는 않았다.

소스 변경을 잘 한 건지 알아보기 위해 V100 4개에서 추가적으로 실험했다.
그 결과 NVIDIA의 실험 결과와 거의 비슷했다.


하지만 생각보다 RTX 2080ti와 V100의 차이는 많이 났다.
일단 메모리가 11G vs 16G라서 V100에서는 batch size를 8까지 늘릴 수 있었고, 최종적으로 거의 2 배 가까운 차이가 났다.

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이 좋아진다." 이다.