NLP Blog

EMNLP 2018 주요 논문 정리

|

EMNLP 2018

  • 이번 포스트에서는 2018년 10월 31일 부터 11월 4일까지 열린 EMNLP의 주요 논문에 대한 정리를 합니다.
  • 본 포스트는 sebastian Ruder의 블로그를 참고하여 작성하였음을 알려드립니다.
  • EMNLP의 페이퍼들은 다음의 key topic을 가지고 있다고 얘기 할 수 있습니다.
    • Inductive bias
    • Cross-lingual Learning
    • Word embedding
    • Latent variable models
    • Language models
    • Datasets
    • Miscellaneous
  • 각각에 대해 정리를 하도록 하겠습니다.

1. Inductive bias (귀납적 편중…?)

  • 일단, bias란 무엇일까요?
    • 굉장히 여러 의미로 사용 될 수 있지만, 편견이나 offset과 비슷한 의미입니다.
  • 여기서 inductive, 즉 귀납적이라는 말이 추가로 붙게 됩니다.
  • 기계학습에서의 inductive bias는, 학습 모델이 지금까지 만나보지 못했던 상황에서 정확한 예측을 하기 위해 사용하는 추가적인 가정을 의미합니다. (Wikipedia)
  • 기계학습에서는 특정 목표 출력(target output)을 예측하기 위해 학습 가능한 알고리즘 구축을 목표로 하고, 학습 모델에는 제한된 수의 입력과 출력에 대한 data가 주어집니다.
  • 학습이 성공적으로 끝난 후에, 학습 모델은 훈련동안에는 보이지 않았던 예들 까지도 정확한 출력에 가까워지도록 추측해야합니다. 이럴 때 추가적인 가정이 없이는 불가능한데, 이 Target function의 성질에 대해 필요한 가정과 같은 것이 Inductive bias라고 볼 수 있습니다.
  • 가장 고전적이고 대표적인 예가 Occam’s Razor, 오컴의 면도날입니다. 이는 target function에 대해 가장 단순한 무모순의 가설이 실제로 가장 좋을 것이라고 가정합니다.

  • 이 inductive bias의 개념은 Max Welling의 CoNLL 2018 keynote에서의 메인 테마였습니다. 2가지의 비결은 다음과 같습니다.

1.1 Exploit Symmetry

  • 만약 input space대칭성이 존재한다면, 그것을 사용하라는 것입니다.
  • 이 대칭성에 관한 가장 좋은 예제가 CNN입니다.
    • 기본적인 CNN의 경우, 아래 그림과 같이 Translation Invariance, Steerable CNN의 겅우 Rotation/Viewpoint Invariance한 특징을 가집니다.
    • 이러한 invariance를 가지는 것은 우리가 특정한 inductive bias를 가지고 CNN 구조를 만들었기 때문에 가능한 것입니다.
  • 그래서 우리는 자연어가 어써한 타입의 invariance를 가질지, 그리고 그것은 어떻게 neural network에 적용할 수 있을지에 대한 연구를 해야합니다.

Translation and rotation invariance in computer vision (source: Matt Krause) fig1. Translation and rotation invariance in computer vision (source: Matt Krause)

1.2 Exploit generative process

-

Comment  Read more

팀을 위한 Git - Chapter 1

|

Chapter 1. 팀으로 일하기

1.1 팀원들

  • 개발 환경을 최대한 최종 제작 환경과 비슷하게 맞춰야 한다.
  • Docker, Vagrant를 사용해 제작 환경과 똑같은 모형을 만들 수 있음
  • 운영 팀과 협력하여 Chef, Puppet, Ansible과 같은 환경 설정 인프라를 구축해야 함

  • 부서간 협업이 늘어나면 기껏 만든 코드가 저굥ㅇ되지 않고 노는 시간을 줄일 수있음
  • 검토를 위해 기다리는 시간이 길어질수록, 해당 코드가 main branch에서 동작하지 않거나 필요 없어질 확률이 높아짐

1.2 사고전략

  • 모든 팀원은 각자 선호하는 작업 방식이 있다. 일에 올바른 방식은 없다.
  • 대신 개별 팀원을 생산적으로 만들 전략을 공유할 수만 있다면 말이다.
  • 사고 전략은 다음과 같이 나누어 볼 수 있다.
    • 창조적 사고
      • 상상력
      • 재구성
      • 브레인스토밍
      • 번뜩이는 통찰력
      • 도전
      • 집중
    • 이해하는 사고
      • 상황 파악
      • 명확함
      • 구조화
      • 듣는 자세
      • 공감
      • 표현
    • 결정하는 사고
      • 핵심 파악
      • 결정력
      • 결론 입증
      • 경험
      • 가치 기반 결정
      • 직감

1.3 팀 회의

-

Comment  Read more

BERT 논문정리

|

BERT: Pre-trainig of Deep Bidirectional Transformers for Language Understanding

  • 최근에 NLP 연구분야에서 핫한 모델인 BERT 논문을 읽고 정리하는 포스트입니다.
  • 구성은 논문을 쭉 읽어나가며 정리한 포스트기 때문에 논문과 같은 순서로 정리하였습니다.
  • Tmax Data AI 연구소에서 제가 진행한 세미나 동영상도 첨부합니다.

Abstract

  • BERT : Bidirectional Encoder Representations form Transformer
    • 논문의 제목에서 볼 수 있듯이, 본 논문은 “Attention is all you need(Vaswani et al., 2017)”(arxiv)에서 소개한 Transformer 구조를 활용한 Language Representation에 관한 논문입니다.
    • Transformer에 대한 자세한 구조를 알고 싶은 분은 위 논문을 읽어보시거나, 다음 블로그 MChromiak’s blog를 참고하시면 좋을 듯 합니다.
  • BERT는 기본적으로, wiki나 book data와 같은 대용랑 unlabeled data로 모델을 미리 학습 시킨 후, 특정 task를 가지고 있는 labeled datatransfer learning을 하는 모델입니다.
  • BERT이전에 이러한 접근 방법을 가지는 모델이 몇가지 있었습니다. 대용량 unlabeld corpus를 통해 language model을 학습하고, 이를 토대로 뒤쪽에 특정 task를 처리하는 network를 붙이는 방식(ELMo, OpenAI GPT…)
  • 하지만 BERT 논문에서는 이전의 모델의 접근 방식은 shallow bidirectional 또는 unidirectional하므로 language representation이 부족하다고 표현하였습니다.
  • 게다가 BERT는 특정 task를 처리하기 위해 새로운 network를 붙일 필요 없이, BERT 모델 자체의 fine-tuning을 통해 해당 task의 state-of-the-art를 달성했다고합니다.

1. Introduction

  • Introduction에서는 BERT와 비슷한 접근 방식을 가지고 있는 기존 model에 대한 개략적인 소개를 합니다.

  • Language model pre-training은 여러 NLP task의 성능을 향상시키는데에 탁월한 효과가 있다고 알려져 있습니다. (Dai and Le, 2015; Peters et al., 2018, 2018; Radford et al., 2018; …)
  • 이러한 NLP task는 token-level task인 Named Entity Recognition(NER)에서부터 SQuAD question answering task와 같은 task까지 광범위한 부분을 커버합니다
  • 이런 pre-trained language representation을 적용하는 방식은 크게 두가지 방식이 있습니다. 하나는 feature-based 또 다른 하나는 fine-tuning 방식입니다.
    • feature-based approach : 특정 task를 수행하는 network에 pre-trained language representation을 추가적인 feature로 제공. 즉, 두 개의 network를 붙여서 사용한다고 보면 됩니다. 대표적인 모델 : ELMo(Peters et al., 2018)
    • fine-tuning approach : task-specific한 parameter를 최대한 줄이고, pre-trained된 parameter들을 downstream task 학습을 통해 조금만 바꿔주는(fine-tuning) 방식. 대표적인 모델 : Generative Pre-trained Transformer(OpenAI GPT) (Radford et al., 2018)
  • 앞에 소개한 ELMo, OpenAI GPT는 pre-training시에 동일한 objective funtion으로 학습을 수행합니다, 하지만 BERT는 새로운 방식으로 pre-trained Language Representation을 학습했고 이것은 매우 효과적이었습니다.

BERT의 pre-training 방법론

그림1. BERT, GPT, ELMo (출처 : BERT 논문)

그림1. BERT, GPT, ELMo (출처 : BERT 논문)

  • BERT pre-training의 새로운 방법론은 크게 2가지로 나눌 수 있습니다. 하나는 Masked Language Model(MLM), 또 다른 하나는 next sentence prediction이다.
    • 기존 방법론 : 앞에 소개한 ELMo, OpenAI GPT는 일반적인 language model을 사용하였습니다. 일반적인 language model이란, 앞의 n 개의 단어를 가지고 뒤의 단어를 예측하는 모델을 세우는 것입니다(n-gram). 하지만 이는 필연적으로 unidirectional할 수 밖에 없고, 이러한 단점을 극복하기 위해 ELMo에서는 Bi-LSTM으로 양방향성을 가지려고 노력하지만, 굉장히 shallow한 양방향성 (단방향 concat 단방향)만을 가질 수 밖에 없었습니다(그림1).
    • Masked Language Model(MLM) : MLM은 input에서 무작위하게 몇개의 token을 mask 시킵니다. 그리고 이를 Transformer 구조에 넣어서 주변 단어의 context만을 보고 mask된 단어를 예측하는 모델입니다. OpenAI GPTTransformer 구조를 사용하지만, 앞의 단어들만 보고 뒷 단어를 예측하는 Transformer decoder구조를 사용합니다(그림1). 이와 달리 BERT에서는 input 전체와 mask된 token을 한번에 Transformer encoder에 넣고 원래 token 값을 예측하므로(그림1) deep bidirectional 하다고 할 수 있습니다. BERT의 MLM에 대해서는 뒷장의 Pre-training Tasks에서 더 자세히 설명하겠습니다.
    • next sentence prediction : 이것은 간단하게, 두 문장을 pre-training시에 같이 넣어줘서 두 문장이 이어지는 문장인지 아닌지 맞추는 것입니다. pre-training시에는 50:50 비율로 실제로 이어지는 두 문장과 랜덤하게 추출된 두 문장을 넣어줘서 BERT가 맞추게 시킵니다. 이러한 task는 실제 Natural Language Inference와 같은 task를 수행할 때 도움이 됩니다.
  • ELMo, OpenAI GPT와 같은 모델이 존재하고, 앞에서 충분히 소개하였기 때문에 생략하도록 하겠습니다. 자세한 내용에서는 BERT 논문을 참고 바랍니다.

3. BERT

  • BERT의 아키텍처는 Attention is all you need에서 소개된 Transformer를 사용하지만, pre-training과 fine-tuning시의 아키텍처를 조금 다르게하여 Transfer Learning을 용이하게 만드는 것이 핵심입니다.

3.1 Model Architecture

  • BERTtransformer 중에서도 encoder 부분만을 사용합니다. 이에 대한 자세한 내용은 Vaswani et al (2017) 또는 tensor2tensor의 transformer를 참고 바랍니다.
  • BERT는 모델의 크기에 따라 base 모델과 large 모델을 제공합니다.
    • BERT_base : L=12, H=768, A=12, Total Parameters = 110M
    • BERT_large : L=24, H=1024, A=16, Total Parameters = 340M
    • L : transformer block의 layer 수, H : hidden size, A : self-attention heads 수, feed-forward/filter size = 4H
  • 여기서 BERT_base 모델의 경우, OpenAI GPT모델과 hyper parameter동일합니다. 여기서 BERT의 저자가 의도한 바는, 모델의 하이퍼 파라미터가 동일하더라도, pre-training concept를 바꾸어 주는 것만으로 훨씬 높은 성능을 낼 수 있다는 것을 보여주고자 하는 것 같습니다.
  • OpenAI GPT모델의 경우 그림1에서 볼 수 있듯, next token 만을 맞추어내는 기본적인 language model 방식을 사용하였고, 그를 위해 transformer decoder를 사용했습니다. 하지만 BERTMLMNSP를 위해 self-attention을 수행하는 transformer encoder구조를 사용했음을 알 수 있습니다.
  • 실제로 대부분의 NLP task SOTABERT_large모델로 이루어 냈습니다.

3.2 Input Representation

그림2. bert input representation (출처: BERT 논문)

그림2. bert input representation (출처: BERT 논문)

  • BERT의 input은 그림 2와 같이 3가지 embedding 값의 합으로 이루어져 있습니다.
  • WordPiece embedding을 사용합니다. WordPiece(Wu et al., 2016)에 대한 자세한 내용은 논문 링크를 참고 하시거나, lovit님의 블로그글을 참고 바랍니다. BERT english의 경우 30000개의 token을 사용하였습니다.
  • 그림 2에서 볼 수 있듯이, Position embedding을 사용합니다. 이는 Transformer에서 사용한 방식과 같으며, jalammer의 블로그 글을 참고하시면 position embedding 뿐만 아니라 transformer의 전체적인 구조를 이해 하실 수 있습니다.
  • 모든 sentence의 첫번째 token은 언제나 [CLS](special classification token) 입니다. 이 [CLS] token은 transformer 전체층을 다 거치고 나면 token sequence의 결합된 의미를 가지게 되는데, 여기에 간단한 classifier를 붙이면 단일 문장, 또는 연속된 문장의 classification을 쉽게 할 수 있게 됩니다. 만약 classification task가 아니라면 이 token은 무시하면 됩니다.
  • Sentence pair는 합쳐져서 single sequence로 입력되게 됩니다. 각각의 Sentence는 실제로는 수 개의 sentence로 이루어져 있을 수 있습니다(eg. QA task의 경우 [Question, Paragraph]에서 Paragraph가 여러개의 문장). 그래서 두 개의 문장을 구분하기 위해, 첫째로는 [SEP] token 사용, 둘째로는 Segment embedding을 사용하여 앞의 문장에는 sentence A embedding, 뒤의 문장에는 sentence B embedding을 더해줍니다.(모두 고정된 값)
  • 만약 문장이 하나만 들어간다면 sentence A embedding만을 사용합니다.

3.3 Pre-training Tasks

  • 기존의 ELMOGPTleft to right or right to left Language Model을 사용하여 pre-training을 하지만, BERT는 이와 다르게 2가지의 새로운 unsupervised prediction taskpre-training을 수행합니다.

3.3.1 Task #1: Masked LM

  • Introduction의 pre-training 방법론에서 설명한 내용과 동일한 내용입니다.
  • 이번 장에서는 MLM이 구체적으로 어떤 식으로 수행되는 지에 대해서 설명하겠습니다.

그림3. MLM

그림3. BERT Masked Language Model (출처: rani horev’s blog : BERT explained)

  • 그림 3에서 볼 수 있듯, 일단 단어 중의 일부[MASK] token 으로 바꾸어 줍니다. 바꾸어 주는 비율은 15% 입니다.
  • 그리고 plain texttokenization하는 방법은 input representation에서 설명한 바와 같이 WordPiece(Wu et al., 2016)를 사용합니다.
  • 이를 통하여 LMleft-to-right (혹은 r2l)을 통하여 문장 전체를 predict하는 방법론과는 달리, [MASK] token 만을 predict하는 pre-training task를 수행합니다.
  • [MASK] token은 pre-training에만 사용되고, fine-tuning시에는 사용되지 않습니다. 해당 token을 맞추어 내는 task를 수행하면서, BERT는 문맥을 파악하는 능력을 길러내게 됩니다.

  • 15%의 [MASK] token을 만들어 낼 때, 몇가지 추가적인 처리를 더 해주게 됩니다. 그것은 다음과 같습니다.
    • 80%의 경우 : token을 [MASK]로 바꿉니다. eg., my dog is hairy -> my dog is [MASK]
    • 10%의 경우 : token을 random word로 바꾸어 줍니다. eg., my dog is hariy -> my dog is apple
    • 10%의 경우 : token을 원래의 단어로 그대로 놔둡니다. 이는 실제 관측된 단어에 대한 표상을 bias해주기 위해 실시합니다.
  • pre-trained 되는 Transformer encoder의 입장에서는 어떤 단어를 predict하라고 하는건지, 혹은 random word로 바뀌었는지 알 수 없습니다. Transformer encoder는 그냥 모든 token에 대해서 distributional contextual representation을 유지하도록 강제합니다.
  • 또한 random word로 바꾸는 것 때문에 모델의 language understanding능력에 해를 끼친다고 생각 할 수 있지만, 바뀌는 부분이 1.5%(15%의 10%)에 불과하므로, 해를 끼치지 않습니다.
  • 또한 MLM은 보통의 LM 보다 converge하는데에 많은 training step이 필요하지만, emperical하게는 LM보다 훨씬 빠르게 좋은 성능을 냅니다. 이는 Section 5.3에서 자세히 설명하겠습니다.

3.3.2 Task #2: Next Sentence prediction

  • 이 task 또한 Introduction의 pre-training 방법론에서 설명한 내용입니다.
  • pre-training task 수행하는 이유는, 여러 중요한 NLP task중에 QANatural Language Inference(NLI)와 같이 두 문장 사이의 관계를 이해하는 것이 중요한 것들이기 때문입니다.. 이들은 language modeling에서 capture되지 않습니다.
  • 그래서 BERT에서는 corpus에서 두 문장을 이어 붙여 이것이 원래의 corpus에서 바로 이어 붙여져 있던 문장인지를 맞추는 binarized next sentence prediction task를 수행합니다.
    • 50% : sentence A, B가 실제 next sentence
    • 50% : sentence A, B가 corpus에서 random으로 뽑힌(관계가 없는) 두 문장
    • 예를 들어

      Input = [CLS] the man went to [MASK] store [SEP] he bought a gallon [MASK] milk [SEP] LABEL = IsNext

      Input = [CLS] the man [MASK] to the store [SEP] penguin [MASK] are flight ##less birds [SEP] Label = NotNext

  • pre-training이 완료되면, 이 task는 97~98%의 accuracy를 달성했습니다. 이러한 간단한 task를 부여해도, QA와 NLI에 굉장히 의미있는 성능 향상을 이루어 냈습니다. 이는 section5. Ablation Studies에서 자세히 설명이 되어있습니다.

3.4 Pre-training Procedure

  • pre-training의 기본적인 절차는 LM에서 수행하는 것과 같습니다.
  • BERT_english의 경우 BookCorpus (Zhu et al., 2015) (800M words)와 English Wikipedia (2,500M words)를 사용하였습니다. Wikipedia 데이터에서는 text passage만 추출하여 사용했다고 합니다. 이유는, long contiguous sequence만을 학습시키고 싶어서입니다.

  • input pre-processing
    • 먼저, NSP를 위해 sentence를 뽑아서 embedding A, B를 먹여줍니다. 물론 50%는 진짜 next sentence, 나머지는 random sentence를 사용합니다.
    • 이 모든 토큰이 합쳐진 길이는 512개 이하여야 합니다. (OOM 때문)
    • 이후 Masking 작업을 해줍니다.
  • pre-training 시의 Hyper Parameters
    • batch size : 256 sequences (256 sequences * 512 tokens = 128,000 tokens/batch) for 1,000,000 steps -> 3.3 billion word corpus의 40 epochs
    • Adam optimizer, learning rate : 1e-4, $\beta_1 = 0.9$, $\beta_2 = 0.999$, L2 weight decay of 0.01, learning rate warmup over the first 10,000 steps, linear decay of the learning rate
    • Dropout prob: 0.1 for all layers
    • using gelu activation Hendrycks and Gimpel, 2016
    • BERT_base - 4 TPUs, BERT_large - 16 TPUs를 사용하여 4일동안 학습

3.5 Fine-tuning Procedure

  • sequence-level classification tasks에 대해서는 BERT fine-tuning과정이 매우 straightforward합니다.
    • input sequence에 대해서 일정한 차원수의 representation 결과를 얻고 싶기 때문에, [CLS] token의 Transformer output값을 사용합니다.
    • [CLS] token의 벡터는 H차원을 가집니다. $C \in \mathbb{ R }^H$
    • 여기서 classify하고 싶은 갯수(K)에 따라 classification layer를 붙여 줍니다. classification layer : $W \in \mathbb{ R }^{K \times H}$
    • label probabilities는 standard softmax로 계산 됩니다. $P = softmax(CW^T)$
    • W matrix와 BERT의 모든 파라미터가 같이 fine-tuning 됩니다.
  • span-level, token-level prediction tasks의 경우에는, 위의 과정에서 약간 변형시켜 fine-tuning이 진행됩니다. 자세한 내용은 Section 4에서 설명하도록 하겠습니다.
  • fine-tuning시의 Hyper-Parameter
    • 몇가지를 제외하고는 pre-training때의 hyper parameter와 대부분 동일합니다.
    • 다른점은 batch size, learning rate, trainig epochs 수 입니다.
    • optimal hyperparametertask마다 달라지지만, 다음에 제시하는 것을 사용하면 대부분 잘 학습됩니다.

      Batch size: 16, 32 Learning rage (Adam): 5e-5, 3e-5, 2e-5 Number of epochs : 3, 4

  • fine-tuning시의 dataset의 크기가 클수록 hyperparameter에 영향을 덜 받고 잘 training 됨을 관측할 수 있었다고 합니다.
  • Fine-tuning은 굉장히 빠르게 학습되며(pre-training에 비해) 이로 인해 최적의 hyperparameter 탐색을 exhaustive search로 찾아내도 무방합니다.

3.6 Comparison of BERT and OpenAI GPT

  • OpenAI GPTBERTtransformer구조를 사용한다는 점에 있어서 공통점을 갖지만, BERT가 훨씬 좋은 성능을 갖습니다. 이 차이는 앞에 설명한 MLM task, NSP task를 수행하는 것과 별개로 또 더 다른점을 갖기에 생깁니다.
    • GPT의 경우 BookCorpus(800M words)만을 pre-training에 사용; BERT는 거기에 + Wikipedia(2500M words) 사용
    • GPT[SEP][CLS] token을 fine-tuning시에만 추가하여 학습; BERT는 pre-training시에도 학습 (NSP task가 존재하기 때문에 가능)
    • GPT : 32,000 words/batch for 1M steps ; BERT : 128,000 words/batch ofr 1M steps
    • GPT는 모든 fine-tuning을 수행할 때 learning rate : 5e-5를 사용; BERTtask-specific하게 조절하여 사용
  • 위에 나열된 차이점에 대한 효과는 ablation experiments가 수행된 Section 5.1에 설명되어 있습니다.

4. Experiments

  • 이번 섹션에서는, 11개의 NLP tasks에 대한 BERT fine-tuning에 대해서 설명하겠습니다.

그림4. BERT experiment result

그림 4. BERT experiments result (출처: BERT 논문)

  • 그림 4를 참고하면, 각 fine-tuning 유형마다 어떻게 학습하는지를 알아 볼 수 있습니다.
  • (a), (b)는 sequence-level task, (c)와 (d)는 token-level task입니다. sequence-level task의 경우는 3.5 Fine-tuning Procedure에서 설명을 드렸습니다.
  • (c)의 QA task경우는, Question에 정답이 되는 Paragraph의 substring을 뽑아내는 것이므로, [SEP] token 이후의 token들에서 Start/End Span을 찾아내는 task를 수행합니다.
  • (d)의 경우는 Named Entity Recognition(NER)이나 형태소 분석과 같이 single sentence에서 각 토큰이 어떤 class를 갖는지 모두 classifier 적용하여 정답을 찾아냅니다.

4.1 GLUE Datasets

4.1.1 GLUE Results

그림5. GLUE results

그림5. GLUE results (출처: BERT 논문)

  • 쉽게 말해, 모든 task에 대해 SOTA를 달성합니다.
  • 특히 인상적인 것은 데이터 크기가 작아도 fine-tuning 때는 좋은 성능을 낼 수 있다는 것입니다.
  • 그리고 BERT_largeBERT_base에 비해 훨씬 좋은 성능을 냅니다.(dataset이 작은 task의 경우에도!) BERT의 모델 크기에 따른 성능은 Section 5.2에서 살펴보겠습니다.

4.2 SQuAD v1.1

  • 기존 SQuAD dataset의 경우에는 GLUE dataset을 BERTfine-tuning할 때와 방식이 좀 다릅니다. GLUE dataset의 경우에는 task가 sequence classification이지만, SQuAD는 질문지문이 주어지고, 그 중 substring인 정답을 맞추는 task입니다.
  • 이러한 차이를 BERT는 아주 간단한 방법론으로 극복합니다.
    • 일단 질문을 A embedding, 지문을 B embedding 으로 처리하고, 지문에서 정답이 되는 substring의 처음과 끝을 찾는 task로 문제를 치환 합니다.
    • start vector $S \in \mathbb{ R }^H$ 와 end vector $E \in \mathbb{ R }^H$를 fine-tuning중에 학습히여, 지문의 각 token들과 dot product하여 substring을 찾아냅니다. (그림 4 (c) 참조)
  • 이런 접근법으로 BERT_large의 경우 기존의 모든 시스템을 wide margin을 두고 최고성능을 달성 합니다.

4.3 Named Entity Recognition

  • token tagging task를 평가해보기 위해서 CoNLL 2003 Named Entity Task를 fine-tuning 해보았습니다.
    • 해당 데이터셋은 200k개의 words로 이루어져 있고, 각각의 단어들은 Person, Organization, Location, Miscellaneous, Other로 태깅되어 있습니다.
  • 각 토큰마다 classifier를 붙여서 위의 제시된 class에 대해 판별을 합니다.
  • 각각의 prediction은 주위의 prediction에 영향을 받지 않습니다. (CRF나 autoregressive를 사용하지 않음!)
  • 이 task또한 SOTA를 달성합니다.

4.4 SWAG

  • The Situations With Adversarial Generations(SWAG) 데이터셋은 113k sentence-pair로 이루어져 있으며, grounded common-sense inference를 측정하기 위해 사용합니다.
  • 앞 문장이 주어지고, 보기로 주어지는 4 문장중에 가장 잘 이어지는 문장을 찾는 task 입니다.

A girl is going across a set of monkey bars. She (i) jumps up across the monkey bars. (ii) struggles onto the bars to grab her head. (iii) gets to the end and stands on a wooden plank. (iv) jumps up and does a back flip.

  • 이 데이터셋을 BERT에 적용하는 것은 GLUE dataset 적용법과 비슷합니다. 4개의 가능한 input sequences를 구성합니다. 이는 given sentence(sentence A)와 possible continuation(sentence B)을 concat한 것들입니다.
  • 해당 task specific한 벡터 $V \in \mathbb{ R }^H$를 학습시키고, input sequences의 값들을 합산한 $C_i \in \mathbb{ R }^H$를 dot product하여 softmax 합니다.
  • 이 또한 사람을 능가하는 SOTA를 달성합니다.

5. Ablation Studies

  • 해당 챕터에서는 이전 챕터에서 중요한 요소라고 설명했던 부분을을 하나씩 제거하며 요소들의 중요함을 파악해 보고있습니다.
  • 개인적으로 논문에서 가장 중요한 챕터라고 생각합니다.

5.1 Effect of Pre-training Tasks

  • 5.1에서는 이전 3.3 Pre-training Tasks에서 소개한 2가지 task를 하나씩 제거하면서 각각의 task의 효과를 알아봅니다.
  • BERT_base와 동일한 hyperparameter로 실험을 진행하지만 ablation한 두가지 다른 모델로 실험을 진행합니다.
      1. No NSP: MLM은 사용하지만, 다음 문장 예측 (NSP)를 없앤 모델
      1. LTR & No NSP : MLM 대신 Left-to-Right (LTR) 을 사용하고, NSP도 없앤 모델, 이는 OpenAI GPT모델과 완전히 동일하지만, 더 많은 트레이닝 데이터를 사용하였습니다.

그림6. ablation result1 그림6. pre-training task ablation result (출처: BERT 논문)

  • 표에서 볼 수 있듯, pre-training task를 하나라도 제거하면 성능이 굉장히 떨어지는 것을 볼 수 있습니다.
  • No NSP의 경우에는 NLI계열의 task에서 성능이 많이 하락하게 되는데, 이는 NSP task가 문장간의 논리적인 구조 파악에 중요한 역할을 하고 있음을 알 수 있습니다.
  • MLM대신 LTR을 쓰게 되면 성능하락은 더욱더 심해지게 됩니다. BiLSTM을 더 붙여도, MLM을 쓸 때보다 성능이 하락하는 것으로 보아, MLM task가 더 Deep Bidirectional한 것임을 알 수 있습니다.

5.2 Effect of Model Size

  • 간단하게 말해서, 측정한 데이터셋에서는 모두 모델이 커질수록, 정확도가 상승함을 볼 수 있습니다.

그림7. ablation result2 그림7. Ablation over BERT model size (출처: BERT 논문)

  • 수 년동안 알려져 왔듯, 번역 task나 language modeling과 같은 large-scale task는 모델 사이즈가 클 수록 성능은 계속 상승합니다.
  • 특히 BERT의 경우에는, downstream task를 수행하는 dataset의 크기가 작아도, pre-training덕분에, model의 크기가 클 수록 정확도는 상승함을 볼 수 있습니다.

5.3 Effect of Number of Training Steps

그림8. ablation result3 그림8. Ablation over number of training steps (출처: BERT 논문)

  • 그림 8에서는 MNLI Dev accuracy를 pre-training step에 따라 정리하였습니다. 세부사항은 문답형식으로 진행하겠습니다.

  • Question 1. fine-tuning 단계에서 높은 정확도를 얻으려면, pre-training 단계에서 많은 training step이 필요합니까?
    • A : 그렇습니다. 0.5M step에 비해 1M step때 accuracy가 거의 1.0% 상승함을 볼 수 있습니다.
  • Question 2. 3.3.1 Task #1: Masked LM의 마지막 부분에서 시사한 바와 같이, MLM으로 학습하면 15%의 단어만 맞추는 것으로 학습을 진행하기 때문에, LTR보다 수렴속도가 훨씬 느리지않습니까?
    • A : 수렴속도가 조금 느린 것은 사실이지만, LTR보다 훨씬 먼저 out-perform성능이 나오게 됩니다.

5.4 Feature-based Approach with BERT

  • 지금까지 BERT는 pre-training을 진행 한 후, downstream task를 학습 할 때, 간단한 classifier를 부착해서 모든 layer를 다시 학습시키는 fine-tuning 방법을 사용하는 것만을 설명드렷습니다.
  • 하지만 BERT를 ELMO와 같이 feature based approach로도 사용을 할 수 있습니다.
  • Feature-based Approach는 몇가지 이점이 존재합니다.
      1. Transformer encoder는 모든 NLP task를 represent하지는 못하므로, 특정 NLP task를 수행할 수 있는 Network를 부착하여 쓸 수 있습니다.
      1. Computational benefit을 얻을 수 있습니다.
  • 해당 section에서는 BERT를 ELMO와 같이 마지막 레이어에 Bi-LSTM을 부착시켜, 해당 레이어만 학습 시키는 방법론을 사용해보았습니다.

그림9. ablation result4 그림9. Ablation using BERT with a feature-based approach (출처: BERT 논문)

  • 그림 9에서 볼 수 있듯이, Concat Last Four Hiddem값을 사용하면, Finetune All과 단지 0.3 F1 score차이밖에 나지 않습니다.
  • 이를 통해, BERT는 Feature-based Approach에서도 효과적이라고 할 수 있겠습니다.

6. Conclusion

  • 읽으면서 계속해서 느꼈지만, 굉장히 놀라운 논문이라고 생각합니다. 특히 MLM과 NSP task를 생각해 낸것이 굉장히 놀라웠습니다. 이러한 간단한 intuition을 가지고 NLP의 전분야를 아우르는 SOTA를 달성해 낸 것에 대해서 놀랍고, 또 부럽다는 생각을 했습니다.

마치며…

  • 논문을 읽은 것이 10월 말 경이었던 것 같은데, 조금씩 글로 정리하다 보니 벌써 2월 말이 되었습니다. 그 사이에 BERT를 토대로 다시 SOTA를 달성한 새로운 논문(Multi-Task Deep Neural Networks for Natural Language Understanding)을 MS에서 발표하였습니다. 해당 논문도 빠른 시일내에 review해 보도록 하겠습니다. 감사합니다.

Comment  Read more

Dockerfile 작성방법 및 읽는 법

|

Dockerfile의 작성 방법 및 읽는 법

rasa-nlu dockerfile

FROM python:3.6-slim

ENV RASA_NLU_DOCKER="YES" \
    RASA_NLU_HOME=/app \
    RASA_NLU_PYTHON_PACKAGES=/usr/local/lib/python3.6/dist-packages

# Run updates, install basics and cleanup
# - build-essential: Compile specific dependencies
# - git-core: Checkout git repos
RUN apt-get update -qq \
    && apt-get install -y --no-install-recommends build-essential git-core openssl libssl-dev libffi6 libffi-dev curl \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

WORKDIR ${RASA_NLU_HOME}

# use bash always
RUN rm /bin/sh && ln -s /bin/bash /bin/sh

COPY . ${RASA_NLU_HOME}

RUN pip install -r alt_requirements/requiements_full.txt

RUN pip install -e .

RUN apt-get update -qq \
    && apt-get install -y --no-install-recommends wget \
    && wget -P data/ https://s3-eu-west-1.amazonaws.com/mitie/total_word_feature_extractor.dat \
    && apt-get remove -y wget \
    && apt-get autoremove -y

RUN pip install https://github.com/explosion/spacy-models/releases/download/en_core_web_md-2.0.0.0.tar.gzz --no-cache-dir > /dev/null \
    && python -m spacy link en_core_web_md en \
    && pip install https://github.com/explosion/spacy_models/releases/download/de_core_news_sm-2.0.0/de_core_news_sm-2.0.0.tar.gz --no-cache-dir > /dev/null \
    && python -m spacy link de_core_news_sm de

COPY sample_configs/config_spacy_duckling.yml ${RASA_NLU_HOME}/config.yml

#VOLUME ["/app/projects", "/app/logs", "/app/data"]

EXPOSE 5000

ENTRYPOINT ["./entrypoint.sh"]
CMD ["start", "-c", "config.yml", "--pach", "/app/projects"]

FROM

  • 빌드 할 이미지가 어떤 이미지를 기반으로 하고있는지를 나타냄
  • rasa-nlu docker의 경우 python 이미지, 특히 3.6-slim 버전을 기반으로 만들어진 이미지임

ENV

  • 해당 이미지의 환경변수를 지정해주는 옵션, 이는 RUN, CMD, ENTRYPOINT에 적용
  • rasa-nlu의 경우 $RASA_NLU_HOME, $RASA_NLU_DOCKER, $RASA_NLU_PYTHON_PACKAGES을 지정해 줌

RUN

  • FROM에서 설정한 이미지 위에서 명령을 실행하는 것, 쉽게 말해 shell sciprt와 같다고 보면 됨
  • 예제를 자세히 풀어서 설명하자면
    • apt-get update -qq : ubuntu에서 패키지 목록 업데이트, -qq는 quiet 2단계를 의미, logging을 없애줌
    • && apt-get ~ : 해당 이미지의 app을 구동하기 위한 우분투 패키지 설치
    • rm /bin/sh && ln -s /bin/bash /bin/sh : 해당 이미지의 shell 실행파일을 bash로 강제
    • pip install -r alt_requirements/requiements_full.txt : rasa-nlu_full 구동에 필요한 파이썬 패키지 목록이 alt_requirements/requiements_full.txt 에 저장되어 있고, 해당 pip 명령어를 통해 설치
    • 이후 RUN : spacy 모듈 설치를 위한 명령어들

COPY

  • 파일을 이미지에 추가함, 뒤에 설명할 ADD와는 약간 다름
  • 사용법 :
    • COPY <복사할 파일> <이미지에서 파일이 복사될 경로> : 예제에서는 . 즉 컨텍스트에 있는 모든 파일을 ${RASA_NLU_HOME}에 복사함
    • <복사할 파일>은 컨텍스트 아래만 가능, ../foo/bar, /home/minhopark2115/ 이런거 불가능
    • 인터넷 url 사용불가
    • <이미지에서 파일이 복사될 경로>는 언제나 절대경로
    • 여러 파일을 복사할 때, dockerignore에 설정한 내역은 제외 됨

WORKDIR

  • RUN, CMD, ENTRYPOINT의 명령어가 실행되는 디렉터리를 설정함
  • 예제에서는 ${RASA_NLU_HOME}로 설정

EXPOSE

  • host와 연결할 포트 번호를 설정
  • rasa-nlu는 5000번 사용

ENTRYPOINT

  • 컨테이너 (이미지의 인스턴스)가 시작되었을 때 실행되는 명령어
  • Dockerfile에서 한번만 사용 가능
  • 예제에서는 COPY 명령어를 통해 넘겨진 entrypoint.sh라는 쉘스크립트를 실행
    • entrypoint.sh 내용 : 간단하게 설명하면 rasa_nlu.server 실행하는 내용
    • 바로 뒤에 있는 CMD의 내용을 매개변수로 받는 듯

CMD

  • ENTRYPOINT와 비슷 하게 쓰이지만, 앞에 ENTRYPOINT가 있다면, 거기에 매개변수를 넘겨주는 목적으로 쓰임
  • 위의 entrypoint.shstart, -c, ...등의 매개별수를 넘겨준다

VOLUME

  • 해당 디렉터리의 내용을 컨테이너에 저장하지 않고 호스트에 저장
  • #VOLUME ["/app/projects", "/app/logs", "/app/data"] 처럼 배열로 선언 가능
  • 근데 host어디에 저장될 것인지는 설정 불가능
  • host의 특정 디렉터리와 연결하려면 docker run -v <host directory>:<container directory> 사용

Comment  Read more

docker 기본개념 정리

|

1. 가상 머신(VM)과 도커(docker)

1-1. 먼저, 가상머신이란 무엇인가?

VM

  • 가상 머신은 host OS 위에 Guest OS + Bins/Libs + App 들로 이루어진 매우 크고 아름답고 느린… 그런 것이다
  • 위 그림의 VM 영역을 이미지로 뜨면, 서버를 편하게 계속 만들어 낼 수 있음
  • But, 리얼 머신에 비해 너무 느림…
    • 일단 VM 이미지 내에 Guest 이미지가 포함되어 있어 이미지의 용량이 굉장히 큼
    • 또한 host의 리소스를 hypervisor라는 것을 통해 접근하기 때문에 비효율적임

1-2. docker는?

docker-container

  • 도커(docker)란?
    • 도커는 개발자와 시스템관리자가 app을 develop, deploy, and run을 container를 통해 할 수 있는 platform임
    • 여기서 컨테이너라는 개념은 리눅스에 존재하던 그것! 도커에서는 컨테이너를 쉽게 deploy할 수 있는데, 이를 containerization이라고 한다.
    • containerization은 급속도로 촉망받고 있는데, 이는 다음과 같은 컨테이너의 특성 덕분이다
      • Flexible: Even the most complex applications can be containerized.
      • Lightweight: Containers leverage and share the host kernel.
        • 이는 VM과 크게 다른 점, guest OS로 커널을 새로 만들어 쓰지 않고, 호스트 커널을 공유한다.
      • Interchangeable: You can depoly updates and upgrades on-the-fly.
      • Portable: You can build locally, deploy to the cloud, and run anywhere.
      • Scalable: You can increase and automatically distribute container replicas.
      • Stackable: You can stack services vertically and on-the-fly

1-3. 이미지(Images)와 컨테이너(Containers)

  • 컨테이너이미지를 run함으로써 launch된다
  • 여기서 Image
    • app을 실행하기 위해 필요한 것 모두가 포함되어 있는 executable package
      • the code, a runtime, libraries, environment variables, and configuration files
  • 컨테이너 란?
    • 이미지의 runtime instance
    • 이미지가 executed되어 메모리에 올라간 상황
    • docker ps 명령어로 확인 가능
    • 컨테이너는 리눅스에서 돌아가며, 호스트 머신의 커널을 공유한다.
    • 이는 discrete process로 실행되어, executable한 메모리 양보다 더 많이 사용하지 않음(경량화)

Comment  Read more