美文网首页工作生活
CS224n winter 2019-(2)Word Vecto

CS224n winter 2019-(2)Word Vecto

作者: tianchen627 | 来源:发表于2019-07-12 22:06 被阅读0次

    CS224n stanford主页
    该链接包含课程的视频、课件、笔记,强烈推荐。
    b站英文字幕
    使用b站新版网页界面,播放器右下角可以调出字幕。2p开始只有英文字幕了。油管倒是可以机翻生成中文字幕。
    斯坦福 CS224n 中文笔记整理活动 | ApacheCN
    CS224n winter 2019-(1)Introduction and Word Vectors


    今天的任务是

    0.Previously

    (0:00~10:25)

    继续前一节课介绍了介绍了Gensim,这是一个python的库。先是举了几个analogy()的例子,随后展示了PCA将词向量降到二维作图。代码在最上面的stanford主页上有。


    1.Finish looking at word vectors and word2vec

    (10:26~18:15)

    Word2vec计算

    词向量是行向量,矩阵中的每一列代表每一个单词。最后运算得到的是一个列向量,softmax后代表词汇表中每个单词出现的概率。
    还有需要注意的一点是经常可以看到词嵌入后二维可视化。实际上二维的情况下无法表现出词向量的高维关系。


    2.Optimization basics

    (18:16~20:59)

    这里介绍了梯度下降。

    (21:00~24:08)

    这里提到了随机梯度下降的概念。


    目标函数,外层∑是遍历语料库里层∑是遍历窗口

    J(θ)是一个标量,可以注意到的是当语料库(corpus,也就是样本数/文本中单词个数,上式中的T)很大时,更新一次θ会很慢。所以可以采取随机梯度下降的方法,一次更新参数不完整遍历1到T而是随机在语料库中抽取几个位置进行梯度下降(抽取位置数量batchsize一般设置为32或64)。
    取32或64为batchsize进行随机梯度下降有两个好处:
    1.比起取batchsize为1,32或64的batchsize噪声更小。
    2.nvidia底层的并行计算设计原因,比起取42或其他大小,取32或64的batchsize运算速度更快。

    (24:09~26:04)

    不要忘记我们最终的目的是更新参数矩阵θ。θ是一个2Vxd的矩阵,V是语料库中出现的单词集合因为一个单词两个向量所以是2V,d是单个词向量的长度。那如果我们采用随机梯度下降,其实每次更新只会更新其中几个行向量,也就是梯度矩阵会很稀疏。
    为了减少稀疏矩阵带来的计算效率上的降低,我们可以采取只更新行向量的方法,或者给词向量维护一个哈希表。具体怎么执行这里也没说。(So there‘s sort of some details there but I'm gonna skip past them more details)

    (26:05~38:42)

    这里提到了Skip-Gram model(SG),和Continuous Bag of Words(CBOW)。区别是Skip-Gram是求o(context word)相对于c(center word)的条件概率,而CBOW是求c(center word)相对于o(context word)的条件概率。以上我们的J(θ)都是根据SG来的(P(Wt+j|Wt) )。
    注意计算P(Wt+j|Wt),即P(o|c)时:

    softmax
    可以注意到w要遍历整个单词集合V。为了提高计算效率这里我们使用负采样进行优化。相比直接遍历整个词汇表来计算P(o|c),负采样只使用一对单词(正样本,即训练样本中在窗口内的单词对)来逻辑回归近似。
    "Main idea: train binary logistic regressions for a true pair .(center word and word in its context window) versus several noise pairs(the center word paired with a random word)"

    Distributed Representations of Words and Phrases and their Compositionality (negative sampling paper)

    当我们用训练样本 ( input word: "fox",output word: "quick") 训练模型时,假设“ fox”和“quick”都是经过one-hot编码。如果我们的词汇表V大小为10000,在输出层,我们期望对应“quick”单词的那个神经元结点输出1,其余9999个都应该输出0。在这里,这9999个我们期望输出为0的神经元结点所对应的单词我们称为“negative” word。
    当使用负采样时,我们将随机选择一小部分的negative words(比如选5个negative words)来更新对应的权重。我们也会对我们的“positive” word进行权重更新(在我们上面的例子中,这个单词指的是”quick“)。

    可以看到分母不再是遍历整个V,而是遍历k个词向量。其中j按照分布P(w)来取。式子的第一项更新正样本权重,第二项更新k个负样本权重。
    注意论文中的Jt(θ)前是正号不是负号,所以目标函数J(θ)是要做梯度上升来最大化的。
    k的取值对于小规模数据集,选择5-20个negative words会比较好,对于大规模数据集可以仅选择2-5个negative words。
    分布P(w)
    Z是归一化因子,把P(w)展开如下:
    ()=
    f(wi)为单词出现的频率,使用一元模型分布(unigram distribution)。每项增加一个指数,归一化后能使原分布中出现概率较小的单词概率变大,而原分布中出现概率较大的单词在 P(w) 中就会相应的变小。
    为什么可以有这个效果呢? 作出 y = x^(3/4) 和 y = x 的图就知道啦(记得观测的区间在[0,1]哦)。
    至于指数 3/4 以及模型的窗口大小都是模型的超参数,关于负采样以及相关超参数的选择都是论文的2.2节(第四页至第五页)。

    对这篇论文更深入的了解以及代码实现,可以见一文详解 Word2vec 之 Skip-Gram 模型

    “负采样的C语言实现非常的有趣。unigram table有一个包含了一亿个元素的数组,这个数组是由词汇表中每个单词的索引号填充的,并且这个数组中有重复,也就是说有些单词会出现多次。那么每个单词的索引在这个数组中出现的次数该如何决定呢,有公式,也就是说计算出的负采样概率*1亿=单词在表中出现的次数。
    有了这张表以后,每次去我们进行负采样时,只需要在0-1亿范围内生成一个随机数,然后选择表中索引号为这个随机数的那个单词作为我们的negative word即可。一个单词的负采样概率越大,那么它在这个表中出现的次数就越多,它被选中的概率就越大。”


    3.Can we capture this essence more effectively by counting

    (38:43~42:59)

    所以我们为什么要用以上词向量迭代优化的方法,而不是直接统计单词出现的频率呢?(上一节课提过one-hot编码的缺点,和这里不一样)晚点再看这个问题,首先我们提出共现矩阵(co-occurrence matrix)的概念,在2013年神经网络流行之前这是广泛应用的传统方法。
    "Those kinds of methods were traditionally used including even with distributed representation techniques so i want to say a bit about that so you are fully educated and don't sound like one of those people who were aware of no work that happened before 2013 when neural networks took off. "
    构建共现矩阵通常有两种方法,
    第一种是window-based co-occurrence matrix,滑动窗口和word2vec有些相似之后会给出例子。
    第二种是word-document co-occurrence matrix,即用单词和文档来构建矩阵。LSA(Latent Semantic Analysis)采用这种构建方法。
    接下来是window-based co-occurrence matrix的例子:


    这里窗口设置为大小1,同时是对称的即中心词左右的上下文都会取窗口大小

    在单词Iike的窗口大小中,I出现两次,deep出现1次,NLP出现1次,矩阵的第二行就是这样由来的其他同理。这就是共现矩阵。
    虽然这样的矩阵不再像one-hot编码那样向量两两正交,但是随着词汇表V的增大矩阵会占用很大的存储。同时由于矩阵的稀疏性后续做分类时也会遇到一些问题,模型的鲁棒性会变差。
    我们可以想办法将矩阵降维,一般会选择降低到25~1000维和word2vec相似的维度。

    (43:00~46:07)

    降维常用的方法就是奇异值分解SVD,原理方面推荐阅读以下博客。
    PCA与SVD的区别于联系

    numpy.svd
    这里因为只用了三句话所以看不出什么效果
    这里老师对这类技术有如下的评价:
    "It generally went for some word applications under the name of latent sematic analysis or latent sematic indexing
    and the idea was that you would have these semantic directions that you were finding in this low dimensional space that have meaning
    and people worked with it quite a bit for techniques like do trying to do information retrieval using these LS approximations
    and it’s sort of worked a bit it kind of never really worked very well
    and I think and so never sort of hugely caught on."
    大意是这种在低维寻找语义信息的LS(latent sematic)相关技术老师认为作用不好所以也不是很流行。

    (46:08~51:07)

    这里提到了优化共现矩阵的计数方式可以有很大帮助,如修整诸如the,he,has等词的计数,或者用相关系数(Pearson correlation)代替单纯计数。这些方法出自
    An Improved Model of Semantic Similarity Based on Lexical Co-Occurrence Rohde et al. ms., 2005
    这篇文章,提出了COALS模型。不过官网没有给出推荐阅读并且这里其实也只是一带而过。老师引出这个的意思是如果做好计数传统方法也会有很好的效果,所以接下来就要讲glove了。
    "The sense is if you have if you kind of do carefully control accounts and so on that conventional methods can also give you good word vector spaces and I mean so that was actually the starting of our work on glove."


    4.The Glove model of word vectors

    (51:08~57:20)

    两类模型比较
    第二种即使用神经网络的方法,这类方法在各方面都比计数的方法表现出的效果好,缺点就是需要更大的语料库和更长的训练时间。Glove结合了两类方法的优点,使用共现矩阵计数的比值来完成词向量的编码。
    "Combine these ideas and sort of have some of goodness of the neural net methods while trying to do things with some kind of count matrix
    and so in particular we wanted to get the result in a slightly less hacky way that you want have components of meaning being linear operation in the vector space that they are just some effector you are adding or something like this."
    Glove
    可以看到,因为solid更常用来描述ice而不是steam,所以在ice在solid的上下文中出现几率较大第在三行有一个较大的值,gas则正好相反比值较小。而对于water和fashion这种不相关的词,比值接近1。
    补充一下出现的符号,对于矩阵,为单词出现在单词上下文中次数,则
    顺带提一下,如果采用单词对单词的方式太构造共现矩阵并且窗口左右都取单词,则即为对称矩阵。
    objective function
    这里直接给出了目标函数。这个式子看起来有些复杂,其实式子的第二项就是一个平方损失,目的就是要让生成词向量的点积近似共现矩阵里对应两个词的计数取log。
    加入两个单词各自的偏置项b,为了减少这两个词都在语料库中出现多次或者都很少出现的情况对模型带来的影响。第一项f()函数可以限制出现多的词语对从而提高系统的表现。
    "We kind of complexified a little by putting in biased terms for both of the two words because maybe the word is just overall common and likes to co-occur things or uncommon or doesn't
    and we do one more little trick because every pun dose trick to make the performance better is that we alse use this F function in front so that we are sort of capping the effect that very common word pairs."
    GloVe: Global Vectors for Word Representation

    目标函数相关细节文章中第三节给出了推导及原因,这里就不展开了。

    5.Evaluating word vectors

    (57:21~59:56)

    评价词向量好坏的方法

    一般我们有内在的评价方法和外在的评价方法。内在评价即在一个特殊子问题上的表现,而外在的评价更多是实际工程的效果。

    (59:57~65:06)

    内在评价方法

    内在的评价方法一般使用词向量同义词的方法。比如上图中根据式子如果算出xi为"queen",则说明这个词向量表现良好。


    同义词的超参数调节实验

    相关文章

      网友评论

        本文标题:CS224n winter 2019-(2)Word Vecto

        本文链接:https://www.haomeiwen.com/subject/iiulhctx.html