본문 바로가기

머신러닝/[딥러닝을 이용한 자연어 처리]

RNN Neural Machine Translation

학습목표

RNN을 활용한 기계번역의 과정을 공부합니다.

핵심키워드

  • 기계번역(Machine Translation)
  • 소스 언어(Source Language)
  • 타겟 언어(Source Language)
  • 인코더(Encoder)
  • 디코더(Decoder)

학습하기

 제가 2015년도에 Bahdanau라는 분과 함께 진행했던 내용은, RNN을 통해 기계번역을 하자는 것이었구요. 이 경우 Bidirectional RNN을 사용했었습니다. 정방향과 역방향, 이 두가지 방향으로 RNN을 통해 토큰을 읽어내리면 두가지 방향의 컨텍스트를 종합한 Representation이 나오겠죠. 이 두개를 Concat시켜서 최종 Representation을 뽑아내니까, 소스 언어의 토큰 개수에 따라서 최종 Representation의 개수가 결정되겠죠. 결국 뽑아낸 Representation은 토큰을 보고 뽑아냈지만, 컨텍스트에 의존하게되겠죠. 문장에 어떻게 쓰였냐에 따라서 결정된다. 라는 말입니다. 기존 Token level representation은 컨텍스트를 고려해서 결정되진 않았었죠. 

 그런 다음에 타겟 언어의 경우에는 이게 번역 결과니까, 당연히 Bidirectional RNN을 쓸 수가 없어요. 그래서 Unidirectional RNN을 써서, 여태까지 번역한 토큰들을 입력으로 받구요. 이걸 RNN에 통과시켰으니 지금까지 번역한 내용들이 Summarize되어서 원 벡터로 출력되게 되겠죠. 이제 이걸 사용할겁니다.

 그렇게, 소스 언어로부터 다양한 Token representation(문맥이 고려된)을 얻어냈고, 타겟 언어로부터 한 벡터를 얻어낸 지금 이걸 둘 다 고려해서 이제 다음 번역 토큰을 내뱉어야할 텐데, 이걸 결합할 방법으로 저흰 Attention 을 활용했습니다. 다시한번, 여태까지 번역된 토큰들에 이어서 다음에는 무슨 토큰을 뱉어내야하는 문제에서, 당연히 소스 언어의 어디를 집중해야하냐가 하나의 문제니까 이게 곧 Attention 그 자체죠. 이걸 위해서 RN과 Weighting vector가 필요하겠죠. Weight가 높으면, 해당 토큰은 다음 결정에 굉장히 중요한거고, 낮으면 다음 결정에는 쓸모가 없는 토큰이고. 

 그렇게 모듈을 연결하면, 다음 과정은 다 똑같죠. Log Likelihood Prob을 로스로써 사용해서, GD를 통해 Param 최적화 진행하고 검증하고 평가하고.. 

 당시에는 Attention을 Search 모듈이라고도 했어요. 전체 토큰 중 어떤게 중요한지 Search해주는 개념이기도 하니까요. 그래서 아래 그림을 보시면, RNNSerach의 경우에는 문장의 길이가 길어져도 그 성능이 유지 되지만, 기존 RNN은 문장이 길어짐에 따라 급격히 성능이 떨어지죠. 

 Attention에 대해 조금 더 얘기해보죠. 사실 Text classification에서는 Attention의 역활이 조금 애매합니다. 문장을 어떤 클래스에 넣는건데 Attention이 뭘 하는가. 그런데 MT에서는 명확하죠. 타겟 언어의 토큰 하나를 만들기 위해 소스 언어의 어떤 토큰들을 봤냐라는 개념이니까요. 그래서 MT에서 Attention이 먼저 나오고, Self attention으로 확장이 된 거겠죠. 그래서 시각화하기에도 굉장히 좋아요. 아래 그림은 영어-불어, 영어-독일어 번역을 시각화한건데, 어떤 불어를 위해 어떤 영어를 봤는지가 명확하죠. 

  다만 처음에는 단점이 Vocab의 사이즈가 증가함에 따라서, 모델 Param도 늘어나는 문제가 있으니까, 이걸 해결할 알고리즘을 저희가 만들었었구요. 그 이후 1년 사이에, 여러 곳에서 이걸 개선시켜서 높은 점수를 따냈습니다. 지금에 와서는 구글, 아마존, 마이크로소프트, 페이스북 등 많은 곳에서 많은 언어에 대해 Neural Net 모델이 쓰이고있습니다. 

 더 멋진건, 이런 내용들이 이미 오픈소스화되어있기 때문에, 지금 말씀드린거 아무거도 몰라도, 그냥 쓰시면 바로 실용화가능한 모델을 만들 수 있으실겁니다. 

 또 구글의 Transformer의 경우에는 RNN도 빼고, Self attention을 쓴 건데 이거도 굉장한 성능입니다. 그리고 이런 내용들을 지금 말하는 MT에만 쓸 수 있는게 아니라, QnA에도, Image generation에도 다양하게 쓸 수 있습니다.

 또 이런것도 있습니다. Machine reading. 어떤 문단과 문제를 모델에게 주면, 그 문제에 대한 답을 문단에서 찾아서 뱉어주는거죠. 이거도 여태했던 내용으로 그대로 풀 수 있어요.

 첫 번째로 문단을 인코딩 해야겠죠. 그냥 Sentence representation을 찾는겁니다. RNN을 쓰든 CNN을 쓰든 Attention을 쓰든... 두 번째는 문제를 인코딩 하겠죠. 그 다음에 세 번째는 Attention입니다. 문맥의 어떤 단어가 이 문제에 필요한지 찾아내는 과정이죠. 그리고 스코어링을 하고, 최적화를 하고. 그러면 끝이죠. 결국 높은 점수를 갖는 토큰을 모아놓으면 그게 답이 될테니까요. 

 자 여태까지 했던 것을 요약해보면 아래와 같습니다. 결국 Sentence representation을 뽑아내는 조합을 어떻게 잘 결정하느냐에 따라 더 좋은 모델을 만들 수 있는 겁니다. 이상입니다.

'머신러닝 > [딥러닝을 이용한 자연어 처리]' 카테고리의 다른 글

Questions  (0) 2020.04.22
Learning to Describe Multimedia  (0) 2020.04.22
Encoder & Decoder  (0) 2020.04.20
Overview: a bit of history remark  (0) 2020.04.19
Summary  (0) 2020.04.18