• 深度学习——嵌入矩阵and学习词嵌入andWord2Vec


    嵌入矩阵

    当你应用算法来学习词嵌入时,实际上是学习一个嵌入矩阵,我们来看一下这是什么意思。

    假设我们的词汇表含有 10,000 个单词,词汇表里有 a,aaron,orange,zulu,可能还有一个未知词标记。我们要做的就是学习一个嵌入矩阵𝐸,它将是一个300×10,000 的矩阵,如果你的词汇表里有 10,000 个,或者加上未知词就是 10,001 维。这个矩阵的各列代表的是词汇表中 10,000 个不同的单词所代表的不同向量。假设 orange 的单词编号是 6257,代表词汇表中第 6257 个单词,我们用符号𝑂6527 来表示这个 one-hot 向量,这个向量除了第 6527 个位置上是 1,其余各处都为0,显然它是一个 10,000 维的列向量,它只在一个位置上有 1。
    在这里插入图片描述
    假设这个嵌入矩阵叫做矩阵𝐸,注意如果用𝐸去乘以右边的 one-hot 向量,也就是𝑂6527,那么就会得到一个 300 维的向量,𝐸是 300×10,000 的,𝑂6527是 10,000×1的,所以它们的积是 300×1 的,即 300 维的向量。要计算这个向量的第一个元素,你需要做的是把𝐸的第一行和𝑂6527的整列相乘,不过𝑂6527的所有元素都是 0,只有 6257 位置上是 1,最后你得到的这个向量的第一个元素就是 orange这一列下的数字。然后我们要计算这个向量的第二个元素,就是把𝐸的第二行和这个𝑂6527相乘,和之前一样,然后得到第二个元素,以此类推,直到你得到这个向量剩下的所有元素
    在这里插入图片描述

    更广泛来说,假如说有某个单词 w,那么𝑒𝑤就代表单词 w 的嵌入向量。同样,𝐸𝑂𝑗,𝑂𝑗就是只有第𝑗个位置是 1 的 one-hot 向量,得到的结果就是𝑒𝑗,它表示的是字典中单词 j 的嵌入向量

    学习词嵌入

    假如你在构建一个语言模型,并且用神经网络来实现这个模型。于是在训练过程中,你可能想要你的神经网络能够做到比如输入:“I want a glass of orange ___.”,然后预测这句话的下一个词。在每个单词下面,我都写上了这些单词对应词汇表中的索引。实践证明,建立一个语言模型是学习词嵌入的好方法
    在这里插入图片描述
    下面我将介绍如何建立神经网络来预测序列中的下一个单词,让我为这些词列一个表格,“I want a glass of orange”,我们从第一个词 I 开始,建立一个 one-hot 向量表示这个单词 I。这是一个 one-hot 向量,在第 4343 个位置是 1,它是一个 10,000 维的向量。然后要做的就是生成一个参数矩阵𝐸,然后用𝐸乘以𝑂4343,得到嵌入向量𝑒4343,这一步意味着𝑒4343是由矩阵𝐸乘以 one-hot 向量得到的。然后我们对其他的词也做相同的操作,单词 want 在第 9665 个,我们将𝐸与这个 one-hot 向量(𝑂9665)相乘得到嵌入向量𝑒9665。对其他单词也是一样。
    于是现在你有许多 300 维的嵌入向量。我们能做的就是把它们全部放进神经网络中,经过神经网络以后再通过 softmax 层,这个 softmax也有自己的参数,然后这个 softmax 分类器会在 10,000 个可能的输出中预测结尾这个单词。如果它们用的是 300维大小的嵌入向量,而这里有 6 个词,所以用 6×300,所以这个输入会是一个 1800 维的向量,这是通过将这 6 个嵌入向量堆在一起得到的。
    实际上更常见的是有一个固定的历史窗口,举个例子,你总是想预测给定四个单词后的下一个单词,注意这里的 4 是算法的超参数。这就是如何适应很长或者很短的句子,方法就是总是只看前 4 个单词,所以说我只用这 4 个单词而不去看这几个词。如果你一直使用一个 4 个词的历史窗口,这就意味着你的神经网络会输入一个 1200 维的特征变量到这个层中,然后再通过 softmax 来预测输出,选择有很多种,**用一个固定的历史窗口就意味着你可以处理任意长度的句子,因为输入的维度总是固定的。**所以这个模型的参数就是矩阵𝐸,对所有的单词用的都是同一个矩阵𝐸,而不是对应不同的位置上的不同单词用不同的矩阵。然后这些权重也都是算法的参数,你可以用反向传播来进行梯度下降来最大化训练集似然,通过序列中给定的 4 个单词去重复地预测出语料库中下一个单词什么。

    这就是早期最成功的学习词嵌入,学习这个矩阵𝐸的算法之一。现在我们先概括一下这个算法,看看我们该怎样来推导出更加简单的算法。现在我想用一个更复杂的句子作为例子来解释这些算法,假设在你的训练集中有这样一个更长的句子:“I want a glass of orange juice to go along with my cereal.”。
    算法预测出了某个单词 juice,我们把它叫做目标词,它是通过一些上下文,在本例中也就是这前 4 个词推导出来的。如果你的目标是学习一个嵌入向量,研究人员已经尝试过很多不同类型的上下文。如果你要建立一个语言模型,那么一般选取目标词之前的几个词作为上下文。但如果你的目标不是学习语言模型本身的话,那么你可以选择其他的上下文。
    你可以提出这样一个学习问题,它的上下文是左边和右边的四个词,你可以把目标词左右各 4 个词作为上下文。这就意味着我们提出了一个这样的问题,算法获得左边 4 个词,也就是 a glass of orange,还有右边四个词 to go along with,然后要求预测出中间这个词。提出这样一个问题,这个问题需要将左边的还有右边这 4 个词的嵌入向量提供给神经网络,就像我们之前做的那样来预测中间的单词是什么,来预测中间的目标词,这也可以用来学习词嵌入。在这里插入图片描述
    还有一个效果非常好的做法就是上下文是附近一个单词,它可能会告诉你单词 glass是一个邻近的单词。或者说我看见了单词 glass,然后附近有一个词和 glass位置相近,那么这个词会是什么?这就是用附近的一个单词作为上下文。我们将在下节把它公式化,这用的是一种 Skip-Gram 模型的思想。这是一个简单算法的例子,因为上下文相当的简单,比起之前 4 个词,现在只有 1 个,但是这种算法依然能工作得很好。
    研究者发现,如果你真想建立一个语言模型,用目标词的前几个单词作为上下文是常见做法。但如果你的目标是学习词嵌入,那么你就可以用这些其他类型的上下文,它们也能得到很好的词嵌入。

    Word2Vec

    假设在训练集中给定了一个这样的句子:“I want a glass of orange juice to go along with my cereal.”,在 Skip-Gram 模型中,我们要做的是抽取上下文和目标词配对,来构造一个监督学习问题。上下文不一定总是目标单词之前离得最近的四个单词,或最近的𝑛个单词。我们要的做的是随机选一个词作为上下文词,比如选 orange 这个词,然后我们要做的是随机在一定词距内选另一个词,比如在上下文词前后 5 个词内或者前后 10 个词内,我们就在这个范围内选择目标词。可能你正好选到了 juice 作为目标词,正好是下一个词(表示 orange的下一个词),也有可能你选到了前面第二个词,所以另一种配对目标词可以是 glass,还可能正好选到了单词 my 作为目标词。
    构造这个监督学习问题的目标并不是想要解决这个监督学习问题本身,而是想要使用这个学习问题来学到一个好的词嵌入模型
    为了表示输入,比如单词 orange,你可以先从 one-hot 向量开始,我们将其写作𝑂𝑐,这就是上下文词的 one-hot 向量。你可以拿嵌入矩阵𝐸乘以向量𝑂𝑐,然后得到了输入的上下文词的嵌入向量,于是这里𝑒𝑐 = 𝐸𝑂𝑐。在这个神经网络中, 我们将把向量𝑒𝑐喂入一个 softmax 单元,softmax 单元要做的就是输出𝑦^。然后我们再写出模型的细节,这是 softmax 模型,预测不同目标词的概率:
    在这里插入图片描述
    这里𝜃𝑡是一个与输出𝑡有关的参数,即某个词𝑡和标签相符的概率是多少。
    最终 softmax 的损失函数就会像之前一样,我们用是用 one-hot 表示的,于是损失函数就会是:
    在这里插入图片描述
    这是常用的 softmax 损失函数,𝑦 就是只有一个 1 其他都是 0 的 one-hot 向量,如果目标词是 juice,那么第 4834 个元素就是 1,其余是 0。类似的softmax 单元输出的 10,000 维的向量,这个向量是所有可能目标词的概率

    总结一下,这大体上就是一个可以找到词嵌入的简化模型和神经网络,其实就是个 softmax 单元。矩阵𝐸将会有很多参数,所以矩阵𝐸有对应所有嵌入向量𝑒𝑐的参数,softmax 单元也有𝜃𝑡的参数。如果优化这个关于所有这些参数的损失函数,你就会得到一个较好的嵌入向量集,这个就叫做 Skip-Gram模型。它把一个像 orange 这样的词作为输入,并预测这个输入词,从左数或从右数的某个词,预测上下文词的前面一些或者后面一些是什么词。

    实际上使用这个算法会遇到一些问题,首要的问题就是计算速度。尤其是在 softmax 模型中,每次你想要计算这个概率,你需要对你词汇表中的所有 10,000 个词做求和计算,可能 10,000 个词的情况还不算太差。如果你用了一个大小为 100,000 或 1,000,000 的词汇表,那么这个分母的求和操作是相当慢的,实际上 10,000 已经是相当慢的了,所以扩大词汇表就更加困难了。
    这里有一些解决方案,如分级(hierarchical)的 softmax 分类器和负采样(Negative Sampling)。

    分级的softmax分类器

    想象如果你有一个分类器,它告诉你目标词是在词汇表的前 5000 个中还是在词汇表的后 5000 个词中,假如这个二分类器告诉你这个词在前 5000 个词中,然后第二个分类器会告诉你这个词在词汇表的前 2500 个词中,或者在词汇表的第二组 2500 个词中,诸如此类,直到最终你找到一个词准确所在的分类器,那么就是这棵树的一个叶子节点。像这样有一个树形的分类器,意味着树上内部的每一个节点都可以是一个二分类器,比如逻辑回归分类器,所以你不需要再为单次分类,对词汇表中所有的 10,000 个词求和了。实际上用这样的分类树,计算成本与词汇表大小的对数成正比,而不是词汇表大小的线性函数,这个就叫做分级 softmax 分类器。
    在这里插入图片描述

    Q;如何对上下文c进行采样?
    A:一种选择是你可以就对语料库均匀且随机地采样,如果你那么做,你会发现有一些词,像 the、of、a、and、to 诸如此类是出现得相当频繁的,于是你那么做的话,你会发现你的上下文到目标词的映射会相当频繁地得到这些种类的词,但是其他词,像 orange、apple 或 durian 就不会那么频繁地出现了。实际上词𝑝(𝑐)的分布并不是单纯的在训练集语料库上均匀且随机的采样得到的,而是采用了不同的分级来平衡更常见的词和不那么常见的词。

    负采样

    改善过的学习问题叫做负采样,它能做到与你刚才看到的 Skip-Gram 模型相似的事情,但是用了一个更加有效的学习算法,让我们来看看这是怎么做到的。
    我们在这个算法中要做的是构造一个新的监督学习问题,那么问题就是给定一对单词,比如 orange 和 juice,我们要去预测这是否是一对上下文词-目标词context-target)。
    在这里插入图片描述
    在这个例子中 orange 和 juice 就是个正样本,那么 orange 和 king 就是个负样本,我们把它标为 0。我们要做的就是采样得到一个上下文词和一个目标词,在这个例子中就是orange 和 juice,我们用 1 作为标记。这样生成一个正样本,正样本之前生成的方式一模一样,先抽取一个上下文词,在一定词距内比如说正负 10 个词距内选一个目标词,这就是生成这个表的第一行,即 orange–juice -1 的过程。然后为了生成一个负样本,你将用相同的上下文词,再在字典中随机选一个词,在这里我随机选了单词 king,标记为 0。然后我们再拿 orange,再随机从词汇表中选一个词,因为我们设想,如果随机选一个词,它很可能跟 orange 没关联,于是 orange–book– 0。我们再选点别的,orange 可能正好选到 the,然后是 0。还是 orange,再可能正好选到 of这个词,再把这个标记为 0,注意 of 被标记为 0,即使 of 的确出现在 orange 词的前面。
    表的第一行,它给了一个正样本,上下文,目标词,并给定标签为 1。然后我们要做的是给定几次,比如𝐾次,我们将用相同的上下文词,再从字典中选取随机的词,king、book、the、of 等,从词典中任意选取的词,并标记 0,这些就会成为负样本。

    接下来我们将构造一个监督学习问题,其中学习算法输入𝑥,输入这对词,要去预测目标的标签,即预测输出𝑦。因此问题就是给定一对词,像 orange 和 juice,你觉得它们会一起出现么?你觉得这两个词是通过对靠近的两个词采样获得的吗?或者你觉得我是分别在文本和字典中随机选取得到的?这个算法就是要分辨这两种不同的采样方式,这就是如何生成训练集的方法
    那么如何选取𝐾?Mikolov 等人推荐小数据集的话,𝐾从 5 到 20 比较好。如果你的数据集很大,𝐾就选的小一点。对于更大的数据集𝐾就等于 2 到 5,数据集越小𝐾就越大。那么在这个例子中,我们就用𝐾 = 4。
    在这里插入图片描述
    为了定义模型,我们将使用记号𝑐表示上下文词,记号𝑡表示可能的目标词,我再用𝑦表示 0 和 1,表示是否是一对上下文-目标词。我们要做的就是定义一个逻辑回归模型,给定输入的𝑐,𝑡对的条件下,𝑦 = 1的概率,即:𝑃(𝑦 = 1|𝑐,𝑡) = 𝜎(𝜃𝑡𝑇𝑒𝑐)
    这个模型基于逻辑回归模型,但不同的是我们将一个 sigmoid 函数作用于𝜃𝑡𝑇𝑒𝑐,参数和之前一样,你对每一个可能的目标词有一个参数向量𝜃𝑡和另一个参数向量𝑒𝑐,即每一个可能上下文词的的嵌入向量,我们将用这个公式估计𝑦 = 1的概率。如果你有𝐾个样本,你可以把这个看作1/𝐾的正负样本比例,即每一个正样本你都有𝐾个对应的负样本来训练一个类似逻辑回归的模型
    我们把这个画成一个神经网络,如果输入词是 orange,即词 6257,你要做的就是输入one-hot 向量,再传递给𝐸,通过两者相乘获得嵌入向量𝑒6257,你就得到了 10,000 个可能的逻辑回归分类问题,其中一个将会是用来判断目标词是否是 juice 的分类器,还有其他的词,比如说可能下面的某个分类器是用来预测 king 是否是目标词,诸如此类,预测词汇表中这些可能的单词。
    在这里插入图片描述
    我们把这个画成一个神经网络,如果输入词是 orange,即词 6257,你要做的就是输入one-hot 向量,再传递给𝐸,通过两者相乘获得嵌入向量𝑒6257,你就得到了 10,000 个可能的逻辑回归分类问题,其中一个将会是用来判断目标词是否是 juice 的分类器,还有其他的词,比如说可能下面的某个分类器是用来预测 king 是否是目标词,诸如此类,预测词汇表中这些可能的单词。把这些看作 10,000 个二分类逻辑回归分类器,但并不是每次迭代都训练全部 10,000 个,我们只训练其中的 5 个,我们要训练对应真正目标词那一个分类器,再训练 4 个随机选取的负样本,这就是𝐾 = 4的情况。所以不使用一个巨大的 10,000 维度的 softmax,因为计算成本很高,而是把它转变为 10,000 个二分类问题,每个都很容易计算,每次迭代我们要做的只是训练它们其中的 5 个,一般而言就是𝐾 + 1个,其中𝐾个负样本和 1 个正样本。这也是为什么这个算法计算成本更低,因为只需更新𝐾 + 1个逻辑单元,𝐾 + 1个二分类问题,相对而言每次迭代的成本比更新 10,000 维 的 softmax 分类器成本低

    Q:如何选取负样本?
    A:一个办法是对中间的这些词进行采样,即候选的目标词,你可以根据其在语料中的经验频率进行采样,就是通过词出现的频率对其进行采样。但问题是这会导致你在 like、the、of、and 诸如此类的词上有很高的频率。另一个极端就是用1 除以词汇表总词数,即|1/𝑣|,均匀且随机地抽取负样本,这对于英文单词的分布是非常没有代表性的。所以论文的作者 Mikolov 等人根据经验,他们发现这个经验值的效果最好,它位于这两个极端的采样方法之间,既不用经验频率,也就是实际观察到的英文文本的分布,也不用均匀分布,他们采用以下方式:
    在这里插入图片描述
    进行采样,所以如果𝑓(𝑤𝑖)是观测到的在语料库中的某个英文词的词频,通过34次方的计算,使其处于完全独立的分布和训练集的观测分布两个极端之间。

  • 相关阅读:
    一文搞懂Go读写Excel文件
    系统开发视角下的诊断 ———— 车身控制(B)诊断故障
    如何在电脑和手机之间无线传输大文件?不限文件格式、不压缩画质
    基于贝叶斯推理估计稳态 (ST) 和非稳态 (NS) LPIII 模型分布拟合到峰值放电(Matlab代码实现)
    SpringMVC系列(五)之JSR303和拦截器
    微信小程序剪切图片的功能
    java线程控制
    通过 MSE 实现基于Apache APISIX的全链路灰度
    计算机毕业设计JavaVue框架电商后台管理系统(源码+系统+mysql数据库+lw文档)
    【C语言】自定义类型:联合体和枚举
  • 原文地址:https://blog.csdn.net/m0_51474171/article/details/125520473