终于把Lecture 2看得差不多了,现在开始写札记哦!
这一课的学习内容主要有四个部分。Pipeline 是这样的 Video/Slides -> Lecture notes 1 -> Distributed Representations of words and phrases and their compositionality -> Efficient Estimation of Word Representations in vector space
说实话这一课的理念让我脑洞大开,原来单词也可以这么玩,这么表示。让我不得不由衷的感叹数学之美,没准在不久的将来,人类就可以实现和计算机的Q&A方式的对话,真是个令人兴奋的时代!其实这课讲解的单词表示法的目的和主旨思想是以单词的mean作为维度,人类语言中的单词有多少个mean就有多少个维度,然后以数字表示这个单词的某个mean占的比例大小,课程中说这是一个word-space其实我个人认为写成mean-space是不是更合适,每个word都是这个mean-space中的一个点。
1. Video/Slides
这一课的Video的主题就是最开头的标题:How do we represent the meaning of a word?如何表示一个单词的意思。一个单词的意思是很抽象的东西,它存在于人的脑海里,如何用数学的方法把它们表示出来呢。
随后就开始了介绍表示单词意思的方法。Pipeline: Discrete representation -> Distributional similarity至此主线完成,之后就是介绍如何优化改进Make neighbors represent words,其pipeline: co-occurrence matrix ->
simple co-occurrence vectors -> Method 1 SVD -> SVD in python -> interesting semantic patterns emerge in the vectors -> problem with SVD -> Method 2 word2vec ->Main idea of word2vec -> Details of word2vec -> interesting semantic patterns emerge in the vectors of word2vec
a)Discrete representation of word
简单的说就是将单词表示成One-hot vectors,也就是有多少单词向量就有多长,给每个单词编唯一的一个编号ID,这个单词就表示成其他位都是零,只有ID位是1的向量,这种方法很简单,但是缺点也很明显:1.由于向量长度是根据单词个数来的,如果有新词出现,这个向量还得增加,麻烦!(Impossible to keep up to date) 2. 主观性太强(subjective) 3. 这么多单词,还得人工打labor并且adapt,想想就恐怖 4.这是最不能忍受的一点,很难计算单词之间的相似性。
b)Distributional similarity based representations
我觉得用其中一句名言总结就够了:You shall know a word by the company it keeps.其实这也符合人类的思维习惯,人类理解一个词并不是单纯的看这个词的拼写来理解它的意思,而是通过上下文来理解其意思。
c)Make neighbors represent words
1.with a co-occurrence matrix
使用co-occurrence matrix表示单词,CM有两种表示法,第一种是用word-document(行代表word,列代表document)的方法这种方法容易探测到单词的general topics;第二种是用word-windows(行代表word,列代表windows)的方法,这种方法容易探测到单词的Syntactic and semantic information,windows的选择一般选5-10之间。两种方法都不错,各有侧重。CM当然也有很大的问题,第一个就是随着单词的增长,矩阵的大小也在增大;第二个是维度太高(和单词数目一致),需要的存储量很大;第三个是太Sparsity,不利于之后的Classification 处理。这可怎么办呢?没事,方法总比问题多。SVD闪亮登场!
2.Method 1: Dimensionality reduction on CM
第一种Dimensionality reduction的方法是用SVD
SVD能很好的捕捉出矩阵中的variation,对降噪和降维都很有帮助
import numpy as np import matplotlib.pyplot as plt la = np.linalg words = ["I", "like", "enjoy", "deep", "learning", "NLP", "flying", "."] X = np.array([[0, 2, 1, 0, 0, 0, 0, 0], [2, 0, 0, 1, 0, 1, 0, 0], [1, 0, 0, 0, 0, 0, 1, 0], [0, 1, 0, 0, 1, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 1], [0, 1, 0, 0, 0, 0, 0, 1], [0, 0, 1, 0, 0, 0, 0, 1], [0, 0, 0, 0, 1, 1, 1, 0]]) U, s, Vh = la.svd(X, full_matrices = False) for i in xrange(len(words)): plt.text(U[i, 0], U[i, 1], words[i]) plt.axis([-1, 1, -1, 1]) plt.show()以上的代码就是课程的实例,最开始只 import matplotlib而没有import matplotlib.pyplot 导致一直没画出来(原谅我不熟悉python - -)
3. Hacks to CM
之前用SVD处理的方法很好,但是在原始的CM中有很多inherent(固有的)问题。第一个就是function words太多,对实际分类也太没用,于是想到两个解决办法:min(CM, t),t是一个阀值;另一个方法就是把function words全部忽略掉(其实也不错呢);第二个问题就是之前的CM建立方法不合理,很显然距离单词越近的词和这个词的相关性越高,反之相关性越小,所以我们可以使用一个Ramped windows(斜的窗)来建立CM,类似于用一个weight乘count,距离越远weight越小反之越大(weight是个bell shape函数);第三个hack的方法没有细介绍,我在网上找了个简单的介绍,可以有一个初步的intuition,链接在这 Pearson correlations
4. Interesting semantic patterns emerge in the vectors
至此使用SVD处理就大概讲完了,这玩意有啥用呢?这时出现了三个美丽的Patterns。第一个就是用Hierarchical Clustering来聚类行向量可以进行同义词聚类,这个video上讲的比较略,我是通过网上查了半天太查出来这个东东(- -);第二个美丽的pattern就是同义的单词在word-spaces里,同义词靠的近,不同意思的词靠的远;第三个美丽的pattern就是相似的semantic pair word之间的向量距离也类似。
5. problems with SVD
看似美丽的SVD方法也有它的缺陷。其中一个就是计算量极大,人类的语料库有数以trillion的数据,将它保存到一个矩阵中,然后做SVD恐怕目前最先进的计算机都吃不消;第二个就是SVD是一次成型(做陶具吗?- -),不容易增添单词和documents;第三个就是它和其它的DL模型不河蟹呀!于是Method 2 word2vec闪亮登场!
6. Main idea of word2vec
word2vec和之前的方法不同,之前建立CM是一次浇铸一次成型(- -),现在建立模型是慢慢的一个单词一个单词来。首先设定init parameter,然后根据这个parameter预测输入进来的word的context,然后如果context和ground truth类似就不变,如果不类似就penalize parameter(怎么有点像训练小狗,做的对给饭吃,做的不对抽两下 - -)
7.Details of word2vec
我们现在假设每个单词都是独立的哦,然后所有ground truth context given center word的概率相乘就是在这个模型的情况下,产生我们已知corpus(语料库)的概率,现在我们的目标就是找到使这个概率最大的parameters。
p(w_0|w_t)是用softmax表示的说实话没搞明白为啥这样表示,看了大纲说下一讲要讲
课程里讲得用Gradient decent求最优解,我又推倒了一遍(抱歉懒得用latex再敲一遍了- -):
8.interesting semantic patterns emerge in the vectors of word2vec
出现的有趣的patterns和用之前SVD方法产生的一样,就不赘述了。
9.Introduction of GloVe
课程最后对GloVe做了一个极其极其简单的介绍,估计是为了下一课开头吧。
2.Lecture notes 1
Lecture note 1里第一节到第三节讲的内容第一课和第二课video和slide里都有讲,就不赘述了。
第四节相当于是相对详细的讲解了word2vec
这里面第一段有一句话讲得非常好:We can try to create a model that will be able to learn one iteration at a time and eventually be able to encode the probability of a word given its context. We can set up this probabilistic model of known and unknown parameters and take on training example at a time in order to learn just a little bit of information for the unknown parameters based on the input, the output of the model, and the desired output of the model.
下面详细的分解了整个步骤:1. 运行我们的模型 2. 评估errors 3.根据一个更新规则及公式惩罚造成error的模型的参数(又让我想到训练小狗 - -)
a)Language Models
这一部分介绍了一元语言模型和二元语言模型,一元语言模型假定一个句子中每个单词的出现都与其上下文的单词无关,这显然不对,于是就有了二元模型。二元模型当然也很naive,它假定一个句子中每个单词的出现仅仅与它前面的单词有关,虽说这个假设很naive但是运行结果还是可以接受但不完美,可见在这个方面还是有性能提升空间的。
b)Continuous Bag of Word Model(CBOW)
CBOW做的工作是从context计算出center word。其中有几个很重要的参数:Input word matrix(W_1),Output word matrix(W_2),w_i是W_1的第i列代表了第i个单词的输入向量,v_i是W_2的第i行代表了第i个单词的输出向量。
具体的六个计算步骤在notes有不赘述了。
需要注意的是loss通过cross-entropy计算,如果预测很完美y_hat_i = 1,那么cross-entropy就是0,无loss。偏差越大则loss越大。最后用softmax给出了object function。
c)skip-gram Model
skip-gram我理解的是相当于做CBOW的逆运算,从center word计算出context。具体计算的六个步骤也类似,只是第三步不再将所有的求出来的u向量取平均,而是直接赋值给h。Object function也和CBOW的object function类似使用到了softmax。
d)Negative sampling
Negative sampling相当于skip-gram Model的改良版,它改进了三个东西:objective function, gradients, update rules
其实更新了objective function相应的gradients和update rules也会改变。Negative sampling的理念是不再用softmax求context在某个center word情况下出现的概率了,它的理念是求得使得corpus里所有正确句子都出现并且不正确的句子不出现的概率最大的parameters。那么如何得到unnatural sentences呢?这时候P_n(w)就登场了,它是每个单词出现概率的3/4次方后的值(有点绕),然后这个值形成的向量作为一个新的distribution,从word bank中随机抽取word组成句子,这样形成的句子多半是unnatural sentences。为什么要用3/4次方呢?因为越小的数的3/4次方增长的幅度越大,而接近1的数的3/4次方增大的很小
eg: 0.9^3/4 = 0.92 0.09^3/4 = 0.16 0.01^3/4 = 0.032
3.Paper:Distributed Representation of words and phrases and their compositionality
这个paper主要类似一个show(展示)对原理性的东西讲得比较略,第一节到第三节的内容,video和notes基本上都涵盖了。
第四节在课上和notes里没有提到。Learning phrases: phrases和简单的words相连接起来的意思有时候有很大的区别,所以不能简单的用讲两个单词的意思相加来表示,必须将其合起来作为一个atomic处理才行。如何找出phrases呢?文中有一句话很棒:To learn vector representation for phrases, we first find words that appear frequently together, and in frequently in other contexts.由这句话引出了一个score函数用来计算某words的组合是不是一个phrase -> score(w_i, w_j) = count(w_i,w_j) - delta / (count(w_i) * count(w_j)) delta是折扣参数,它的作用是抑制过多的不常出现的单词被提取出来。
之后几节的内容就是这样做的好处和测试结果了,略过不表。
最后有个结论挺重要的这里摘抄下来:In our experiments, the most crucial decisions that affect the performance are the choice of the model architecture, the size of the vectors, the subsampling rate, and the size of the training window.
4.Paper:Efficient Estimation of word representations in vector space
这个paper对那么多复杂的模型的介绍简直是介绍的略的不能再略了,可以看作是一个非常非常非常简单的introduction,讲了各种模型的计算复杂度,大概的框架。然后最后贴出来各种测试记录就结束了。
作为一个科普或者给初学者的方向指引不错,作为预习材料也可以。
版权声明:本文为博主原创文章,未经博主允许不得转载。