本周任务
学课程
学习cs224n第3讲和第4讲
高级词向量表示:word2vec 2
- 课件: lecture03
- 观看视频3
- 学习笔记: word2vec-2
Word Window分类与神经网络
- 课件: lecture04
- 观看视频4
- 学习笔记:Word Window分类与神经网络
读论文
论文导读:词语义项的线性代数结构与词义消歧
- 论文原文: paper
- 论文分析: highlight
- 论文笔记:词语义项的线性代数结构与词义消歧
写作业
- Assignment 1.3-1.4
- 1.3 word2vec 实现
- 1.4 Sentiment Analysis 情绪分析
关于softmax与word2vec,一定要看的两篇好文章:
《word2vec中的数学原理》 : https://www.cnblogs.com/peghoty/p/3857839.html
《谈Softmax激活函数以及Softmax回归和Logistic回归关系》 : https://mp.weixin.qq.com/s/n1alXwE1psus2GK3cfEnpQ
第三课笔记
每次更新矩阵时(随机梯度下降的方法更新
),每个窗口就那么点词,所以矩阵会非常稀疏。所以每次只更新W矩阵中的少数列,或者为每个词语建立到词向量的哈希映射(怎么只更新W中的少数列?)
因为归一化因子的计算代价很大。可以用负样本减少计算时间。用在skip-gram里面就是取不是中心词上下文词的词,和中心词组成一对.
这是目标函数,k是我们用的负样本的个数。我们想最大化中心词和上下文词一起出现的概率,再加一个SIGMOD函数,取对数,就是上式的第一项。然后最小化随机与中心词匹配的负样本,就是第二项。U(w)是unigram分布,就是一个词出现的
这个幂使得更少频率的词能够被更经常用到。这是一种平滑策略,可以理解为劫富济贫
任何采样算法应该保证频次越高的样本越容易被采样出来,负采样可以看这篇文章(http://www.hankcs.com/nlp/word2vec.html#h3-12)
负采样和Hierarchical Softmax都是用近似的思想来降低模型的复杂度的。
word2vec将窗口视作训练单位,每个窗口或者几个窗口都要进行一次参数更新。要知道,很多词串出现的频次是很高的。能不能遍历一遍语料,迅速得到结果呢?用共现矩阵可以。
但是共现矩阵:1 出现新词的时候,旧向量的维度都要改变, 2 纬度太高 , 3 高稀疏性。
解决办法:降维
用svd,可以,还能加一些改进:限制高频词,或者用停用词;根据与中心词的距离衰减词频权重;用皮尔逊相关系数代替词频。但是存在的问题:计算复杂度高,n*m的矩阵时O(mn^2)
基于计数的和直接预测的两种模型的优点,我们得到了Glove模型
目标函数是
(关于glove的目标函数没懂?)
第四课笔记
对每个训练样本来说,我们的任务就是最大化争取分类y的概率。可以变成最小化它的负对数。
又由于是onehot,所以y中只有一个元素是1,其他都是0。所以这个损失函数等于交叉熵。
H(yhat,y) = -yi * log(yhat i)
若训练集为
那么最终的损失函数就是
在词向量的学习中,需要更新的参数有权值矩阵和词向量 参数太多
xi是d维的,是词的embedding表示形式,比如是用了一个300维的向量表示了zebra这个单词。在单词表里一共有V个单词,所以y是一个V维的onehot,每个单词的词向量表示要更新,就是V*d个参数,权重矩阵也要更新,权重矩阵就是乘以词向量x后再进行softmax就是输出的那一个矩阵。(这里C好像是等于V的?)
小常识:如果任务语料非常小,则不必在任务语料上重新训练词向量,否则会导致单词过拟合 。
一个现实中的分类任务:window classification
有一个张这样子的向量,可看作是列向量,每一个元素是d维词向量来表示的。可以还用softmax来做。但是!效果并不好。softmax等价于逻辑回归,是单层的网络,没有办法拟合非线性,课程里举得这个例子是为了引出后面的神经网络,对于窗口分类的用softmax的推导我就不写在这了。
一些note:在softmax中有两个费力的运算:W与x的乘法和求exp;for循环是非常没有效率的,要用矩阵乘法一次性做完。
神经网络:
神经网络的一般样式
神经网络同时运行多个逻辑回归,但不需要提前指定他们具体预测什么。这一层的多个逻辑回归同事进行,得到的结果继续向下传递到第二层,第二层也是有多个逻辑回归,这样一层层传下去就得到了一个多层网络。
这个f是激活函数,可以用SIGMOD:f(x) = 1 / (1 + exp(-x))
接下来要间隔最大化目标函数,就是怎么把两类分的更准确呢,就要把样本点与分界线之间的距离最大化,这时分的是最合理的。
这实际上是将函数间隔转换为几何间隔,参考SVM:http://www.hankcs.com/ml/support-vector-machine.html#h3-3
U是隐藏层到class的权值矩阵。
然后就可以继续算反向传播了。