CS224D Lecture2 札記

終於把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,講了各種模型的計算複雜度,大概的框架。然後最後貼出來各種測試記錄就結束了。

作爲一個科普或者給初學者的方向指引不錯,作爲預習材料也可以。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章