吳恩達深度學習筆記(124)

Word2Vec

在上節你已經見到了如何學習一個神經語言模型來得到更好的詞嵌入,在本節中你會見到 Word2Vec算法,這是一種簡單而且計算時更加高效的方式來學習這種類型的嵌入,讓我們來看看。

吳恩達深度學習筆記(124) | NLP | Word2Vec

本節中的大多數的想法來源於Tomas Mikolov,Kai Chen,Greg Corrado 和 Jeff Dean。

(Mikolov T, Chen K, Corrado G, et al. Efficient Estimation of Word Representations in Vector Space[J]. Computer Science, 2013.)

假設在訓練集中給定了一個這樣的句子:“I want a glass of orange juice to go along with my cereal.”,在Skip-Gram模型中,我們要做的是抽取上下文和目標詞配對來構造一個監督學習問題

上下文不一定總是目標單詞之前離得最近的四個單詞,或最近的n個單詞。我們要的做的是隨機選一個詞作為上下文詞,比如選orange這個詞,然後我們要做的是隨機在一定詞距內選另一個詞,比如在上下文詞前後5個詞內或者前後10個詞內,我們就在這個範圍內選擇目標詞。可能你正好選到了juice作為目標詞,正好是下一個詞(表示orange的下一個詞),也有可能你選到了前面第二個詞,所以另一種配對目標詞可以是glass,還可能正好選到了單詞my作為目標詞。

於是我們將構造一個監督學習問題,它給定上下文詞,要求你預測在這個詞正負10個詞距或者正負5個詞距內隨機選擇的某個目標詞。顯然,這不是個非常簡單的學習問題,因為在單詞orange的正負10個詞距之間,可能會有很多不同的單詞。但是構造這個監督學習問題的目標並不是想要解決這個監督學習問題本身,而是想要使用這個學習問題來學到一個好的詞嵌入模型。

接下來說說模型的細節,我們繼續假設使用一個10,000詞的詞彙表,有時訓練使用的詞彙表會超過一百萬詞。但我們要解決的基本的監督學習問題是學習一種映射關係,從上下文c,比如單詞orange,到某個目標詞,記為t,可能是單詞juice或者單詞glass或者單詞my。延續上一張幻燈片的例子,在我們的詞彙表中,orange是第6257個單詞,juice是10,000個單詞中的第4834個,這就是你想要的映射到輸出y的輸入x。

吳恩達深度學習筆記(124) | NLP | Word2Vec

為了表示輸入,比如單詞orange,你可以先從one-hot向量開始,我們將其寫作O_c,這就是上下文詞的one-hot向量(上圖編號1所示)。然後和你在上節中看到的類似,你可以拿嵌入矩陣E乘以向量O_c,然後得到了輸入的上下文詞的嵌入向量,於是這裡e_c=EO_c。

在這個神經網絡中(上圖編號2所示),我們將把向量e_c喂入一個softmax單元。我通常把softmax單元畫成神經網絡中的一個節點(上圖編號3所示),這不是字母O,而是softmax單元,softmax單元要做的就是輸出^y。然後我們再寫出模型的細節,這是softmax模型(上圖編號4所示),預測不同目標詞的概率:

吳恩達深度學習筆記(124) | NLP | Word2Vec

這裡θ_t是一個與輸出t有關的參數,即某個詞t和標籤相符的概率是多少。我省略了softmax中的偏差項,想要加上的話也可以加上。

最終softmax的損失函數就會像之前一樣,我們用y表示目標詞,我們這裡用的y和^y都是用one-hot表示的,於是損失函數就會是:

吳恩達深度學習筆記(124) | NLP | Word2Vec

這是常用的softmax損失函數,y 就是隻有一個1其他都是0的one-hot向量,如果目標詞是juice,那麼第4834個元素就是1,其餘是0(上圖編號5所示)。類似的^y是一個從softmax單元輸出的10,000維的向量,這個向量是所有可能目標詞的概率。

總結一下,這大體上就是一個可以找到詞嵌入的簡化模型和神經網絡(上圖編號2所示),其實就是個softmax單元。矩陣E將會有很多參數,所以矩陣E有對應所有嵌入向量e_c的參數(上圖編號6所示),softmax單元也有θ_t的參數(上圖編號3所示)。

如果優化這個關於所有這些參數的損失函數,你就會得到一個較好的嵌入向量集,這個就叫做Skip-Gram模型。它把一個像orange這樣的詞作為輸入,並預測這個輸入詞,從左數或從右數的某個詞,預測上下文詞的前面一些或者後面一些是什麼詞。

實際上使用這個算法會遇到一些問題,首要的問題就是計算速度。尤其是在softmax模型中,每次你想要計算這個概率,你需要對你詞彙表中的所有10,000個詞做求和計算,可能10,000個詞的情況還不算太差。如果你用了一個大小為100,000或1,000,000的詞彙表,那麼這個分母的求和操作是相當慢的,實際上10,000已經是相當慢的了,所以擴大詞彙表就更加困難了。

吳恩達深度學習筆記(124) | NLP | Word2Vec

這裡有一些解決方案,如分級(hierarchical)的softmax分類器和負採樣(Negative Sampling)。

在文獻中你會看到的方法是使用一個分級(hierarchical)的softmax分類器,意思就是說不是一下子就確定到底是屬於10,000類中的哪一類。

想象如果你有一個分類器(上圖編號1所示),它告訴你目標詞是在詞彙表的前5000箇中還是在詞彙表的後5000個詞中,假如這個二分類器告訴你這個詞在前5000個詞中(上圖編號2所示),然後第二個分類器會告訴你這個詞在詞彙表的前2500個詞中,或者在詞彙表的第二組2500個詞中,諸如此類,直到最終你找到一個詞準確所在的分類器(上圖編號3所示),那麼就是這棵樹的一個葉子節點。

像這樣有一個樹形的分類器,意味著樹上內部的每一個節點都可以是一個二分類器,比如邏輯迴歸分類器,所以你不需要再為單次分類,對詞彙表中所有的10,000個詞求和了。實際上用這樣的分類樹,計算成本與詞彙表大小的對數成正比(上圖編號4所示),而不是詞彙表大小的線性函數,這個就叫做

分級softmax分類器

吳恩達深度學習筆記(124) | NLP | Word2Vec

我要提一下,在實踐中分級softmax分類器不會使用一棵完美平衡的分類樹或者說一棵左邊和右邊分支的詞數相同的對稱樹(上圖編號1所示的分類樹)。實際上,分級的softmax分類器會被構造成常用詞在頂部,然而不常用的詞像durian會在樹的更深處(上圖編號2所示的分類樹),因為你想更常見的詞會更頻繁,所以你可能只需要少量檢索就可以獲得常用單詞像the和of。然而你更少見到的詞比如durian就更合適在樹的較深處,因為你一般不需要到那樣的深處,所以有

不同的經驗法則可以幫助構造分類樹形成分級softmax分類器

所以這是你能在文獻中見到的一個加速softmax分類的方法,但是我不會再花太多時間在這上面了,你可以從我在第一張幻燈片中提到的Tomas Mikolov等人的論文中參閱更多的細節,所以我不會再花更多時間講這個了。因為在下節中,我們會講到另一個方法叫做負採樣,我感覺這個會更簡單一點,對於加速softmax和解決需要在分母中對整個詞彙表求和的問題也很有作用,下節中你會看到更多的細節。

吳恩達深度學習筆記(124) | NLP | Word2Vec

但是在進入下個視頻前,我想要你理解一個東西,那就是怎麼對上下文c進行採樣,一旦你對上下文c進行採樣,那麼目標詞t就會在上下文c的正負10個詞距內進行採樣。

但是你要如何選擇上下文c?

一種選擇是你可以就對語料庫均勻且隨機地採樣,如果你那麼做,你會發現有一些詞,像the、of、a、and、to諸如此類是出現得相當頻繁的,於是你那麼做的話,你會發現你的上下文到目標詞的映射會相當頻繁地得到這些種類的詞,但是其他詞,像orange、apple或durian就不會那麼頻繁地出現了。你可能不會想要你的訓練集都是這些出現得很頻繁的詞,因為這會導致你花大部分的力氣來更新這些頻繁出現的單詞的e_c(上圖編號1所示),但你想要的是花時間來更新像durian這些更少出現的詞的嵌入,即e_durian。實際上詞p(c)的分佈並不是單純的在訓練集語料庫上均勻且隨機的採樣得到的,而是採用了不同的分級來平衡更常見的詞和不那麼常見的詞。

這就是Word2Vec的Skip-Gram模型,如果你讀過我之前提到的論文原文,你會發現那篇論文實際上有兩個不同版本的Word2Vec模型,Skip-Gram只是其中的一個,另一個叫做

CBOW,即連續詞袋模型(Continuous Bag-Of-Words Model),它獲得中間詞兩邊的的上下文,然後用周圍的詞去預測中間的詞,這個模型也很有效,也有一些優點和缺點。

(上圖左邊為CBOW,下面為Skip-Gram)

吳恩達深度學習筆記(124) | NLP | Word2Vec

CBOW

吳恩達深度學習筆記(124) | NLP | Word2Vec

Skip Gram

CBOW對小型數據庫比較合適,而Skip-Gram在大型語料中表現更好

總結下:

CBOW是從原始語句推測目標字詞;而Skip-Gram正好相反,是從目標字詞推測出原始語句

而剛才講的Skip-Gram模型,關鍵問題在於softmax這個步驟的計算成本非常昂貴,因為它需要在分母裡對詞彙表中所有詞求和。通常情況下,Skip-Gram模型用到更多點。

在下個筆記中,我會展示給你一個算法,它修改了訓練目標使其可以運行得更有效,因此它可以讓你應用在一個更大的訓練集上面,也可以學到更好的詞嵌入


分享到:


相關文章: