Machine Learning/Paper

RNN LM (Recurrent neural network based language model)

대소니 2017. 3. 21. 14:50


언어모델에 사용된 RNN 관련 논문을 읽고 발로 요약정리한 내용입니다.

흠. 좀 심하게 막장 요약이라서 올리기가 좀 그랬지만, 시간이 되면 정리해서 다시 올리겠습니다.^^

혹시라도 관련해서 궁금하신 내용이 있으시면 댓글에 남겨주시면 겸사겸사 수정/정리하는 것으로 일단 하려고 합니다




Recurrent neural network based language model, 2010

http://www.fit.vutbr.cz/research/groups/speech/publi/2010/mikolov_interspeech2010_IS100722.pdf


Abstract

Language model 기반의 RNN이 음성인식에서 perplexity가 50% 감소하는 결과를 보였다. 여러개의 RNN LMs를 사용했다.


1.Introduction

Sequential data prediction 은 ML과 AI에서 중요한 문제처럼 많이 생각되고 있다.

통계적 LM에서는 주어진 컨텍스트에서 다음 단어를 예측하기 위한 것이다. 그래서 LM을 만들때 이러한 통계적 LM을 다루어야 한다

아직도 많이 시도되고 있는데 예를들어, parse trees, 형태학, 신텍스, 시맨틱에 고려가 필요하다

n-gram 모델에서 특히 단어와 문장의 형태, 문장 마지막 기호 등이 중요하다. 그런데 이런것이 중요한지는 의문이다.

그래서 이러한 것을 더 잘하는 모델을 만들려고 했고 상당한 성과가 있었다. cache models and class-based models로 말이다

cache model은 긴 컨텍스트의 정보를 묘사하고 class-based model은 비슷한 단어들 사이에 파라미터를 쉐어함으로서 짧은 컨텍스트를 위한 파라미터 평가를 개선한다


2.Model description

sequential data 모델을 위해서 recurrent neural network에 주목했다

벤지오교수님의 NN 모델이 위에서 살펴본 과거 모델 여러개를 사용하는 것보다 더 좋은 성능을 내는 것으로 나타났다

그런데 큰 단점이 바로 fixed length context를 사용해야 하는 것이다. 그래서 cache models이 NN에서도 유용해 보일수도 있다.

RNN은 컨텍스트에 제한길이를 사용하지 않는다.

이 모델을 사용하면 정보가 오랜시간동안 내부에서 사이클을 돌게 된다.

그런데, SGD를 이용한 long-term dependencies를 학습하는게 좀 어렵다.

우리는 이 논문에서 보통 simple recurrent neural network 혹은 Elman network라고 불리우는 아키텍처를 사용했다

이것은 아주 단순하고 구현하기 쉬운 것일 거야




이 네트워크는 input layer x, hidden layer s, output layer y로 구성된다.

x(t)는 time t에 입력이 되고 y(t)는 결과가 되고, s(t)는 state가 된다.

x(t)는 현재 단어 벡터 w과 연관된 공식이 되고 t-1 time에 s의 결과와도 합으로서 공식이 된다.


초기화를 위해서, s(0)를 작은 값의 벡터로 셋팅하고, 0.1로. 만약 엄청 큰 데이터로 처리할 때에는 이런 초기화가 중요하지 않게 된다.

다음 step의 s(t+1)은 s(t)의 복사본이 된다.

입력 단어의 벡터는 1 of N 코딩과 이전 컨텍스트 레이어, 벡터 x의 사이즈는 V의 사이즈와 같다. 

context(hidden) 레이어 s 의 사이즈는 보통 30~500개의 hidden units이다.

논문자의 경험상 레이어의 유닛 사이즈는 학습 데이터의 양에 따라서 반영해야 한다. 데이터가 많아질수록 hidden layer도 커져야 한다


학습 코퍼스의 모든 데이터는 시퀀셜하게 표현되어 있어야 하고, Weights는 작은 값으로 초기화 한다. (랜덤 가우스 노이즈, mean : 0, variance : 0.1)

네트워크를 학습시키기 위해서 SGD의 일반적인 backprop을 사용한다

learning rate = 0.1로 시작한다

매 epoch 마다 validation data로 테스트를 한다 validation data의 log-likelihood가 증가하면 새로운 epoch에서 학습을 계속하고 중요한 개선점이 없으면 관찰한다


일반적인 의미의 'likelihood'는 '~일이 일어날 가능성'을 말합니다.

log-likelihood란 주어진 자료의 분포를 대표하는 "함수" (data를 fit하여 구함)를 의미합니다.


learning rate 는 매 epoch 시작 시점의 값에서 절반으로 낮춘다

중요한 개선점이 없으면 학습을 끝낸다 보통 10~20 epochs에서 convergence가 된다.

우리의 경험상 큰 사이즈의 hidden layer를 사용하더라도 overtrain이 중요하지 않고 regularization에서도 중요한 개선점이 없었다


output layer y(t)는 이전의 단어 w(t)와 s(t-1)에 다음 단어의 확률분포(probability distribution)로 나타난다

softmax는 이 확률분포를 정당함을 보장한다 어떤 단어의 결과 값이 0보다 크면 모든 결과를 다 더하면 1이 된다

error vector는 cross entropy 로 연산이 되고 weights는 기본적인 backdrop 알고리즘으로 업데이트 된다


desired(t)는 1ofN coding 의 벡터이고 특별한 컨텍스트에서 예측되어진 단어이고, y(t)는 망에서 나온 결과다.

test data로 진행된 것은 업데이트 하지 않는다

그래서 만약 새로운 사람이름이 테스트 셋에서 반복적으로 발생하거나 이미 알고 있는 단어로 구성이 되어도, 계속 아주 작은 가능성(확률)을 갖게 될 것이다

이런 long term memory는 context unit의 활성화에 있지 않고 synapses 자체에 있을꺼야. 

테스트를 하더라도 학습이 계속되도록 dynamic 한 모델을 위해서, fixed learning rate = 0.1을 사용하고 

epoch에서 7번 정도 네트워크에 표현되고 dynamic 모델은 테스팅할때 한번 업데이트한다

물론 이게 최적은 아니지만, 우리는 볼 수 있지. 충분한 perplexity 감소를 보였다. static model 보다.

이런 수정은 back off 모델에서 cache 기술하고 유사하다 NN이 연속적인 공간에서 배우는 것이 좀 다르다

그래서 dog, cat은 관계가 있다면 test data에 종종 나타나는 dog는 cat의 확률을 증가시킬 것이다

다이나믹하게 업데이트되는 모델은 자동적으로 새로운 도메인에 적응 가능하다

그러나 음성인식에서 경험상 recognizer가 주는 hypothesis에 의해 나타난다 그리고 recognition error를 포함한다

이것은 ASR에서의 저성능의 cache n-gram 모델의 일반적인 결과다 


여기서의 학습 알고리즘은 truncated back propagation through time with r = 1을 참조한다

이것도 최적이 아니야. 현재 time step 동안에 에러 벡터의 연산을 기준으로 업데이트 하는거다

BPTT 알고리즘은 보편적으로 사용되는거다

https://pdfs.semanticscholar.org/4b7a/0ba426690b08489a86038db161846ffcfaa9.pdf


RNN과 기본 NN과의 가장 큰 차이점 하나는 학습하기 이전에 parameter의 값을 미리 잡아 줘야 한다

RNN LM에서는 hidden layer 사이즈만 선택해주면 된다

일반적인 NN에서는 단어를 저차원의 벡터공간 투영하고과 히든레이어 사이즈와 context length을 잡아줘야 한다, 


2.1 Optimization

성능 개선을 위해서 학습데이터셋에 있는 어떤 threshold 이하의 빈도를 보이는 단어들을 모두 합쳤어. 특별한 rare 토큰으로

Crare는 발생빈도가 적은 V의 단어 수이다 이로서 모든 낮은 빈도의 단어들도 똑같이 다루어지게 된다

또 다른 몇가지 개선점을 Schwenk가 제안한게 있어.[4,10,11,12]

대부분 RNN에 적용이 가능한 것들이다

연산을 빠르게 하기 위해 BLAS 라이브러리를 사용해서 6시간만에 학습이 되었는데 벤지오 교수님의 학습은 113일하고 26시간이 걸렸다 



word error rate(WER)

Kneser-Ney smoothing (KN5)

dynamic RNN