단일 언어 코퍼스를 활용하기
Last updated
Last updated
번역 시스템을 훈련하려면 다량의 병렬 코퍼스가 필요합니다. 필자의 경험상 대략 최소 300만 문장 쌍이 있으면 완벽하지는 않지만 나름 쓸만한 번역기가 나오기 시작합니다. 하지만 인터넷에는 수치로 정의하기도 힘들 만큼 단일 언어 코퍼스가 널려 있는데 반해, 병렬 코퍼스를 대량으로 얻기란 굉장히 어려운 일입니다. 또한, 단일 언어 코퍼스가 그 양이 많다 보니 실제 우리가 사용하는 언어의 확률 분포에 더 가까울 수 있고, 따라서 더 나은 언어 모델을 학습할 때 훨씬 유리합니다. 즉, 앞으로 소개할 기법들은 병렬 코퍼스 이외에도 추가적으로 다량의 단일 언어 코퍼스를 활용하여 해당 언어의 언어 모델을 보완하는 것이 주 목적입니다. 이번 절은 이러한 저렴한 단일 언어 코퍼스를 활용하여 신경망 기계번역 시스템의 성능을 쥐어짜는 방법들을 다룹니다.
단일 언어 코퍼스를 단방향 코퍼스, 병렬 코퍼스를 양방향 코퍼스라고 부르기도 합니다.
이 그림에서 설명하는 방법은 요슈아 벤지오Yoshua Bengio 교수의 연구실에서 제안한 방법[19]입니다. 언어 모델을 명시적으로 앙상블하여 디코더의 성능을 올리고자 했습니다. 여기서는 두 개의 서로 다른 모델을 사용하는 'shallow fusion' 방법보다, 언어 모델을 seq2seq에 포함시켜 end2end 학습을 통해 한 개의 모델로 만드는 'deep fusion' 방법이 더 나은 성능을 나타냈습니다. 두 방식 모두 단일 언어 코퍼스를 활용하여 언어 모델을 학습한 후, 실제 번역기를 훈련 시킬 때는 신경망 웨이트 파라미터 값을 고정한 상태로 seq2seq 모델을 훈련합니다.
다음 테이블은 터키어 $\rightarrow$ 영어 기계번역 성능을 각 방법을 적용하여 실험한 결과입니다. 뒤에서 다룰 내용들보다 성능 측면에서의 이득은 적지만, 수집한 단일 언어 코퍼스를 전부 활용할 수 있다는 장점이 있습니다.
이번 절에서 다룰 내용들은 전부 에든버러 대학교의 Nematus 번역시스템[49]에서 제안되고 사용된 내용들입니다.
저자인 리코 센리치Rico Sennrich는 방금 살펴본 것처럼 명시적으로 언어 모델을 앙상블하는 대신, 디코더로 하여금 단일 언어 코퍼스를 학습하는 방법을 제안하는 논문[50], [51]을 출판했습니다. 예전 장에서 다루었듯이 seq2seq의 디코더는 조건부conditional 신경망 언어 모델(NNLM)이라고 할 수 있는데, 소스 문장인 $X$ 를 빈 입력으로 넣어줌으로써 (그리고 어텐션 등을 모두 드롭아웃 하여 끊어줌으로써) 인코더로부터 전달되는 정보들을 없애는 것이 이 방법의 핵심입니다. 리코 센리치는 이 방법을 사용하면 디코더가 단일 언어 코퍼스를 활용하여 언어 모델을 학습하는 것과 같다고 했습니다.
한편 같은 논문[50], [51]에서는 좀 더 발전된 다른 방법도 함께 제시했습니다. 기존의 훈련된 반대 방향 번역기를 사용해 단일 언어 코퍼스를 기계번역해 합성synthetic 병렬 코퍼스를 만든 후, 이것을 기존 양방향 병렬 코퍼스에 추가하여 훈련에 사용하는 방식입니다. 중요한 점은 기계번역으로 만들어진 합성 병렬 코퍼스를 사용할 때, 반대 방향 번역기의 훈련에 사용한다는 것입니다.
사실 번역기를 만들면 하나의 병렬 코퍼스로 두 개의 번역 모델을 만들 수 있습니다. 예를 들어 한국어와 영어로 이루어진 병렬 코퍼스가 있다면, 자연스럽게 영한 번역기뿐만 아니라 한영 번역기도 얻게 될 것입니다. 따라서 이 방법은 이렇게 동시에 얻어지는 두 개의 모델을 활용해 서로 보완하여 성능을 높이는 방법을 제시합니다.
예를 들어 한국어 단일 언어 코퍼스가 있을 때, 기존에 훈련된 한 $\rightarrow$ 영 번역기에 기계번역시켜서 한영 합성 병렬 코퍼스를 만들고, 이것을 기존에 수집한 오리지널 한영 병렬 코퍼스와 합쳐서 영 $\rightarrow$ 한 번역기를 훈련시키는 데 사용하는 것입니다. 이러한 방법의 특징 때문에 back translation이라고 명명되었습니다.
이 테이블은 더미dummy 문장을 활용한 방법과 back translation 방식에 대해 영어 $\rightarrow$ 독일어 성능을 실험한 결과를 보여줍니다. 두 가지 방법 모두 사용했을 때 성능이 제법 향상되었음을 알 수 있습니다. 병렬 코퍼스와 거의 같은 양의 단일 언어 코퍼스가 각각 쓰였는데요. 앞에서 언급했듯이, 명시적으로 언어 모델을 앙상블하는 방식에서는 코퍼스 사용량의 제한이 없었지만, 이 방식에서는 기존의 병렬 코퍼스와 합성한 병렬 코퍼스를 섞어서 동시에 훈련에 사용하므로 단일 언어 코퍼스의 양이 매우 많아집니다. 다만 지나치게 많은 합성 병렬 코퍼스가 생성 되어 쓰이면 주객전도 현상이 일어날 수 있으므로, 그 양을 제한하여 훈련에 사용해야 합니다.
이 방식은 센리치 교수의 에든버러 대학 연구실에서 출판한 논문[9]에서 제안되었습니다. 앞서 설명한 기존의 더미 문장을 활용한 방식에서 좀 더 발전한 방식입니다. 기존의 방식 대신, 소스 쪽과 타깃 쪽에 똑같은 데이터를 넣어 훈련시키는 것입니다. 기존의 더미 문장을 인코더에 넣는 방식은 인코더에서 디코더로 가는 길을 훈련할 때 드롭아웃 처리해주어야 했지만, 이 방식은 그럴 필요가 없다는 게 장점입니다. 하지만 소스 언어의 어휘vocabulary에 타깃 언어의 어휘가 포함되는 불필요함을 감수해야 합니다. 보통은 back translation 방식과 함께 사용됩니다. 이 방법은 copied translation이란 이름으로 불립니다.
이와 같이 여러 방법들이 제안되었지만, 지금까지 설명한 방법 중에서는 구현할 때의 용이성과 효율성 때문에 back translation과 copied translation이 가장 많이 쓰이는 추세입니다. 이 두 가지는 매우 직관적이고 간단한 방법이면서도 효과적인 성능 향상을 얻을 수 있습니다.
방법
실험 1
실험 2
실험 3
실험 4
NMT
18.40
18.77
19.86
18.64
NMT+LM (Shallow)
18.48
18.80
19.87
18.66
NMT+LM (Deep)
20.17
20.23
21.34
20.56
방법
병렬 코퍼스 크기
단일 언어 코퍼스 크기
실험 1
실험 2
기존
3,700만
19.9
22.8
+ dummy
4,900만
4,900만
20.4
23.2
+ back translation
4,400만
3,600만
22.7
25.7
방법
터키어 $\rightarrow$ 영어
영어 $\rightarrow$ 터키어
back-translation
19.7
14.7
+copied
19.7
15.6