NLP基础之——Subword Model

一、word-level Model(基于词级模型)
使用基于单词的模型时需要处理规模庞大的词汇表,例如Word2Vec和 glove,是利用word embedding的方法来得到每一个word的vec,这种方法需要去处理规模庞大的词汇表。
这种方式虽然效果不错,但是对于单词而言,只要稍微做些改变就是另一个单词了。

存在的一些问题:
1.容易出现单词不存在于词汇库中的情况,也就是 OOV(out-of-vocabulary)
2.非正式拼写
3.拼写错误
4.对名字和地名的音译

二、Character-Level Model(字符级语言模型)
以Character 作为基本单位的,这种方式虽然能够很好的对字库中每一个 Char 进行向量表示。
单词嵌入可以由字符嵌入表示:
1.能为不知道的单词生成嵌入
2.相似的拼写有相似的嵌入
3.解决了oov问题
连接的语言可以被分解为字符
有些令人惊讶的是,传统上,音素/字母不是一个语义单元,但在DL模型中却是。
**缺点:**相比于 word-level , Character-level 的输入句子变长,使得数据变得稀疏,而且对于远距离的依赖难以学到,训练速度降低。
解决办法:
2017年,Jason Lee等人开发出一种(无显式分割的全字符级神经机器翻译)Fully Character-Level Neural Machine Translation without Explicit Segmentation,下图是该模型的Encoder,Decoder是一个char-level的GRU,利用了多层的convolution, 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 的想法雏形。

三、Subword model(子词模型)
基本单元介于字符与单词之间的模型称作Subword Model。那么Subword如何选择呢?Subword Model 可以被分为 Byte Pair Encoding(BPE) 和 SentencePiece。
BPE
Byte Pair Encoding,简称BPE。 BPE最早是一种压缩算法,基本思路是把经常出现的byte pair用一个新的byte来代替,例如假设(‘A’, ’B‘)经常顺序出现,则用一个新的标志’AB’来代替它们。
例:
假设我们的文本库中出现的单词及其出现次数为 {‘l o w’: 5, ‘l o w e r’: 2, ‘n e w e s t’: 6, ‘w i d e s t’: 3},我们的初始词汇库为{ ‘l’, ‘o’, ‘w’, ‘e’, ‘r’, ‘n’, ‘w’, ‘s’, ‘t’, ‘i’, ‘d’},出现频率最高的ngram pair是(‘e’,‘s’) 9次,所以我们将’es’作为新的词汇加入到词汇库中,由于’es’作为一个整体出现在词汇库中,这时文本库可表示为 {‘l o w’: 5, ‘l o w e r’: 2, ‘n e w es t’: 6, ‘w i d es t’: 3},这时出现频率最高的ngram pair是(‘es’,‘t’) 9次,将’est’加入到词汇库中,文本库更新为{‘l o w’: 5, ‘l o w e r’: 2, ‘n e w est’: 6, ‘w i d est’: 3},新的出现频率最高的ngram pair是(‘l’,‘o’)7次,将’lo’加入到词汇库中,文本库更新为{‘lo w’: 5, ‘lo w e r’: 2, ‘n e w est’: 6, ‘w i d est’: 3}。以此类推,直到词汇库大小达到我们所设定的目标。这个例子中词汇量较小,对于词汇量很大的实际情况,我们就可以通过BPE逐步建造一个较小的基于subword unit的词汇库来表示所有的词汇。
在这里插入图片描述
wordpiece/sentencepiece model
BPE中利用了n-gram count来更新词汇库,而wordpiece model中则用了一种贪心算法来最大化语言模型概率,即选取新的n-gram时都是选择使得perplexity(困惑)减少最多的ngram。
进一步的,sentencepiece model将词间的空白也当成一种标记,可以直接处理sentence,而不需要将其pre-tokenize成单词。

四、Hybrid NMT(混合字符)
Hybrid NMT为在大多数情况下我们还是采用word level模型,而只在遇到OOV的情况才采用character level模型。
混合模型即两种方式并存的模型,在正常处理时采用word-level的模型,当出现奇怪的词的后,使用char-level级的模型。
其结构如下图所示,大部分还是依赖于比较高效的word level模型,但遇到例子中的"cute"这样的OOV词汇,我们就需要建立一个character level的表示,decode时遇到这个表示OOV的特殊标记时,就需要character level的decode,训练过程是end2end的,不过损失函数是word部分与character level部分损失函数的加权叠加。
在这里插入图片描述
五、Chars for word embeddings(单词嵌入的字符)
采用subword的方式长生词向量,课程中提到了FastText。主要思路为:
1.字符的卷积来生成词嵌入
2.使用pos标记固定的窗口

FastText
使用n-grams和整个单词来代表单词。
  我们知道在word2vec方法中我们基于word-level的模型来得到每一个单词的embedding,但是对于含有许多OOV单词的文本库word2vec的效果并不好。那么我们可不可以采取类似于上面的subword的思路来产生更好的word embedding呢?
FastText embeddings是一个word2vec like embedding。对于where这个单词和n=3的情况,它可以表示为 <wh,whe,her,ere,re>,< where>其中"<",">"为代表单词开始与结束的特殊标记。这样就可以有效地解决OOV的问题, 并且速度依然很快。
在这里插入图片描述
假设对于word w w w,其n-gram集合用 G w G_w Gw 表示,每个n-gram的矢量表示为 z g z_g zg,则每个单词可以表示成其所有n-gram的矢量和的形式,而center word w w w 与context word c c c 的分数就可表示成:
在这里插入图片描述
之后就可以按照经典的word2vec算法训练得到这些特征向量。
这种方式既保持了word2vec计算速度快的优点,又解决了遇到training data中没见过的oov word的表示问题,可谓一举两得。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值