附两个词向量基础的博客链接:
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
自然语言是一套用来表达含义的复杂系统。在这套系统中,词是表义的基本单元。词向量是用来表示词的向量,也可被认为是词的特征向量或表征。把词映射为实数域向量的技术也叫词嵌入(word embedding)。近年来,词嵌入已逐渐成为自然语言处理的基础知识。
Word2vec算法用了Huffman编码,它把训练语料中的词当成叶子节点,其在语料中出现的次数当做权值,通过构造响应的Huffman树来对每一个词进行Huffman编码。
统计语言模型就是计算一个句子的概率的概率模型。那么什么是一个句子的概率呢?就是语料库中出现这个句子的概率。
N-gram模型
计算复杂度:n越大, 计算复杂度越大, 呈指数级增大
模型效果:理论上n越大越好, 但是n越大的时候,模型效果提升幅度就会越小
因此,实际情况下, 最多的情况是取n = 3; 同时要考虑平滑化的问题, 假如词串在统计时计数为0, 会导致连乘的时候,整个词串的概率都为0。
N-gram模型是存储下来所有可能的概率参数,然后计算时对概率进行连乘。机器学习领域通用的做法:对所考虑的问题建模后,先为其构造一个目标函数进行优化,求得一组最优参数,然后用最优参数对应的模型来预测。因此对于N-gram模型来说,我们不需要存储所有可能的概率参数,而是求解对问题建模后得到的目标函数的最优参数即可。神经概率语言模型即用『神经网络』构建『函数F()』
词向量有两种表现形式:
神经概率语言模型
训练样本取前面n-1个词, 投影层向量、隐藏层向量、输出层向量, 使用神经网络确定网络参数, 继而求得整个句子的概率, 缺点:计算量太大。
神经概率语言模型的目的是得到语言模型, 词向量不过是次要目的
Word2vec模型主要的目的是计算出『词向量word embedding』
Word2vec选择将输入层到投影层的运算从『拼接』变成『叠加』。也就是说,投影层的节点数不再是上下文词数量*词向量维度,而就是词向量维度。其次,针对『隐层和输出层之间的矩阵运算』,word2vec选择删去隐藏层。变成类似下图所示:
注意,对于神经网络而言,我们的输入层的参数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向量的余弦相似度都为0,多个不同词之间的相似度难以通过one-hot向量准确地体现出来。word2vec工具的提出正是为了解决上面这个问题 。它将每个词表示成一个定长的向量,并使得这些向量能较好地表达不同词之间的相似和类比关系。word2vec工具包含了两个模型,即跳字模型(skip-gram)和连续词袋模型(continuous bag of words,CBOW)。
跳字模型假设基于某个词来生成它在文本序列周围的词。举个例子,假设文本序列是“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运算而得到
训练
跳字模型的参数是每个词所对应的中心词向量和背景词向量。训练中我们通过最大化似然函数来学习模型参数,即最大似然估计。如果使用随机梯度下降,那么在每一次迭代里我们随机采样一个较短的子序列来计算有关该子序列的损失,然后计算梯度来更新模型参数。梯度计算的关键是条件概率的对数有关中心词向量和背景词向量的梯度。
连续词袋模型与跳字模型类似。与跳字模型最大的不同在于,连续词袋模型假设基于某中心词在文本序列前后的背景词来生成该中心词。在同样的文本序列“the”“man”“loves”“his”“son”里,以“loves”作为中心词,且背景窗口大小为2时,连续词袋模型关心的是,给定背景词“the”“man”“his”“son”生成中心词“loves”的条件概率, 也就是 P(“loves"∣“the",“man",“his",“son")。对应的CBOW神经网络模型输入层有多少个神经元,输出层有词汇表大小个神经元。
因为连续词袋模型的背景词有多个,我们将这些背景词向量取平均,然后使用和跳字模型一样的方法来计算条件概率。训练连续词袋模型同训练跳字模型基本一致。连续词袋模型的最大似然估计等价于最小化损失函数
不论是跳字模型还是连续词袋模型,由于条件概率使用了softmax运算,每一步的梯度计算都包含词典大小数目的项的累加。对于含几十万或上百万词的较大词典,每次的梯度计算开销可能过大。为了降低该计算复杂度,本节将介绍两种近似训练方法,即负采样(negative sampling)或层序softmax(hierarchical softmax)。跳字模型的核心在于使用softmax运算得到给定中心词来生成背景词的条件概率。为了降低该计算复杂度,本节将介绍两种近似训练方法,即负采样(negative sampling)或层序softmax(hierarchical softmax)。
参考文献:10.3 word2vec的实现 - Dive-into-DL-PyTorch (tangshusen.me)
Word2vec的实现,采用跳字模型、负采样为例, 介绍在语料库上训练词嵌入模型的实现。我们还会介绍一些实现中的技巧,如二次采样(subsampling)。
构词学
英语单词通常有其内部结构和形成方式。例如,我们可以从“dog”“dogs”和“dogcatcher”的字面上推测它们的关系。这些词都有同一个词根“dog”,但使用不同的后缀来改变词的含义。而且,这个关联可以推广至其他词汇。例如,“dog”和“dogs”的关系如同“cat”和“cats”的关系,“boy”和“boyfriend”的关系如同“girl”和“girlfriend”的关系。这一特点并非为英语所独有。在法语和西班牙语中,很多动词根据场景不同有40多种不同的形态,而在芬兰语中,一个名词可能有15种以上的形态。事实上,构词学(morphology)作为语言学的一个重要分支,研究的正是词的内部结构和形成方式。
在word2vec中,我们并没有直接利用构词学中的信息。无论是在跳字模型还是连续词袋模型中,我们都将形态不同的单词用不同的向量来表示。例如,“dog”和“dogs”分别用两个不同的向量表示,而模型中并未直接表达这两个向量之间的关系。鉴于此,fastText提出了子词嵌入(subword embedding)的方法,从而试图将构词信息引入word2vec中的跳字模型。
在fastText中,每个中心词被表示成子词的集合。下面我们用单词“where”作为例子来了解子词是如何产生的。首先,我们在单词的首尾分别添加特殊字符“<”和“>”以区分作为前后缀的子词。然后,将单词当成一个由字符构成的序列来提取元语法。例如,当时,我们得到所有长度为3的子词:“
在fastText中,对于一个词,我们将它所有长度的子词和特殊子词的并集记为。那么词典则是所有词的子词集合的并集。假设词典中子词的向量为,那么跳字模型中词的作为中心词的向量则表示成
fastText的其余部分同跳字模型一致,不在此重复。可以看到,与跳字模型相比,fastText中词典规模更大,造成模型参数更多,同时一个词的向量需要对所有子词向量求和,继而导致计算复杂度更高。但与此同时,较生僻的复杂单词,甚至是词典中没有的单词,可能会从同它结构类似的其他词那里获取更好的词向量表示。