본문 바로가기

AI/NLP Paper

[NLP] Neural Machine Translation of Rare Words with Subword Units(BPE) 리뷰

https://arxiv.org/pdf/1508.07909.pdf

 

Abstract

이전의 Neural machine translation(NMT)는 고정된 단어장에서 작동했지만, 번역은 open-vocabulary problem입니다. 이는 OOV(Out of Vocabulary) 문제에 취약할 수밖에 없습니다. 

 

이 논문에서는 희귀하거나 모르는 단어를 subword units의 연결로 encoding 함으로써 open-vocabulary 번역을 가능하게 하는 방법을 소개합니다.

 

Introduction

최근의 Neural machine translation은 인상적인 결과를 보여주지만 희귀 단어에 대한 번역은 해결되지 않은 문제입니다. 

 

open vocabulary problem, 특히 교착어나 합성어와 같은 생산적인 단어 형성 과정(없던 단어를 만들어냄)을 가진 언어들 때문에 번역은 단어 수준 이하로 내려가는 모델을 필요로 합니다.

 

지금까지의 단어 수준 NMT모델들은 out-of-vocabulary 단어에 대하여 back-off to dictionary look-up(사전을 찾아본다(?))방법을 사용했습니다. 또한, 보지 못 한 단어들을 생성하거나 번역하지 못합니다.

 

Back-off to dictionary look-up 은 아마 희귀 단어를 모아놓은 단어장을 만들어놓고 거기서 찾아온다는 느낌인 것 같습니다. 정확히는 모르겠네요.... 허허

 

이에 논문에서는 subword units 수준으로 동작하는 NMT모델을 연구했고, 이 모델의 주된 목표는 희귀 단어에 대한 back-off 모델을 요구하지 않고 네트워크 그 자체에서 open-vocabulary 번역을 수행하게 하는 것입니다.

이 논문은 두 가지의 기여를 했습니다.

 

  • open vocabulary 기계 번역은 희귀 단어(rare word)를 subword units를 통해 인코딩함으로써 가능해졌습니다. 
  • word segmentation 방법으로 byte pair encoding(BPE)를 채택했습니다. BPE는 가변 길이 시퀀스의 고정 크기 어휘를 통해 open vocabulary를 표현할 수 있으므로, neural network model에서의 word segmentation에 적합한 방법입니다.

 

Neural Machine Translation

논문에서는 Bahdanau와 연구진이 2015년에 만든 신경망 기계 번역 구조를 따릅니다. 간단하게 설명을 하지만 정확한 구조는 아니라는 점은 주의하시길 바랍니다.

 

신경망 기계 번역은 RNN을 이용한  encoder-decoder 구조로 구현됐습니다.

 

Encoder는 gated recurrent units를 가진 양방향 신경망입니다. 인코더는 입력 시퀀스 $x = (x_1, \cdots, x_m)$을 읽고 순방향 hidden states $(\overrightarrow{h_1}, \cdots, \overrightarrow{h_m})$와 역방향 hidden states $(\overleftarrow{h_1}, \cdots, \overleftarrow{h_m})$를 계산합니다. 그리고 hidden states $\overrightarrow{h_j}$와 $\overleftarrow{h_j}$를 합쳐서(concatenate) annotation 벡터 $h_j$를 만듭니다.

 

Decoder는  target 시퀀스($y = (y_1, \cdots, y_n)$)를 예측하는 recurrent neural network입니다. 각 단어 $y_i$는 recurrent hidden state $s_i$, 이 전 예측 단어 $y_{i-1}$ 그리고 context vector $c_i$를 기반으로 예측됩니다.

 

$c_i$는 $h_j$의 가중합으로 계산되고, 그때의 가중치는 alignment model $\alpha_{ij}$에 의해 계산됩니다. alignment model은 네트워크의 나머지 부분과 back-propagation을 통해 함께 학습되는 single-layer feedforward 신경망입니다.

 

Subword Translation

이 논문의 주요 동기는 몇몇 단어의 번역은 투명하다(?)는 것입니다. 유능한 번역가들이 처음 보는 단어라도 그들이 알고 있는 subword를 조합하여 번역이 가능한 것과 비슷한 맥락입니다. 번역이 투명할 수 있는 단어들은 아래와 같은 경우가 있습니다.

번역이 투명하다...?라는 말이 어떻게 번역했는지 알 수 있다는 말인지... 잘 모르겠네요. 모르는 단어를 어떻게 번역했는지를 이해하기 쉽다? 정도로 저는 이해했습니다.
  • named entities(명명된 객체, 이름이나 고유명사 같은 것들)은 음절별로 대응시킵니다.
    • Barank Obama (English ; German)
    • Барак Обама (Russian)
    • バラク・オバマ (ba-ra-ku o-ba-ma) (Japanese) 
  • 동의어와 외래어같이 origin이 있는 단어들은 규칙적인 방식을 통해 변화하므로 character-level 번역이 필요합니다.
    • claustrophobia (English)
    • Klaustrophobie (German)
    • Клаустрофобия (Klaustrofobiâ) (Russian)
  • compunding, affixation, inflection을 통해 형성된 여러 형태소를 포함하는 단어는 형태소를 별도로 번역하여 번역 가능합니다.
    • solar system (English)
    • Sonnensystem (Sonne + System) (German)
    • Naprendszer (Nap + Rendszer) (Hungarian)

위의 방법을 이용해서 불어 훈련 데이터에서의 희귀 단어 100개를 분석해본 결과 대부분의 토큰을 smaller units를 통해 영어로 번역할 수 있었습니다. (56개의 합성어, 21개의 고유명사, 6개의 외래어(origin을 갖고 있는), 5개의 affixation, 1개의 숫자, 1개의 프로그래밍 언어를 찾아냈습니다.)

 

Related Work

OOV는 고유명사 (사람 이름, 지역명) 등에 대해서 자주 발생합니다.

 

이를 해결하기 위해 character level로 word를 분리한 뒤, 각 character들이 일정한 기준을 충족할 경우 하나의 token으로 묶어 표현하는 방식을 채택했습니다. 이를 통해 text size는 줄어들게 됩니다.

 

이때 단어를 subword로 구분하는 기존의 Segmentation algorithm을 사용하되, 좀 더 aggressive 한 기준을 적용하고자 했습니다.

 

vocabulary size와 text size는 서로 trade-off 관계이므로 vocabulary size가 감소한다면 시간/공간 복잡도는 낮아지겠지만 unknown word의 개수가 증가하게 됩니다.

 

Byte Pair Encoding(BPE)

import re, collections

def get_stats(vocab):
  pairs = collections.defaultdict(int)
  for word, freq in vocab.items():
    symbols = word.split()
    for i in range(len(symbols)-1):
      pairs[symbols[i], symbols[i+1]] += freq
  return pairs

def merge_vocab(pair, v_in):
  v_out = {}
  bigram = re.escape(' '.join(pair))
  p = re.compile(r'(?<!\S)' + bigram + r'(?!\S)')
  for word in v_in:
    w_out = p.sub(''.join(pair), word)
    v_out[w_out] = v_in[word]
  return v_out

vocab = {'l o w </w>' : 5,
         'l o w e r </w>' : 2,
         'n e w e s t </w>' : 6,
         'w i d e s t </w>' : 3}
num_merges = 10

for i in range(num_merges):
  pairs = get_stats(vocab)
  best = max(pairs, key=pairs.get)
  vocab = merge_vocab(best, vocab)
  print(best)
  
# r .  ->  r.
# l o  ->  lo
# lo w ->  low
# e r. ->  er.

BPE는 가장 빈도가 높은 pair of bytes를 single byte로 바꿔주는 간단한 데이터 압축 기법입니다.

 

BPE는 다음과 같은 과정을 거치며 진행됩니다.

  1. character vocabulary로 symbol vocabulary를 초기화하고, 각 단어를 일련의 문자로 표현한 후 끝부분에 ' $\cdot$ '을 추가합니다.
    여기서 $\cdot$은 번역 후에 원래의 토큰으로 복원할 수 있게 해주는 특수한 토큰입니다.
  2. 모든 symbol pairs의 횟수를 세고 가장 빈번하게 등장하는 pair('A', 'B')를 하나의 symbol 'AB'로 치환합니다. 각 병합 과정은 character n-gram으로 표현되는 새로운 symbol을 만들게 됩니다. 자주 등장하는 character n-grams는 결국 단일 symbol로 치환되기 때문에 BPE는 따로 shorlist가 필요 없습니다.

여기서 주의할 점은 BPE를 진행할 때 한 단어 내에서의 pair만 고려합니다.

 

논문에서는 BPE를 두 가지 방법으로 적용하고 평가했습니다.

  • source, target vocabulary를 따로 만들도록 독립적으로 학습

  • 2개를 합쳐서 한 번에 학습(joint BPE)

첫 번째 방법은 text size와 vocabulary size를 좀 더 compact 하게 했고, 만들어진 subword unit이 훈련 데이터 내에 존재한다는 장점이 있습니다.

 

반면에 두 번째 방법은 source, target의 segmentation사이의 연관성을 향상했습니다.

 

Evaluation

영어 $\rightarrow$ 불어의 경우 420만 개의 문장 쌍, 대략 1억 개의 토큰을 학습 데이터로 사용했고, 영어 $\rightarrow$ 러시아어의 경우 260만 개의 문장 쌍, 대략 5천만 개의 토큰을 학습 데이터로 사용했습니다.

 

평가 지표로는 BLEU와 영어 번역에서 인간의 판단과 비슷하다고 알려진 character n-gram $F_3$ score (CHRF3)를 사용했습니다. 

또한, rare/OOV에 대해서는 $F_1$ score를 사용했습니다.

 

훈련에 사용된 모델들의 스펙은 다음과 같습니다.

  • hidden layer size : 1000
  • embedding layer size : 620
  • shortlist ($\tau$ = 30000)
  • Optimizer : Adadelta
  • minibatch size : 80
  • 에폭 마다 훈련 데이터 섞음

Table 1은 번역 성능과 별개로 불어에서의 각 segmentation방법의 결과를 통계적으로 나타낸 표입니다.

  • # tokens : sequence length
  • # types : vocabulary size

결과를 보면 BPE를 사용하지 않은 이전의 방법들은 unknown word problem을 해결하지 못한 것을 볼 수 있습니다.

 

  • WDict : back-off dictionary를 이용한 단어 수준 모델
  • WUnk : back-off dictionary 없이 OOV를 UNK로 전부 치환한 단어 수준 모델

    (아래는 subword model)

  • C2-50K : char-bigram 사용 (shortlist of 50000 unsegmented words)
  • BPE-60K : 독립 BPE사용(source, target 데이터에 대해 각각 BPE적용)
  • BPE-J90K : joint BPE사용 모델

단어 수준의 모델끼리 비교해보면 back-off dictionary 사용 모델이 rare/unseen word에 대한 unigram F1 score이 향상되는 것을 볼 수 있습니다.  

 

subword system을 이용한 모델을 보면 rare word에 대한 unigram F1 score에서는 영어 $\rightarrow$ 불어, 영어 $\rightarrow$ 러시아어 둘 다 성능이 향상됐습니다.

OOV에 경우는 transliteration이 가능한 불어의 경우는 back-off dictionary를 이용한 모델의 성능이 높았습니다. 하지만 러시아어의 경우 subword model의 성능이 훨씬 좋은 것을 볼 수 있습니다.

 

전체적으로 볼 때 subword모델이 웬만해서 back-off dictionary모델에 비해 성능이 좋습니다.

 

  • C2-3/500K : WDict과 vacabulary size가 같고 character bigram을 사용한 모델.

Manual Analysis

Conclusion

이 논문의 주요 공헌은 신경망 기계 번역 시스템이 rare/unseen word를 subword units의 연속으로 표현하여 open-vocabulary 번역을 가능하게 함을 보였다는 것입니다.

또한 분석을 통해 OOV word뿐 아니라 rare word의 번역이 baseline NMT에서 잘 되지 않았고, subword 모델의 vocabulary size를 줄이는 것이 실제로 성능을 향상하는 것을 보였습니다.

이러한 방법에 대한 상대적인 효과는 언어별 요인(예를 들어 단어장의 크기)에 따라 달라지겠지만, subword segmentation은 대부분의 언어 쌍에 적합할 것이며, 큰 NMT vocabularies나 back-off 모델에 대한 필요성을 없애줄 것입니다.

 

 


처음으로 논문을 읽고 정리해봤습니다.

 

처음이라 어떤 내용을 중점적으로 봐야 하는지, 어느 정도로 정리를 해야 하는지 몰라서 헤맸습니다 ㅎㅎㅎ;;

그리고 영어로 된 논문을 한글로 번역해서 쓸려고 하니까 이게 이해가 좀 안 되는 문장이 종종 보이네요... ㅋㅋㅋ

꾸준히 논문 읽고 정리하면서 연습하다 보면 점점 나아질 거라 믿습니다. 😄