CS224D Deep Learning for NLP lecture2
来源:互联网 发布:女神联盟2进阶13数据 编辑:程序博客网 时间:2024/06/09 09:43
斯坦福深度学习与自然语言处理课程是Richard Socher今年开的课程。他是德国人,本来学习的是机器视觉。在斯坦福大学博士毕业,师从Andrew Ng和Chris Channing学习机器学习和NLP,毕业后也成为一个大牛。本人小白一枚,花了好长时间才消化了课程的视频和课件,为了防止以后忘记,在这里纪录一下。
先放上该课程的官网镇楼:http://cs224d.stanford.edu/syllabus.html
还有一个专门提供NLP资料的网站:http://www.52nlp.cn
课程的官网课件和笔记我会在每次看完后上传到CSDN,可以免费下载(lecture2的课件后来发现要一个积分才能下载,想改成免费但是CSDN貌似改不了)
Lecture1 没有什么干货,不写了。
- Lecture2 词矢量
- 整个文档VS窗口
- SVD分解
- SVD分解的问题
- word2vec
- word2vec主要思想
- 具体细节
- 梯度的推导
- 在word2vec里发现的线性关系
- Lecture3 预告
- 整个文档VS窗口
Lecture2 词矢量
计算机如何表示单词的含义呢?普遍的做法是像WordNet(这究竟是个什么,调研之后再补上)一样用分类的方法表示从属关系和同义关系。但是这样的做法有很多局限,例如生词和新词就无法表示,并且需要大量的人力去建造和维护,最关键的是无法准确度量词语之间的相似度,于是词语的离散表示(discrete representation)应运而生。
在向量空间里,一个向量通常有1个1和很多0(剩下的应该都是0),维度从20K(语音)到13M(Google1T)不等,这种表示方式我们称为”one-hot”表示。但是这种表示方法有个问题,假设
motel=[0000001000000]
hotel=[0000100000000],则
You shall know a word by the company it keeps
——J.R.Firth 1957:11
词矢量的基本假设: 假设相似的词总是有相似的上下文
于是我们使用上下文来表示一个单词。用上下文表示词语有两种方法:用整个文档的词表示当前单词,和使用有限长窗口内的词表示当前单词,究竟应该选用哪种方案呢?
整个文档VS窗口
- 使用文档的话,词-文档的共现矩阵会使得大众话题有相似的输入,导致进一步的隐藏语义分析
- 使用窗口的话可以让我们同时保留句法(POS)和语法信息
所以此后我们使用基于窗口的方法用上下文表示词矢量。窗的长度通常为5-10。
在这里,我们令窗长为1,计算对称的共现矩阵。
Example corpus:
- I like learning.
- I like NLP.
- I enjoy flying.
得到的共现矩阵见pdf第8页
共现矩阵的问题是随着字典的变大而变大,需要很高维的存储,并且在后续的分类模型中会有稀疏问题,所以需要进行降维。如何用最重要的若干信息来生成密集的向量呢?
SVD分解
SVD分解就是把一个
简单的python编程在pdf第12页中有。我自己写了一个python小程序,自带求共现矩阵功能。完整代码:
import numpy as npimport matplotlib.pyplot as pltla=np.linalgsentence=[[],[],[]]sentence[0]=["I","like","deep","learning","."]sentence[1]=["I","like","NLP","."]sentence[2]=["I","enjoy","flying","."]wordset=sentence[0]+sentence[1]+sentence[2]vocabulary=sentence[0]def count(x,y): count=0 for i in range(0,3): if x in sentence[i] and y in sentence[i]: if np.fabs(sentence[i].index(y)-sentence[i].index(x))==1: count+=1 return countfor i in wordset: if not i in vocabulary: vocabulary.append(i)lenth=len(vocabulary)X=np.zeros((lenth,lenth))for i in range(0,lenth): for j in range(0,lenth): X[i][j]=count(vocabulary[i],vocabulary[j])print XU,s,Vh=la.svd(X,full_matrices=False)print U,s,Vhfig=plt.figure()for i in xrange(lenth): plt.text(U[i,0],U[i,1],vocabulary[i])plt.xlim(-0.8,0.3)plt.ylim(-0.6,0.6)plt.show()
上图为程序运行的结果,可以看到词的坐标位置和课件上的并不一样。说明了结果与词的排列顺序有关,不同顺序共现矩阵不同,效果不同。为了效果起见,应该将词的顺序按照在文档中出现的频率降序排列。
Hacks to X(共现矩阵):
对于像(the,he,she)这样的功能词,出现频率太高,解决方法:
- 使用min(X,t),t~100的方法限制最高频率
- 直接忽略
- 用pearson correction 而不是直接统计次数,将负值设为0
- 使用有斜坡的窗使靠近的词更高比重(感觉就像DSP里的汉宁窗和汉命窗等)
。。。
SVD分解的问题:
对于一个n*m的矩阵,计算复杂度是
所以有了新的思路:直接学习低维词矢量
word2vec
word2vec主要思想
- 并非直接计算共现次数,而是预测每个词周围的词
- 与Golve很相似
- 更快更容易适应新文档和在单词里加入新词
具体细节
目标函数:给定当前中心词,最大化上下文中所有的词的log概率
对于
其中,v和v’分别是一个单词的”输入”和”输出”词矢量,即每个词有两个向量。输入向量很好理解,就是作为中心词时的词矢量。一开始我并不懂“输出”词矢量是什么鬼,看到Lecture3才明白,原来就是该词在变成非中心词时更新后的矢量。
例如 I like to run, 当like作为中心词时,它当前的词矢量为”输入”词矢量
梯度的推导
基础知识:
∂xTa∂x=∂aTx∂x=a - Chain rule!
dydx=dydududx
推导开始:
有木有很神奇!在当前中心词C下周围词O的log概率的梯度为,周围词O的”输出“词矢量减去,在中心词C下所有词X的概率乘X的”输出“词矢量之和(即所有”输出“词矢量的期望)。
虽然化成这种形式之后很方便计算,可以使用梯度下降法(SGD)求解,但是因为每次更新都需要计算所有词的概率和词矢量,这个目标函数在大词汇的字典并不适用,因为尺度太大训练太慢!
解决思路:
- 进行近似
- 定义负预测(negative prediction)(对于在上下文中不出现的单词,只采样几个,从而把注意力集中在大多数的正预测上)目前不是很懂这个负预测是什么,有什么作用,之后搞懂里再补上
在word2vec里发现的线性关系:
-句法上
-语义上
讲义里还有很多图片,这里不贴了
Lecture3 预告
- details to implement word2vec
- word embedding matrix
- advantages of low dimensional word vectors
- CS224D Deep Learning for NLP lecture2
- CS224D:Deep Learning for NLP Note1
- CS224d: Deep Learning for NLP Lecture1 听课记录
- CS224d: Deep Learning for NLP Lecture1 概率复习(1)
- deep learning for NLP courses
- Deep learning for NLP(summary)
- 【Deep Learning学习笔记】Deep learning for nlp without magic_Bengio_ppt_acl2012
- Deep Learning for NLP 文章列举
- Deep Learning for NLP 文章列举
- Deep Learning for NLP 文章列举 | 持之以恒
- Deep Learning for NLP 文章列举
- Deep Learning for NLP Best Practices
- Deep Learning for NLP Best Practices
- NLP之路-Deep Learning for NLP 文章列举
- deep learning in NLP
- CS224D Lecture2 札记
- CS224D Lecture2 札记
- Deep Learning, NLP, and Representations
- 登录界面的全过程
- 黑马程序员-------Foundation框架 NSRange
- 浅谈技术管理(转载,讲的非常不错,技术和产品都值得一看)
- iOS 禁止横屏
- INSTALL_FAILED_INSUFFICIENT_STORAGE.
- CS224D Deep Learning for NLP lecture2
- 正则表达式学习(基础篇)(原创)
- Android五大布局
- 51nod 01背包(DP)
- junit 的classpath文件
- 华为2016研发工程师编程题
- android集成微信支付(全是坑)
- 数组对称判断方法
- hdu5475 An easy problem