作者: 大树先生
博客: http://blog.csdn.net/koala_tree
知乎:https://www.zhihu.com/people/dashuxiansheng
GitHub:https://github.com/KoalaTree
2018 年 3 月 5 日
Ng最后一课发布了,撒花!以下为吴恩达老师 DeepLearning.ai 课程项目中,第五部分《序列模型》第二周课程“NLP和词嵌入”关键点的笔记。
同时我在知乎上开设了关于机器学习深度学习的专栏收录下面的笔记,以方便大家在移动端的学习。欢迎关注我的知乎:大树先生。一起学习一起进步呀!^_^
在前面学习的内容中,我们表征词汇是直接使用英文单词来进行表征的,但是对于计算机来说,是无法直接认识单词的。为了让计算机能够能更好地理解我们的语言,建立更好的语言模型,我们需要将词汇进行表征。下面是几种不同的词汇表征方式:
one-hot 表征:
在前面的一节课程中,已经使用过了one-hot表征的方式对模型字典中的单词进行表征,对应单词的位置用1表示,其余位置用0表示,如下图所示:
one-hot表征的缺点:这种方法将每个词孤立起来,使得模型对相关词的泛化能力不强。每个词向量之间的距离都一样,乘积均为0,所以无法获取词与词之间的相似性和关联性。
特征表征:词嵌入
用不同的特征来对各个词汇进行表征,相对与不同的特征,不同的单词均有不同的值。如下例所示:
这种表征方式使得词与词之间的相似性很容易地表征出来,这样对于不同的单词,模型的泛化性能会好很多。下面是使用t-SNE算法将高维的词向量映射到2维空间,进而对词向量进行可视化,很明显我们可以看出对于相似的词总是聚集在一块儿:
Word Embeddings对不同单词进行了实现了特征化的表示,那么如何将这种表示方法应用到自然语言处理的应用中呢?
名字实体识别的例子:
如下面的一个句子中名字实体的定位识别问题,假如我们有一个比较小的数据集,可能不包含durain(榴莲)和cultivator(培育家)这样的词汇,那么我们就很难从包含这两个词汇的句子中识别名字实体。但是如果我们从网上的其他地方获取了一个学习好的word Embedding,它将告诉我们榴莲是一种水果,并且培育家和农民相似,那么我们就有可能从我们少量的训练集中,归纳出没有见过的词汇中的名字实体。
词嵌入的迁移学习:
有了词嵌入,就可以让我们能够使用迁移学习,通过网上大量的无标签的文本中学习到的知识,应用到我们少量文本训练集的任务中。下面是做词嵌入迁移学习的步骤:
词嵌入和人脸编码:
词嵌入和人脸编码之间有很奇妙的联系。在人脸识别领域,我们会将人脸图片预编码成不同的编码向量,以表示不同的人脸,进而在识别的过程中使用编码来进行比对识别。词嵌入则和人脸编码有一定的相似性。
但是不同的是,对于人脸识别,我们可以将任意一个没有见过的人脸照片输入到我们构建的网络中,则可输出一个对应的人脸编码。而在词嵌入模型中,所有词汇的编码是在一个固定的词汇表中进行学习单词的编码以及其之间的关系的。
类比推理特性:
词嵌入还有一个重要的特性,它还能够帮助实现类比推理。如下面的例子中,通过不同词向量之间的相减计算,可以发现不同词之间的类比关系,man——woman、king——queen,如下图所示:
这种思想帮助研究者们对词嵌入建立了更加深刻的理解和认识。
计算词与词之间的相似度,实际上是在多维空间中,寻找词向量之间各个维度的距离相似度。
以上面的单词为例:
相似度函数:
余弦相似度函数(Cosine similarity):也就是向量 u 和 v 的内积
sim(u,v)=uTv||u||2||v||2
欧氏距离:
||u−v||2
在我们要对一个词汇表学习词嵌入模型时,实质上就是要学习这个词汇表对应的一个嵌入矩阵 E 。当我们学习好了这样一个嵌入矩阵后,通过嵌入矩阵与对应词的one-hot向量相乘,则可得到该词汇的embedding,如下图所示:
词嵌入的学习算法随着时间的进行逐渐变得越来越简单。
早期的学习算法:
如下面的例子中,我们要通过前面几个单词,预测最后一个单词:
在不断地训练过程中,算法会发现要想最好地拟合训练集,就要使得一些特性相似的词汇具有相似的特征向量,从而就得到了最后的词嵌入矩阵 E 。
其他的上下文和目标词对:
我们将要预测的单词称为目标词,其是通过一些上下文推导预测出来的。对于不同的问题,上下文的大小和长度以及选择的方法有所不同。
Word2Vec算法是一种简单的计算更加高效的方式来实现对词嵌入的学习。
Skip-grams:
在Skip-grams模型中,我们需要抽取上下文(Content)和目标词(Target)配对,来构造一个监督学习问题。
上下文不一定是要目标词前面或者后面离得最近的几个单词,而是随机选择一个词作为上下文,同时在上下文的一定距离范围内随机选择另外一个词作为目标词。构造这样一个监督学习问题的目的,并不是想要解决监督学习问题本身,而是想要使用这个问题来学习一个好的词嵌入模型。
模型流程:
存在的问题:
如何采样上下文:
在构建上下文目标词对时,如何选择上下文与模型有不同的影响。
Skip-grams模型可以帮助我们构造一个监督学习任务,将上下文映射到目标词上,从而让我们能够学习到一个实用的词嵌入模型。但是其缺点就是softmax计算的时间复杂度较高。下面介绍一种改善的学习问题:负采样。其能够做到的和Skip-grams模型相似,但其学习算法更加有效。
新的学习问题:
模型:
在负采样模型中,我们使用logistic回归模型:
每个正样本均有k个对应的负样本。在训练的过程中,对于每个上下文词,我们就有对应的 k+1 个分类器。如下图所示:
相比与Skip-grams模型,负采样不再使用一个具有词汇表大小时间复杂度高的庞大维度的Softmax,而是将其转换为词汇表大小个二分类问题。每个二分类任务都很容易解决,因为每个的训练样本均是1个正样本,外加k个负样本。
如何选择负样本:
在选定了上下文(Content)后,在确定正样本的情况下,我们还需要选择k个负样本以训练每个上下文的分类器。
GloVe(global vectors for word representation)词向量模型是另外一种计算词嵌入的方法,虽然相比下没有Skip-grams模型用的多,但是相比这种模型却更加简单。
GloVe模型:
GloVe词向量模型中,要定义一个量 Xij ,表示目标词 i 出现在上下文 j 的次数。模型的优化目标如下:
从上面的目标中,可以看出我们想要学习一些向量,他们的输出能够对上下文和目标两个词同时出现的频率进行很好的预测,从而得到我们想要的词嵌入向量。
词嵌入的特征化:
通过上面的很多算法得到的词嵌入向量,我们无法保证词嵌入向量的每个独立分量是能够让我们理解的。我们能够确定是每个分量是和我们所想的一些特征是有关联的,其可能是一些我们能够理解的特征的组合而构成的一个组合分量。使用上面的GloVe模型,从线性代数的角度解释如下:
加入的 A 项,可能构成任意的分量组合。
情感分类就是通过一段文本来判断这个文本中的内容是否喜欢其所讨论的内容,这是NLP中最重要的模块之一。
情感分类任务存在的一个问题就是只有很小的数据集,缺乏训练样本。但是在使用了词嵌入后,则能够带来很好的效果,足以训练一个良好的情感分类模型。
平均值或和的模型:
RNN模型:
当下机器学习或者人工智能算法已经被应用到做一些非常重要的决策中,因此我们需要尽可能地保证其不受非预期形式的偏见的影响,如性别、种族歧视等等。下面介绍一些在词嵌入中消除偏见的办法。
目前的偏见问题:
以一些预料库中学习到的词嵌入向量,会发现学习到的词向量存在下面一些具有性别、种族等偏见,这反映了人们在历史的写作中存在的这种社会偏见:
消除偏见的方法:
更多算法的细节可以查阅图中的文献。
本周(Week2)的课后编程作业请参见: