nlp小知识

nlp小知识


一些知乎看到的小知识点

0.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”,而这些单元往往能应用到别的词汇当中。举个例子:

1
2
3
训练集的词汇: old older oldest smart smarter smartest`
`word-level 词典: old older oldest smart smarter smartest 长度为6`
`subword-level 词典: old smart er est 长度为4

将词划分成字词的形式,能够大大降低词典的大小。同时,未知词汇能以subword组合的形式表示出来,也能提升词典的表达能力。

1.subword算法

1.1 Byte Pair Encoding

BPE是一种数据压缩的方式,它将字符串中最常见的一对连续字符数据替换成该字符串中不存在的字符串,后续再通过一个词表重建原始的数据。BPE的处理过程可以理解为一个单词的再拆分过程。如”loved”,”loving”,”loves”这三个单词,其本身的语义都是”爱”的意思。BPE通过训练,能够把上面的3个单词拆分成”lov”,”ed”,”ing”,”es”几部分,这样可以把词的本身的意思和时态分开,有效的减少了词表的数量。

流程:

  1. 准备预料-分解为最小单元-例如26字母+符号作为原始词表
  2. 根据语料统计相邻字符对出现频次
  3. 挑选出相邻频次最高的字符对,例如:’a’,’b’->’ab’加入词表,训练语料中所有该相邻字符对都融合
  4. repeat2,3直到字符表数量达到期望or再次合并后会出现对出现频率->1

编码-解码:

得到词表后对词表按照字词长度由大到小排序。编码时对于每个单词,遍历排好序的字词词表寻找是否有token是当前单词的子字符串,如果有则该token是表示单词的token之一。从最长的token迭代至最短token,尝试将每个单词的子字符串替换为此表中的token,如果还有没被替换的子字符串则用特殊token代替例如<unk>,解码逆过程不表

1.2 wordpiece

bert使用分词形式,与1.1BPE相似,但是基于概率生成,作者原话:

1
Choose the new word unit out of all possible ones that increase the likelihood on the training data the most when added to the mode.

公式理解:
$$
logP(sentence)=\sum\limits_{i=1}^{n}logP(t_i) \ \ if \ Sentence \ has \ token \ t1…t_n
$$
对于一个x,y相邻的token合并为z,整个句子的似然变化如下式:
$$
\delta_p=logP(t_z)-(logP(t_x)+logP(t_y))=log(\frac{P(t_z)}{P(t_x)P(t_y)})
$$
此式说明wordpiece的合并token相似但不相同,wordpiece和BPE的核心区别就在于wordpiece是按token间的互信息来进行合并而BPE是按照token一同出现的频率来合并的。停止可以指定$\delta_p$增量小于某一阈值时停止。

1.3 unigram language model

首先,了解一下怎么样在给定词表的条件下最大化句子的likelihood。 给定词表及对应概率值: {“你”:0.18, “们”:0.16, “好”:0.18, “你们”:0.15},对句子”你们好“进行分词:

  • 划分为”你@@” “们@@” “好” 的概率为 0.18 *0.16 *0.18=0.005184
  • 划分为”你们@@” “好@@” 的概率为 0.15*0.18=0.027

明显看出后一种分词方式要比前一种好,当然在真实的案例下词表可能有几万个token,直接罗列各种组合的概率显然不可能,所以需要用到viterbi(维特比)算法。因此在给定词表的情况下,可以 1.计算每个token对应的概率;2.找到一个句子最好的分词方式

作者

Kingsley Dong

发布于

2022-11-01

更新于

2023-01-08

许可协议

评论