본문 바로가기

ML & DM/Deep Learning

Introduction to Neural Machine Translation with GPUs (part 1)

원문 : https://devblogs.nvidia.com/parallelforall/introduction-neural-machine-translation-with-gpus/


Neural machine translation은 최근 순수 신경망에만 기초한 기계번역으로 제안된 프레임워크다. 이 포스팅은 neural machine translation 시스템을 구현한 간단한 encoder-decoder 모델을 설명한 시리즈중 첫번째 포스팅이다. [Cho et al., 2014Sutskever et al., 2014Kalchbrenner and Blunsom, 2013]. 차후 포스팅에서는, 어떻게 attention mechanism 이 간단한 encoder-decoder모델에 통합될 수 있는지를 설명하겠다[Bahdanau et al., 2015]. 이 통합모델은 영-프, 영-독, 영-터,영-중을 포함한 수많은 Language pair들 에 대한  최신의 기계번역모델이 됐다[Gulcehre et al., 2015Jean et al., 2015]. 더 나아가,  이러한 neural translation 의 프레임워크를 이미지나 영상 description generation에 적용한 최근 연구를 소개할것이다 [Xu et al., 2015Li et al., 2015].


Statistical Machine Translation


먼저 간단히 기계번역에 대해 전반적설명을 해보겠다. 사실상, 기계번역이라는 이름이 모든것을 말한다. 우리는 기계가 어떤 문자를 하나의 특정 언어로 번역해주기를 원한다. 다시말해 우리는 source sentence라고 불리는 것을 다른 언어의 문자에 부합한 문장 바꾸고 즉 target sentence로 바꿔주길 원한다. (비록 이상적으로 기계가 하나의 전체 문서를 한 언어에서 다른 언어로 번역할수 있어야만 하나, 이 포스팅에서는 문서단위가 아닌 문장단위의 기계번역에 대한 블로깅에 초첨을 맞추겠다.)

언어를 번역할수 있는 기계를 만드는것에는 많은 방법들이 있다. 예를들어, 우리는 2개국어를 하는 사람에게 source sentence를 올바른 번역으로 바꾸는 한 규칙집합을 달라고 요청할 수 있다. 그러나 이는 좋은 해결법은 아니다. 왜냐하면 우리는 하나의 언어(모국어)의 기저에 있는 규칙들의 집합도 모르기 때문에, 언어들의 한짝(pair)에 있는 법칙들은 말할 필요도 없다. 이것은 source sentence를 올바른 번역본으로 번역하는것에 대해 하나도 빠짐없는 완벽한 규칙을 쓰는것은 희망이 없어보인다. 그러므로, 이 포스팅에서, 우리는 이러한 규칙들이(암묵적이든 형식적이든) 큰 말뭉치로부터 자동적으로 추출하는 방식의 통계적인 접근에 초점을 맞춘다.

기계번역에대한 통계적 접근을 우리는 통계적 기계번역(statistical machine translation)이라 부른다. 목적은 같다. (한 언어로부터 다른언어로 한 문장을 번역하는 기계를 만드는 것) 그러나 우리는 데이터로부터 기계를 위한 규칙집합을 만들기보다는 번역을 하는 방법을 학습하게 했다. (Fig.1 의 그림을 보라.) 학습은 기계학습에 대한 기초적 강좌를 수강한 사람이라면 누구에게나 친숙한 통계적 방법에 기초했다. 사실상, 통계적 기계번역이란 단지 기계학습의 하나의 특정적용일 뿐이다. 이 방식은 source sentense에서 대응되는 target으로 맵핑을 하는 함수를 찾는것이다. 
 


기계번역에 대한 하나의 중요한 특징은 목표(번역) 함수가 기계학습에 대한 많은 다른 적용들에서 같이(예를들어, 분류문제 (다대일) 일대일 혹은 다대일 이 아니라 하나의 source sentence가 많은 가능한 문장들로 변역될수 있다는 측면에서 일대다 라는 점이다. 이것 때문에, 우리는 번역 함수를 결정론적(deterministic) 함수가 아닌 목적문장(번역)의 조건부확률p(y|x)로써 모델링 한다. 이 조건부확률은 하나 이상의 잘 나뉘어진 배치(configuration) 혹은 문장들에 동등한 높은 확률을 적용한다. 이것은 source와 targe(목적) 문장들 간의 일대다 관계로 이끈다.


이제 당신이 영어로된 source sentence를 불어로된 target sentence로 번역하는 통계적 기계번역시스템을 만들고 싶다고 해보자. 첫번째 그리고 아마 가장 중요한 일은 source sentence와 이에 따른 반응 번역(target sentence)를 모으는 것이다.  source sentense와 이들의 반응 번역들을 나타내기 위해 각각 x^ny^n으로 나타내겠다. 승수자리에 있는 n은 이것이 많은 짝들의 집합중에서 n 번째 짝이라는 것을 의미한다. (보통 정말 많은 짝들이 좋은 번역모델을 훈련하는데 필요하다.) N개의 짝들의 데이터셋을 표현하기 위해  D={(x^1,y^1), ..., (x^N, y^N)}  이렇게 나타낸다.


어디에 이 훈련 짝데이터들을 얻을수 있을까? 일반적으로 기계번역에서 사용되는 언어에 대해서는 Workshop on Statistical Machine Translation or the International Workshop on Spoken Language Translation를 확인해보기 바란다.


수중의  D={(x^1,y^1), ..., (x^N, y^N)} 훈련데이터들로, 우리는 D훈련데이터에 대해 모델이 얼마나 잘 작동하는지를 보는것으로 모델을 평가할 수 있게 됐다. 이 평가점수는 모델의 로그우도가 된다. 이 로그우도값은 각 짝  (x^n, y^n)에 대한 모델의 평균로그우도값이다. 기계번역모델의 확률적해석은, 각 짝에 대한 모델의 로그우도는 단순히 모델이 해당 짝에 로그확률을 얼마나 높게 할당하는지를 보여준다. 다시말해 모델을 정의하는 파라미터들의 집합을 나타내는 \log p(y^n | x^n, \theta)말한다. 그렇다면, 전반적인 훈련데이터에 대한 모델의 평가는 다음과 같다.


\mathcal{L}(\theta, D) = \sum_{(x^n, y^n) \in D} \log p(y^n|x^n, \theta).


만약 로그우도 \mathcal{L}이 낮다면, 그 모델은 올바른 번역 짝들에 충분한 확률질량(probability mass)을 주고있지 않다는 것이다. 이것은 몇몇 잘못된 번역들에 모델의 확률질량을 낭비하고 있다는 것을 의미한다. 그러므로 우리는 모델의 한 문장, 즉 이 로그우도를 최대화하는 파라미터 \theta의 값을 찾는것이다. 


기계학습에서는 이를 Maximum Likelihood Estimator라고 알려져있다. 그러나 더 중요한 문제가 남았다. 어떻게 p(y|x, \theta)을 모델링 할 것인가?


Statistical Machine Translation (almost) from Scratch


조건부확률 p(y|x) 분포를 모델링하는 방법에 대한 질문은 20여년전 IBM T.J. Watson Research Center에서 시작하여 오랫동안 다루어져왔다 [Brown et al., 1993 and references therein]. 통계적 기계번역(SMT)에서 그 당시에 주된 연구는 log-linear 모델이었다. 이 모델은 우리가 많은 피쳐들의 선형결합을 사용해 참조건부확률p(y|x)의 로그를 대략적으로 근사시킨다.


\log p(y|x) \approx \log p(y|x, \theta) = \sum_i \theta_i f_i(x, y) + C(\theta),


C는 일반화 상수이다. 이 케이스에서는, 연구의 가장 큰 부분은 좋은 피쳐함수f_i,의 집합을 찾는것이다. 그리고 이것에 대한 모든 세부사항을 잘 다룬 책이 있다. [Koehn, 2009].


이러한 SMT의 접근법에서, 종종 기계학습에 남는 유일한 것은 다른 피쳐들사이의 균형을 잘 맞추는 계수들의 집합을 찾거나, log-linear 모델로부터 해석된 잠재적인 번역들의 집합을 필터링 혹은 재순위 매기기 를 하는것이다 [Schwenk, 2007]. 더 자세히, 인공신경망은 피쳐함수를 찾는것과 n개의 최고로 가능한 번역들로 불리는 재순위매기기 이 두가지 역할로써 사용됐다. Fig.2의 중간과 오른쪽 판넬에 있는것이 이를 설명한것이다.



이 포스팅에서, 반대로 신경망 기계번역(neural machine translation)으로 최근에 제안된 방식에 초점을 맞추겠다. 이 방식은 Fig.2의 왼쪽 판넬에 있는것과 같이 SMT까지 포함하여 모델링한것이다.


Neural Machine Translation


일반적인 deep learning 과 같이, Neural machine translation (NMT)는 사전제작한 피쳐함수들에 의존하지 않는다. (사전에 제작된 피쳐함수들로 학습된 것이 아닌것을 말한다.) 오히려, NMT의 목적은 이것의 번역성능을 최대화 하기 위해, 훈련 말뭉치들에 기반해 모든 요소들을 조정한 완전학습이 가능한 모델을 만드는 것이다. 완전학습이 가능한 NMT 모델\mathcal{M}은 가능한한 순수 source 문장의 표현으로 시작하여, 가능한 한 target 문장의 순수 표현을 생성하는것으로 끝마친다. 여기 한 문장의 가장 순수(평소에 쓰는) 문장으로써 단어들의 연속을 고려해보자. (대부분의 자연어들에 관해서 이것은 사실이 아니다. 그러나 일반성의 손실없이, 한 단어를 최소한의 단위로 여길것이다.) 순서대로 있는 각 단어는 단어장에서 정수색인으로 표현된다. 예를 들어 빈도에 따라 정렬된 영어 단어장에서, 첫번째 단어가 정수1로 표현될 것이다.  source 문장을 표현하기 위해 X=(x_1, x_2, \dots, x_T)을 사용하고 target 문장을 표현하기 위해 Y=(y_1, y_2, \dots, y_{T'})으로 표현한다.

X=(x_1, x_2, \dots, x_T) 의 단어 인덱스들을 고려하여, NMT 모델 \mathcal{M}은 Y=(y_1, y_2, \dots, y_{T'}) 의 조건부확률을 계산한다. 다음은 어떻게 인공신경망이 조건부확률 p(Y|X)을 근사시키게 모델링하는지를 다루어 볼것이다.

Recurrent Neural Networks


기계번역의 한가지 중요한 특성, 혹은 자연어를 기반으로한 어떠한 연구에서 중요한 특성은 변동적인 길이의 input  X=(x_1, x_2, \dots, x_T) 과 output Y=(y_1, y_2, \dots, y_{T'})을 다룬다는 것이다. 다르게 말해서, T와 T'는 고정되어 있지 않다.

다양한 길이의 input과 output을 다루기 위해서, RNN(Recurrent Neural Network)를 쓸 필요가 있다. CNN(Convolutional Neural Network) 같은 더 보편적으로 쓰이는 Feed-forward Neural Networks는 네트워크상의 파라미터들을 제외하고는 내부상태를 유지하지 않는다. 하나의 단일표본이 feed-forward neural networks에 들어때마다, 신경망의 내부상태, 즉 은닉노드들의 활성화는 처음부터 계산되고 이전 표본으로부터 계산된 상태에 의해서는 영향을 받지 않는다. (즉 두 표본간에는 독립성질을 가지고 있다는 말) 반면에 RNN은 input 데이터를 연속적으로 읽으면서 이것의 내부상태를 유지한다. 우리의 경우에는 이것이 단어의 연속이 될 것이다. 그렇기 때문에 어떠한 길이의 input도 처리가 가능하다.

더 자세히 설명해보면, RNN의 뒤에 있는 주요한 생각은 반복을 사용하여 Input symbol들의 연속을 고정된 차원의 벡터로 압축하는 것이다. t 스텝에서 우리는 모든 이전 symbol들의 이력(histrory)인  h_{t-1} 이라는 한 벡터를 가졌다고 가정해보자. RNN은 새로운 벡터 즉 이것의 새로운 내부상태 h_t 를 계산할 것이다. 이 내부상태 h_t는 h_t = \phi_{\theta}(x_t, h_{t-1}),에 의해 새로운 symbol뿐 아니라 모든 이전의 symbol들을 압축한 것이다. 여기서 \phi_{\theta}는 새로운 symbol x_t를 인풋으로 받아들인 \theta에 의해 매개변수화된 함수를 말한다. history  h_{t-1} (t-1) 까지의 symbols들을 말한다. 처음에는 h_0 가 영벡터라고 가정할 수 있다.



예를들어 Recurrent activation function은 종종 요소단위별 비선형 함수에 의한 단순한 아핀변환으로 실행된다.


h_t = \tanh(W x_t + U h_{t-1} + b).


이 공식에서, 파라미터들은 input 가중치 행렬 W, Recurrent 가중치 행렬  U 그리고 bias 벡터 b를 포함한다. 이것이 유일한 Recurrent activation function은 아니다.  새로운 Recurrent activation function을 만드는 것에 대해서 아직 많은 가능성들이 남아 있다. [Pascanu et al., 2014]로부터 몇몇 예제들이 Fig.3에 있다.


이 단순한 RNN은 CPU 또는 GPU 둘중 하나에서 실행되는 Theano를 사용하여 매우 쉽게 구현될 수 있다.  Recurrent Neural Networks with Word Embeddings를 참고해라, 모든 RNN 코드들이 10줄 미만으로 쓰여졌다는 것에 주목할만하다.


최근에, Long-Short Term Memory(LSTM) unit [Hochreiter and Schmidhuber, 1997]과 Gated Recurrent unit [Cho et al., 2014] 같은 최신의 활성화함수들로 RNN을 학습하는것이 더 낫고 쉬워졌음을 볼 수 있다.




단순한 Recurrent 활성화함수에 있던것과 마찬가지로, 파라미터들은 input 가중치 행렬들  W, W_r ,W_u , Recurrent 가중 행렬들  UU_rU_u 그리고 편향 벡터들 bb_rb_u을 포함하고 있다.


비록 이러한 unit들이 단순 RNN보다는 더 복잡해 보일지라도, Theano 또는 Torch같은 다른 deep learning framework로 간단해 질수 있다. 예를 들어 다음 예제를 확인해봐라 LSTM Networks for Sentiment Analysis (example code).


RNN을 history compressor로 설명했다. 그러나 이것은 확률적 모델 시퀀스에 사용될수도 있다. 확률적 시퀀스로 모델링하여 어느 주어진 시퀀스X=(x_1, x_2, \dots, x_{T})의 확률 p(X) 계산하는 기계학습 모델을 말한다. 어떻게  우리가p(X)를 recurrence를 써서 표현할수 있을까?


 p(X) = p(x_1, x_2, \dots, x_{T})를 p(x_1, x_2, \dots, x_{T}) = p(x_1) p(x_2 | x_1) p(x_3 | x_1, x_2) \cdots p(x_T | x_1, \dots, x_{T-1}),로 다시 쓰는것 부터 시작해보자. p(x_1, x_2, \dots, x_{T}) = p(x_1) p(x_2 | x_1) p(x_3 | x_1, x_2) \cdots p(x_T | x_1, \dots, x_{T-1}),는 조건부확률의 정의로부터 나왔다  p(X|Y) = \frac{P(X, Y)}{P(Y)}. 이것으로부터, 우리는 다음과 같이 recursive formula을 만들수 있다.

p(x_1) p(x_2 | x_1) p(x_3 | x_1, x_2) \cdots p(x_T | x_1, \dots, x_{T-1}) = \prod_{t=1}^T p(x_t | x_{<t})

이제 RNN이 아래 식에 의해 각 t시점에서  p(x_t | x_{<t})를 모델링하도록 하자.

p(x_t | x_{<t}) = g_{\theta}(h_{t-1})
h_{t-1} = \phi_{\theta}(x_{t-1}, h_{t-2}).

g_{\theta}는  h_{t-1}를 통해  (t-1)번째 symbol까지의 전체 history에 대한 조건부 확률분포를 출력한다. 다르게 말하면, 각 t 스텝에서, RNN은 input symbol들의 history를 고려해 다음 symbol들을 예측하려고 한다.


RNN에 대한 많은 흥미로운 속성들과 특징들이 있다. RNN에 대해 더 관심이 있는 독자는 아래 논문들을 읽어보거나 혹은 다음 슬라이드를 확인해보길 바란다. my slides on how to use recurrent neural networks for language modeling.


  • Graves, Alex. “Generating sequences with recurrent neural networks.” arXiv preprint arXiv:1308.0850 (2013).
  • Pascanu, Razvan et al. “How to construct deep recurrent neural networks.” arXiv preprint arXiv:1312.6026 (2013).
  • Boulanger-Lewandowski, Nicolas, Yoshua Bengio, and Pascal Vincent. “Modeling temporal dependencies in high-dimensional sequences: Application to polyphonic music generation and transcription.” arXiv preprint arXiv:1206.6392 (2012).
  • Mikolov, Tomas et al. “Recurrent neural network based language model.” INTERSPEECH 2010, 11th Annual Conference of the International Speech Communication Association, Makuhari, Chiba, Japan, September 26-30, 2010 1 Jan. 2010: 1045-1048.
  • Hochreiter, Sepp, and Jürgen Schmidhuber. “Long short-term memory.” Neural computation 9.8 (1997): 1735-1780.
  • Cho, Kyunghyun et al. “Learning phrase representations using rnn encoder-decoder for statistical machine translation.” arXiv preprint arXiv:1406.1078 (2014).
  • Bengio, Yoshua, Patrice Simard, and Paolo Frasconi. “Learning long-term dependencies with gradient descent is difficult.” Neural Networks, IEEE Transactions on 5.2 (1994): 157-166.

이 포스팅에서는 기계번역을 소개했고 어떻게 SMT가 기계번역의 문제에 접근했는지를 설명했다. SMT의 프레임워크에서, 어떻게 인공신경망이 전반적인 번역성능을 향상하는데 사용될 수 있는지를 보였다.


이 블로그 시리즈는 neural machine translation에 대한 최신 패러다음을 소개하는 것이다. 이 포스팅은 RNN의 두가지 중요기능에 집중하여 기초작업을 했다. :순서요약(Sequence summarization)그리고 순서에 대한 확률적 모델링(probabilistic modeling of sequences).


이 두 특징에 기초해, 다음 포스트는 RNN에 기초한 실제 neural machine translation system을 설명할 것이다. 또한 왜 GPU가 NMT(Neural Machine Translation)에 중요한지를 보일것이다.