使用基于单词的模型时需要处理规模庞大的词汇表,例如Word2Vec,是利用word embedding的方法来得到每一个word的vec,这种方法需要去处理规模庞大的词汇表。这种方式虽然效果不错,但是对于单词而言,只要稍微做些改变就是另一个单词了。造成的后果:
OOV(out-of-vocabulary)出现单词不存在于词汇库中的情况。解决方法:最佳语料规模,使系统能够获得更多的词汇量;拼写错误。解决方法:矫正或加规则约束;对名字和地名的音译。基于 Character 作为基本单位的,这种方式能够很好的对字库中每一个 Char 进行向量表示。对比word embedding,character embedding有以下几个优点:
解决基于词级模型的OOV 问题为不存在的词生成embedding,拼写相似的单词具有相似的 embedding存在问题:
序列变长:相比于 词级(word-level ), 字符级(Character-level) 的输入句子变长,使得数据变得稀疏,而且对于远距离的依赖难以学到,训练速度降低; 解决办法:Jason Lee等人提出(Fully Character-Level Neural Machine Translation without Explicit Segmentation 原文点此)利用多层 conv 和 pooling 和 highway layer 的方式来解决该问题 该论文思路如下: 1.输入的字符首先需要经过 Character embedding 层,并被转化为 character embeddings 表示; 2.采用 不同窗口大小的卷积核对输入字符的 character embeddings 表示进行卷积操作,论文中采用的窗口的大小分别为 3、4、5 ,也就是说学习 Character-level 的 3-gram、4-gram、5-gram; 3.对不同卷积层的卷积结果进行 max-pooling 操作,即捕获其最显著特征生成 segment embedding; 4.segment embedding 经过 Highway Network (有些类似于Residual network,方便深层网络中信息的流通,不过加入了一些控制信息流量的gate); 5…输出结果 再经过 单层 BiGRU,得到最终 的 encoder output; 6.之后,decoder再利用Attention机制以及character level GRU进行decode。 通过这种方式不仅能够解决 Word-level 所存在的 OOV 问题,而且能够捕获 句子的 3-gram、4-gram、5-gram 信息,这个也是 后期 FastText 的想法雏形;