动手学深度学习(十一、自然语言处理基础知识)

动手学深度学习(十一、自然语言处理基础知识)

附两个词向量基础的博客链接:

word2vec原理--CBOW与Skip-Gram模型基础

Word2Vec-知其然知其所以然

词向量:word2vector、Glove, 对于word2vector的近似训练(负采样、层序softmax)不甚了解, 对于word2vec的实现尚未处理

∝,数学符号,表示与什么成正比例。

负采样的本质:每次让一个训练样本只更新部分权重, 其他权重全部固定, 减少计算量(一定程度上还可以增加随机性)

negative sampling 的思想是只需要按照一定的概率分布P抽取K个负样本,比如在skip-gram的例子中,输入“fox”,抽出的负样本可能是“two”,“mother”等等,与正样本放在一起,将多分类问题转换成K+1个二分类问题,从而减少计算量,加快训练速度。

命名实体识别

基于规则的命名实体识别、基于特征的命名实体识别(语句是单词的序列,这种标注也成为序列标注, 下一个词的标注结果取决于之前单词的标注及相关特性)(逻辑回归、条件随机场)

词性标注(以单词为基本单位)

隐马尔科夫模型HMM

在许多研究中, 使用命名实体识别NER 和 词性标注POS 可以有效帮助机器阅读理解模型提高回答的准确度

eq:如果一共有m种命名实体和n种词性, 则训练一个大小为m * c的命名实体编码表 和 一个大小为n * d的词性编码表, 每个单词除了词向量外, 还使用其对应的c维命名实体编码 和d维词性编码表示

(命名实体识别、词性标注 都是 以单词为基本单位)

语言模型(N元模型)

语言模型刻画自然语言的生成概率, 常见算法有N元模型等, 可以使用困惑度评测(负N分之一次方)

拉普拉斯平滑(在计数中加上一个平滑项1 or K, add-K)

自然语言处理中的深度学习

从词向量 到 文本向量

将若干词向量变成一个向量的方法

利用RNN的最终状态、利用CNN和池化(CNN和最大池化  另一用途  字符CNN)、利用含参加权和(使用了可优化参数b, 其实是一种自注意力机制)

最大池化:最大池化的优势是, 对于一段文本的理解和其中的重要单词的位置无关, 平移不变性(tensor.unsqueeze函数)

自然语言理解

用于分类的深度学习网络 被称为 判定模型、自然语言中与分类相关的任务被称为自然语言理解(NLU)

文本分类(多标签分类、序列标注)

自然语言生成

文本生成用于机器翻译、自然语言回答形式的机器阅读理解,生成文章总结、自动补全句子或创作文章, 实现生成功能的深度学习网络称为生成模型、任务称为自然语言生成(NLG)

tensor.view函数是Pytorch中常用的变换维度的工具  3.3.2实战生成文本

集束搜索(Beam search)

集束宽度, 参数B, beam width, 同时设置最长长度L, 使用长度归一化计算平均全局概率

注意力机制

具有注意力机制的序列到序列模型

序列到序列模型和注意力机制。解码器RNN在每一步对编码器RNN状态使用注意力机制, 得到上下文向量, 并和词向量一起输入RNN

一、词嵌入(word2vec)

  • 词向量是用来表示词的向量。把词映射为实数域向量的技术也叫词嵌入。
  • word2vec包含跳字模型和连续词袋模型。跳字模型假设基于中心词来生成背景词。连续词袋模型假设基于背景词来生成中心词。

自然语言是一套用来表达含义的复杂系统。在这套系统中,词是表义的基本单元。词向量是用来表示词的向量,也可被认为是词的特征向量或表征。把词映射为实数域向量的技术也叫词嵌入(word embedding)。近年来,词嵌入已逐渐成为自然语言处理的基础知识。

Huffman编码

Word2vec算法用了Huffman编码,它把训练语料中的词当成叶子节点,其在语料中出现的次数当做权值,通过构造响应的Huffman树来对每一个词进行Huffman编码。

N-gram模型

统计语言模型就是计算一个句子的概率的概率模型。那么什么是一个句子的概率呢?就是语料库中出现这个句子的概率。

N-gram模型 

 计算复杂度:n越大, 计算复杂度越大, 呈指数级增大

模型效果:理论上n越大越好, 但是n越大的时候,模型效果提升幅度就会越小

因此,实际情况下, 最多的情况是取n = 3; 同时要考虑平滑化的问题, 假如词串在统计时计数为0, 会导致连乘的时候,整个词串的概率都为0。

N-gram模型是存储下来所有可能的概率参数,然后计算时对概率进行连乘。机器学习领域通用的做法:对所考虑的问题建模后,先为其构造一个目标函数进行优化,求得一组最优参数,然后用最优参数对应的模型来预测。因此对于N-gram模型来说,我们不需要存储所有可能的概率参数,而是求解对问题建模后得到的目标函数的最优参数即可。神经概率语言模型即用『神经网络』构建『函数F()』

词向量有两种表现形式:

  • One-hot Representation:用维度为字典长度的向量表示一个词,仅一个分量为1,其余为0。缺点是容易收到维度灾难的困扰,而且不能很好的刻画词与词之间的关系。
  • Distributed Representation:每个词映射为固定长度的短向量。通过刻画两个向量之间的距离来刻画两个向量之间的相似度。

神经概率语言模型

训练样本取前面n-1个词, 投影层向量、隐藏层向量、输出层向量, 使用神经网络确定网络参数, 继而求得整个句子的概率, 缺点:计算量太大。 

神经概率语言模型的目的是得到语言模型, 词向量不过是次要目的

Word2Vec

Word2vec模型主要的目的是计算出『词向量word embedding』

Word2vec选择将输入层到投影层的运算从『拼接』变成『叠加』。也就是说,投影层的节点数不再是上下文词数量*词向量维度,而就是词向量维度。其次,针对『隐层和输出层之间的矩阵运算』,word2vec选择删去隐藏层。变成类似下图所示:

7

注意,对于神经网络而言,我们的输入层的参数Context(w)是中各个词的词向量,那么这个词向量是怎么来的呢?其实这个词向量就是输出层和映射层之间的参数, 这样一来的话,我们训练神经网络的参数,就相当于训练了每个词的词向量,也就得到了词典中每个词的词向量。

语料库中的词的数量级通常在million甚至billion量级,这样一来的话,训练复杂度就无法接受。Word2vec提出了两种优化Softmax计算过程的方法,同样也对应着Word2vec的两种框架,即:Hieraichical Softmax和Negative Sampling。它利用了树实现了分层的Softmax,即用树形结构替代了输出层的结构。Hierarchical Softmax采用是Huffman树而不是其他的二叉树,这是因为Huffman树对于高频词会赋予更短的编码,使得高频词离根节点距离更近,从而使得训练速度加快; Word2vec采用的Negative Sampling是NCE的一种简化版本,目的是为了提高训练速度以及改善所得词的质量。相比于Hierarchical Softmax,Negative Sampling不再采用Huffman树,而是采用随机负采样

随机负采样: 每次只从词典里随机选一些word作为当前词w的负样本(称为NEG(w)),而不是以所有的字典里的其他词作为负样本。其实在做出随机选取负样本的动作之后,我们就已经抛弃了Softmax这个函数所代表的归一化的意思了。也就代表了我们已经不再关注求解语言模型的问题,而只关注求解词向量的问题。

Word2vec对于经典神经网络概率语言模型的优化的话,我们发现,Word2vec大大简化了网络结构。但是同时也因为网络结构简单所带来的低计算复杂度,所以它可以在更大规模的数据集上计算出非常精确的高维词向量。这也是值得注意的思路,我们如何权衡模型复杂度与可训练数据之间的关系。模型越复杂,可训练数据的量级越小;而模型越简单,可训练数据的量级越多。

Word2vec中的两个重要模型是:CBOW模型(Continuous Bag-of-Words Model)和Skip-gram模型(Continuous Skip-gram模型)。

One-hot向量

虽然one-hot词向量构造起来很容易,但通常并不是一个好选择。一个主要的原因是,one-hot词向量无法准确表达不同词之间的相似度,如我们常常使用的余弦相似度。它们的余弦相似度是它们之间夹角的余弦值。由于任何两个不同词的one-hot向量的余弦相似度都为0,多个不同词之间的相似度难以通过one-hot向量准确地体现出来。word2vec工具的提出正是为了解决上面这个问题 。它将每个词表示成一个定长的向量,并使得这些向量能较好地表达不同词之间的相似和类比关系。word2vec工具包含了两个模型,即跳字模型(skip-gram)和连续词袋模型(continuous bag of words,CBOW)。

跳字模型Skip-gram

跳字模型假设基于某个词来生成它在文本序列周围的词。举个例子,假设文本序列是“the”“man”“loves”“his”“son”。以“loves”作为中心词,设背景窗口大小为2。跳字模型所关心的是,给定中心词“loves”,生成与它距离不超过2个词的背景词“the”“man”“his”“son”的条件概率,即P(“the",“man",“his",“son"∣“loves")。

假设给定中心词的情况下,背景词的生成是相互独立的,那么上式可以改写成P(“the"∣“loves")⋅P(“man"∣“loves")⋅P(“his"∣“loves")⋅P(“son"∣“loves").

在跳字模型中,每个词被表示成两个d维向量,用来计算条件概率。假设这个词在词典中索引为i,当它为中心词时向量表示为vi∈Rd,而为背景词时向量表示为ui∈Rd。

给定中心词生成背景词的条件概率可以通过对向量内积做softmax运算而得到

训练

跳字模型的参数是每个词所对应的中心词向量和背景词向量。训练中我们通过最大化似然函数来学习模型参数,即最大似然估计。如果使用随机梯度下降,那么在每一次迭代里我们随机采样一个较短的子序列来计算有关该子序列的损失,然后计算梯度来更新模型参数。梯度计算的关键是条件概率的对数有关中心词向量和背景词向量的梯度。

连续词袋模型CBOW

连续词袋模型与跳字模型类似。与跳字模型最大的不同在于,连续词袋模型假设基于某中心词在文本序列前后的背景词来生成该中心词。在同样的文本序列“the”“man”“loves”“his”“son”里,以“loves”作为中心词,且背景窗口大小为2时,连续词袋模型关心的是,给定背景词“the”“man”“his”“son”生成中心词“loves”的条件概率, 也就是 P(“loves"∣“the",“man",“his",“son")。对应的CBOW神经网络模型输入层有多少个神经元,输出层有词汇表大小个神经元。

因为连续词袋模型的背景词有多个,我们将这些背景词向量取平均,然后使用和跳字模型一样的方法来计算条件概率。训练连续词袋模型同训练跳字模型基本一致。连续词袋模型的最大似然估计等价于最小化损失函数

二、近似训练(尚未实现)

  • 负采样通过考虑同时含有正类样本和负类样本的相互独立事件来构造损失函数。其训练中每一步的梯度计算开销与采样的噪声词的个数线性相关。
  • 层序softmax使用了二叉树,并根据根结点到叶结点的路径来构造损失函数。其训练中每一步的梯度计算开销与词典大小的对数相关。

不论是跳字模型还是连续词袋模型,由于条件概率使用了softmax运算,每一步的梯度计算都包含词典大小数目的项的累加。对于含几十万或上百万词的较大词典,每次的梯度计算开销可能过大。为了降低该计算复杂度,本节将介绍两种近似训练方法,即负采样(negative sampling)或层序softmax(hierarchical softmax)。跳字模型的核心在于使用softmax运算得到给定中心词w_{c}​来生成背景词w_{o}​的条件概率。为了降低该计算复杂度,本节将介绍两种近似训练方法,即负采样(negative sampling)或层序softmax(hierarchical softmax)。

三、Word2Vector的实现(尚未实现)

参考文献:10.3 word2vec的实现 - Dive-into-DL-PyTorch (tangshusen.me)

  • 可以使用PyTorch通过负采样训练跳字模型。
  • 二次采样试图尽可能减轻高频词对训练词嵌入模型的影响。
  • 可以将长度不同的样本填充至长度相同的小批量,并通过掩码变量区分非填充和填充,然后只令非填充参与损失函数的计算。

Word2vec的实现,采用跳字模型、负采样为例, 介绍在语料库上训练词嵌入模型的实现。我们还会介绍一些实现中的技巧,如二次采样(subsampling)。

四、子词嵌入(fastText)

构词学

  • fastText提出了子词嵌入方法。它在word2vec中的跳字模型的基础上,将中心词向量表示成单词的子词向量之和。
  • 子词嵌入利用构词上的规律,通常可以提升生僻词表示的质量。

英语单词通常有其内部结构和形成方式。例如,我们可以从“dog”“dogs”和“dogcatcher”的字面上推测它们的关系。这些词都有同一个词根“dog”,但使用不同的后缀来改变词的含义。而且,这个关联可以推广至其他词汇。例如,“dog”和“dogs”的关系如同“cat”和“cats”的关系,“boy”和“boyfriend”的关系如同“girl”和“girlfriend”的关系。这一特点并非为英语所独有。在法语和西班牙语中,很多动词根据场景不同有40多种不同的形态,而在芬兰语中,一个名词可能有15种以上的形态。事实上,构词学(morphology)作为语言学的一个重要分支,研究的正是词的内部结构和形成方式。

在word2vec中,我们并没有直接利用构词学中的信息。无论是在跳字模型还是连续词袋模型中,我们都将形态不同的单词用不同的向量来表示。例如,“dog”和“dogs”分别用两个不同的向量表示,而模型中并未直接表达这两个向量之间的关系。鉴于此,fastText提出了子词嵌入(subword embedding)的方法,从而试图将构词信息引入word2vec中的跳字模型。

在fastText中,每个中心词被表示成子词的集合。下面我们用单词“where”作为例子来了解子词是如何产生的。首先,我们在单词的首尾分别添加特殊字符“<”和“>”以区分作为前后缀的子词。然后,将单词当成一个由字符构成的序列来提取n元语法。例如,当n = 3时,我们得到所有长度为3的子词:“<wh>”“whe”“her”“ere”“<re>”以及特殊子词“<where>”。

在fastText中,对于一个词w,我们将它所有长度3 - 6的子词和特殊子词的并集记为G_w​。那么词典则是所有词的子词集合的并集。假设词典中子词g的向量为z_{g},那么跳字模型中词w的作为中心词的向量v_{w}​则表示成

fastText的其余部分同跳字模型一致,不在此重复。可以看到,与跳字模型相比,fastText中词典规模更大,造成模型参数更多,同时一个词的向量需要对所有子词向量求和,继而导致计算复杂度更高。但与此同时,较生僻的复杂单词,甚至是词典中没有的单词,可能会从同它结构类似的其他词那里获取更好的词向量表示。

五、全局向量的词嵌入(GloVe)(略、尚未实现)

  • 在有些情况下,交叉熵损失函数有劣势。GloVe模型采用了平方损失,并通过词向量拟合预先基于整个数据集计算得到的全局统计信息。
  • 任意词的中心词向量和背景词向量在GloVe模型中是等价的。

猜你喜欢

转载自blog.csdn.net/jiangchao98/article/details/115658486
今日推荐