이전 포스팅에서는 Self-attention mechanism만을 처음으로 사용하는 Transformer 모델을 설명했다. 이번 포스팅에서는 자연어처리 분야에서 주류가 된 language model pretraining 방식을 사용한 모델들을 소개한다.

 

ELMo

ELMo는 contextualized word embedding, 즉 문맥을 고려한 단어 임베딩을 제공하는 모델이다.

ELMo는 여러 레이어의 bi-directional LSTM으로 구성되어 있고,  각 단어에 대한 임베딩은 여러 레이어의 벡터들을 합쳐서 사용한다.

ELMo의 학습은 language model task를 학습하는 방식으로 이루어지는데, 이전 step까지의 단어들이 주어졌을 때 현재 문맥상 와야하는 단어를 예측하도록 학습된다.

각 단어의 임베딩은 여러 레이어들의 hidden state들의 linear combination으로 계산되고, 임베딩 계산 방식은 각 downstream task에 대해 fine-tuning되며 학습되게 된다.

이렇게 학습된 ELMo의 contextualized word embedding은 기존의 Word2Vec과 GloVe 같은 static word embedding과 결합되어 사용되거나, 단독으로 사용되며 기존 워드임베딩보다 여러 downstream task에서 큰 성능 향상을 불러왔다.

ELMo의 등장으로 language modeling task로 큰 뉴럴모델을 사전학습 (pretraining) 시키고 downstream task에 대해 가져와서 사용하는 방식이 대두되게 되었는데, ELMo에 이어 등장한 모델들은 GPT, BERT, GPT-2와 여기서 파생된 모델들이 있었다.

여기서 GPT와 GPT-2, BERT는 앞선 포스팅에서 설명한 Transformer 모델의 인코더, 디코더 중 각각 디코더, 인코더만을 사용하여 language modeling task로 pretraining된 모델들이다.

 

각 모델들은 필요에 따라 파라미터의 수를 키워가며 성능을 높일 수 있음이 확인되었지만, 너무 큰 모델의 경우 일반적인 사용자는 사용할 수 없는 문제점이 있다.

 

GPT (Generative Pretrained Transformer)

GPT는 OpenAI에서 제안한 Transformer의 디코더만을 사용한 pretrained transformer 모델이다.

GPT를 이해하기 위해서는 Transformer 모델의 디코더를 이해해야 하는데,  이전 포스팅에서 self-attention 매커니즘은 설명하였기 때문에 decoder만의 encoder와의 차별점을 중점으로 설명한다.

Transformer의 decoder layer는 masked self-attention, encoder-decoder attention, fully connected layer로 구성되어 있다. 이 중 masked self-attention은 language modeling task를 위해 사용되는 self-attention 방식인데, encoder의 self-attention 방식과 다른 점은 전체 문장에 대해서 참조(attend)할 수 있는 인코더와 다르게 앞서 등장한 단어들에 대해서만 참조가 가능하도록 아직 등장하지 않은 단어들에 대해서는 masking 처리를 해준다는 점이다.

GPT의 input 문장은 Transformer 모델과 동일하게 토큰 임베딩과 위치정보를 뜻하는 positional embedding이 더해져서 인코딩된다.

 

각 decoding step에서 input embedding을 처리하고 와야할 단어를 예측하게 되고, 다음 decoding step에서의 input으로 해당 단어를 제공하여 <eos>(문장이 끝났다는 것을 표시하는 special token)이 올때까지 decoding을 이어나가게 된다. 위 그림에서는 Language modeling task를 학습함에 따라 이전에 등장한 단어들에 대해서만 self-attention 매커니즘을 적용하는 masked self-attention 방식을 보여주고 있다.

GPT의 self-attention은 어떤 decoding step에서 이전 step의 단어에 대한 Q(query) 벡터를 구하고, 이전까지의 단어들의 K(key), V(value) 벡터들과 곱해 각 단어에 대해 얼마나 참조할지를 결정하고 이 결과물을 해당 step에 와야할 단어를 예측하는 데에 사용하는 방식으로 이루어진다.

이전 step에서의 단어들의 K 벡터들과 score들을 구하고, V 벡터들과 곱한 벡터들을 더해 현재 step에서의 벡터로 얻게 되는 것을 확인할 수 있다.

GPT의 각 decoding step에서의 output vector는 전체 vocabulary에 대한 등장 확률을 예측는 방식으로 학습되고, 가장 큰 확률을 갖는 단어를 현재 step에서의 단어로 출력하게 된다. 이러한 방식을 auto-regressive라 표현하고, GPT는 language modeling을 auto-regressive한 방식으로 학습하는 모델이라 할 수 있다.

 

다음에 올 단어를 예측하는 방식으로 학습된 GPT는 문장을 자유롭게 생성할 수 있는데, 여러 decoding 방식에 따라 문장 생성 결과에 큰 차이를 보이는 것이 확인되었다.

 

그렇다면 여기서  "langugae modeling으로 pretraining된 GPT를 다른 task에 대해서는 사용할 수 없을까?" 라는 의문점을 가지게 된다. 

결론부터 말하자면, "가능하다"이고, pretraining을 통해 임의의 값으로 초기화된 동일한 구조(파라미터 수)의 모델을 사용할 때보다 더 downstream task에 대해서 높은 성능을 보이게 된다. 즉, pretraining을 통해 많은 데이터들을 통해 언어 자체를 이해하는 기본적인 능력을 갖춘 상태라고도 할 수 있다.

 

Pretraining된 language model은 다양한 downstream task에 대해 소수의 추가 파라미터와 함께 fine-tuning되어 높은 성능을 얻을 수 있다. 여러 pretrained LM을 제안한 논문들에서 fine-tuning시에 유효했던 구조를 함께 설명하고 있다.

 

위 그래프는 pretraining에 따라 transfer learning시에 더 빠르게 더 높은 성능을 얻을 수 있음을 보여준다.

 

BERT (Bidirectional Encoder Representations from Transformers)

GPT 이후에 제안된 pretrained language model은 BERT이다. BERT는 수없이 많이 인용되며 자연어처리 분야의 주류로 사용되고 있어 꼭 알아두어야 하는 모델이다.

 

BERT는 GPT와 유사하게 큰 데이터셋 (위키피디아)에 대해서 masked language modeling task로 학습되어 downstream task에 대해 fine-tuning하는 방식으로 사용된다. BERT가 GPT와 다른 점은 Transformer 모델의 인코더만을 가져와서 사용했다는 점이다.

Base 모델과 Large 모델은 각각 인코더 블록의 수와 파라미터 수에서 큰 차이가 있고, 그에 비례하여 성능에서도 차이가 있다.

BERT는 앞서 설명한대로 Transformer의 인코더블록만을 사용하고 있는데, 인코더의 input으로 사용하는 임베딩을 구성하는 방식에서 차이가 있다.

토큰 임베딩과 위치 정보를 부여하는 positional embedding만 사용하던 기존 Transformer 모델과 달리 BERT는 토큰 임베딩, segment embedding, 학습되는 positional embedding을 사용한다.

Pretraining 단계에서의 input은 위와 같이 구성되는데, fine-tuning 단계에서 문장을 대표하는 벡터로 사용되는 [CLS] 토큰이 추가되고, 두 segment를 분리하고 input의 끝임을 표시하는 [SEP] 토큰이 추가된 것을 확인할 수 있다.

또한 [MASK] 토큰은 주어진 segment에서 임의의 토큰을 선택하여 대체함으로써 해당 위치에 와야하는 토큰을 예측하는 masked languge modeling task를 위해 도입된 토큰을 의미한다. 

BERT의 pretraining task는 1. masked language modeling, 2. Next sentence prediction task로 구성되어 있는데, 앞서 설명하지 않은 next sentence prediction task는 두 segment가 연속된 문단인지를 [CLS] 토큰의 벡터를 가지고 에측하는 task로 정의된다.

 

Pretraining 이후에 finetuning은 여러 downstream task들에 대해서 이루어지는데, 앞서 설명한 것과 같이 BERT를 제안한 논문에서 각각의 task에 대해 finetuning을 위해 BERT를 사용하는 방식에 대해서도 설명해 놓았다.

위 표에서 ELMo, GPT와 비교했을 때 BERT 모델의 pretraining 방식이 크게 앞선 것을 확인할 수 있다.

 

Pretraining된 BERT를 finetuning하여 사용하는 것 외에도 BERT의 학습된 파라미터들은 그대로 두고, feature extractor로써 사용할 수도 있는데, 이 경우엔 여러 레이어로 구성된 BERT에서 어떤 단어 벡터를 사용할지가 문제가 된다.

BERT를 feature extractor로 사용할 경우 여러 벡터 선택방식에 따라, task에 따라 성능 차이가 있는 것을 확인할 수 있다.

 

ELMo로 시작하여 GPT, BERT로 이어지는 language modeling task를 pretraining한 모델들은 현재 자연어처리의 주류가 되어 downstream task에서의 학습을 시작할 경우, 해당 모델의 pretraining된 초기 파라미터에서 시작하는 경우가 대부분이 되었다. 이번 포스팅에서 설명한 pretraining task 이외에 다른 task를 제안하거나, 다른 모델 구조를 제안하는 많은 논문들이 쏟아져 나오고 있으니 계속해서 확인하는 것이 필수적이다.

Introduction to Transformer

현재까지 강의를 수강하면서 RNN에서 LSTM과 다른 RNN variant들을 공부하면서 자연어처리에 사용되는 뉴럴모델의 변화를 확인하였다. 긴 문장에 대한 문제와 gradient vanishing 문제를 해결하기 위해 등장한 attention 매커니즘은 LSTM의 성능을 다시 한번 향상시켰고, 'Attention is all you need' 논문의 등장과 함께 attention만을 사용하는 Transformer 모델이 자연어처리 분야를 지배하는 시대가 시작되었다.

 

Transformer 모델은 기존의 seq2seq 모델과 같이 encoder, decoder로 구성되어 있지만 그 내부 구조는 모두 fully connected 레이어들과 attention mechanism으로 구성되어 있다. 각 인코더, 디코더는 다시 여러 레이어로 구성되어 있으며, 마지막 인코더 레이어의 아웃풋을 디코더의 각 레이어에서 사용하게 된다.

 

인코더의 각 레이어를 더 자세히 살펴보면, 연속된 self-attention layer와 fully connected layer로 구성되어 있는 것을 확인할 수 있다. 

디코더 또한 각 레이어가 self-attention layer와 fully connected layer로 구성되어 있으나, 다른 점은 인코더의 결과물을 고려하는 encoder-decoder attention layer가 두 레이어 사이에 추가되었다는 점이다.

 

 

Closer look

여기서부터는 Transformer 모델이 주어진 문장을 어떻게 처리하는지에 대해 자세히 살펴본다. 예제에서는 단어 3개로 이루어진 문장이 주어지고, 각 단어들은 512차원의 벡터로 인코딩되어 인코더의 입력으로 주어지게 된다.

인코더의 각 레이어를 통과하는 단어 벡터들은 동시에 병렬로 처리되고, 동일한 차원을 유지한다.

Self-attention 매커니즘은 각 단어의 처리에 주어진 문장의 모든 단어에 대해서 attention mechanism을 적용하는 방식을 뜻한다. 

Self-attention 매커니즘은 Q(query), K(key), V(value) 벡터를 사용해 각 벡터를 처리하게 되는데, 따라서 Q, K, V 벡터를 구하기 위한 파라미터 행렬이 각각 존재하게 된다.

각 단어에 대해 Q,K,V 벡터가 구해지면 Q와 K 벡터의 dot product, softmax를 통해 기존 attention 매커니즘과 같이 모든 단어들을 참조하고, 총합이 1인 attention score들을 미리 구해놓은 V 벡터와 곱해 self-attention 레이어의 결과물을 구하게 된다. 위 그림에서 8로 dot product의 결과값을 나누어주는 것은 수치적 안정성을 위해서라고 한다. 또 위 그림은 각 단어에 대한 벡터 단위의 self-attention 연산을 설명하고 있는데 이는 행렬로써 동시에 병렬연산을 거치게 된다.

 

여기까지 설명한 self-attention은 하나의 head에서 이루어졌고, 여러 attention 방식을 동시에 고려하기 위해 이러한 head를 여러 개 사용하는 multi-head self-attention 방식을 Transformer 모델은 채택하였다.

위 그림과 같이 각 head들에 대해 이전에 설명한 self-attention 연산을 하게 되고, 각 head의 아웃풋 벡터는 합쳐져 (concatenate) 또 다른 파라미터 행렬과 곱해져 입력 문장의 벡터와 동일한 크기의 벡터를 multi-head self-attention 레이어의 결과물로 출력하게 된다.

 

Multi-head self-attention의 attention score를 시각화해보면 위 그림과 같은데, 각 attention head마다 동일한 단어의 경우에도 문장의 여러 단어를 참조하는(attend) 정도가 다르게 나타나는 것을 확인할 수 있다.

 

Positional Encoding

이러한 self-attention 방식은 모든 단어를 병렬로 처리할 수 있는 장점이 있지만, 입력 문장에서 각 단어의 위치 정보가 고려되지 않는 문제점이 있었고 Transformer 모델에서는 positional encoding을 통해 각 단어에 위치 정보를 추가해줌으로써 이 문제를 해결하였다.

위치 정보는 positional encoding(embedding)으로써 각 단어의 임베딩에 더해져 인코더에 입력되는데, 512개의 위치에 대해 고유한 값을 더해주기 위해 사인함수를 사용하지만 여기서는 자세히 설명하지 않는다.

 

Residual Connection

추가로 각 레이어의 사이마다는 residual connection과 layernorm이 존재한다. 즉, self-attention, fully connected layer의 input이  각 레이어의 결과물에 그대로 더해지고 normalize되는 방식을 의미하고, 깊은 (deep) 모델에서도 안정적인 학습을 할 수 있도록 돕는 기능을 한다.

 

Decoder side

여기서부터는 디코더의 각 레이어의 구조를 설명하는데, 인코더의 각 레이어와 encoder-decoder attention layer가 추가된 것 이외에는 모두 같은 구조를 가지고 있다.

각 단어를 디코딩하는 step마다 동일한 연산이 수행되는데, 이 때 인코더의 마지막 레이어의 결과물 벡터를 사용한다. 더 구체적으로는, 인코더의 마지막 레이어의 K(key), V(value) 벡터를 가져와 디코더에서 계산된 Q(query) 벡터와 attention 연산을 통해 디코딩을 진행한다.

디코더의 모든 레이어를 거친 결과물 벡터는 단어를 출력하기 위해 추가로 fully connected layer와 softmax layer를 통과하여 전체 vocabulary에 대한 확률을 구하게 되고, 가장 높은 확률을 갖는 단어를 해당 decoding step의 결과물로 출력하게 된다.

기존 translation task에서 사용하는 cross entropy loss function을 그대로 사용하며, 디코더의 label은 원-핫 인코딩으로 주어지게 된다.

모델은 각 decoding step에서 출력되어야하는 단어에 대한 확률이 모든 단어들에 대해서 가장 높게 학습된다.

Teaching machine to Read

기계(컴퓨터)에게 글을 가르치기 위해서, 즉 글을 이해하게 하기 위해 가장 먼저 인간이 떠올린 task는 질의응답 (Question answering)이었다.

 

그러나 2015년 이전까지 인간은 그 어떤 질의응답을 수행할 수 있는 통계학적인 NLP 시스템을 갖추지 못했다. 그러나 2015년 이후 많은 질의응답(QA) 데이터셋들과 뉴럴넷의 등장으로 기계에게 질의응답 task로 글을 이해할 수 있도록 (어느 정도는) 할 수 있게 되었다.

 

 

CNN/Daily Mail Datasets

여기서부터는 새롭게 등장한 데이터셋과 그에 대해서 학습하고 평가한 모델들에 대해 설명하겠다.

 

두 데이터셋은 주어진 문단(passage)에 대해서 중요한 entity들을 알수없도록 표기해두고 주어지는 질문에 대한 답변이 되어야하는 entity를 맞추어야 하는 데이터셋이다. CNN은 38만개, Daily mail은 88만개의 학습데이터를 제공한다.

 

각 entity들에 대해 딥러닝 모델의 도입 이전까지는 사람이 직접 어떠한 feature를 만들어주고, 이에 대해 머신러닝 모델들을 학습시키는 방식으로 QA task를 수행하고자 했다.

그러나 attentive reader라는 딥러닝 모델의 등장과 함께 위와 같은 feature를 만들어 줄 필요가 없게 되었다.

 

Attentive Reader

Attentive Reader는 주어진 passage와 질문을 딥러닝 모델로서 알아서 인코딩하고 학습하여 답을 내놓는 모델이다.

 

Passage와 Question은 모두 이전에 설명했던 bidirectional LSTM으로 인코딩되고, attention 매커니즘에 의해 질문에 따라 passage를 이해하고, 그에 따라 답변이 되어야하는 entity를 예측하도록 학습된다.

 

DeepMind와 Stanford에서 Attentive Reader라는 동일한 이름으로 각각 2015년, 16년에 모델을 제안했으나, attention score 계산 방식 등에서의 차이로 Stanford의 모델이 큰 차이로 높은 성능을 보였다.

 

또 Stanford의 Attentive Reader 모델은 기존의 categorical feature classifier 방식보다도 큰 차이로 성능이 높았는데, 그렇다면 어떤 수준의 언어 이해 능력이 필요하고, 현재의 모델은 어떤 방식으로 QA task를 학습했는지에 대해 분석해보았다.

 

6가지의 가능성에 대해 모델이 학습한 경우를 예시를 들어 보여주는데, 아래에서 해당 예시들을 확인할 수 있다.

 

뉴럴 QA 모델은 feature classifier보다 paraphrasing, partial clue 등의 추상적인 언어 이해능력이 필요한 경우에서 더 QA를 잘 수행하는 것으로 확인되었다.

 

Bidirectional LSTM + attention 모델이 CNN이나 Daily Mail과 같은 semantic matching으로 정답이 올 위치를 예측할 수 있는 것은 확인되었으나, 실제로 entity들이 존재하는 passage에 대해 질문이 주어졌을 때 정답을 내놓을 수 있을지에 대한 궁금증이 생겨났다.

 

 

Stanford Question Answering Dataset (SQuAD)

그에 따라 등장한 것이 SQuAD 데이터셋이다. 

SQuAD셋의 passage들은 위키피디아에서 추출되었고, 질문들은 많은 사람들에 의해 크라우드소싱되어 생성되었으며, 질문에 대한 답은 passage안에서 span으로 존재한다.

 

 

Attentive Reader 모델은 이 SQuAD 데이터셋에 대해 바로 적용되었는데, 예측하는 대상이 정답 span의 start position과 end position으로 변경되었다. SQuAD 데이터셋으로 학습된 모델에서 흔히 나타나는 에러는 어떠한 숫자에 대해서 질문했을 때, 원하는 숫자가 아닌 관계가 없는 숫자들을 정답으로 예측하는 것이었다.

SQuAD 데이터셋은 여전히 정답이 passage 내에 존재하는 span selection task였고, 질문을 만들어내는 사람들은 passage를 보며 질문을 만들기 때문에 lexical overlap이 높은 확률로 발생하였다. 이에 따라 실제로 기계가 글을 이해하고 어떤 질문에라도 대답할 수 있는가에 대한 open-domain QA task가 대두되었다.

 

DrQA

DrQA 모델은 주어진 질문에 대해 위키피디아 등의 open-domain 지식을 이용해 대답할 수 있는 모델을 학습시키기 위해 제안되었다.

수많은 document들에서 주어진 질문에 관련된 document만을 선택하기 위해 Information Retrieval 테크닉을 사용하고, 이에 따라 줄어든 후보 document들에서 정답을 찾아 제공하는 방식을 채택하였다. 아래는 DrQA 모델로 실제 질문에 대해 모델이 대답하는 예시이다. 잘 학습된 예시에 대한 결과일수도 있으나 위키피디아라는 큰 open-domain 지식을 이용해 다양한 질문에 대답할 수 있다는 것이 놀랍다.

 

 

Applications of RNNs

 

RNN이 사용되는 대표적인 task로는 language classification, image description, language modeling, translation 등이 있다. 그 중 Many-to-many, 또는 sequence-to-sequence에 대해 알아본다.

 

먼저 Language modeling은 sequence가 들어왔을 때, 이전 input들에 기반하여 다음에 올 term을 예측하는 task이다. 아래 예시에서는 "the, dog"를 입력받아 다음에 올 "chased"를 예측하도록 학습되는 것을 확인할 수 있다.

Language modeling에 이어 Machine translation task는 대표적인 many-to-many 케이스 중 하나이다. Translation의 경우, 아래와 같이 서로 다른 두 언어의 문장이 다른 길이로 나타나는 경우가 대부분이다.

 

이러한 다른 길이의 입력, 출력의 길이를 다루기 위해 등장한 것이 encoder-decoder 모델, 또는 sequence-to-sequence 모델이다. Encoder-decoder 모델의 encoder는 다양한 길이의 sequence를 입력받아 고정된 크기의 hidden state로 인코딩하고, 이를 decoder가 <SOS (Start Of Sentence)> 토큰과 함께 입력받아 다양한 길이의 sequence를 출력하게 된다.

 

Encoder-decoder 모델의 학습 과정과 loss function을 아래 figure에서 확인할 수 있는데, language modeling과 유사하게 decoder에서는 각 time step마다 이전 decoding output을 가져와 입력하여 다음에 출력되어야 할 단어를 예측하는 분류 문제를 수행하고, 따라서 cross entropy loss를 사용하여 학습하게 된다. Teacher forcing은 학습 과정 중 이전 step에서의 decoding output이 아니라 실제 정답 단어를 입력함으로써 학습을 더 빠르게 하는 효과를 가져온다.

 

Decoder의 decoding 방식은 여러가지가 존재하는데, 여기서는 greedy decoding (inference)과 beam search를 설명하고자 한다. Greedy decoding은 각 decoding time step마다 가장 확률이 높은 단어를 <EOS (End-Of-Sentence)> 토큰이 출현할 때까지 decoding하는 방식이고, beam search는 각 decoding step마다 확률이 가장 높은 K개의 단어들을 유지하면서 <EOS> 토큰이 등장할 때까지 decoding하는 방식이다.

Beam search decoding

 

Encoder-decoder 모델의 문제점은 각 decoding time step에서 동일한 encoder embedding에 의존한다는 점, encoder embedding이 모든 encoder time step에 대한 정보를 가지고 있다고 가정한다는 점이 있었고, 이 문제들을 해결하고자 한 것이 attention mechanism이다.

 

Attention

처음 제안된 attention mechanism은 decoding time step마다 encoder의 전체 hidden state에 대해서 집중해야하는 정도(attention)을 계산하고, softmax normalization을 통해 weight sum을 적용한 encoder output을 사용한다.

각 encoder hidden state들이 얼마나 해당 decoding step에 영향을 미치는가를 계산하는 방식은 dot product, multiplicative, additive의 3가지가 제안되었는데 여기서는 자세하게 설명하지 않는다.

 

Attention은 encoder의 1) 전체 hidden state들에 대해서 또는 2) 인접한 일부 hidden state들에 대해서 적용되는지에 따라 global, local attention으로도 구별되며, 각 decoding step에서 예측되는 단어에 대한 근거를 attention score로써 설명할 수 있게 되었다.

How to deal with sequential data?

Vanilla feed forward network는 fixed size (e.g., image) 입력을 받아 fixed size 출력을 내놓는다. 그렇다면 길이가 고정되어 있지 않은 sequence 데이터를 뉴럴넷으로 처리하려면 어떻게 해야할까? 또 모델에 입력되는 데이터의 순서는 중요할까?

 

가변적인 시퀀스 입력(동영상)을 뉴럴넷으로 처리한 연구는 16년에 발표되었지만, 입력 순서를 고려하지 않은 averaging이 사용되었다

 

Recurrent neural network (RNN)은 가변적인 길이의 입력을 순서를 고려하면서 처리하는 vanilla feed forward network와는 다른 새로운 네트워크였다.

 

Recurrent Neural Network (RNN)

많은 task들에서 입력 데이터들은 temporal dependency를 가지고 있었다. Image captioning, sentiment analysis, machine translation, Part-of-speech (POS) tagging task가 RNN을 사용할 수 있는 대표적인 task들이다.

 

RNN의 수식을 살펴보자.

 

새로운 new state h_t는 f_w로 표현되는 RNN에 이전 time step에서의 hidden state와 현재 time step에서의 input vector를 입력함으로써 얻어진다. 이러한 이전과 현재 time step의 input을 함께 넣어주는 것은 RNN이 temporal dependency를 학습하게 한다. 여기서 유의할 점은 많은 그림에서 RNN의 각 셀(cell)마다 새로운 파라미터를 갖는 다른 네트워크로 보일 수 있지만, 모두 같은 파라미터를 각 time step마다 계속해서 사용한다는 것이다.

 

h_t는 W_hh, W_xh로 표현되는 두 파라미터와 tanh 함수로 구성되고, 마지막에 W_hy 파라미터와 곱해짐으로써 해당 time step에서의 output vector를 얻게 된다. 

 

아래는 Many to Many (sequence to sequence)의 예시이다.

 

앞서 설명한 것처럼 파라미터의 집합 W는 모든 time step에서 계속해서 사용되고, h_t에 곱해지는 W_hy 역시 계속해서 사용된다.

 

각 time step에서 y_t와 L_t를 얻고, 모든 L_t를 합쳐 L이라는 sequence output을 출력하게 된다.

 

Many-to-one (Sequence to vector)의 경우는 더 간단한데, W는 모든 time step에서 공유되지만, W_hy는 마지막 time step의 h_T에만 곱해져 output vector를 얻게 된다.

 

 

더 구체적으로 sentiment analysis task에서의 RNN의 쓰임을 살펴보면

One-hot encoding으로 This moive is fun이라는 sequence가 입력되게 되고, 마지막 time step인 T에서 h_T를 사용해 positive / negative의 분류를 수행하게 된다.

 

POS tagging task에서의 RNN도 좀 더 살펴보면,

 

각 time step에서의 h_t에 동일한 W_hy 파라미터가 곱해져 POS tag에 대한 분류를 모든 x_t에 대해 수행할 수 있는 것을 확인할 수 있다.

 

Long-Short Term Memory (LSTM)

Long-Short Term Memory (LSTM)은 기존의 RNN의 vanishing gradient 문제를 해결하기 위해 고안된 RNN이다. 위 figure의 가운데 셀에서 이전 셀과 다음 셀을 연결하는 직선이 보이는데, 이것을 cell state라 하며 시간이 오래 흐르더라도 역전파를 위한 gradient가 흐를 수 있도록 해 vanilla RNN의 vanishing gradient 문제를 어느정도 해결하였다.

 

Vanishing gradient problem

 

LSTM은 forget, input, output의 3개의 gate로 이루어져 있다. 먼저 input gate와 forget gate를 살펴보자.

위의 forget gate는 '과거 정보를 잊기 위한' 게이트이다. 이전 시점의 hidden state h_t-1와 x_t를 입력받아 시그모이드를 취한 값이 forget gate의 결과값이 되고, 이전 cell state를 얼마나 유지할지를 결정하게 된다. 1에 가까울 수록 이전 상태를 유지하고, 0에 가까운 값을 내놓을수록 이전 상태를 잊게(forget) 된다.

 

아래의 input gate는 현재 time step의 정보를 기억하기 위한 게이트이다. 이전 시점의 hidden_state h_t-1와 x_t를 입력받아 각각 시그모이드, 하이퍼볼릭탄젠트 함수를 취하고, 둘의 결과값을 Hadamard product해준 값이 input gate의 결과값이 된다. input gate의 출력값은 cell state에 element-wise로 더해져 cell state에 이번 시점의 정보를 더해주게 된다.

 

Output gate는 forget, input gate의 출력값에 따라 얻어진 이번 time step에서의 cell state와, 이전 시점의 hidden state h_t-1, x_t를 입력받아 이번 step에서의 hidden state를 결정해주게 된다.

 

LSTM에 더해 GRU와 다른 기존의 vanilla RNN을 개선한 네트워크들이 있으니, 필요하다면 더 찾아보면 좋을 것 같다.

How to encode natural language inputs into vectors?

Sentiment analysis task (positive / negative)를 예시로 뉴럴넷으로 해결하고자 할 때, 자연어 문장은 어떤 형식으로 입력되어야 할까?

정답은 토큰화 (tokenization)을 거쳐 (여기서는 whitespace 기준) 각 퍼셉트론마다 하나의 토큰을 입력해주면 된다.

 

컴퓨터는 자연어가 아닌 숫자만 인식할 수 있기 때문에 우리는 자연어로 된 문장을 컴퓨터가 이해할 수 있도록 어떠한 규칙을 가지고 숫자들로 구성된 입력으로 변환해주어야 한다. 이것을 벡터화 (vectorization) 또는 인코딩 (encoding) 이라고 한다. 우리가 할 수 있는 가장 쉬운 인코딩 방식은 데이터셋에서 나타나는 모든 단어에 대해서 해당 단어에 해당하는지 (1) 또는 해당하지 않는지 (0)를 표시하는 것이다.

 

이러한 인코딩 방식을 원-핫 인코딩 (One-hot encoding)이라 부르고, 결과로 얻어지는 각 단어의 벡터의 크기는 |V|, 즉 전체 데이터셋의 고유한 단어의 총 개수이다. 원-핫 인코딩은 간단하게 뉴럴넷을 위한 벡터들을 얻을 수 있지만, 치명적인 결점이 존재했다.

 

 

첫번째로는 Curse of dimensionality, 차원의 저주이다. 고유한 단어들 전체에 대해 해당되지 않을 때도 0이라는 값을 배정해야하기 때문에 인코딩된 벡터들의 행렬은 sparse (대부분의 값들이 0)일 수밖에 없다. 이러한 불필요하게 많은 정보들은 뉴럴넷이 처리해야하는 정보의 질을 저하시키고 메모리를 많이 차지하게 되며 따라서 계산 시간도 증가시킨다.

 

 

두번째는 orthogonality이다. 원-핫 인코딩된 서로 다른 두 단어의 유사도를 계산하기 위해 dot product를 할 때, 항상 그 값은 0이 되어 유사도의 계산이 불가능하다는 문제점이 있다.

 

Curse of dimensionality를 해결하기 위해 사용하는 방법으로는 차원 축소 (dimensionality reduction)가 있다. 차원 축소는 고차원의 데이터들을 상대적으로 저차원의 벡터를 갖는 데이터로 압축하되 유사한 정보를 갖도록 하는 방식이다. 주성분분석(PCA, principal component analysis), 선형판별분석 (LDA, Linear discriminant analysis) 등의 알고리즘들이 여기에 속한다.

 주성분분석(PCA, principal component analysis)을 통한 차원 축소

 

주성분분석 (PCA)은 현재 데이터들이 표현된 벡터 공간에서 각 데이터들이 투영(projection)되었을 때 데이터들의 분산을 최대화하는 선형부분공간을 찾는 알고리즘이다. PCA는 동시에 기존 벡터와 투영된 벡터 간의 거리를 최소화하는 방향으로도 차원 축소를 진행한다.

 

 

 

이러한 차원 축소는 manifold hypothesis에 기반하는데, manifold hypothesis는 고차원의 데이터들이 집중되어 분포하는 어떠한 저차원의 매니폴드가 존재하고, 이 매니폴드에서 멀어질 수록 데이터들의 분포가 희박해진다는 가설이다. 수학적으로 증명되지는 않았지만 해당 가설이 잘 작동하는 도메인들이 존재한다고 한다.

 

Autoencoder (오토인코더)

오토인코더 (autoencoder)는 항등 함수 (identity function)를 학습하는 뉴럴넷을 의미한다. 입력 데이터에 대해 오토인코더는 동일한 출력값을 내도록 학습되지만, 입력 데이터를 저차원의 벡터로 압축하는 인코더 (encoder)와 압축된 데이터를 다시 입력 데이터와 동일하게 복원하는 디코더 (decoder) 구조를 통해 저차원의 압축된 representation을 얻을 수 있다.

 

저차원의 벡터로 축소한 뒤, 이 벡터를 다시 입력 데이터와 동일하게 복원하는 학습 방식을 통해 오토인코더는 가장 중요한 feature들을 선택할 수 있도록 학습되고 MSE loss function은 오토인코더의 입력과 출력이 동일하도록 한다.

 

 

오토인코더의 학습 이후, 차원 축소를 위해서는 오토인코더의 인코더만 사용하게 된다.

 

원-핫 인코딩의 결점을 보완하기 위해 등장한 워드 임베딩 (word embeddings)은 이러한 차원 축소 방식을 이용한 자연어 인코딩 방식이다.

 

 

Word embeddings : Word2Vec

Distributional hypothesis

Distributional hypothesis는 유사한 단어들은 유사한 문맥에서 나타난다는 가설이다. 

Moon, Trump, Jinping은 동일한 문맥 상에서 나타나며, 다른 사람이지만 '같은' 대통령을 지칭하고 있다.

워드 임베딩 알고리즘은 이러한 distributional hypothesis에 기반하고 있다.

 

 

Word2Vec 논문은 CBOW (Continuous Bag-Of-Words)와 Skip-gram 방식의 단어 임베딩 학습 방식을 제안했다.

먼저 CBOW를 살펴보자.

 

CBOW

 

문장이 주어졌을 때, Trump라는 단어의 벡터를 학습하기 위해 주변 단어를 뉴럴넷에 입력하고 중앙 단어인 Trump를 예측하는 방식이 CBOW이다. 학습하는 모든 단어에 대해서 임베딩 행렬은 사전에 정해진 차원으로 초기화되고, 학습에 추가로 사용되는 weight matrix와 함께 각 단어의 벡터를 학습하게 된다.

 

1. 먼저 주변 단어들을 임베딩 행렬에서 찾는다 (look-up)

첫번째 단계로 먼저 t 위치 단어의 벡터를 학습하기 위해 주변 단어들의 벡터를 원-핫 인코딩된 벡터의 곱을 통해 찾는다 (look-up).

 

2. 고정된 길이의 벡터로 인코딩

두번째로 학습을 위해 모은 여러 단어들을 하나의 벡터로 합치고, weight matrix를 곱해 |V|의 실수값을 출력하도록 한다.

 

3. Softmax 함수를 통해 중앙 단어를 예측

세번째로 구해진 |V| 값들에 softmax 함수를 적용하여 전체 단어들에 대한 확률로 변환하고 분류 문제로써 뉴럴넷을 학습하게 된다.

 

 

Skip-gram

Skip-gram은 CBOW와 반대로 중앙 단어를 통해 주변 단어들을 예측함으로써 각 단어의 벡터를 학습하는 방식이다.

Skip-gram

 

원-핫 인코딩을 통해 중앙 단어의 벡터를 찾고 (look-up), weight matrix를 곱해 주변 단어들에 대해 softmax 확률을 가지고 분류 학습을 통해 단어 벡터를 학습하게 된다.

 

CBOW와 Skip-gram의 차이점은 CBOW는 학습이 빠르고 자주 등장하는 단어에 대해 더 나은 성능을 보인다고 하며, Skip-gram의 경우 적은 양의 학습 데이터로도 잘 학습되며 자주 등장하지 않는 단어나 구에 대해서도 잘 학습되는 특징이 있다고 한다.

 

 

Other techniques in Word2Vec

위 word2vec의 loss function에서 확인할 수 있듯이 데이터셋의 모든 vocabulary V에 대해 확률을 구하는 normalization 과정은 계산량이 불필요하게 많은 단점이 있었다.

 

이를 해결하기 위해 hierachical softmax와 negative sampling이 제안되었다.

 

- Hierarchical softmax : 여러 개의 이진 트리 (binary tree)로 예측 문제를 분리하여 예측하고자 하는 단어에 이르는 경로(path) 상의 확률들을 최대화하는 방식으로 학습

- Negative sampling : 예측하고자 하는 단어 하나에 대해서 나머지 V-1개의 단어를 사용하지 않고 5~20개의 negative sample들을 사용하여 학습

 

 

Conclusion

단어 임베딩은 각 단어들을  distributed continuous space 상에 배치하여 기존의 curse of dimensionality로 고통받던 discrete 인코딩의 문제를 해결하였다. Word2vec으로 대표되는 단어임베딩은 단어 간의 similarity 계산을 더 자유롭게 가능하게 하였고, 단어 벡터 간의 연산을 가능하게 하는 결과를 가져왔다.

 

AI, Machine Learning, Representation Learning, Deep learning

 

AI, Machine learning, representation learning, deep learning의 관계는 아래 그림과 같다.

 

AI, 인공지능 (Artificial Intelligence) 은 가장 넓은 범위의 개념으로서, 이후의 머신러닝 이후의 분류를 제외하고 사람이 손수 제작한 지식베이스나 어떠한 규칙에 따라 기계가 행동하게 하는 가장 넓은 범위의 의미를 가진다.

머신 러닝 (Machine learning) 은 규칙이나 지식베이스에서 벗어나 데이터의 여러 feature에서 나타나는 패턴과 관계를 알고리즘으로 파악하여 그에 따른 행동을 할 수 있게 하는 것을 의미한다.

Representation learning은 머신 러닝에서 더 나아가 알고리즘에 직접 제공해주어야 했던 feature도 기계가 학습할 수 있도록 하는 기법을 의미하며, deep learning은 이러한 간단한 representation들로 더 복잡한 representation들을 학습할 수 있도록 하는 기법을 뜻한다.

 

기존의 전통적인 프로그래밍이 입력에 대해 프로그램 (지식베이스 또는 규칙) 에 따른 처리를 통해 결과를 출력하는 방식이었다면, 머신러닝은 입력과 원하는 출력 결과물을 가지고 기계가 학습하여 프로그램을 만들어내는 과정으로 표현될 수 있다.

 

 

머신 러닝은 4가지 요소로 구성된다.

 

1. Task

2. Experience

3. Performance measure

4. Program = Model

 

1, 2번째의 task과 experience는 학습을 위한 데이터의 목표 task와 모델이 해당 데이터를 가지고 학습하는 경험 (과정)을 의미한다.

4번째의 프로그램 또는 모델은 머신러닝 모델(알고리즘) 또는 딥러닝 모델을 의미하며 주어진 입력 데이터에 대해 원하는 결과를 출력할 수 있는 어떠한 함수로 정의된다.

 

모델의 task에 대한 학습을 위한 평가는 task에 따라 다른 기준으로 이루어진다.

대표적으로 regression(회귀)의 경우는 MSE (Mean squared error), classification(분류)의 경우는 cross entropy가 평가 기준 (loss function)으로 사용되며, 모델은 이 loss function의 값을 줄이는 방식으로 학습하게 된다.

 

 

 

Neural Networks

Neural network (뉴럴넷)의 기본 구조인 퍼셉트론 (perceptron)은 인간의 신경계에 존재하는 뉴런을 모방한 구조를 가지고 있다.

 

퍼셉트론의 순방향 전파 (forward propagation)은 다른 퍼셉트론들로부터의 입력값들을 수용하고 계산하여 하나의 값을 출력하는 방식으로 이루어진다. 입력값의 수 M은 항상 미리 정해져 있어야 한다.

 

각 입력값들은 해당 퍼셉트론에서의 각기 다른 weight와 곱해지고 더해진다. 이후 모델의 표현력을 높이기 위한 non-linearity function이 적용되는 과정을 거쳐 출력값을 얻게 된다. 모델의 특성 또는 task의 종류 등의 요인들에 따라 다양한 종류의 Non-linearity fuction 중에 선택하여 사용하여야 하는데, 이에 대해서는 여기서는 설명하지 않는다.

 

Non-linearity function (Activation function, 활성화 함수)은 weighted sum으로 표현되는 퍼셉트론을 보완하여 더 복잡한 함수를 표현하기 위해 사용된다.

 

또한 뉴럴넷은 앞서 설명한 퍼셉트론을 여러 개 사용하여 하나의 layer를 구성하여 여러 출력값을 얻게할 수도 있으며,

이 layer를 복수로 구성하여 모델의 표현력(성능)을 향상시킬 수도 있다.

 

How to manage an image with multi-output perceptron

 

 

Loss function, Back propagation with Gradient Descent

Loss function(손실 함수), backpropagation (역방향 전파)과 gradient descent에 대해서는 예시와 함께 설명하고자 한다.

 

두 가지 feature, 참가한 수업의 수와 final project에 투자한 시간을 가지고 어떤 수업을 패스할 것인지에 대해 예측하는 모델을 만들고자 한다.

 

참가한 수업의 수와 투자한 시간의 분포, 해당 경우마다 pass / fail 결과를 표현할 경우 [4, 5]의 값을 갖는 학생의 경우 유사한 사례의 학생들이 수업을 패스했음을 학습하면 해당 학생에 대해서도 패스할 것이라 예측할 수 있을 것이다.

 

뉴럴넷으로 해당 task를 학습하고 예측하고자 할 때, 앞서 설명했던 loss function을 사용하게 된다.

Loss function의 값은 예측해야 하는 값에 대한 모델의 예측값의 에러(오류)의 정도(크기)를 뜻한다. 전체 학습 데이터들에 대한 모든 loss 값의 합을 empirical loss라고 부른다.

 

해당 task가 학생이 수업을 패스할것인지 아닌지에 대해 예측(분류)하는 task이기 때문에 모델은 pass의 확률 (0~1)을 예측하는 방식으로 학습될 수 있다. 이러한 경우 사용되는 loss function이 binary cross entropy loss 함수이다. 

Binary cross-entropy loss function

 

또는 0 또는 1의 결과값을 갖는 분류 문제가 아닌 여러 경우에 대한 분류 문제를 해결해야하는 경우가 있는데, 이러한 경우는 binary가 아닌 일반적인 cross entropy loss 함수를 사용한다.

시험 성적 등의 연속적인 실제 값을 예측하고자 하는 경우는 MSE (Mean squared error) loss 함수를 사용한다.

 

그렇다면 이렇게 구해진 loss 값에 대해서 모델은 어떻게 학습될까? 정답은 학습 데이터에 대해 경험적으로 가장 낮은 loss 값을 갖는 모델의 weight들을 찾으면 된다. 그러나 딥러닝 모델의 loss 값은 입력 feature들에 대해 non-convex하게 (울퉁불퉁하게) 나타나므로, 

 

어떤 지점에서의 loss 값보다 낮은 값을 갖는 지점을 향해 모델의 weight들을 점차 업데이트해나가야 한다. 이러한 방식을 gradient descent (경사 하강법)이라고 부르며, loss 값이 더 이상 줄어들지 않을 때까지 업데이트를 반복적으로 수행한다.

 

 

Data split, Overfitting, Regularization

앞서 설명한 학습 이후에는 모델이 실제 예측을 평가하기 위한 학습 데이터와 중복되지 않는 데이터가 필요하므로, 한정된 데이터를 학습(train) 데이터와 평가 (test) 데이터로 분리하여 사용한다. 모델의 학습 과정 중의 중간 평가를 위해 별도로 검증 (validation) 데이터를 두는 경우도 있다.

 

 

검증 (validation) 데이터는 오버피팅 (overfitting)을 방지하기 위해 사용되며, 오버피팅은 학습 데이터만 지나치게 학습하여 새로운 테스트 데이터에 대해서는 제대로 예측하지 못하는 일반화 성능이 낮은 상태를 의미한다.

이러한 오버피팅을 방지하기 위해서 1) 검증 데이터셋으로 학습 도중에 학습 데이터와 별도의 데이터로 지속적으로 평가하거나, 2) 정규화 (regularization), 3) early stopping 기법들을 사용해 테스트 데이터에 대해서도 모델이 동등하게 좋은 성능을 보이도록 학습시킬 수도 있다.

 

L1, L2-norm regularization
Dropout regularization

 

Early stopping

+ Recent posts