sheng的学习笔记-AI-自然语言处理(NLP),机器翻译,情感分类,词嵌入

Ai目录:sheng的学习笔记-AI目录-CSDN博客

先看这个文章:序列模型:sheng的学习笔记-AI-序列模型(Sequence Models),RNN,GRU,LSTM_音乐识别是一对多吗-CSDN博客

自然语言处理( Natural Language Processing, NLP)

数学符号

想要建立一个序列模型,它的输入语句是这样的:"Harry Potter and Herminoe Granger invented a new spell. ",(这些人名都是出自于J.K.Rowling 笔下的系列小说Harry Potter)。假如你想要建立一个能够自动识别句中人名位置的序列模型,那么这就是一个命名实体识别问题,这常用于搜索引擎,比如说索引过去24小时内所有新闻报道提及的人名,用这种方式就能够恰当地进行索引。命名实体识别系统可以用来查找不同类型的文本中的人名、公司名、时间、地点、国家名和货币名等等

现在给定这样的输入数据x,假如你想要一个序列模型输出y,使得输入的每个单词都对应一个输出值,同时这个y能够表明输入的单词是否是人名的一部分。技术上来说这也许不是最好的输出形式,还有更加复杂的输出形式,它不仅能够表明输入词是否是人名的一部分,它还能够告诉你这个人名在这个句子里从哪里开始到哪里结束。比如Harry Potter (上图编号1所示)、Hermione Granger(上图标号2所示)

词典

想要表示一个句子里的单词,第一件事是做一张词表,有时也称为词典,意思是列一列你的表示方法中用到的单词。这个词表(下图所示)中的第一个词是a ,也就是说词典中的第一个单词是a ,第二个单词是Aaron ,然后更下面一些是单词and ,再后面你会找到Harry ,然后找到Potter ,这样一直到最后,词典里最后一个单词可能是Zulu

因此a 是第一个单词,Aaron 是第二个单词,在这个词典里,and 出现在367这个位置上,Harry 是在4075这个位置,Potter 在6830,词典里的最后一个单词Zulu可能是第10,000个单词。所以在这个例子中我用了10,000个单词大小的词典,这对现代自然语言处理应用来说太小了。

如果你选定了10,000词的词典,构建这个词典的一个方法是遍历你的训练集,并且找到前10,000个常用词,你也可以去浏览一些网络词典,它能告诉你英语里最常用的10,000个单词,接下来你可以用one-hot表示法来表示词典里的每个单词。

模型

语言模型和序列生成(Language model and sequence generation)

什么是语言模型

比如你在做一个语音识别系统,你听到一个句子,"the apple and pear(pair) salad was delicious. ",所以我究竟说了什么?我说的是 "the apple and pair salad ",还是"the apple and pear salad "?(pearpair是近音词)。你可能觉得我说的应该更像第二种,事实上,这就是一个好的语音识别系统要帮助输出的东西,即使这两句话听起来是如此相似。而让语音识别系统去选择第二个句子的方法就是使用一个语言模型,他能计算出这两句话各自的可能性

如何建立一个语言模型

你首先需要一个训练集,包含一个很大的英文文本语料库(corpus)或者其它的语言,你想用于构建模型的语言的语料库。语料库是自然语言处理的一个专有名词,意思就是很长的或者说数量众多的英文句子组成的文本。

训练集中得到这么一句话,"Cats average 15 hours of sleep a day."(猫一天睡15小时)

  1. 句子标记化,建立一个字典,然后将每个单词都转换成对应的one-hot向量,也就是字典中的索引
  2. 定义句子的结尾,一般的做法就是增加一个额外的标记,叫做EOS ,它表示句子的结尾,这样能够帮助你搞清楚一个句子什么时候结束,EOS标记可以被附加到训练集中每一个句子的结尾,如果你想要你的模型能够准确识别句子结尾的话。
  3. 如果你的训练集中有一些词并不在你的字典里,比如说你的字典有10,000个词,10,000个最常用的英语单词。现在这个句,"The Egyptian Mau is a bread of cat. "其中有一个词Mau ,它可能并不是预先的那10,000个最常用的单词,在这种情况下,你可以把Mau 替换成一个叫做UNK 的代表未知词的标志,我们只针对UNK 建立概率模型,而不是针对这个具体的词Mau

完成标识化的过程后,这意味着输入的句子都映射到了各个标志上,或者说字典中的各个词上。下一步我们要构建一个RNN来构建这些序列的概率模型。

示例

词汇表征(Word Representation)

NLP 自然语言处理中,一个很重要的概念就是词嵌入(word embeddings),这是语言表示的一种方式,可以让算法自动的理解一些类似的词,比如男人对女人,比如国王对王后,还有其他很多的例子

普通词汇表的缺点

我们可以用词汇表来表示词,one-hot 向量来表示词,比如man (上图编号1所示)在词典里是第5391个,那么就可以表示成一个向量,只在第5391处为1(上图编号2所示),我们用O5391代表这个量,这里O的代表one-hot

这种表示方法的一大缺点就是它把每个词孤立起来,这样使得算法对相关词的泛化能力不强

举个例子,假如你已经学习到了一个语言模型,"I want a glass of orange ___ ",那么下一个词很可能是juice 。即使算法已经学到了"I want a glass of orange juice "这样一个很可能的句子,但如果看到"I want a glass of apple ___ ",因为算法不知道appleorange 的关系很接近。所以算法很难从已经知道的orange juice 是一个常见的东西,而明白apple juice 也是很常见的东西或者说常见的句子。这是因为任何两个one-hot 向量的内积都是0,如果你取两个向量,appleorange 来计算它们的内积,结果是0。很难区分它们之间的差别,因为这些向量内积都是一样的,所以无法知道appleorange 要比kingorange ,或者queenorange相似地多

词嵌入(word embeddings

换一种表示方式会更好,如果我们不用one-hot 表示,而是用特征化的表示来表示每个词,manwomankingqueenappleorange或者词典里的任何一个单词,我们学习这些词的特征或者数值

举个例子,对于这些词,比如我们想知道这些词与Gender性别 )的关系。假定男性的性别为-1,女性的性别为+1,那么man 的性别值可能就是-1,而woman 就是+1。最终根据经验king 就是-0.95,queen 是+0.97,appleorange没有性别可言

假设有300个不同的特征,这样的话你就有了这一列数字(上图编号1所示),这里我只写了4个,实际上是300个数字,这样就组成了一个300维的向量来表示man这个词,用e5391符号来表示man这个词

用这种表示方法来表示appleorange 这些词,那么appleorange 的这种表示肯定会非常相似,这样对于已经知道orange juice 的算法很大几率上也会明白apple juice 这个东西,这样对于不同的单词算法会泛化的更好,这种高维特征的表示能够比one-hot更好的表示不同的单词

这种词嵌入算法对于相近的概念,学到的特征也比较类似,在对这些概念可视化的时候,这些概念就比较相似,最终把它们映射为相似的特征向量。这种表示方式用的是在300维空间里的特征表示,这叫做嵌入(embeddings)。

词嵌入的使用

如果你要找出人名,假如有一个句子:"Sally Johnson is an orange farmer. "(Sally Johnson是一个种橙子的农民 ),你会发现Sally Johnson 就是一个人名,所以这里的输出为1。之所以能确定Sally Johnson是一个人名而不是一个公司名,是因为你知道种橙子的农民一定是一个人

用词嵌入作为输入训练好的模型,如果你看到一个新的输入:"Robert Lin is an apple farmer. "(Robert Lin是一个种苹果的农民 ),因为知道orangeapple 很相近,那么你的算法很容易就知道Robert Lin也是一个人,也是一个人的名字。

要是你看到:"Robert Lin is a durian cultivator. "(Robert Lin是一个榴莲培育家 ),榴莲durian )是一种比较稀罕的水果,这种水果在新加坡和其他一些国家流行。如果对于一个命名实体识别任务,你只有一个很小的标记的训练集,你的训练集里甚至可能没有durian榴莲 )或者cultivator培育家 )这两个词。但是如果你有一个已经学好的词嵌入,它会告诉你durian榴莲 )是水果,就像orange橙子 )一样,并且cultivator培育家 ),做培育工作的人其实跟farmer农民 )差不多,那么你就有可能从你的训练集里的"an orange farmer "(种橙子的农民 )归纳出"a durian cultivator "(榴莲培育家)也是一个人。

词嵌入能够达到这种效果,其中一个原因就是学习词嵌入的算法会考察非常大的文本集,也许是从网上找到的,这样你可以考察很大的数据集可以是1亿个单词,甚至达到100亿也都是合理的,大量的无标签的文本的训练集。通过考察大量的无标签文本,很多都是可以免费下载的

一般步骤如下:

  1. 第一步,先从大量的文本集中学习词嵌入。一个非常大的文本集,或者可以下载网上预训练好的词嵌入模型,网上你可以找到不少,词嵌入模型并且都有许可。
  2. 第二步,你可以用这些词嵌入模型把它迁移到你的新的只有少量标注训练集的任务中,比如说用这个300维的词嵌入来表示你的单词。这样做的一个好处就是你可以用更低维度的特征向量代替原来的10000维的one-hot 向量,现在你可以用一个300维更加紧凑的向量。尽管one-hot向量很快计算,而学到的用于词嵌入的300维的向量会更加紧凑。
  3. 第三步,当你在你新的任务上训练模型时,在你的命名实体识别任务上,只有少量的标记数据集上,你可以自己选择要不要继续微调,用新的数据调整词嵌入。实际中,只有这个第二步中标记的数据集不是很大,通常不会在微调词嵌入上费力气。

当你的任务的训练集相对较小时,词嵌入的作用最明显,所以它广泛用于NLP领域。但是词嵌入在语言模型、机器翻译领域用的少一些,因为这些任务你有大量的数据。

单词类比推理

能否有一种算法来自动推导出这种关系,man 如果对应woman ,希望算法能知道:king 应该对应queen

假设用e[man]表示男人的四维向量(实际上应该是300维,此处为了举例简化),e[woman]表示女人,king和queen也是相同表示,那么 e[man]-e[women] 约等于 e[king]-e[queen]

这个结果表示,manwoman 主要的差异是gender性别 )上的差异,而kingqueen 之间的主要差异,根据向量的表示,也是gender性别)上的差异,所以我们要找到一个e符合公式: e[men]-e[woman] = e[king]-e[?] ,当这个新词是queen的时候,式子的左边会近似地等于右边

在图中,词嵌入向量在一个可能有300维的空间里,于是单词man 代表的就是空间中的一个点,另一个单词woman 代表空间另一个点,单词king 也代表一个点,还有单词queen 也在另一点上(上图编号1方框内所示的点)。事实上,我们在上个幻灯片所展示的就是向量manwoman 的差值非常接近于向量kingqueen 之间的差值,箭头(上图编号2所示)代表的就是向量在gender性别 )这一维的差,不过不要忘了这些点是在300维的空间里。为了得出这样的类比推理,计算当man 对于woman ,那么king 对于什么,你能做的就是找到单词w 来使得这个等式成立,你需要的就是找到单词w 来最大化的相似度,即

相似度算法

t-SNE:t-SNE可以将300维的数据用一种非线性的方式映射到2维平面上,但在非线性处理后,大概率没办法做出上面左图的四边形

**余弦相似度:**最常用的相似度函数叫做余弦相似度。分子就是u和v的内积。如果u和v非常相似,那么它们的内积将会很大,把整个式子叫做余弦相似度,是因为该式是u和v的夹角的余弦值(夹角是Φ角),这个公式实际就是计算两向量夹角Φ角的余弦。夹角为0度时,余弦相似度就是1,当夹角是90度角时余弦相似度就是0,当它们是180度时,图像完全跑到了相反的方向,这时相似度等于-1,这就是为什么余弦相似度对于这种类比工作能起到非常好的效果

两个向量之间角度的余弦是衡量它们有多相似的指标,角度越小,两个向量越相似

嵌入矩阵(Embedding Matrix)

假设我们的词汇表含有10,000个单词,词汇表里有aaaronorangezulu ,可能还有一个未知词标记<UNK>。

我们要做的就是学习一个嵌入矩阵,它将是一个300×10,000的矩阵。这个矩阵的各列代表的是词汇表中10,000个不同的单词所代表的不同向量。假设orange 的单词编号是6257(下图编号1所示),代表词汇表中第6257个单词,我们用符号O6527来表示这个one-hot向量,这个向量除了第6527个位置上是1(下图编号2所示),其余各处都为0,它是一个10,000维的列向量,它只在一个位置上有1,它不像图上画的那么短,它的高度应该和左边的嵌入矩阵的宽度相等

把矩阵E和这个one-hot 向量相乘,最后得到的其实就是这个300维的列,就是单词orange 下的这一列,它等于e6257,这个符号是我们用来表示这个300×1的嵌入向量的符号,它表示的单词是orange

学习训练词嵌入矩阵

如果你真想建立一个语言模型,用目标词的前几个单词作为上下文是常见做法(上图编号9所示)。但如果你的目标是学习词嵌入,那么你就可以用这些其他类型的上下文(上图编号10所示),它们也能得到很好的词嵌入

通过左侧词列表预测下一个单词

实践证明,建立一个语言模型是学习词嵌入的好方法,在训练过程中,想要神经网络能够做到比如输入:"I want a glass of orange ___.",然后预测这句话的下一个词

从第一个词I 开始,建立一个one-hot 向量表示这个单词I, 在第4343个位置是1,它是一个10,000维的向量。然后要做的就是生成一个参数矩阵E,然后用乘以O4343,得到嵌入向量e4343,这一步意味着e4343是由矩阵E乘以one-hot向量得到的(上图编号2所示)。其他单词也按照这样的方式获取

现在我们有许多300维的嵌入向量(每个单词就是一个300维矩阵,有多个单词)。它们全部放进神经网络中(上图编号3所示),经过神经网络以后再通过softmax 层(上图编号4所示),这个softmax 也有自己的参数,然后这个softmax分类器会在10,000个可能的输出中预测结尾这个单词。

假如说在训练集中有juice 这个词,训练过程中softmax 的目标就是预测出单词juice ,就是结尾的这个单词。这个隐藏层(上图编号3所示)有自己的参数,我这里用w1和b1来表示,这个softmax层(上图编号4所示)也有自己的参数w2和b2。如果它们用的是300维大小的嵌入向量,而这里有6个词,所以用6×300,所以这个输入会是一个1800维的向量,这是通过将这6个嵌入向量堆在一起得到的

固定的历史窗口

更常见的是有一个固定的历史窗口,举个例子,你总是想预测给定四个单词(上图编号1所示)后的下一个单词,注意这里的4是算法的超参数。这就是如何适应很长或者很短的句子,方法就是总是只看前4个单词,所以说我只用这4个单词(上图编号2所示)而不去看这几个词(上图编号3所示)。如果你一直使用一个4个词的历史窗口,这就意味着你的神经网络会输入一个1200维的特征变量到这个层中(上图编号4所示),然后再通过softmax 来预测输出,选择有很多种,用一个固定的历史窗口就意味着你可以处理任意长度的句子,因为输入的维度总是固定的。所以这个模型的参数就是矩阵,对所有的单词用的都是同一个矩阵,而不是对应不同的位置上的不同单词用不同的矩阵。然后这些权重(上图编号5所示)也都是算法的参数,你可以用反向传播来进行梯度下降来最大化训练集似然,通过序列中给定的4个单词去重复地预测出语料库中下一个单词什么。

用一个300维的特征向量来表示所有这些词,算法会发现要想最好地拟合训练集,就要使apple苹果 )、orange橘子 )、grape葡萄 )和pear )等等,还有像durian榴莲)这种很稀有的水果都拥有相似的特征向量

通过左右侧词列表预测中间的词

一个学习问题,它的上下文是左边和右边的四个词,你可以把目标词左右各4个词作为上下文(上图编号3所示)。这就意味着我们提出了一个这样的问题,"I want a glass of orange juice to go along with my cereal. ",算法获得左边4个词,也就是a glass of orange ,还有右边四个词to go along with,然后要求预测出中间这个词(上图编号4所示)。

将左边的还有右边这4个词的嵌入向量提供给神经网络,就像我们之前做的那样来预测中间的单词是什么,来预测中间的目标词,这也可以用来学习词嵌入

Word2Vec

这是一种简单而且计算时更加高效的方式来学习这种类型的嵌入

Skip-Gram模型

原理

假设在训练集中给定了一个这样的句子:"I want a glass of orange juice to go along with my cereal. ",在Skip-Gram模型中,我们要做的是抽取上下文和目标词配对,来构造一个监督学习问题。上下文不一定总是目标单词之前离得最近的四个单词,或最近的n个单词

我们要的做的是随机选一个词作为上下文词,比如选orange 这个词,然后我们要做的是随机在一定词距内选另一个词,比如在上下文词前后5个词内或者前后10个词内,我们就在这个范围内选择目标词。可能你正好选到了juice 作为目标词,正好是下一个词(表示orange 的下一个词),也有可能你选到了前面第二个词,所以另一种配对目标词可以是glass ,还可能正好选到了单词my作为目标词。

构造一个监督学习问题,它给定上下文词,要求你预测在这个词正负10个词距或者正负5个词距内随机选择的某个目标词。构造这个监督学习问题的目标是想要使用这个学习问题来学到一个好的词嵌入模型

具体做法

假设使用一个10,000词的词汇表(有时训练使用的词汇表会超过一百万词)。要解决的基本的监督学习问题是学习一种映射关系,从上下文c ,比如单词orange ,到某个目标词,记为t ,可能是单词juice 或者单词glass 或者单词my

orange 是第6257个单词,juice是10,000个单词中的第4834个,这就是你想要的映射到输出y的输入x。

  1. 对于单词orange ,先从one-hot 向量开始,我们将其写作Oc,这就是上下文词的one-hot向量(上图编号1所示)。
  2. 拿嵌入矩阵E乘以向量Oc,然后得到了输入的上下文词的嵌入向量ec = E * Oc。
  3. 在这个神经网络中(上图编号2所示),我们将把向量喂入一个softmax 单元,softmax单元要做的就是输出。

这是softmax模型(上图编号4所示),预测不同目标词的概率:

损失函数:用y表示目标词,我们这里用的y(真实)和y(预测,带个上标)都是用one-hot表示的

总结

就是一个可以找到词嵌入的简化模型和神经网络(上图编号2所示),其实就是个softmax 单元。矩阵E将会有很多参数,所以矩阵E有对应所有嵌入向量的参数ec(上图编号6所示),softmax单元也有的参数theta t(上图编号3所示)。

如果优化这个关于所有这些参数的损失函数,你就会得到一个较好的嵌入向量集,这个就叫做Skip-Gram 模型。它把一个像orange这样的词作为输入,并预测这个输入词,从左数或从右数的某个词,预测上下文词的前面一些或者后面一些是什么词

缺点-计算速度

softmax模型中,每次你想要计算这个概率,你需要对你词汇表中的所有10,000个词做求和计算,可能10,000个词的情况还不算太差。如果你用了一个大小为100,000或1,000,000的词汇表,那么这个分母的求和操作是相当慢的,实际上10,000已经是相当慢的了,所以扩大词汇表就更加困难了。

解决这个问题,可以用分级的分类器和负采样,其中负采样用的更多一些

优化方案-计算速度:分级的分类器

分级(hierarchical )的softmax分类器:不是一下子就确定到底是属于10,000类中的哪一类。

你有一个分类器(上图编号1所示),它告诉你目标词是在词汇表的前5000个中还是在词汇表的后5000个词中,假如这个二分类器告诉你这个词在前5000个词中(上图编号2所示),然后第二个分类器会告诉你这个词在词汇表的前2500个词中,或者在词汇表的第二组2500个词中,诸如此类,直到最终你找到一个词准确所在的分类器(上图编号3所示),那么就是这棵树的一个叶子节点。

像这样有一个树形的分类器,意味着树上内部的每一个节点都可以是一个二分类器,比如逻辑回归分类器,所以你不需要再为单次分类,对词汇表中所有的10,000个词求和了。实际上用这样的分类树,计算成本与词汇表大小的对数成正比(上图编号4所示),而不是词汇表大小的线性函数,这个就叫做分级softmax分类器

在实践中分级softmax 分类器不会使用一棵完美平衡的分类树或者说一棵左边和右边分支的词数相同的对称树(上图编号1所示的分类树)。分级的softmax 分类器会被构造成常用词在顶部,然而不常用的词像durian 会在树的更深处(上图编号2所示的分类树),因为你想更常见的词会更频繁,所以你可能只需要少量检索就可以获得常用单词像theof 。然而你更少见到的词比如durian就更合适在树的较深处,因为你一般不需要到那样的深处

优化方案-计算速度:负采样(Negative Sampling)

原理

给定一对单词,比如orangejuice ,我们要去预测这是否是一对上下文词-目标词(context-target)。

orangejuice 就是个正样本,那么orangeking就是个负样本,我们把它标为0。

我们要做的就是采样得到一个上下文词和一个目标词,在这个例子中就是orangejuice ,我们用1作为标记,我把中间这列(下图编号1所示)叫做词(word )。这样生成一个正样本,正样本跟上个视频中生成的方式一模一样,先抽取一个上下文词,在一定词距内比如说正负10个词距内选一个目标词,这就是生成这个表的第一行,即orange-- juice -1的过程。

然后为了生成一个负样本,你将用相同的上下文词,再在字典中随机选一个词,在这里我随机选了单词king ,标记为0。然后我们再拿orange ,再随机从词汇表中选一个词,因为我们设想,如果随机选一个词,它很可能跟orange 没关联,于是orange--book--0 。我们再选点别的,orange 可能正好选到the ,然后是0。还是orange ,再可能正好选到of 这个词,再把这个标记为0,注意of 被标记为0,即使of 的确出现在orange 词的前面。(此处注意,从字典中随机选的词,全都是负样本,由于of,the等高频词汇可能在句子前后,但只要从字典中获取的就是负采样)

训练模型

小数据集的话,k从5到20比较好。如果你的数据集很大,k就选的小一点。对于更大的数据集k就等于2到5,数据集越小k就越大。那么在这个例子中,我们就用k=4。

上图2是新的输入x,上图3是新的输出y,记号c表示上下文词,记号t表示可能的目标词,我再用y表示0和1,表示是否是一对上下文-目标词。定义一个逻辑回归模型,给定输入的c,t对的条件下,y=1的概率,即:

sigmoid函数作用入参,并且每个正样本,都会有K个负样本,计算y=1的概率,获取参数ec和theta c

为什么会减少计算量

如果输入词是orange ,即词6257,要做的就是输入one-hot 向量,再传递给E,通过两者相乘获得嵌入向量e6257,得到了10,000个可能的逻辑回归分类问题,其中一个(上图编号4所示)将会是用来判断目标词是否是juice的分类器,还有其他的词。

把这些看作10,000个二分类逻辑回归分类器,但并不是每次迭代都训练全部10,000个,只训练其中的5个,要训练对应真正目标词那一个分类器,再训练4个随机选取的负样本,这就是k=4的情况。所以不使用一个巨大的10,000维度的softmax ,因为计算成本很高,而是把它转变为10,000个二分类问题,每个都很容易计算,每次迭代我们要做的只是训练它们其中的5个,一般而言就是个,其中个负样本和1个正样本。这也是为什么这个算法计算成本更低,因为只需更新个逻辑单元,个二分类问题,相对而言每次迭代的成本比更新10,000维的softmax分类器成本低。

如何负采样数据

选取了上下文词orange之后,你如何对这些词进行采样生成负样本?

1)一个办法是对中间的这些词进行采样,即候选的目标词,你可以根据其在语料中的经验频率进行采样,就是通过词出现的频率对其进行采样。但问题是这会导致你在liketheofand诸如此类的词上有很高的频率。

2)另一个极端就是用1除以词汇表总词数,即,均匀且随机地抽取负样本,这对于英文单词的分布是非常没有代表性的。

3)根据经验,发现这个经验值的效果最好,它位于这两个极端的采样方法之间,既不用经验频率,也就是实际观察到的英文文本的分布,也不用均匀分布,他们采用以下方式:

进行采样,所以如果f(w)是观测到的在语料库中的某个英文词的词频,通过3/4次方的计算,使其处于完全独立的分布和训练集的观测分布两个极端之间。

缺点-上下文采样多频词

在skip-gram模型中,对上下文c 进行采样,那么目标词t 就会在上下文c 的正负10个词距内进行采样。但是你要如何选择上下文c ?一种选择是你可以就对语料库均匀且随机地采样,如果你那么做,你会发现有一些词,像theofaandto 诸如此类是出现得相当频繁的,于是你那么做的话,你会发现你的上下文到目标词的映射会相当频繁地得到这些种类的词,但是其他词,像orangeappledurian就不会那么频繁地出现了

优化方案-上下文采样多频词

词的分布并不是单纯的在训练集语料库上均匀且随机的采样得到的,而是采用了不同的分级来平衡更常见的词和不那么常见的词。

连续词袋模型(Continuous Bag-Of-Words Model

获得中间词两边的的上下文,然后用周围的词去预测中间的词

CBOW 是从原始语句推测目标字词;而Skip-Gram 正好相反,是从目标字词推测出原始语句。CBOW 对小型数据库比较合适,而Skip-Gram 在大型语料中表现更好。 (下图左边为CBOW ,右边为Skip-Gram

GloVe 词向量(GloVe Word Vectors)

GloVe 代表用词表示的全局变量(global vectors for word representation)。假定Xij是单词i在单词j上下文中出现的次数,遍历你的训练集,然后数出单词i在不同单词j上下文中出现的个数

如果你将上下文和目标词的范围定义为出现于左右各10词以内的话,那么就会有一种对称关系。如果你对上下文的选择是,上下文总是目标词前一个单词的话,那么Xij和Xji就不会像这样对称了

对于GloVe算法,我们可以定义上下文和目标词为任意两个位置相近的单词,假设是左右各10词的距离,也就是Xij = Xji

GloVe模型做的就是进行优化,我们将他们之间的差距进行最小化处理:

词嵌入除偏(Debiasing Word Embeddings)

什么是词嵌入除偏

现在机器学习和人工智能算法正渐渐地被信任用以辅助或是制定极其重要的决策,因此我们想尽可能地确保它们不受非预期形式偏见影响,比如说性别歧视、种族歧视等等。

此处的术语bias,是指性别、种族、性取向方面的偏见

学习类比像ManWomanKingQueen,但如果 可能会输出ManComputer Programmer ,同时输出WomanHomemaker ,那个结果看起来是错的,并且它执行了一个十分不良的性别歧视。如果算法输出的是ManComputer Programmer ,同时WomanComputer Programmer这样子会更合理

词嵌入,它们能够轻易学会用来训练模型的文本中的偏见内容,所以算法获取到的偏见内容就可以反映出人们写作中的偏见。

性别除偏

获取偏差趋势

性别歧视这种情况来说,e(he)-e(she),因为它们的性别不同,然后将e(male)-e(female),然后将这些值取平均(上图编号2所示),将这些差简单地求平均。

这个趋势(上图编号3所示)看起来就是性别趋势或说是偏见趋势,然后这个趋势(上图编号4所示)与我们想要尝试处理的特定偏见并不相关,因此这就是个无偏见趋势。

在这种情况下,偏见趋势可以将它看做1D 子空间,所以这个无偏见趋势就会是299D 的子空间。我已经略微简化了,原文章中的描述这个偏见趋势可以比1维更高,同时相比于取平均值,如同我在这里描述的这样,实际上它会用一个更加复杂的算法叫做SVU ,也就是奇异值分解,奇异值分解这个算法的一些方法和主成分分析 (PCA)其实很类似。

中和步骤

所以对于那些定义不确切的词可以将其处理一下,避免偏见。

有些词本质上就和性别有关,像grandmothergrandfathergirlboyshehe ,他们的定义中本就含有性别的内容,不过也有一些词像doctorbabysitter 我们想使之在性别方面是中立的。同时在更通常的情况下,你可能会希望像doctorbabysitter 这些词成为种族中立的,或是性取向中立的等等,不过这里我们仍然只用性别来举例说明。对于那些定义不明确的词,它的基本意思是不像grandmothergrandfather 这种定义里有着十分合理的性别含义的,因为从定义上来说grandmothers 是女性,grandfather是男性。

所以对于像doctorbabysitter这种单词我们就可以将它们在这个轴(上图编号1所示)上进行处理,来减少或是消除他们的性别歧视趋势的成分,也就是说减少他们在这个水平方向上的距离(上图编号2方框内所示的投影),所以这就是第二个中和步

均衡步

意思是说你可能会有这样的词对,grandmothergrandfather ,或者是girlboy,对于这些词嵌入,你只希望性别是其区别。

在这个例子中,babysittergrandmother 之间的距离或者说是相似度实际上是小于babysittergrandfather 之间的(上图编号1所示),因此这可能会加重不良状态,或者可能是非预期的偏见,也就是说grandmothers 相比于grandfathers 最终更有可能输出babysitting

所以在最后的均衡步中,我们想要确保的是像grandmothergrandfather 这样的词都能够有一致的相似度,或者说是相等的距离,和babysitter 或是doctor 这样性别中立的词一样。这其中会有一些线性代数的步骤,但它主要做的就是将grandmothergrandfather 移至与中间轴线等距的一对点上(上图编号2所示),现在性别歧视的影响也就是这两个词与babysitter 的距离就完全相同了(上图编号3所示)。所以总体来说,会有许多对像grandmother-grandfatherboy-girlsorority-fraternitygirlhood-boyhoodsister-brotherniece-nephewdaughter-son这样的词对,你可能想要通过均衡步来解决他们。

决定哪个词是中立的

怎样才能够决定哪个词是中立的呢?对于这个例子来说doctor 看起来像是一个应该对其中立的单词来使之性别不确定或是种族不确定。相反地,grandmothergrandfather 就不应是性别不确定的词。也会有一些像是beard 词,一个统计学上的事实是男性相比于比女性更有可能拥有胡子,因此也许beard 应该比female 更靠近male一些。

训练一个分类器来尝试解决哪些词是有明确定义的,哪些词是性别确定的,哪些词不是。结果表明英语里大部分词在性别方面上是没有明确定义的,意思就是说性别并是其定义的一部分,只有一小部分词像是grandmother-grandfathergirl-boysorority-fraternity 等等,不是性别中立的。因此一个线性分类器能够告诉你哪些词能够通过中和步来预测这个偏见趋势,或将其与这个本质是299D的子空间进行处理。

针对性别特定词汇的均衡算法

举一个具体的例子,假设"actress "("女演员 ")比"actor "("演员 ")更接近"保姆"。 通过将中和应用于"babysit "("保姆 "),我们可以减少与保姆相关的性别刻板印象。 但是这仍然不能保证"actress "("女演员 ")和"actor "("演员 ")与"babysit "("保姆 ")等距。 均衡算法可以解决这个问题。

主要步骤如下

减少或者是消除学习算法中的偏见问题是个十分重要的问题,因为这些算法会用来辅助制定越来越多的社会中的重要决策,虽然本文有一套如何尝试处理偏见问题的办法,不过这仍是一个许多学者正在进行主要研究的领域

评估机器翻译系统

机器翻译(machine translation)的一大难题是一个法语句子可以有多种英文翻译而且都同样好,所以当有多个同样好的答案时,怎样评估一个机器翻译系统呢?

Bleu 得分

常见的解决办法是,通过一个叫做BLEU 得分(the BLEU score)的东西来解决

假如给你一个法语句子:Le chat est sur le tapis ,然后给你一个这个句子的人工翻译作参考:The cat is on the mat 。不过有多种相当不错的翻译。所以一个不同的人,也许会将其翻译为:There is a cat on the mat ,同时,实际上这两个都是很好的,都准确地翻译了这个法语句子。BLEU得分做的就是,给定一个机器生成的翻译,它能够自动地计算一个分数来衡量机器翻译的好坏。

BLEU得分背后的理念是观察机器生成的翻译,然后看生成的词是否出现在一个人工翻译参考之中。因此这些人工翻译的参考会包含在开发集或是测试集中。

基础版本

衡量机器翻译输出质量的方法之一是观察输出结果的每一个词看其是否出现在参考中,这被称做是机器翻译的精确度(a precision of the machine translation output

每个单词如果出现在参考翻译中,就得1分,一共7个单词,如果生成的所有单词都在参考翻译中,就是7分

改进版本

基础版本有个问题:我们假设机器翻译系统缩写为MT 。机器翻译 (MT )的输出是:the the the the the the the 。这显然是一个十分糟糕的翻译。机器翻译输出了七个单词并且这七个词中的每一个都出现在了参考1或是参考2。单词the在两个参考中都出现了,所以得分会很高7/7,但翻译很糟糕

我们把每一个单词的记分上限定为它在参考句子中出现的最多次数。在参考1中,单词the 出现了两次,在参考2中,单词the 只出现了一次。而2比1大,所以我们会说,单词the 的得分上限为2。有了这个改良后的精确度,我们就说,这个输出句子的得分为2/7,因为在7个词中,我们最多只能给它2分。所以这里分母就是7个词中单词the 总共出现的次数,而分子就是单词the 出现的计数。我们在达到上限时截断计数,这就是改良后的精确度评估(the modified precision measure)。

二元组

BLEU 得分中,你不想仅仅考虑单个的单词,你也许也想考虑成对的单词,我们定义一下二元词组(bigrams )的BLEU 得分。bigram的意思就是相邻的两个单词,即成对的词,同时也许会有更长的单词序列,比如说三元词组(trigrams)。意思是三个挨在一起的词。

假定机器翻译输出了稍微好一点的翻译:The cat the cat on the mat ,仍然不是一个好的翻译。这里,可能的二元词组有the cat ,忽略大小写,接着是cat the , 这是另一个二元词组,然后又是the cat 。不过我已经有了,所以我们跳过它,然后下一个是cat on ,然后是on the ,再然后是the mat。所以这些就是机器翻译中的二元词组。

数一数每个二元词组出现了多少次。

我们来定义一下截取计数(the clipped count)。我们以这列的值为基础,但是给算法设置得分上限,上限值为二元词组出现在参考1或2中的最大次数。

  • 分母:the cat 出现了两次 ,cat the 出现了一次,cat on 它出现了一次记1分。on the 出现一次就记1分,the mat出现了一次,总值为6
  • 分子the cat 在两个参考中最多出现一次,所以将截取它的计数为1。cat the 它并没有出现在参考1和参考2中,所以我将它截取为0。cat on 它出现了一次记1分。on the 出现一次就记1分,the mat出现了一次,总值为4。

我们把所有的这些计数都截取了一遍,实际上就是将它们降低使之不大于二元词组出现在参考中的次数。最后,修改后的二元词组的精确度就是count_clip之和。因此那就是4除以二元词组的总个数,也就是6。因此是4/6也就是2/3为二元词组改良后的精确度。

公式化

改良后的一元词组精确度定义为P1,P代表的是精确度。这里的下标1的意思是一元词组(定义为一元词组之和,也就是对机器翻译结果中所有单词求和)。定义Pn为n元词组精确度

MT 输出就是y^。除以机器翻译输出中的一元词组出现次数之和。因此这个就是最终结果应该是两页幻灯片前得到的2/7。

因此这些精确度或说是这些改良后的精确度得分评估的是一元词组或是二元词组。或者是三元词组,也就是由三个词组成的,甚至是n取更大数值的n元词组。如果机器翻译输出与参考1或是参考2完全一致的话,那么所有的这些P1、P2等等的值,都会等于1.0

计算出n(假设是4)元词组的概率P1,P2,P3,P4,然后取平均值,对这个线性运算进行乘方运算,乘方是严格单调递增的运算 ,exp的意思是e的多少次方

会用额外的一个叫做BP 的惩罚因子(the BP penalty )来调整这项。BP 的意思是"简短惩罚"( brevity penalty

如果你输出了一个非常短的翻译,那么它会更容易得到一个高精确度。因为输出的大部分词可能都出现在参考之中,不过我们并不想要特别短的翻译结果。因此简短惩罚(BP )就是一个调整因子,它能够惩罚输出了太短翻译结果的翻译系统。BP的公式如上图所示。如果你的机器翻译系统实际上输出了比人工翻译结果更长的翻译,那么它就等于1,其他情况下就是像这样的公式,惩罚所有更短的翻译

总结

BLEU 得分是一个有用的单一实数评估指标,用于评估生成文本的算法,判断输出的结果是否与人工写出的参考文本的含义相似。不过它并没有用于语音识别(speech recognition )。因为在语音识别当中,通常只有一个答案,你可以用其他的评估方法,来看一下你的语音识别结果,是否十分相近或是字字正确(pretty much, exactly word for word correct )。不过在图像描述应用中,对于同一图片的不同描述,可能是同样好的。或者对于机器翻译来说,有多个一样好的翻译结果,BLEU得分就给了你一个能够自动评估的方法,帮助加快算法开发进程

情感分类(Sentiment Classification)

什么是情感分类

情感分类任务就是看一段文本,然后分辨这个人是否喜欢他们在讨论的这个东西,这是NLP中最重要的模块之一,经常用在许多应用中。情感分类一个最大的挑战就是可能标记的训练集没有那么多,但是有了词嵌入,即使只有中等大小的标记的训练集,你也能构建一个不错的情感分类器

这是一个情感分类问题的一个例子(上图所示),输入是一段文本,而输出是你要预测的相应情感。比如说是一个餐馆评价的星级,

比如有人说,"The dessert is excellent."(甜点很棒),并给出了四星的评价;

"Service was quite slow"(服务太慢),两星评价;

"Good for a quick meal but nothing special"(适合吃快餐但没什么亮点),三星评价;

简单架构

情感分类一个最大的挑战就是可能标记的训练集没有那么多。对于情感分类任务来说,训练集大小从10,000到100,000个单词都很常见,甚至有时会小于10,000个单词,采用了词嵌入能够带来更好的效果,尤其是只有很小的训练集时

假设有一个句子"dessert is excellent ",然后在词典里找这些词,我们通常用10,000个词的词汇表。我们要构建一个分类器能够把它映射成输出四个星,给定这四个词("dessert is excellent "),我们取这些词,找到相应的one-hot 向量,所以这里(上图编号1所示)就是O8928,乘以嵌入矩阵E,E可以从一个很大的文本集里学习到,比如它可以从一亿个词或者一百亿个词里学习嵌入,然后用来提取单词the 的嵌入向量e8928,对dessertisexcellent做同样的步骤。

如果在很大的训练集上训练E,比如一百亿的单词,这样你就会获得很多知识,甚至从有些不常用的词中获取,然后应用到你的问题上,即使你的标记数据集里没有这些词。

我们可以这样构建一个分类器,取这些向量(上图编号2所示),比如是300维度的向量。然后把它们求和或者求平均,这里我画一个大点的平均值计算单元(上图编号3所示),你也可以用求和或者平均。这个单元(上图编号3所示)会得到一个300维的特征向量,把这个特征向量送进softmax 分类器,然后输出预测y。这个softmax 能够输出5个可能结果的概率值,从一星到五星,这个就是5个可能输出的softmax结果用来预测的值

这里用的平均值运算单元,这个算法适用于任何长短的评论,因为即使你的评论是100个词长,你也可以对这一百个词的特征向量求和或者平均它们,然后得到一个表示一个300维的特征向量表示,然后把它送进你的softmax分类器,所以这个平均值运算效果不错。它实际上会把所有单词的意思给平均起来

RNN的架构

这个算法有一个问题就是没考虑词序,尤其是这样一个负面的评价,"Completely lacking in good taste, good service, and good ambiance. ",但是good 这个词出现了很多次,有3个good ,如果你用的算法跟这个一样,忽略词序,仅仅把所有单词的词嵌入加起来或者平均下来,你最后的特征向量会有很多good的表示,你的分类器很可能认为这是一个好的评论,尽管事实上这是一个差评,只有一星的评价

一个更加复杂的模型,不用简单的把所有的词嵌入都加起来,我们用一个RNN来做情感分类。

  1. 取这条评论,"Completely lacking in good taste, good service, and good ambiance. ",找出每一个one-hot向量。
  2. 用每一个one-hot 向量乘以词嵌入矩阵E,得到词嵌入表达e,然后把它们送进RNN里。
  3. RNN的工作就是在最后一步(上图编号1所示)计算一个特征表示,用来预测,这是一个多对一的网络结构的例子。

有了这样的算法,考虑词的顺序效果就更好了,它就能意识到"things are lacking in good taste ",这是个负面的评价,"not good "也是一个负面的评价。而不像原来的算法一样,只是把所有的加在一起得到一个大的向量,根本意识不到"not good "和 "good "不是一个意思,"lacking in good taste"也是如此,等等。

由于你的词嵌入是在一个更大的数据集里训练的,这样效果会更好,更好的泛化一些没有见过的新的单词。比如其他人可能会说,"Completely absent of good taste, good service, and good ambiance. ",即使absent这个词不在标记的训练集里,如果是在一亿或者一百亿单词集里训练词嵌入,它仍然可以正确判断,并且泛化的很好

相关推荐
意疏4 分钟前
从告警风暴到根因定位:SigNoz+CPolar让分布式系统观测效率提升10倍的实战指南
人工智能
新智元22 分钟前
Ilya震撼发声!OpenAI前主管亲证:AGI已觉醒,人类还在装睡
人工智能·openai
朱昆鹏31 分钟前
如何通过sessionKey 登录 Claude
前端·javascript·人工智能
汉堡go38 分钟前
1、机器学习与深度学习
人工智能·深度学习·机器学习
只是懒得想了1 小时前
使用 Gensim 进行主题建模(LDA)与词向量训练(Word2Vec)的完整指南
人工智能·自然语言处理·nlp·word2vec·gensim
johnny2331 小时前
OpenAI系列模型介绍、API使用
人工智能
KKKlucifer1 小时前
生成式 AI 冲击下,网络安全如何破局?
网络·人工智能·web安全
LiJieNiub2 小时前
基于 PyTorch 实现 MNIST 手写数字识别
pytorch·深度学习·学习
ARM+FPGA+AI工业主板定制专家2 小时前
基于JETSON ORIN/RK3588+AI相机:机器人-多路视觉边缘计算方案
人工智能·数码相机·机器人
文火冰糖的硅基工坊2 小时前
[创业之路-691]:历史与现实的镜鉴:从三国纷争到华为铁三角的系统性启示
人工智能·科技·华为·重构·架构·创业