reniew's blog
cs and deep learning

A Structured Self-Attentive Sentence Embedding

|

2017 ICLR Conference에서 소개된 논문 중 IBM Watson의 Attention mechanism을 사용해 Sentence embedding을 하는 A Structured Self-Attentive Sentence Embedding 논문에 대해서 알아보도록 한다. 해당 모델은 sentence embedding을 위한 self-attention mechanism과 정규화를 위해 새로운 regularization term을 소개한다. 뿐만 아니라 추가적으로 visualizing을 쉽게 할 수 있도록 설계되어있어 간단하게 visualizing을 할 수 있도록 한다. 해당 모델의 성능을 측정하기 위해서 3개의 task(author profiling, sentiment classification, textual entailment)에서 실험했다.


1 Introduction

Word embedding 기법, 즉 개별 단어들에 대해 유의미한 distributed representation을 학습하는 기법들을 계속해서 많은 발전을 이뤄왔다. 반면 아직 phrase나 sentence의 representation을 만드는 데는 word에 비해 아직은 부족한 상황이다. 보통 이와 같이 phrase나 sentence를 representation하는 방법은 두가지로 나뉜다. 첫 번째는 unsupervised 학습을 사용해 universal sentence representation을 만드는 방법이다.(SkipThought vector, ParagraphVector, recursive auto-encoders, Sequential Denoising Autoencoder, FastSent, etc)

또 다른 방법은 특정 task를 위해 특별하게 학습하는 방법이다. 이러한 방법은 보통 supervised 학습하고, downstream application과 합쳐져서 사용된다. 그리고 몇몇 모델의 경우에는 일반적인 단어 임베딩을 사용하고 중간에 recurrent networks, recursive networks, convolutional networks 등을 사용함으로써 sentence representation을 얻어 다양한 task에 적용되었다.

Attention mechanism을 CNN 혹은 LSTM 네트워크 상단에 적용함으로써 추가적인 정보를 통해 sentence embedding을 추출하는 모델이 몇가지 task에서 제안되었다. 하지만 sentiment analysis 같은 단일 문장이 입력으로 들어가는 경우에 추가적인 정보로 활용할 문장이 없기 떄문에 attention mechanism을 적용할 수 없다.

따라서 대부분의 경우에는 max or average pooling 기법을 적용하거나 RNN의 마지막 hidden vector를 선택해서 사용하는데, 해당 모델에서는 self-attention 기법을 통해서 기존의 방법들을 대체한다. self-attention의 경우에는 추가적인 입력값이 없는 하나의 문장에 대해서도 적용할 수 있고, 긴 문장에 대해서도 좋은 성능을 낸다. 이후 section 2.1 에서 self-attentive sentence embedding 모델을 소개하고 2.2에서 모델에서 사용한 정규화 방법에 대해서 소개한다. 마지막으로 2.3 에서는 효과적으로 해당 기법을 시각화 할 수 있는 방법에 대해서 소개할 것이다.

2 Approach

2.1 Model

Sentence embedding 모델은 크게 두개의 part로 구성되어 있다. 첫 번째 part는 bidirectional LSTM 을 사용하는 부분이고 다음은 self-attention을 적용하는 방법이다. 두 번째 part에서 나오는 값들을 사용해 LSTM의 hidden state값을 weighted sum 하게 되고 이 값이 입력 문장에 대한 embedding vector 로 사용된다. 그리고 이 값을 활용해서 각각의 task에 맞게 추가적인 networks를 모델 상단에 적용시킬 수 있다. 예를 들면 sentence embedding vector에 multi-layer perceptron을 적용시켜서 sentiment analysis task에 적용할 수 있다. 아래의 그림은 해당 예시를 도식화한 그림이다.

스크린샷 2019-03-02 오전 11.54.20

모델의 세부 과정에 대해서 자세히 알아보도록 하자. 우선 아래와 같이 $n$개의 token을 가지는 입력 문장이 있다고 하자. 입력 문장은 아래와 같이 각 단어들의 vector들이 모여서 matrix가 된다.

여기서 $\mathbf{w_i}$ 는 $i$번째 단어의 $d$-dimensional vector이다. 입력 문장 $S$ 는 $(n,d)$ 형태가 된다. 해당 입력 문장에 bidirectional LSTM을 적용시켜 두 개의 $u$-dimensional hidden vector 값을 구한다.

Bidirectional LSTM hidden state인 $\overset{\rightarrow}{h_t}$와 $\overset{\leftarrow}{h_t}$를 concatenate한 결과인 $h_t$를 사용한다. 전체 길이 $n$에 대해 다음과 같이 n개의 hidden state값이 나오게 된다. 이 값들을 모아서 하나의 matrix로 만들면$(n,2u)$의 size를 가지게 된다.

가변 길이의 입력값에 대해서 동일한 크기의 embedding 값을 얻는 것을 목표로 하기 떄문에, $n$개의 LSTM state를 적당한 linear combination을 통해 일정한 크기로 만들어 줘야 한다. 여기서는 self-attention mechanism을 linear combination으로 사용한다. Attention mechanism의 입력으로는 $H$를 사용하고, weight로 사용되는 output $\mathbf{a}$가 나오게 된다.

여기서 $W_{s1}$은 $(d_a, 2u)$ 크기의 가중치 행렬이고, $\mathbf{w_{s2}}$는 $(d_a)$ dimension의 가중치 벡터이다. 최종 output인 $\mathbf{a}$는 $n$ dimension의 벡터가 나오게 된다. 해당 값은 각 token에 대해 얼마나 반영할지를 확률값으로 표현되어있다. 이 값을 사용해 $H$의 가중 합을 구하게 된다.

이 값은 한 문장에 대해서 하나의 semantic 정보를 담고있다. 하지만 일반적으로 문장의 경우 여러개의 의미를 담는경우가 많이 있다. 예를 들면 ‘and’로 연결되어 있는 문장의 경우 한문장이더라도 여러개의 의미를 담고 있다. 따라서 이러한 전체적인 의미를 담은 represent하기 위해서 multiple $\mathbf{m}$을 필요로 한다. 따라서 multiple hops of attention을 사용한다. 문장에서 $r$개의 각각 다른 부분의 의미를 추출하기 위해서 기존의 $\mathbf{w_{s2}}$를 $(r,d_a)$크기의 가중치 행렬로 확장시켜서 다음과 같이 attention matrix를 구하게 된다.

이후 최종 output은 위의 attention matrix $A$와 $H$를 행렬곱해서 얻게된다.

2.2 Penalization Term

앞서 구한 $M$은 $r$개의 정보를 담아야 하는데 만약 비슷한 값들만을 갖게 된다면 정확한 정보를 전달하기 어려워지는데 이러한 문제를 해결하기 위해 penalization term을 통해 다양한 정보를 각각의 attention hop이 가질 수 있도록 만들어 준다.

다양성을 평가하는 가장 좋은 방법은 Kullback Leibler divergence를 측정하는 것이다. 하지만 해당 모델에서 KL-divergence를 사용한 경우에 unstable하기 때문에 해당 모델에서는 다른 regularization term을 사용해서 Regularization을 한다. 뿐만 아니라 여기서 제시하는 penalization term의 경우 KL-divergence와 비교해서 연산량이 1/3로 cost 측면에서도 효율적이다.

해당 term은 아래와 같이 계산한다.

여기서 사용한 $\Vert\cdot\Vert_F$은 Frobenius norm이다. L2 regularization term과 비슷하게 해당 term은 coefficient를 곱한 후 loss와 함께 최소화하게 된다.

2.3 Visualization term

해당 모델에서 sentence embedding을 interpretation하는 것은 매우 간단하게 annotation matrix $A$를 사용함으로써 매우 간단히 해결할 수 있다. embedding matrix $M$의 각 row에 대해 각각 상응하는 annotation vector $\mathbf{a}$를 가진다. 각 element는 각 position의 token이 얼마나 contribution을 한지 확인 할 수 있다. 이 값을 사용해 Visualization을 쉽게 할 수 있다. Visualization결과는 다음과 같이 나타난다.

스크린샷 2019-03-02 오후 2.16.26

Conclusion & Discussion

해당 논문에서는 self-attention을 사용해서 고정된 크기의 matrix sentence embedding을 만들었다. 해당 모델을 3개의 task에 실험한 결과는 해당 모델의 다른 sentence embedding 모델에 비해 더 좋은 성능을 보인다는 것을 확인할 수 있다.

LSTM의 결과에 attention mechanism을 적용함으로써 LSTM은 마지막 hidden state에 모든 token의 정보를 담을 필요가 없고 단지 각 token의 정보들만을 담으면 된다. 따라서 해당 모델은 sentence의 길이가 길어지더라도 좋은 성능을 보인다.

그리고 해당 모델은 가변 길이의 문장을 하나의 고정된 길이의 representation으로 나타낼 수 있고, long-term의 경우에도 동일하게 정보를 잠 담는다. 이러한 장점은 모델이 scalability 하다는 것을 나타낸다. 따라서 단순 문장이 아니라 paragraph, articles등 더욱 긴 content에도 적용할 수 있다는 것을 볼 수 있다.

Comment  Read more

BERT: Bidirectional Transformers for Language Understanding

|

이번에는 많은 Task 에서 SotA(State of the Art)의 성능을 보이고 있는 BERT(Bert Encoder Representations form Transformers)에 대해서 알아보도록 하자. 이전에 소개된 ELMo, GPT에 이어 Pre-trained을 함으로써 성능을 올릴 수 있도록 만든 모델이다. 해당 모델은 Google에서 제시한 모델로 BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 논문에서 소개되었다. 이제 논문을 살펴보자.


1 Introduction

많은 Task 에서 Language model pre-training은 효과적이라는 것을 계속해서 입증해오고 있다. ELMo, OpenAI의 Generative Pre-trained Transformer(GPT) 등 다양한 모델에서 pre-train을 함으로써 대부분의 NLP의 task의 성능이 향상됨을 보여왔다.

우선 여기에는 pre-train 된 언어 표현을 실제 task에 적용시키는 방법은 두 가지로 나뉜다. 하나는 feature-base 방법이고, 하나는 fine-tuning 방법이다.

우선 feature-based 방법의 경우 예시는 ELMo이며, 이 경우에는 ELMo를 통해 사전 학습한 feature를 사용하지만, task에 적합한 새로운 architecture를 추가로 사용해서 task를 해결한다. 즉 사전 학습을 통해 언어 표현 feature만 사용하고, 모델의 경우 별개의 개념인 것이다.

그와 다르게 fine-tuning 방법의 경우 예시는 OpenAI의 GPT이다. 이 방법의 경우 task에 맞게 새로운 task-specific한 parameter를 사용한다. 이 parameter를 각 task에 학습하는데, 이 때 사전 학습한 parameter를 사용해 fine-tuning 하는 방법이다.

이러한 두 방법 모두 같은 목적 함수를 사용해 사전 학습하지만, 두 방법 모두 단방향의 language model을 사용해서 언어 표현을 학습한다.

해당 논문에서는 기존의 이러한 기법들(ELMo, GPT)이 pre-train된 표현의 제대로된 성능을 저해하는 요소가 있다고 주장한다. 이러한 요소에 대해서 설명하면, 먼저 이러한 langugage model 이 단방향으로 학습한다는 점이다. 그리고 이러한 이유로 pre-train 과정에서 사용될 architecture를 선택할 수 있는 폭을 줄어든다는 점이다.

예를 들어 OpenAI의 GPT의 경우 텍스트에서 왼쪽에서 오른쪽으로만 참고할 수 있는 구조를 취하고 있다.

따라서 해당 논문에서는 fine-tuning based 방법으로 BERT: Bidirectional Encoder Representations from Transformers 를 사용함으로써 성능을 향상시킬 것이다. 해당 방법의 경우 기존의 방법이 단방향이였다면, “masked language model(MLM)“를 통해 사전학습을 함으로써 이러한 제약을 해결할 것이다.

Masked language model은 임의로 input token의 몇가지를 masking 처리하고, 다른 token들을 사용해서 masking된 token들을 예측하는 방향으로 학습한다. 기존의 왼쪽에서 오른쪽으로 단방향으로만 사전 학습하는 모델과는 다르게 MLM의 목적은 좌,우의 모든 문맥이 융화되도록 하는 것이다.

그리고 Masked language model과 더불어 “next sentence prediction” 라는 task를 사전 학습 과정에서 같이 사용할 것이다.

마지막으로 해당 논문이 기여하려고 하는 바는 다음과 같다.

  • 해당 논문에서는 언어 표현을 위해 양방향으로 사전 학습하는 것의 중요성을 증명할 것이다. OpenAI의 GPT 처럼 단방향으로 사전 학습을 하지 않고 BERT는 masked langugage model을 사용해 언어 표현을 위한 양방향으로 사전 학습을 진행한다. 그리고 ELMo의 경우 좌에서 우, 우에서 좌 둘다 사용해서 양방향이라 표현할 수 있지만, 해당 논문에서는 좌에서 우, 우에서 좌로 각각 학습한 후 이를 concatenate 해서 사용했다는 점이 BERT와의 차이점이다.

  • 또한 많은 engineering이 필요한 task-spesific한 architecture를 사용할 필요성을 사전 학습을 통해 줄여준다. BERT는 문장 단위와 단어 단위 모두에서 SotA의 성능을 보이는 최초의 fine-tuning 기반의 표현(representation) 모델이다.

  • BERT를 사용함으로써 11개의 NLP task들에서 SotA의 성능을 향상시켰다. 그리고 BERT를 통해 양방향 특성이 가장 중요한 점이라는 것을 보여준다. 그리고 code와 pre-trained 모델의 경우 goo.gl/language/bert에서 사용할 수 있다.

먼저 사전 학습 모델의 역사에 대해서 간략하게 알아보도록 하자.

2.1 Feature-based Approaches

우선 Feature based 한 Pre-trained 기법들을 Neural이 아닌 모델들도 많이 있었다. 그리고 Pre-trained 시 단순히 단어에 대한 임베딩만을 진행하는 것이 아니라, 문장 및 구절에 대해서도 임베딩 하기도 한다.

그 중에서도 ELMo는 이러한 전형적인 단어 임베딩 연구를 다른 차원으로 일반화 시켰다. ELMo 모델에서는 context-sensitive 특징을 모델을 통해 추출했다.

2.2 Fine-tuning Approaches

최근의 Langugage model에서 tansfer learning의 트렌드는 실제 task에 맞는 지도 학습 모델을 적용하기 전에 동일한 모델을 사전 학습한 후 학습한 결과를 사용해서 fine-tuning하는 방법이다. 이러한 방법의 장점은 학습해야 하는 parameter의 수가 적다는 점이다. 더 적은 수의 parameter를 학습하면 된다.

2.3 Transfer Learning from Supervised Data

비지도 학습의 사전 학습 방법은 무한정의 데이터를 사용할 수 있다는 장점이 있지만, 큰 데이터에 대해서 지도 학습 방법의 transfer가 더욱 효과적이라는 것이 입증되었다.

3 BERT

이제 본격적인 BERT의 세부적인 구현 내용에 대해서 알아보도록 하자. 순서는 우선 전체 모델의 architecture에 대해서 알아보고 input의 형태를 먼저 알아본다. 그리고 다음으로 pre-training task에 대해서 알아본 뒤 pre-training, fine-tuning의 세부적인 절차에 대해서 알아본다. 마지막으로 BERT와 OpenAI GPT의 차이점에 대해서 다뤄보도록 한다.

3.1 Model Architecture

BERT의 모델 구조는 multi layer의 양방향 Transformer 인코더를 기반으로한 구조이다. Transformer에 대한 자세한 설명은 생략하도록 한다.(블로그 글 참고)

해당 모델의 트랜스 포머의 layer의 수(Transformer 블록의 수)는 $L$로 지칭하고, hidden size는 $H$로 지칭한다. 그리고 self-attention의 head 수는 $A$로 지칭한다. 마지막으로 Transformer의 feed-forward layer의 첫번째 layer의 unit 수는 $4H$로 지정한다.

해당 모델에서는 2개의 각각 다른 하이퍼 파라미터를 가지는 모델을 정의했다. 각 모델의 하이퍼 파라미터 값은 다음과 같다.

  • $\text{BERT}_\text{BASE}$: $L=12, H=768, A=12, \text{Total Parameters} = 110M$
  • $\text{BERT}_\text{LARGE}$: $L=24, H=1024, A=16, \text{Total Parameters} = 340M$

$\text{BERT}_\text{BASE}$는 비교를 위해 OpenAI의 GPT 모델과 같은 크기로 설정했다. BERT와 OpenAI의 GPT와 ELMo의 모델의 차이점은 아래의 그림을 참고하자.

BERT

3.2 Input Representation

이제 입력값의 형태에 대해서 알아보도록 하자. 여기서 입력값의 형태는 약간 모호할 수 있다. 하나의 문장이 입력값이 될 수도 있고 두개의 문장 쌍(e.g. [Question, Answer])이 입력값이 될 수도 있다. 주어진 token에 대해서 다음의 세가지 값을 더함으로써 입력값으로 사용한다.

  • Token의 Embedding
  • Segment의 Embedding
  • Position의 Embedding

위의 세가지 값을 더하면 입력값이 된다. 입력값에 대한 부분은 아래의 그림을 참고하자.

INpu

입력값에 대한 구체적인 특징들은 다음과 같다.

  • 30,000개의 token vcabulary를 가지는 WordPiece 임베딩 값(Wu et al., 2016)을 사용했다. 그리고 split word의 경우 ##으로 사용했다.

  • 그리고 Positional 임베딩 값으로는 512 토큰 길이에 맞게 학습된 임베딩 값을 사용했다.

  • 모든 문장의 첫 토큰은 special classification embedding값([CLS])을 넣어준다. 해당 토근에 대응하는 마지막 hidden state(Transformer의 출력값)는 분류 task에서 사용된다. 만약 분류 task가 아니라면 해당 벡터는 무시한다.

  • 문장 쌍은 하나로 묶여서 하나의 문장으로 만들어지는데, 실제로 다른 이 문장 쌍을 두가지 방법으로 구별한다. 첫 번쨰는 두 문장 사이에 special token([SEP])를 넣어주고, 두 번째 방법은 학습된 문장 A 임베딩 값을 앞쪽 문장 모든 token에 더해주고 문장 B 임베딩 값을 뒤쪽 문장 모든 token에 더해준다.

  • 단일 문장 입력값의 경우 문장 A 임베딩 값만을 사용한다.

3.3 Pre-training Tasks

해당 모델에서는 전형적인 좌에서 우 혹은 우에서 좌로 가는 language model을 사용해서 BERT를 pre-train하지 않았다. 대신 BERT는 두개의 비지도 예측 task들을 통해 pre-train 했다. 이 Section에서 두개의 비지도 학습 task에 대해서 알아보도록 하자.

3.3.1 Task #1: Masked LM

직관적으로 양방향 모델이 기존의 좌->우 / 우->좌 모델보다 훨씬 더 좋다는 것은 합당하다. 하지만 불행이도 양방향 조건은 간접적으로 각 단어를 본인 스스로를 보도록 하기 때문에, 일반적인 조건부 language model은 오직 좌에서 우, 우에서 좌로만 학습할 수 있다. 따라서 양방향 학습을 위해서 여기서는 특정 확률만큼에 해당하는 입력 토큰들을 임의로 마스킹 처리한다. 그리고 마스킹 된 단어들을 예측하도록 한다. 이러한 기법을 “masked LM”이라 부른다.(MLM) denoising auto-encoders와는 대조적으로 여기서는 오직 masking 한 값만 비교를 해서 학습을 진행한다.

이러한 MLM 기법을 통해서 양방향 학습이 가능하도록 했지만, 이러한 기법의 큰 두가지 문제점이 남아있다. 첫 번째는 pre-train 과정에서는 “[MASK]” 토큰을 사용하지만, fine-tuning 한 후에는 사용하지 않아서 pre-train과 fine-tuning 사이의 간극이 생긴다는 점이다. 이러한 문제점을 해결하기 위해 학습 과정에서 모든 masking된 값을 [MASK] 토큰으로 대체하지 않았다. 자세하게 이러한 문제점을 해결하는 방법에 대해서 알아보도록 하자. 예를 들어 “내 개는 크다” 라는 문장이 있다고 하자. 이 때 “크다” 라는 단어를 masking 하려고 한다면 다음과 같이 진행된다.

  • 항상 “크다” 라는 단어를 [MASK] 토큰으로 대체하는 것이 아니라 다음과 같이 진행한다.
  • 전체 시간의 80%: “크다” 라는 단어를 “[MASK]” 토큰으로 대체한다. 즉 “내 개는 크다” $\rightarrow$ “내 개는 [MASK]”
  • 전체 시간의 10%: “크다” 라는 단어를 임의의 다른 단어로 대체한다. 즉 “내 개는 크다” $\rightarrow$ “내 개는 사과”
  • 전체 시간의 10%: Masking 된 단어, “크다” 를 그대로 둔다. 즉 “내 개는 크다” $\rightarrow$ “내 개는 크다”

위와 같이 masking 함으로써 pre-train과 fine-tuning 과의 간극을 줄여서 첫 번째 문제점을 해결한다. 두 번째 MLM의 문제점은 오직 15%의 token 만 각 batch 에서 예측된다는 점인데, 따라서 pre-train 값이 수렴하기 위해서는 더 많은 step을 학습해야 한다.

step

위 그림을 보면 MLM 기법을 사용한 BERT 모델이 단방향의 BERT 모델 보다 더 많은 step이 지나야 수렴한다는 것을 확인할 수 있다.

3.3.2 Task #2: Next Sentence Prediction

Question Answering, Natural Language Inference 등의 Task들은 두 문장 사이의 관계를 이해하는 것이 매우 중요하다. 문장 사이의 관계를 모델이 학습할 수 있도록 단일 Corpus로 구성된 두 개의 문장에 대해 문장이 관계있는지 없는지 이진 분류하는 next sentence prediction task를 통해 pre-train 한다. 구체적으로 두개의 A, B 문장을 선택하는데, 학습 과정에서 절반은 B 를 실제 A의 다음 문장으로 선택하고, 나머지는 임의의 다른 문장을 선택한다. 아래의 예를 보자.

NotNext 문장의 경우 완전히 임의로 선택했다. 해당 테스크에 대해서 최종적으로 pre-train된 모델의 경우 97~98%의 정확도를 보여준다. 이러한 task는 QA 와 NLI task에 대해서 아래와 같은 성능 향상을 보여줬다.

nli

3.4 Pre-training Procedure

pre-traning Corpus를 위해 두개의 Corpus를 합쳐서 사용했다. BooksCorpus(800M words)와 Engish Wikipedia(2,500M words)를 합쳐 하나의 Corpus로 만들었다. Wikipedia corpus의 경우 list, tables, header를 모두 무시하고 text만을 추출했다.

각 학습 입력값을 만들어주기 위해서 두개의 문장을 뽑아서 하나의 문장으로 만들어 준다. 첫 번쨰 문장의 경우 A 임베딩 값을 가지고 두 번째 문장의 경우 B 임베딩 값을 가진다. B의 50%는 실제 A의 다음 문장을 사용하고 나머지는 임의의 문장을 사용한다. 이렇게 뽑아 “next sentence prediction” task에 사용한다. 그리고 두 문장을 합친 문장의 최대 길이는 512 토큰으로 제한한다.

학습 시 batch size의 경우 256 문장으로 한다. 따라서 한 batch에 총 256 sequence $\times$ 512 tokens 인 128,000개의 토큰이 학습된다. 또한 전체 step은 1,000,000번 으로 33억개의 단어 corpus에 대해서 대략 40 에폭정도 학습한다.

또한 학습은 Adam 을 사용하였으며 하이퍼 파라미터 값은 다음과 같다.

  • Learning rate: $10^{-4}$
  • $\beta_1 = 0.9$
  • $\beta_1 = 0.999$
  • 0.01 값으로 L2 가중치 감소 사용
  • Learning rate의 경우 10,000 스탭마다 선형으로 감소하도록 함

그리고 드랍아웃의 경우 0.1 확률로 모든 레이어에 적용했다. 활성화 함수로는 gelu를 사용했다. 학습 loss의 경우 mean masked LM likelihood and mean next sentence prediction likelihood를 더한 값을 사용했다.

3.5 Fine-tuning Procedure

문장의 classification task는 BERT의 fine-tuning이 직관적이고 간단한다. 입력값에 대해서 고정된 길이의 벡터를 추출해야 하는데, 해당 모델에서 첫 번째 입력값인 [CLS] 토큰에 의해 출력되는 마지막 hidden state값을 사용한다. 이 벡터를 $C\in\mathbb{R}^H$라 부른다. fine-tuning 과정에서 전체 파라미터는 그대로 유지되지만 마지막 classification을 위해 classification layer $W\in\mathbb{R}^{K\times H}$를 추가한다. 여기서 $K$는 classification 해야 되는 라벨의 개수를 의미한다. 해당 layer를 거친 벡터에 대해서 소프트맥스 함수를 적용시켜 확률 벡터인 $P\in\mathbb{R}^K$를 계산한다. 즉 아래의 수식과 같이 최종 확률 벡터가 계산된다.

BERT의 모든 parameter와 $W$는 실제 라벨과 비교한 log-probability 를 최대화 하며 학습된다. 사실 이러한 최종적인 fine-tuning과정과 학습 방법은 task에 따라 조금은 달라지는데 아래의 그림을 참고하자.

bert_cl

fine-tuning 과정에서 대부분의 모델의 hyper parameters는 pre-train 과정과 동일하게 진행하지만, batch size, learning rate, epoch 값은 변경한다.

그리고 대부분의 최적의 hyper parameters는 task마다 매우 다르다.

4 Conclusion

최근의 language model 에서의 transfer leaning의 효과가 입증되었다. 그리고 비지도 학습의 pre-training 이 대부분의 language understanding의 한 부분으로 통합되었다.

해당 논문을 통한 가장 큰 기여는 양방향의 구조를 통해 pre-train 모델이 대부분의 NLP 모델에 성공적으로 적용된다는 점이다. 대부분의 결과가 매우 성공적이지만, 일부 사람의 성능보다 떨어지기도 하기 때문에 더 많은 연구를 통해 BERT에 의해 잡지 못하는 언어적 현상을 잡도록 해야 한다.

Comment  Read more

End to End Memory Network

|

지난 포스트인 Memory Network에 이어 다음 논문으로 볼 수 있는 End to End Memory Network 논문을 소개한다. 기존의 Memory Network의 경우 모델의 전 과정이 supervised 하기 떄문에 일반적으로 사용하기 어렵고 제약된 사항이 많았으나, 해당 논문의 경우 이름을 보면 알 수 있듯 End to End 한 모델을 제시해서 사용하기 쉽도록 구성되어있다. 이전 논문을 읽지 않았다면 읽은 후에 이 글을 읽도록 하자.

  1. Memory Network
  2. End-to-End Memory Network[현재글]

Introduction

최근 모델에서 attention의 개념과 부가적인 storage를 도입함으로써 모델의 성능을 향상시켰다. “Memory Network”, “Neural machine translation by jointly learning to align and translate”, “Neural turing machines” 에서 소개된 모델을을 보면 continuous한 representation을 저장하는 저장소를 따로 사용하고 있다. 그리고 이 값들을 읽고 모델의 일부분으로 사용을 한다.

해당 논문에서는 continuous한 형태의 Memory Network 모델을 소개한다. 기존의 memory network의 경우 backpropagation을 통해 학습이 어려웠고, 각 component, 즉 각 layer에서 supervised 하기 때문에 제약이 있었다는 단점이 있다. 이러한 문제를 해결하기 위해 end to end로 학습할 수 있는 모델을 제시한다. 따라서 이 모델은 기존의 모델보다 unsupervised한 성격의 모델로 제약없이 많은 task에 적용할 수 있을 것이다.

Approach

모델에서 input 값으로 discrete 한 값인 $x_1, x_2,…,x_n$를 받는다. 이 값들은 하나를 제외한 전부는 memory로 저장될 것이고 하나는 질문(query) $q$이다. 그리고 output은 이 질문에 대한 대답인 $a$가 나온다. memory $x_i$, query $q$, answer $a$ 는 모두 $V$개의 단어들의 dictionary들의 값들로 구성된다. input 값들은 multiple hop 구조를 통해 continuous한 output인 $a$ 값을 만든다. 이러한 구조는 backpropagation을 통해 학습이 쉽도록 만든다. 모델의 전체적인 구조는 아래의 그림과 같다.

end2end

위의 그림의 (a)인 왼쪽 그림은 전체 구조에서 하나의 layer를 나타내고 오른쪽 그림인 (b)는 이 layer들이 쌓여 전체 구조를 나타낸다. (a), (b)를 각각 나눠 따로 설명한다.

Single Layer

앞서 말했듯이 모델은 multiple hop 구조를 가진다고 했다. 전체 모델을 소개 전에 우선 하나의 layer에 대해서 먼저 설명한다. multiple hop 구조는 이 single layer가 여러개 쌓인 형태이므로 간단하다.

Input memory representation

우선 input값 중 $x_1,x_2,…,x_i$는 memory에 저장된다. 저장될 떄는 d-차원의 embedding vector로 변환된 후 저장된다. 따라서 ${x_i}$는 ${m_i}$로 storage에 저장된다. 이 때 embeddng vector를 만들기 위해 embedding matrix $A\in\mathbb{R}^{d\times V}$를 곱한다. 그리고 질문(query)도 embedding 된다. 이 때는 $A$와 같은 형태를 가지는 embedding matrix $B$를 곱한다. embedding 된 질문은 internal state $u$ 라 부른다. 다음으로는 질문과 문장들의 연관도를 구하기위해 각각의 $m_i$과 $u$를 각각 곱한 후 softmax를 취해서 계산한다. 이 값은 각 sentence와 query와의 연관성을 계산한 후 확률 벡터로 만들어준다고 생각하면된다. 즉 어떤 문장이 질문에 대해 연관성이 높은지를 계산한 값이다. 이 값을 확률 벡터 $p$라 부른다.

Ouput memory representation

위에서 각 ${x_i}$를 ${m_i}$로 만든 것처럼 똑같이 embedding한 output vector인 $c_i$들을 계산한다. 계산은 embedding matrix $C\in\mathbb{R}^{d\times V}$ 이 값을 output 값을 만들기 위해 사용된다. 그리고 최종 response를 만들기 위해 위에서 계산한 확률 벡터와 output vector를 가중평균한다. 이렇게 최종 response인 $o$를 만든다.

여기서 사용된 함수들은 smooth한 함수들이기 때문에 gardient를 계산하기 쉽다. 따라서 backpropagation을 통해 학습이 쉬워진다. 그리고 여기서 가중평균한 개념은 self attention과 유사한 개념이다.

Generating the final prediction

이제 최종 response를 통해 마지막 prediction값을 계산해야 한다. 이 떄 response와 계산하기 위해 질문 벡터(query vector)를 embedding 한 vector인 $u$를 사용한다. 두 벡터를 더한 후 가중치 행렬인 $W$를 곱한 후 Softmax 함수를 취해서 최종 prediction을 계산한다.

여기까지하면 Single layer의 모델이 끝이난다. 총 4개의 parameter matrix $A,B,C,W$가 있고 학습의 경우 prediction 값인 $\hat{a}$와 실제 label $a$를 비교한 cross-entropy loss 함수를 사용하고 update는 SGD를 사용한다.

Multiple Layers

이제 위의 single layer를 확장해 전체 모델을 만들어 보자.위의 layer를 K개 쌓아서 만들면 된다. 이 때 몇 가지 특징이 있는데 다음과 같다.

  • 첫 번째 layer를 제외한 layer의 질문(query) 벡터는 이전 layer의 output vector인 $o^k$와 query vector 인 $u^k$를 더한 값을 사용한다.
  • 각 layer는 모두 다른 embedding matrix $A^k, C^k$를 사용한다. 하지만 parameter를 줄이기 위해 가중치를 공유할 수 있다 이는 밑에서 설명한다.

  • 마지막 layer에서 계산하는 prediction은 다음과 같이 계산된다.

그리고 앞서 말했던 parameter를 줄이기 위한 방법으로 두 가지 방법이 사용될 수 있다.

1. Adjacent

인접한 embedding matrix를 같은 weight를 사용하게 함으로써 paramter 수를 줄이는 방법이다. 즉 모든 $k$에 대해 아래의 식들을 만족한다.

  • $A^{k+1}=C^k$ : 이전 layer의 $C$ matrix 와 해당 layer의 $A$ matrix는 같다.
  • $W^T=C^K$ : prediction을 위한 matrix은 $W$는 마지막 layer의 $C$ matrix를 transpose한 것과 같다.
  • $B=A^1$ : query를 embedding 하는 matrix인 $B$와 첫 layer의 $A$ matrix는 같다.

2. Layer-wise(RNN-like)

여기서는 여러 matrix가 생기는 $A$와 $C$들이 각각 모두 같은 matrix를 사용하도록 한다. 즉 아래의 식을 만족한다.

그리고 이 경우에는 추가적인 linear mapping 함수인 $H$를 사용한다. 이 함수는 $u$ vector를 다음 값으로 넘길 때 사용된다.

여기까지가 전체 모델에 대한 설명이다. 전체적으로 기존 memory network의 모델인 menNN과 비슷한 형태를 취하고 있다. 가장 큰 차이점으로는 QA task에서 질문에 답하기 위해 모든 sentence를 필요로하지 않고 몇 개의 sentence만 필요로한다. 기존 모델인 menNN의 경우에는 이렇게 몇 개의 질문만을 사용하기 위해 supporting subset을 명시적으로 지정하고 학습 시 계속해서 따로 분리시키는데, 해당 모델에서는 이러한 과정없이 한번의 계산으로 질문과 유사한 문장들을 계산하기 때문에 End to End 한 모델이 될 수 있는 것이다.

그리고 학습에 사용된 몇 가지 세부적인 특징은 다음과 같다.

  • Training data의 10%를 Validation data로 사용
  • update 시 learning rate 는 0.01 사용, 매 25 에폭마다 절반으로 줄였고 총 100에폭동안 학습
  • 가중치의 경우 평균 0, 표준편차 1인 정규 분포를 따르도록 했다. $\sim N(0,1)$
  • Batch size 32
  • 학습시 gradient 값의 $l_2 norm$이 40보다 커질 경우 더 커지지 못하고 40을 가지도록 함.
  • K=3 으로 지정
  • 파라미터를 줄이는 방법으로는 앞서 설명한 adjacent weight sharing 방법 사용

그리고 모델에 추가적으로 사용된 기법들에 대해서 알아보자.

Sentence Representation

문장의 경우 두 가지 representation 방식을 사용했다. 처음으로는 bag-of-words(BoW)를 사용했는데, 이 방식을 사용할 경우 단어들의 위치 정보를 반영하지 못하는 단점이 있다. 따라서 위치 값을 encoding해서 representation을 하였다.

위 식에서 $l_j$가 위치 정보를 담은 값이다. 그리고 이 값은 아래의 수식 값을 가진다.

이렇게 위치 정보를 embedding 하는 방법을 position encoding(PE)라 부른다.

Temporal Encoding

하나의 정보에 대해 두 가지 선택지가 나오는 경우가 있다. 예를 들어 특정 사람이 두 위치에 다녀왔고, 현재 위치를 물어보는 경우를 대비해서 temporal context의 개념을 사용했다. 이 방식은 memory vector인 $m_i$ 와 output vector인 $c_i$ 계산시 사용된다.

여기서 사용된 $T_A$ 와 $T_C$는 temporal 정보를 가지는 matrix이고, 학습 시 같이 학습되는 가중치이다.

Result & Conclusion

이 모델도 결과는 따로 설명하지 않는다. 우선 이전의 모델과 비교하면 성능 자체는 약간 떨어지지만 End to End 로 학습한다는 것에 의미가 있고, 다른 task에 적용하기 쉽다는것이 해당 모델의 큰 장점이다. 이후 Dynamic Memory Network(DMN) 모델도 추가적으로 나왔으므로 이후에 같이 학습하면 도움이 될 것이다.


오역 및 잘못된 내용이 있을 수 있습니다. 잘못된 부분 혹은 이해가 잘 안되는 부분은 댓글 혹은 메일로 말씀해주시면 감사하겠습니다!

Comment  Read more

Memory Network

|

이번에 리뷰할 논문은 Memory Network입니다. Memory network 중 첫 논문으로 이 모델에서 중점적으로 보는 부분은 memory를 사용해서 긴 text에서 필요한 부분만 저장해서 사용할 수 있도록 하는 것입니다. 주로 Question Answering Task에 실험했으며, QA task를 여러 경우로 나눠서 모델을 구성했습니다. 이 모델의 경우 QA 분야가 아니라 Text generation 등 다른 분야에서 사용할 수 있으며 넓은 범위로 의미있는 논문이므로 자세히 리뷰를 통해 자세히 알아보겠습니다. 해당 Post 이후 향후 이 논문 이후에 나온 “End-to-End Memory Network” 까지 알아봄으로써 Memory Network에 대해 자세히 다룰 예정입니다.

  1. Memory Network[현재글]
  2. End-to-End Memory Network

Introduction

대부분의 머신러닝 모델은 long-term component를 잘 읽고 사용하지 못한다. 예를 들면 전체 소설을 읽고 주제를 말하는 것과 같은 질문을 답하기는 어렵다. RNN 모델을 사용하면서 이런 long-term을 잘 읽을 수 있게 되긴 했지만, 결국 이 memory가 hidden state vector & weights 로 저장되는데, 크기 자체가 크지않고 제한적이다.

따라서 여기서는 momory network라 불리는 모델을 통해 이러한 문제를 해결하고자 한다. 핵심 idea는 머신러닝에서 효과적인 학습 전략과 memory component를 결합해서 사용하는 것이다. 이제 모델에 대해서 알아보자.

Memory Network

Memory Network는 메모리 $\mathbf{m}$(객체 $\mathbf{m}_i$ 들의 배열, 여기서 말하는 객체는 vector 혹은 string을 뜻한다)와 4개의 component인 $I,G,O,R$로 구성된다. 여기서 말하는 4개의 component의 역할은 다음과 같다.

  • $I$: (input feature map) input을 내부적인 feature 표현으로 바꿔준다.
  • $G$: (generalization) 새로운 인풋을 통해 기존의 memory를 update한다. 이러한 과정을 genralization이라 부른다.
  • $O$: (output feature map) 새로운 input과 현재 memory의 값들을 사용해 output을 만든다.
  • $R$: (response) output을 원하는 포맷의 response로 만들어 준다. 예를 들면 터를 text 혹은 action 으로 바꿔준다.

위의 4가지 component에 대한 설명은 범용적인 개념으로 설명되어 있다. 따라서 해당 모델이 사용한 것에 맞게 component들을 설명하면 다음과 같다.

  • $I$: input 값을 bag-of-word를 사용해서 embedding 해준다.
  • $G$: embedding 한 vector를 남아있는 memory slot $m_n$ 에 저장한다. 이 경우에 기존것이 삭제 될 수 있다.
  • $O$: 모든 memory 값에 대해서 k번 loop를 돌며 match되는 값을 찾고 최종적으로 output $o$를 만들어낸다. (아래 loop은 k=2 인 경우)
    • 1st - input 값과 가장 match score가 높은 memory slot $m_i$를 찾는다.
    • 2nd - input 과 이전 loop에서 찾은 memory slot $m_i$를 같이 사용해 다음으로 match score가 높은 memory slot인 $m_j$를 찾는다.
    • input과 $m_i,~m_j$ 모두 사용해 output 값을 만든다.
  • $R$: (reponse) output을 사용해 dictionary의 모든 word들의 score를 계산해 하나의 word를 찾는다.

즉 전체 모델은 memory와 4개의 component들을 사용하는 구조이다. 모델의 전체적인 그림은 다음과 같다.

memory

이제 모델에 대해 자세히 알아보자. 모델은 input $x$가 다음의 순서로 모델에 흘러간다. 여기서 input 값은 charcter, word, sentence등이 될 수 있다.(image or audio signal이 될 수도 있다)

  1. input $x$를 feature 표현으로 바꾼다. 즉 embedding한다: $I(x)$.
  2. 새로운 input으로 memory를 update한다: $\mathbf{m}_i=G(\mathbf{m}_i,I(x),\mathbf{m}), \forall i$.
  3. input과 memory를 이용해 output $o$를 계산한다: $o=O(I(x),\mathbf{m})$
  4. 마지막으로 output을 decode해서 최종 response를 만든다: $r=R(o)$

위의 process는 학습과 테스트 모두에 적용된다. 학습과 테스트의 다른점은 학습시에는 memory와 4개의 component인 $I,G,O,R$모두 update되는데 테스트 때는 memory만 update된다.

그리고 memory netword의 해당 모델은 범용적으로 제안된 모델로 각각의 component들은 기존의 machine model 어느 것을 사용해서 구현할 수 있다.(e.g SVMs, decision tress, etc.)

이제 각 component들 각각에 대해서 자세히 살펴보자.

$I$ - component

$I$ component는 전처리의 표준으로 사용할 수 있다. 예를 들면 text input을 parsing, coreference, entity resolution 등을 하는 과정을 넣을 수 있다. 이러한 과정을 통해 raw한 input값을 feature 표현(representation)으로 만든다. 즉 text 를 feature vector로 만들어 준다.

$G$ - component

component $G$의 가장 간단한 형태는 $I(x)$를 memory의 “slot”에 저장하는 것이다. 즉 아래의 식을 수행하는 것이 component $G$가 된다.

여기서 $H(.)$는 저장될 slot을 선택하는 함수이다. 즉 $G$는 memory의 배열 중 index $H(x)$의 메모리인 $\mathbf{m}_{H(x)}$를 update한다. $G$는 구현 방법에 따라 기존에 slot에 저장된 memory를 모두 제거하거나 부분적으로 제거한 후 update한다.

그리고 만약 memory가 커질 경우에는 memory를 조직화할 필요가 있다. 이 때 Hash 함수를 사용해 choosing 함수인 $H(x)$를 구현한다. 그리고 이 함수는 경우에 따라 주제나 개체에 따라 저장되는 곳이 함수를 통해 지정될 수 있다. 즉 choosing 을 모든 slot에 대해서 적용하는 것이 아니라, 조직화한 후 적용되는 부분 slot에 대해서만 choosing한다.

그리고 만약 메모리가 가득 찼다면 “foregetting”이라는 $H$를 통해 구현해야 한다. 즉 $H$는 각 메모리의 사용에 대한 점수를 측정하고 점수가 낮은 memory를 제거한 후 update한다. 이런 forgetting에 대한 부분은 이 논문에서 구현하고 실험하지 않았다.

$O$ and $R$ components

$O$ component는 memory를 읽고 inference 과정을 수행한다. 예를 들어 연관성이 높은 memory와 계산하고 output을 만들어낸다. 그리고 $R$ component는 output으로 부터 최종 결과물을 만들어 낸다. Question answering 분야로 생각해보면, $O$를 통해 연관성 높은 memory 와 계산을 해서 output을 만들고 $R$을 통해 해당 output을 다시 실제 답변 text로 만들어 낸다.

A MenNN Implementation for Text

Memory Network 구현의 하나의 예시로 각 components를 Nerual network로 구현했다. 따라서 이러한 모델을 memory neural networks(MenNNs)라 부르고, 이번 section에서 이러한 방법으로 구현한 모델에 대해서 설명한다. 그리고 이 모델의 input과 output은 text인 경우를 다룰 것이다.

Basic model

우선 기본적인 모델의 Architecture에 대해서 알아보자, $I$ 모듈은 text를 input으로 받는다. 여기서는 우선 text가 문장(sentence)라고 생각하자. 그리고 이 문장은 질문이 될수도 있고 사실들이 적혀있는 글일 수 있다. 그리고 text는 가능한 memory slot에 저장된다. 즉 $S(x)$를 통해서 비어있는 memory slot $N$을 찾고 해당 메모리에 input을 저장한다: $\mathbf{m}_N=x,~N=N+1$. $G$ 모듈은 새로운 메모리 저장에만 사용되고 이미 저장된 메모리는 건들지 않는다.

추론(inference)의 핵심은 $O$와 $R$ 모듈이다. $O$ 모듈은 input $x$에 대해 $k$개의 supporting memory를 찾는다. $k=2$로 예를 들어보자. 총 2번의 loop을 돌게되는데 첫 번째 loop에서는 input과 가장 match score가 높은 memory를 찾는다.

여기서 함수 $s_O$는 input 문장과 하나의 memory $\mathbf{m}_i$와의 match score를 측정한다. 그리고 이제 두 번째 loop에서는 input과 이전에 찾은 memory 를 같이 사용해 다음 match score가 높은 memory를 찾는다.

최종 output $o$는 가 된다. 그리고 이 값은 module $R$의 input으로 사용된다.

마지막으로 $R$ 모듈은 위의 input값을 사용해 text response인 $r$을 만든다. 가장 간단한 형태로 response를 만드는 방법은 $k$ loop을 돌며 나온 결과 중 마지막 memory인 $\mathbf{m}_{o_k}$를 text로 만드는 방법이다. 만약 sentence generation을 해야 된다면 하나의 예로 RNN모델을 사용해 generation 할 수 있다. 해당 논문에서의 실험에서는 text response를 단일 단어로 제한해서 모델을 만들었다. 이 경우에는 $O$의 output으로 나온 값들과 vocabulary $W$의 모든 단어들과의 score를 측정해서 가장 높은 score를 가지는 단어를 response로 출력한다. 즉 다음의 수식을 통해 $r$을 만든다.

예를 통해 모델을 이해해보자. 우선 아래의 문장을 input으로 사용한다고 하자.

Joe went to the kitchen. Fred went to the kitchen. Joe picked up the milk.
Joe travelled to the office. Joe left the milk. Joe went to the bath room

위 문장에 대해서 다음의 질문들이 주어진다고 하자.

Where is the milk now?
Where is Joe?
Where was Joe before the office?

우선 첫 번째 질문에 답한다고 하자. 그러면 input은 다음과 같다.

그리고 $O$ 모듈은 모든 메모리에 대해서 첫 번째 loop을 돌 것이다. 즉 전체 문장에 대해서 주어진 질문과 가장 유사한 문장을 찾아낸다. 그리고 이 경우에 결과를 통해 나온 memory는 다음과 같다.

그리고 그 다음 loop을 돌 것이다. 주어진 input 그리고 memory slot $\mathbf{m}_{o_1}$을 사용해서 다음으로 match score가 높은 두 번째 문장을 찾는다.

마지막으로 $R$ 모듈에서 $[x,\mathbf{m}{o_1},\mathbf{m}{o_2}]$를 사용해 최종 output을 만든다.

그리고 실험에서 score fucntion인 $s_O$와 $s_R$은 같은 형태의 함수를 사용했다.

여기서 $U$는 $n\times D$ matrix이다. $D$는 feature의 수를 뜻하고 $n$는 embedding 차원의 크기를 뜻한다. 그리고 $\Phi_x$ 와 $\Phi_y$ 는 raw한 형태의 text를 D 차원의 vector로 만들어주는 함수이다. $\Phi$ 함수의 가장 간단한 예는 bag of words 표현 방식을 사용하는 것이다. 이 실험에서 $D=3\vert W\vert$로 사용했다. 즉 각 문장을 3개의 표현방식을 사용해 vector로 만들었다. 하나는 $\Phi_x(.)$를 위한 representation이고, 하나는 $Phi_y$를 위한 representation이다. 그리고 마지막 하나는 이후의 장에서 설명한다. 이렇게 만든 이유는 input이 실제 처음 input text를 통해서 온 것인지, memory에서 온 것인지 구별하기 위해 각각 따로 representation을 했다. 마지막으로 $U$의 경우에도 $R$ 모듈과 $O$ 모듈 각각 다른 matrix를 사용했다.

Training

학습은 fully supervised setting을 통해 진행되었다. 즉 input과 response이 모두 주어지고 supporting sentence도 모두 labeling 되어있다. 따라서 score의 함수의 best choice를 알 수 있다. 그리고 학습 시 loss는 margin ranking loss함수를 사용하고 update는 stochastic gradient descent(SGD)를 사용했다. 우선 loss함수를 보면 다음과 같이 구성된다.

Loss 함수를 자세히 알아보자. 우선 3개의 부분으로 나눠지는데 이는 k를 설정함에 따라 달라진다. 이 경우에는 위와 같이 $k=2$의 경우이고, $k$ 값이 커질수록 loss의 term의 개수가 많아질 것이다. 우선 하나씩 알아보자. 첫 번째 term의 경우 첫 번째 memory 선정에 따른 loss이고, 두 번째는 두 번째 memory 선정에 따른 loss함수이다. 마지막은 최종 결과인 response의 loss함수가 된다. 각 loss함수는 동일하게 margin ranking loss함수 형태인데, 이 loss함수의 의미는 학습시 선택한 memory(혹은 response)인 과 선택하지 않은 것 중에서 score가 높은 memory(혹은 response)인 과의 차이가 margin(위 식에서는 $\gamma$)보다 크도록 학습시키는 과정이다. 예를 들어 생각해보자. 위 식에서 우리가 선택한 memory와의 score와 다른 선택지 중 가장 높은 score와의 차이가 margin인 $\gamma$보다 작다면 loss는 양수값이 나올 것이다. 만약 margin보다 큰 경우에는 max를 통해 loss값이 0이 된다.

그리고 MemNN 구현 시 R은 RNN을 사용해서 구현했다. 따라서 이 경우에는 loss 함수의 마지막 term을 일반적인 language modeling에서 사용되는 일반적인 log likelihood를 사용했다.

Word Sequences as Input

위에서는 input을 문장으로 가정한 모델을 설명했다. 만약에 input이 단어라면 어떻게 해야 할까? 우선 word로 들어올 경우 가장 큰 문제점은 statement와 question이 구분되지 않는다는 점이다. 따라서 위의 경우와는 다른 접근법이 필요하다. 따라서 “segementation” 함수, 즉 단어들을 구분지어서 statement와 question들을 구분시켜주는 학습시킬 함수를 사용한다. 이 함수를 segementer라 한다. 이 segementer을 사용하면 sequence를 memory에 쓸 수 있고 그 이후는 위에 나온 모델과 동일하게 사용하면된다. 그리고 이 segementer는 다른 component들과 같이 embedding model 형태이다.

여기서 $W_{seg}$는 vector이다. 이 vector의 역할은 embedding 된 값을 linear clasification 해주는 역할이다. 그리고 $c$는 input seqeunce로 vector 형태이다. 즉 각 단어들이 bag of words 형태로 들어온다. 따라서 이 함수의 결과값이 특정 margin $\gamma$보다 큰지 안큰지에 따라서 sequence가 하나의 segment인지 아닌지를 판단한다. 즉 아래와 같이 구분된다.

Result & Conclusion

실험결과에 대해서는 소개하지 않는다. 논문을 참고하길 바란다. 그리고 해당 모델은 하나의 Attention으로 볼 수 있는데, Hard attention으로 분류된다. 이후 다음 모델은 해당 모델보다 좀더 unsupervised한 성격의 모델로 Soft attention 성격의 모델이다. Memory를 사용하는 모델로 기존 RNN 혹은 LSTM 보다 성능이 좋다는 것을 확인할 수 있다.


오역 및 잘못된 내용이 있을 수 있습니다. 잘못된 부분 혹은 이해가 잘 안되는 부분은 댓글 혹은 메일로 말씀해주시면 감사하겠습니다!

Comment  Read more

ConvS2S: Convolutional Sequence to Sequence Learning

|

이번에 소개할 논문은 Facebook에서 발표한 ConvS2S라 불리는 Convolutional Sequence to Sequence Learning이다. 이름부터 알 수 있듯이 sequence to sequence 모델을 convolutional neural network를 사용해서 만든 모델이다. 기존의 sequence to sequence 모델들은 대부분 RNN을 기반으로 나왔는데, CNN을 사용해서 sequence를 다루면서 높은 성능을 보여준 모델이라 많은 의미가 있다. RNN 대신 CNN으로 어떻게 모델을 구성하는지, 또 RNN대신 CNN을 사용하면 어떤 장점이 있는지 알아보자.


Introduction

Sequence to sequence learning은 기계번역, 음성인식, text 요약 등 많은 분야에서 성공적인 결과를 보여줬다. 이러한 모델 구성중 대부분이 encoder에서 bi-directional RNN을 사용하고 decoder에서도 RNN을 사용했다.

그에 반해 Convolutional neural network는 sequence를 다루는 모델에서는 별로 사용하지 않았다. sequence 모델에 CNN을 적용할 때를 RNN을 적용할 때와 비교해 보자. CNN을 적용하면 고정된 크기의 문맥만을 얻을 수 있다. 즉 우리가 정의한 kernel size로만 문맥을 파악하게 할 수 있는데, 다행이도 CNN은 몇개의 layer를 추가함으로써 context size를 늘리는 것이 쉽다. 따라서 모델의 maximum length of dependencies를 제어하기가 쉽다. 또한 RNN은 이전 step의 값이 있어야 계산을 할 수 있는데 반해 CNN은 그럴 필요가 없기 때문에 병렬화가 쉽다는 장점이 있다.

Multi-layer CNN을 생각해보자. 층층이 쌓여서 hierarchical한 구조를 만드는데 이는 lower layer에서는 단어 주변의 문맥을 파악하고 higher layer로 가면 먼 거리의 단어도 파악할 수 있게 된다.

그렇다면 시간을 고려해보자. CNN의 경우 n개의 단어를 문맥으로 파악하려면 드는 시간은 $O(\frac{n}{k})$이다. RNN의 경우를 생각해보면 linear하기 때문에 시간은 $O(n)$이 된다.

해당 논문에서는 sequence를 다루는 모델로 전체가 convolutional neural network로 구성된 모델을 소개한다. 다음의 세가지를 사용해서 모델을 구성할 것이다.

  • Gated linear units (Dauphin et al., 2016)
  • residual connections (He et al., 2015)
  • attention

소개한 모델의 평가는 두가지 task로 진행한다. Machine translation과 Text summerization으로 진행한다.

Recurrent Sequence to Sequence Learning

기존의 recurrent한 sequence to sequence 모델을 생각해보자. input에 대해서 RNN을 통해 representation을 계산한다. 여기까지가 encoder이고, decoder에서는 구한 representation을 가지고 다시 RNN 모델을 사용해 output을 만든다. 그리고 decoder에서는 conditional input을 사용하기도 한다. attention을 도입한 모델에서는 conditional input으로 representation을 가중 평균한 값으로 사용한다.

그리고 가장 흔히 쓰이는 RNN 모델은 LSTM과 GRU이다. 둘다 Elman RNN을 응용해서 나온 모델로 long-term dependency를 잡기 위해 만들어 졌다. 그리고 최근에 가장 많이 쓰이는 모델은 bi-directional encoder 이다. RNN을 input에 대해 양방향으로 두개의 RNN을 만들어서 사용하는 것이다. 그리고 추가적인 기법으로는 shortcut과 residual connection을 많이 사용한다.

A Convolutional Architecture

sequence to seqeunce modeling을 fully convolutional architecture를 살펴보자.

Position Embeddings

우선 가장 먼저 input $\mathbf{x}$을 embedding vector $\mathbf{w}$로 만든다. 그리고 embedding한 dimension과 똑같이 각 token의 절대적인 위치에 대한 embedding vector $\mathbf{p}$를 만들어서 두 vector를 더해서 representation vector $\mathbf{e}$를 만든다.

그리고 이러한 position embedding 기법은 decoder에 의해 만들어진 ouput 값에서도 사용된다.

Convolutional Block Structure

encoder와 docoder 모두 simple block 구조를 비슷하게 사용한다. 이 block은 고정된 개수의 input을 연산한다. 여기서 $l$-th block을 decoder에서는 $\mathbf{h}^l=(h_1^l,…,h_m^l)$이라 표현하고 encoder에서는 $\mathbf{z}^l=(z_1^l,…,z_m^l)$라 표현한다. 그리고 해당 논문에서 block과 layer는 같은 의미로 사용된다.

각각의 block의 구성은 1d convolution + non-linearity로 구성된다. 하나의 예를 보자. decoder에서 하나의 block이 있다고 하자. 그리고 이 block의 kernel size가 5라고 하면 convolution 하나의 단일 결과인 $h_i^1$는 k개의 단어에 대한 정보를 포함하고 있다. 몇개의 block들을 위에 쌓음으로써 정보를 포함하는 단어의 개수를 늘릴 수 있다.

예를 들어 kernel size가 5인 6개의 blcok을 쌓았다고 생각하면 총 25개의 단어의 정보를 포함하고 있다.

그리고 각 convolution의 kernel의 파라미터는 $\mathbf{W}\in\mathbb{R}^{2d\times kd}$와 $\mathbf{b}_w\in\mathbb{R}^{2d}$이다. 위 파라미터는 단어 하나당 $d$-dimension vector인 단어 k개를 포함하는 matrix인 $\mathbf{X}\in \mathbb{R}^{k\times d}$를 input으로 계산된다.

kernel에 적용시킨 결과 output을 $\mathbf{Y}\in\mathbb{R}^{2d}$라 부른다. 이 vecotr의 dimension은 input의 dimension의 2배가 되었는데 이는 gated linear unit을 적용시키기 위함이다.

그리고 이 모델에서는 convolution 결과에 non-linearity로 gated linear unit(GLU: Dauphin et al., 2016)를 사용했다. convolution을 output의 dimension을 생각해보면 input과는달리 2d였다. 이는 GLU를 사용하기위해 dimension을 2배로 만들어 준것인데, dimension이 2배가된 output vector를 2개로 나눠서(A,B) GLU에 적용시킨다. GLU의 식은 다음과 같다.

여기서 $A, B$는 d차원의 vector가 된다. 그리고 $\otimes$는 element-wise multiplication이다. GLU를 통해 다시 output은 resize되어서 dimension이 input과 같아진다.

GLU에 대해서 좀 더 생각해보자. input으로 A,B 두 벡터가 들어가게 되는데, 하나는 값 그대로 들어가고 또 다른 하나는 sigmoid를 적용시켜서 들어간다. sigmoid를 적용시킨 값은 A를 문맥에 적용시키기 위해서 사용한 것이다.

개인적인 생각 GLU에서 하나의 vector를 반으로 나눠서 적용시키는데 이는 거의 유사한 값이라고 생각하자. 이때 하나는 그 값 그대로 넣고 나머지 하나는 sigmoid를 적용시킨다. 따라서 한 벡터는 값을 의미하고 한 벡터는 그에 대한 확률 값이라 생각할 수 있다. 즉 input을 적용시키지 않고 비율을 각각 곱해준뒤 적용시킨다고 생각할 수 있다.

해당 논문에서는 GLU에서 sigmoid를 사용했는데, tanh를 사용하는 경우도 있다. 하지만 Dauphin의 말을 인용하면 language modeling에서는 tanh 보다 sigmoid를 적용하는 것이 성능이 좋다고 한다.

다음으로는 deep한 convolutional network를 만들기 위해서 residual connection을 사용했다. residual connection을 사용한 수식은 다음과 같다.

수식에서 마지막 더해진 항이 residual connection 값이다.

encoder network에서 output값이 input값과 동일하게 하기 위해서 sequence의 양끝에 padding을 추가한다. 즉, 양 끝에 k-1 개의 0값을 추가한다. 그리고 output에서 마지막 k개의 원소를 제거해서 사용한다.

마지막으로 decoder의 output인 $h_i^L$에 weight를 곱한 후 bias를 더한 값에 softmax를 취해서 다음 token 값인 $y_{i+1}$을 얻어낸다.

Multi-step Attention

해당 논문에서 decoder layer에 separate attention mechanism을 적용시켰다. attention 계산을 위해서 현재 decoder state vector에 이전 target element의 embedding값($g_i$)을 더해준다.

decoder layer $l$의 attention 값인 $a_{ij}^l$은 현재 state $i$에 대한 source 원소인 $j$의 attention 값을 나타낸다. 계산은 decoder의 state summary 값인 $d_i^l$과 encoder의 output값인 $z_j^u$를 dot-product한 값을 softmax 취해주면 된다.

그리고 이 attention 값을 사용해서 decoder에 사용될 conditional input $c_i^j$를 계산한다. 이 때 attention 값을 encoder의 output 값에 가중평균하는데 encoder의 output만 사용하는 것이 아니라 input값이 embedding 값도 더해줘서 가중평균한다.

이 attention 구조는 기존의 RNN에서 사용한 attention 과는 $z$뿐만아니라 embedding 값인 $e$를 사용했다는 점이 다르다. 여기서 사용한 attention을 생각해보면 encoder를 통해서 나온 값인 $z$를 key로 해석할 수 있고, 각 input의 embedding 값인 $e$를 value로 해석할 수 있다.

또 다른 해석은 $z$는 context에 대한 정보도 포함을 하고 있고, $e$는 하나의 token에 대한 정보를 담고 있으므로 두 정보를 모두 사용하는 것이다.

계산된 conditional input $c$는 간단하게 decoder layer의 output $h_i^l$에 더해서 사용한다.

attention은 multi hop구조로 적용된다. 즉 attention을 통해 나온 결과를 바로 결과로 만든는 것이 아니라 결과를 다시 또 attention을 거치게 하는 구조이다. 이러한 구조는 첫 attention을 통해 유용한 정보를 결정하고 이제 유용한 정보만을 사용해서 다시 attention을 적용하는 구조로 생각할 수 있다.

이때까지 나온 구조를 그림을 통해서 이해해보자. 우선 전체 그림은 다음과 같다.

convs2s_archi1

그림의 윗 부분이 encoder이고 아랫 부분이 decoder이다. 중간의 matrix는 attention 값들을 의미한다. encoder의 값들과 decoder의 값들을 사용해서 attention 값을 을 계산한다. encoder의 우측부분은 embedding vector 와 encoder output을 더하는 것을 의미한다. 이 값을 attention값과 가중 평균 해준다.

이제 encoder와 decoder를 나눠서 살펴보자. 이제부터의 그림은 stanford의 seminar slide에서 나온 그림이다.

먼저 encoder 먼저 살펴보자.

encoder

convolution을 계산한 후 2개의 벡터로 나눠서 gated linear unit이 계산된다. 그리고 residual connection으로 연결된 모습을 볼 수 있다. 위 그림의 가장 상단의 결과가 $z$가 될 것이다.

이제 decoder의 그림을 보자.

decoder

우선 encoder와 마찬가지로 convolution이 계산되고 gated linear unit까지 계산되는 부분은 동일하다. 이제 그 결과를 encoder값과 같이 attention 값을 사용한다. 그리고 그 결과를 이전의 결과 값과 더해주고 마지막으로 residual connection까지 계산을 해주면 최종 출력이 나오는 모습이다.

하지만 해당 논문에서는 이런 single attention이 아닌 multi hop 구조를 사용했다고 했는데 이를 그림으로 표현하면 다음과 같을 것이다.

multi_hop

attention 까지 계산한 결과가 다시 input으로 들어가서 다시한번 attention을 계산하는 형태이다. 전체적인 multi hop 구조는 아래의 그림을 보면 좀 더 이해가 쉬울 것이다.

fairseq

전체적인 구조에 대한 설명은 여기까지이다. 이제 Normalization 방법과 initialize한 방법에 대해서 알아보자.

Normalization Strategy

해당 논문에서는 Batch Normalization은 사용하지 않고 weight nomalization을 사용했다. 논문의 말에 따르면 network의 전체적인 varience가 크게 변하지 않도록 initialize와 normalize에 신경을 썻다고 한다.

특히 residual block의 output과 attention을 scaling 해서 전체적인 variance를 크게 변하지 않도록 했다. residual block에는 $\sqrt{0.5}$를 곱해서 varience를 절반으로 줄였다.

그리고 attention 값인 conditional input $c_i^l$에는 전체 attention score가 균등 분포를 따른다고 가정하고 원래 크기에 맞춰주기 위해 $m\sqrt{1/m}$을 곱해서 scale up 했다.

그리고 multiple attention을 사용한 convolutional decoder에는 gradient 값도 사용한 attention 수만큼 scaling 했다.

Initialization

Residual connection과 같이 다른 layer의 값을 어떤 layer에 더하는 모델에는 초기값 설정이 매우 중요하다. 사용한 초기값 설정은 대부분 정규 분포를 따르도록 했으며, 평균 0 에 표준편차를 weight에 맞게끔 설정해줬다.

Experiment

Datasets

데이터셋은 간단하게 소개만 한다. 다음의 데이터셋들을 사용해서 실험을 했다.

  • WMT’16 English-Romanian
  • WMT’14 English-German
  • WMT’14 English-French
  • 그 외 몇가지 corpus

Model Parameters and Optimization

Parameter와 사용한 optimization에 대한 정보는 다음과 같다.

  • Encoder 와 decoder에 512개의 hidden unit 사용.
  • 모든 embedding은 512 dimension
  • Nesterov’s accelerated gradient 방법을 사용해서 학습
    • 하이퍼 파라미터인 모멘텀 값은 0.99로 하고 norm이 0.1을 넘지 않도록 만들었다.
  • 학습률은 0.25로 설정했다.
    • 학습률은 학습이 경과하면서 계속 감소하도록 설정하고 그 값이 $10^{-4}$보다 작아지는 Epoch에서 학습을 멈추도록 설정
  • 64 크기의 mini-batch 사용
  • 가장 긴 sentnece의 길이는 GPU memory에 맞게 설정(64 mini batch에서 메모리가 허용하는 가장 긴 길이 사용)
  • gradient는 mini-batch의 padding 값이 아닌 값들의 개수로 normalize함
  • convolutional block의 input과 embedding에 dropout사용

Result

결과도 간단히 보고 넘어가자.

13

123

Conclusion

다른 모델들에 비해 상대적으로 최근에 나온 모델이고, 모델을 발표한 facebook에서 소스코드 또한 공개를 해서 성능 높은 모델을 접근성 높게 사용할 수 있다는 장점이 있다. 그리고 기존의 RNN이 대부분이였던 Sequence to sequence 모델에서 CNN만을 사용해서도 다른 모델보다 높은 성과를 보여줬다는 것은 새로운 모델도 계속해서 나올 것이라는 것을 예상해 볼 수 있다.

그리고 무었보다 이 모델의 sequence에 적용했을 때의 장점은 다른 RNN계열의 모델들 보다 병렬화가 쉽기 때문에 속도가 매우 빠르다는 것이 큰 장점이다.


오역 및 잘못된 내용이 있을 수 있습니다. 잘못된 부분 혹은 이해가 잘 안되는 부분은 댓글 혹은 메일로 말씀해주시면 감사하겠습니다!

Comment  Read more