作者的观点:
在本文中作者认为神经机器翻译(Neural machine translation,NMT)模型通常使用固定的词汇量进行操作,但翻译是一个开放的词汇量问题。以前的工作是通过回退到字典(去了解后进行补充) 来解决词汇外词的翻译问题。在本文中作者引入了一种更简单有效的方法,通过将稀有和未知词编码为子词单元序列,使NMT模型能够进行开放词汇翻译。
本文的核心思想为:
不同的词类可以通过比单词更小的单位翻译,例如名称(通过字符复制或音译),复合词(通过组合翻译),同源词和外来词(通过音系和形态转换)。 同时,可变长度的表示比将单词编码为固定长度的向量直观上更有吸引力。
与同时间节点其他解决方案的对比
- 作者也指出了back-off to a dictionary这种方案的不足之处:这种技术所作的假设往往在实践中并不成立。例如,源词和目标词之间并不总是1对1的对应关系,这是因为语言之间的形态合成程度不同。
- 作者所处的时间节点上的另一种解决未知词的技术是:将未知单词复制到目标文本中。这听起来是一种较为合理的策略,但在实际的过程中往往需要进行形态变化和音译,尤其是在字母表不同的情况下。
作者的主要贡献
- 作者发现开放词汇神经机器翻译是可以通过以子词为单元进行编码来解决。并且体系结构比使用大型词汇表和后退词典更简单、有效。
- 将字节对编码(BPE)(Gage,1994),一种压缩算法,应用于分词任务。BPE允许通过可变长度字符序列的固定大小词汇表来表示一个开放的词汇表,使其成为一种非常适合神经网络模型的分词策略。
观点的来源
本文的主要动机是,一些词的翻译是透明的,即使对一个称职的译者来说是新奇的,也可以根据已知的子词单位(如语素或音素)的翻译来翻译。
BPE
字节对编码(BPE)(Gage,1994)是一种简单的数据压缩技术,它用单个未使用的字节迭代地替换序列中最频繁的字节对。
作者将此算法应用于分词,作者不是合并频繁的字节对,而是合并字符或字符序列。每个合并操作产生一个新的符号,它代表一个字符n-gram。
作者具体的做法如下:
1、将每个单词表示为一个字符序列,再加上一个特殊的词尾符号’·’,加入结束符的作用是在翻译后恢复原来完整的单词。
2、迭代地计数所有符号对,并用一个新符号’AB’替换最频繁的符号对(‘A’,‘B’)。每次合并都会产生一个新的n-gram符号。
3、最终的符号词汇表大小等于初始词汇表的大小,加上合并操作的数目-后者是算法的唯一超参数。
4、为了效率,作者不考虑跨越单词边界的对。因此,该算法可以在从文本中提取的字典上运行,每个单词都按其频率加权。
与其他压缩算法(如Huffman encoding)的主要区别在于,符号序列仍然可以解释为子词单元,并且网络可以进行泛化以翻译和生成新词在这些子词单位的基础上。
算法代码
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)
print(vocab)
不同实验方案
作者评估了两种应用BPE的方法:学习两种独立的编码,
- 分别用于源和目标词汇
- 学习两种词汇的联合编码(我们称之为联合BPE)。
前者的优点是在文本和词汇量方面更紧凑,并且更能保证每个子词单元都能在各自语言的训练文本中看到,而后者则提高了源和目标切分之间的一致性。作者发现单独应用BPE,相同的名字在两种语言中可能会被不同的切分,这使得神经模型更难学习子词单元之间的映射。