天然语言处理( NLP )是信息时代最重要的技术之一,也是人工智能的重要组成部分。NLP的应用无处不在,由于人们几乎用语言交流一切:网络搜索、广告、电子邮件、客户服务、语言翻译、医疗报告等。算法
近年来,深度学习方法在许多不一样的NLP任务中得到了很是高的性能,同时也吸引了愈来愈多的人加入学习NLP的大潮中。应广大学习者要求,Datawhale正式开启NLP专辑系列,提供NLP入门方向和指引,但愿能帮助到你们。本系列专辑以斯坦福的CS224N教学视频为基础,整理其课堂笔记、拓展做者的理解和学习感悟,帮助你们全面了解NLP深度学习的前沿研究。如今,咱们开启预训练模型(一):Word vector。
网络
本文目录: app
1. 人类语言和词义框架
如何表达一个单词的含义分布式
在计算机中如何具备可用的含义ide
wordNet存在的问题函数
将单词表示为离散符号工具
单词做为离散符号存在的问题性能
经过上下文表示单词学习
词向量
词义做为神经词向量-可视化
2. Word2Vec介绍
Word2Vec概述
Word2Vec:目标函数
带矢量的Word2Vec概述
Word2Vec:预测功能
经过优化参数来训练模型
训练模型:计算全部矢量梯度
3. Word2Vec梯度的导数
链式法则
交互式白板会议
计算全部梯度
Word2vec:更多详细信息
4. 经常使用工具总结
梯度降低
随机梯度降低
定义:含义(韦伯斯特词典)
一个词或词组表示的意思;
人用这个单词,符号时表达的意思;
最广泛的意义语言学思惟方式:
能指(符号)⟺所指(思想或事物)
=指称语义
常看法决方案:使用 WordNet,一个同义词库,包含同义词集和上位词列表(“是”关系)
例如 包含“good”的同义词集
# 导入初始包# pip install nltkimport nltk#必须下载对应的wordnet包nltk.download('wordnet')from nltk.corpus import wordnet as wnposes = {'n':'noun','v':'verb','s':'adj(s)','a':'adj','r':'adv'}for synset in wn.synsets("good"): print("{}:{}".format(poses[synset.pos()],",".join([l.name() for l in synset.lemmas()])))
例如 "panda"的化身
# 导入初始包# pip install nltkimport nltk#必须下载对应的wordnet包nltk.download('wordnet')from nltk.corpus import wordnet as wnpanda = wn.synset("panda.n.01")hyper = lambda s: s.hypernyms()list(panda.closure(hyper))
做为资源很好,但缺乏细微差异
例如:“proficient”被列为“good”的同义词,这仅在某些状况下是正确的。
缺乏单词的新含义
例如,wicked,badass,nifty,wizard,genius,ninja,bombest,不可能保持最新。
主观
须要人工来创造和适应
没法计算准确的单词类似度
在传统的天然语言处理中,咱们将单词视为离散符号:hotel,conference,motel - 地方表明。单词能够用one-hot向量表示:<仅一个1,其他0s>
motel=[000000000010000]
hotel = [000000010000000]
向量维数=词汇中的单词数(例如:500,000)。
示例:在网络搜索中,若是用户搜索“Seattle motel”,咱们但愿匹配包含“Seattle hotel”的文档。可是:
motel=[000000000010000]
hotel = [000000010000000]
这两个向量是正交的。one-hot向量没有天然的类似性概念。
《解决方案》
能够尝试依靠WordNet的同义词列表来得到类似性吗?
可是众所周知严重失败:不完整等。
替代:学习在向量自己中编码类似性。
“您将知道它所经营的公司的一句话”(J.R. Firth 1957:11)
使用w的许多上下文来构建w的表示
咱们将为每一个单词构建一个密集的向量,并选择它,使其相似于出如今类似上下文中的单词的向量。
注意:单词向量有时也称为单词嵌入或单词表示形式,它们是分布式表示形式。
Word2vec使用两层神经网络结构来为大量文本数据的语料库生成单词的分布式表达,并在数百维向量空间中表达每一个单词的特征。在该向量空间中,假设在语料库中共享公共上下文的词彼此类似,而且将向量分配给这些词,以使它们在向量空间中彼此接近。
Word2vec(Mikolov et al.2013)是用于学习单词向量的框架。想法:
咱们有大量的语料库;
固定词汇表中的每一个单词都由一个向量表示;
遍历文本中的每一个位置t,该位置具备中心词c和上下文(“outside”)词o;
使用c和o的词向量的类似度来计算o给定c的几率(反之亦然);
采样窗口和计算下图的过程:
下一步:
对于每一个位置,在给定中心词的状况下,在固定大小的窗口中预测上下文词。
对于是全部要优化的变量。目标函数是平均负对数似然度:<:有时称为成本或损失函数>
咱们想要最小化目标函数:
问题:怎样计算
回答:在每一个单词咱们将使用两个向量:
当是中心词时
当是上下文词时
计算的采样窗口和过程
的缩写为:
这是softmax函数的一个例子:
softmax函数将任意值映射到几率分布
1. max,由于放大了最大的几率
2. soft”,由于仍然为较小的分配了一些几率
为了训练模型,咱们调整参数以最大程度地减小损失。例如,对于下面两个参数的简单凸函数,等高线显示目标函数的级别。下图为等高线:
召回:表示全部模型参数,在一个长矢量中。在咱们以维向量和个单词为例的状况下:
注意:每一个词都有两个向量,咱们经过沿着梯度走来优化这些参数
此处可观看吴恩达CS224n的视频,首先给出两个公式
1. 有用的基础知识:
2. 链式法则!若是和,即,而后:
链式法则!若是和,即,而后:
简单的例子:
1. 首先,展开成y对u的函数:
2. 接着,y对u求导:
3. 其次,在展开u对x的函数:
4. 接着,u对x求导:
5. 最后,根据链式法则:
让咱们一块儿得出中心词的梯度。对于一个采样窗口和一个采样外部单词:
而后,须要为上下文单词添加梯度(相似;左侧为做业),这就是这里的全部参数。
对一个窗口中的每一个中心向量v进行了渐变,咱们还须要外部向量u的梯度一般在每一个窗口中,计算该窗口中正在使用的全部参数的更新,例如:
为何要选择两个向量?->简化优化。最后将两个向量平均。Word2Vec模型有两种类型,即CBOW和skip-gram,它们均由两层神经网络组成(输入层,中间层,输出层)。
Continuous Bag of Words(CBOW)
从上下文词袋中预测中心词
如上所述,CBOW根据上下文(周围的单词)预测目标单词。顺便说一句,这里使用的文本是“You can do it!”。
它是一个学习模型,以上下文做为输入值来最大化目标词的后验几率。大体在如上图所示的图像中,输入值以one-hot 向量的形式输入,而且在中间层得到单词的分布式表示。在此,目标词是“can”,所以检查了预测输出结果(几率)与正确答案值(1)(1-0.93)之间的差别,并经过更新权重执行学习,以使偏差变小。
Skip-grams(SG)
根据给定的中心词来预测上下文(“外部”)词(与位置无关)
接下来是skip-gram,这是一个根据中心单词预测上下文(周围单词)的模型。简而言之,它是反转CBOW的图像。到目前为止,我看到的两个模型都使用神经网络(它模仿人脑的神经细胞),所以当人出现带有可疑记忆的单词时考虑到有待猜想的地方,人脑可能以相似的机制主导结果。
这两种模型细节请参见:https://blog.csdn.net/dn_mug/article/details/69852740
咱们有一个成本函数咱们想要最小化。梯度降低是最小化的算法
思路:对于的当前值,计算的梯度,而后朝负梯度的方向走一小步。重复。<注意:咱们的目标可能不会像这样凸出>
更新公式(以矩阵表示法):
更新公式(对于单个参数):
算法:
while True: theta_grad = evalute_gradient(J,corpus,theta) theta = theta - alpha * theta_grad
问题:是语料库中全部窗口的函数(多是数十亿!)
所以的计算很是昂贵
解决方案:随机梯度降低(SGD)
重复采样窗口,并在每一个窗口以后进行更新
while True: window = sample_window(corpus) theta_grad = evaluate_gradient(J,window,theta) theta = theta - alpha * theta_grad