【CS224n】Lecture 12: Information from parts of words: Subword Models

1. Character-Level Models

word embeddings可以由character embeddings组成,有以下好处:

  1. 生成未知词的embeddings;
  2. 相似的单词拼写可以共享相似的embeddings;
  3. 能够解决OOV问题(OOV=out of vocabulary,感觉第三点跟第一点有点像)

1.1. Purely character-level models

针对句子分类任务的纯字符粒度的模型的应用案例是:使用深度卷积网络来进行文本分类;
当然也可以用字符粒度的模型应用于机器翻译中,能比词粒度带来更好的性能,但是速度慢很多,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qbGl0Gw6-1589725488494)(evernotecid://331CA178-4507-4573-914C-34BF843F1D8C/appyinxiangcom/26093810/ENResource/p178)]
论文【Fully Character-Level Neural Machine Translation without Explicit Segmentation】使用多层的convolution, pooling与highway layer来解决这一问题,其中encoder的结构如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6beOvxYB-1589725488497)(evernotecid://331CA178-4507-4573-914C-34BF843F1D8C/appyinxiangcom/26093810/ENResource/p181)]
其中,highway network的结构如下图所示(有点类似于残差网络):
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lv5tMhgx-1589725488498)(evernotecid://331CA178-4507-4573-914C-34BF843F1D8C/appyinxiangcom/26093810/ENResource/p182)]
decoder部分使用char-level GRU进行解码。

2. Byte Pair Encoding

Byte Pair Encoding(BPE)是一种处理字符,对词进行分割的方法。具体步骤如下:

  1. 先列出词表中的所有单字符;
  2. 添加频率最高的ngrams字符对,直到达到指定的字符数。
    具体可以看一下以下的例子:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dCuKdK06-1589725488500)(evernotecid://331CA178-4507-4573-914C-34BF843F1D8C/appyinxiangcom/26093810/ENResource/p180)]
    词典中有四个词(low, lower, newest, widest)以及对应的频率,先列出词典中出现的所有单字符Vocab(l,o,w,e,r,n,w,s,t,i,d),其次,添加频率最高的字符对,比如(es,est)共出现9词,因此Vocab(l,o,w,e,r,n,w,s,t,i,d,es,est),再次,(lo)字符对出现7次,继续添加进词表中,即Vocab(l,o,w,e,r,n,w,s,t,i,d,es,est,lo),以此类推,不断添加频率较高的字符对,直到达到指定个字符数停止。
    谷歌的NMT模型用了BPE的变种,称作wordpiece model,BPE中利用了n-gram count来更新词汇库,而wordpiece model中则用了一种贪心算法来最大化语言模型概率,即选取新的n-gram时都是选择使得perplexity减少最多的ngram。

3. Hybrid NMT

Hybrid NMT的结构如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RlrmjcVp-1589725488501)(evernotecid://331CA178-4507-4573-914C-34BF843F1D8C/appyinxiangcom/26093810/ENResource/p183)]
其中,主逻辑部分还是使用word level进行训练,但当输入遇到OOV之类的词时,我们就建立一个char level的子结构,decoder时遇到的标记时,同样建立一个char level的子结构,训练过程是end2end的,不过损失函数是word部分与character level部分损失函数的加权叠加。
这部分改进的效果也是比较明显的:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7Ez8XA6I-1589725488503)(evernotecid://331CA178-4507-4573-914C-34BF843F1D8C/appyinxiangcom/26093810/ENResource/p184)]

4. FastText embeddings

FastText embeddings的基本思路是将每个word表示成bag of character n-gram以及单词本身的集合,例如对于where这个单词和n=3的情况,它可以表示为 <wh,whe,her,ere,re>, ,其中"<",">"为代表单词开始与结束的特殊标记。假设对于word w,其n-gram集合使用 G W G_W 表示,每个n-gram的矢量表示为 z g z_g ,则每个单词可以表示成其所有n-gram的矢量和的形式,而center word w 与context word c的分数就可表示成 s ( w , c ) = g G w z g T v c s(w,c)=\sum_{g\in G_w}z_g^Tv_c 的形式,然后按照经典的word2vec算法训练得到这些特征向量。
这种方式既保持了word2vec计算速度快的优点,又解决了遇到training data中没见过的oov word的表示问题。
参考:Stanford CS 224n lecture12
CS224N笔记(十二):Subword模型

猜你喜欢

转载自blog.csdn.net/Flying_sfeng/article/details/106182460