记录一下找到的写的比较好的博客
1.word、subword和character
在神经机器翻译中,通常有一个固定的词表,并且模型的训练和预测都非常依赖这个词表。在神经网络的训练过程中,需要对词表中每个词做向量表,每个词对应不同的向量,即embedding的过程。每个不同的词对应不同的向量,即使两个词看起来十分相近,但在训练过程词向量没有任何关系。这就导致一个单词因为拥有不同的形态产生不同的词,从而产生大词汇量的问题。
机器翻译的词表是定长的,但是需要实际翻译的词汇是开放的(out of vocabulary)。以前的做法是新词汇添加到词典中,但是过大的词典会带来两个问题:
稀疏问题: 某些词汇出现的频率很低,得不到充分的训练
计算量问题: 词典过大,也就意味着embedding过程的计算量会变大
同时,这种word-level的处理方式并不能通过增大词表真正解决OOV的问题,因为再大的词典不能真正覆盖所有的词汇。
为了处理这个问题,一个思路是将字符当做基本单元,建立character-level模型。character-level模型试图使用26个字母加上一些符号去表示所有的词汇,相比于word-level模型,这种处理方式的粒度变小,其输入长度变长,使得数据更加稀疏并且难以学习长远程的依赖关系。类似的工作可参考Character-Level Neural Machine Translation,实验结论是基于字符的模型能更好处理OOV问题,并且能更好学习多语言之间通用的语素。
word-level模型导致严重的OOV,而character-level模型粒度又太小,那么subword-level的处理方式就应运而生。subword将单词划分为更小的单元,比如"older"划分为"old" 和 “er”,而这些单元往往能应用到别的词汇当中。举个例子:
训练集的词汇: old older oldest smart smarter smartest
word-level 词典: old older oldest smart smarter smartest 长度为6
subword-level 词典: old smart er est 长度为4
将词划分成字词的形式,能够大大降低词典的大小。同时,未知词汇能以subword组合的形式表示出来,也能提升词典的表达能力。
- 3种subword算法
如何将词分解成subword,依据不同的策略,产生了几种主流的方法: Byte Pair Encoding (BPE)、wordpiece 和 Unigram Language Model。值得一提的是,这几种算法的处理流程跟语言学没有太大的关系,单纯是统计学的解决思路。
https://zhuanlan.zhihu.com/p/112444056