2.6 Word2Vec-深度学习第五课《序列模型》-Stanford吴恩达教授
Word2Vec
在上個視頻中你已經見到了如何學習一個神經語言模型來得到更好的詞嵌入,在本視頻中你會見到 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模型中,我們要做的是抽取上下文和目標詞配對,來構造一個監督學習問題。上下文不一定總是目標單詞之前離得最近的四個單詞,或最近的 nnn 個單詞。我們要的做的是隨機選一個詞作為上下文詞,比如選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個,這就是你想要的映射到輸出 yyy 的輸入 xxx。
為了表示輸入,比如單詞orange,你可以先從one-hot向量開始,我們將其寫作 OcO_cOc? ,這就是上下文詞的one-hot向量(上圖編號1所示)。然后和你在上節視頻中看到的類似,你可以拿嵌入矩陣 EEE 乘以向量 OcO_cOc? ,然后得到了輸入的上下文詞的嵌入向量,于是這里 ec=EOce_c=EO_cec?=EOc? 。在這個神經網絡中(上圖編號2所示),我們將把向量 ece_cec? 喂入一個softmax單元。我通常把softmax單元畫成神經網絡中的一個節點(上圖編號3所示),這不是字母O,而是softmax單元,softmax單元要做的就是輸出 y^\hat{y}y^? 。然后我們再寫出模型的細節,這是softmax模型(上圖編號4所示),預測不同目標詞的概率:
Softmax:p(t∣c)=exp(θtTec)∑j=110,000exp(θjTec)Softmax:p(t|c)=\frac{exp(\theta_t^Te_c)}{\sum_{j=1}^{10,000}exp(\theta^T_je_c)}Softmax:p(t∣c)=∑j=110,000?exp(θjT?ec?)exp(θtT?ec?)?
這里 θt\theta_tθt? 是一個與輸出 ttt 有關的參數,即某個詞 ttt 和標簽相符的概率是多少。我省略了softmax中的偏差項,想要加上的話也可以加上。
最終softmax的損失函數就會像之前一樣,我們用 yyy 表示目標詞,我們這里用的 yyy 和 y^\hat{y}y^? 都是用one-hot表示的,于是損失函數就會是:
L(y^,y)=?∑i=110,000yilog?y^iL(\hat{y},y)=-\sum_{i=1}^{10,000}y_i\log\hat{y}_iL(y^?,y)=?i=1∑10,000?yi?logy^?i?
這是常用的softmax損失函數, yyy 就是只有一個1其他都是0的one-hot向量,如果目標詞是juice,那么第4834個元素就是1,其余是0(上圖編號5所示)。類似的 y^\hat{y}y^? 是一個從softmax單元輸出的10,000維的向量,這個向量是所有可能目標詞的概率。
總結一下,這大體上就是一個可以找到詞嵌入的簡化模型和神經網絡(上圖編號2所示),其實就是個softmax單元。矩陣 EEE 將會有很多參數,所以矩陣 EEE 有對應所有嵌入向量 ece_cec? 的參數(上圖編號6所示),softmax單元也有 θt\theta_tθt? 的參數(上圖編號3所示)。如果優化這個關于所有這些參數的損失函數,你就會得到一個較好的嵌入向量集,這個就叫做Skip-Gram模型。它把一個像orange這樣的詞作為輸入,并預測這個輸入詞,從左數或從右數的某個詞,預測上下文詞的前面一些或者后面一些是什么詞。
實際上使用這個算法會遇到一些問題,首要的問題就是計算速度。尤其是在softmax模型中,每次你想要計算這個概率,你需要對你詞匯表中的所有10,000個詞做求和計算,可能10,000個詞的情況還不算太差。如果你用了一個大小為100,000或1,000,000的詞匯表,那么這個分母的求和操作是相當慢的,實際上10,000已經是相當慢的了,所以擴大詞匯表就更加困難了。
這里有一些解決方案,如分級(hierarchical)的softmax分類器和負采樣(Negative Sampling)。
在文獻中你會看到的方法是使用一個分級(hierarchical)的softmax分類器,意思就是說不是一下子就確定到底是屬于10,000類中的哪一類。想象如果你有一個分類器(上圖編號1所示),它告訴你目標詞是在詞匯表的前5000個中還是在詞匯表的后5000個詞中,假如這個二分類器告訴你這個詞在前5000個詞中(上圖編號2所示),然后第二個分類器會告訴你這個詞在詞匯表的前2500個詞中,或者在詞匯表的第二組2500個詞中,諸如此類,直到最終你找到一個詞準確所在的分類器(上圖編號3所示),那么就是這棵樹的一個葉子節點。像這樣有一個樹形的分類器,意味著樹上內部的每一個節點都可以是一個二分類器,比如邏輯回歸分類器,所以你不需要再為單次分類,對詞匯表中所有的10,000個詞求和了。實際上用這樣的分類樹,計算成本與詞匯表大小的對數成正比(上圖編號4所示),而不是詞匯表大小的線性函數,這個就叫做分級softmax分類器。
我要提一下,在實踐中分級softmax分類器不會使用一棵完美平衡的分類樹或者說一棵左邊和右邊分支的詞數相同的對稱樹(上圖編號1所示的分類樹)。實際上,分級的softmax分類器會被構造成常用詞在頂部,然而不常用的詞像durian會在樹的更深處(上圖編號2所示的分類樹),因為你想更常見的詞會更頻繁,所以你可能只需要少量檢索就可以獲得常用單詞像the和of。然而你更少見到的詞比如durian就更合適在樹的較深處,因為你一般不需要到那樣的深處,所以有不同的經驗法則可以幫助構造分類樹形成分級softmax分類器。所以這是你能在文獻中見到的一個加速softmax分類的方法,但是我不會再花太多時間在這上面了,你可以從我在第一張幻燈片中提到的Tomas Mikolov等人的論文中參閱更多的細節,所以我不會再花更多時間講這個了。因為在下個視頻中,我們會講到另一個方法叫做負采樣,我感覺這個會更簡單一點,對于加速softmax和解決需要在分母中對整個詞匯表求和的問題也很有作用,下個視頻中你會看到更多的細節。
但是在進入下個視頻前,我想要你理解一個東西,那就是怎么對上下文c進行采樣,一旦你對上下文c進行采樣,那么目標詞t就會在上下文c的正負10個詞距內進行采樣。但是你要如何選擇上下文c?一種選擇是你可以就對語料庫均勻且隨機地采樣,如果你那么做,你會發現有一些詞,像the、of、a、and、to諸如此類是出現得相當頻繁的,于是你那么做的話,你會發現你的上下文到目標詞的映射會相當頻繁地得到這些種類的詞,但是其他詞,像orange、apple或durian就不會那么頻繁地出現了。你可能不會想要你的訓練集都是這些出現得很頻繁的詞,因為這會導致你花大部分的力氣來更新這些頻繁出現的單詞的 ece_cec? (上圖編號1所示),但你想要的是花時間來更新像durian這些更少出現的詞的嵌入,即 eduriane_{durian}edurian? 。實際上詞 p(c)p(c)p(c) 的分布并不是單純的在訓練集語料庫上均勻且隨機的采樣得到的,而是采用了不同的分級來平衡更常見的詞和不那么常見的詞。
這就是Word2Vec的Skip-Gram模型,如果你讀過我之前提到的論文原文,你會發現那篇論文實際上有兩個不同版本的Word2Vec模型,Skip-Gram只是其中的一個,另一個叫做CBOW,即連續詞袋模型(Continuous Bag-Of-Words Model),它獲得中間詞兩邊的的上下文,然后用周圍的詞去預測中間的詞,這個模型也很有效,也有一些優點和缺點。
總結下:CBOW是從原始語句推測目標字詞;而Skip-Gram正好相反,是從目標字詞推測出原始語句。CBOW對小型數據庫比較合適,而Skip-Gram在大型語料中表現更好。 (下圖左邊為CBOW,右邊為Skip-Gram)
而剛才講的Skip-Gram模型,關鍵問題在于softmax這個步驟的計算成本非常昂貴,因為它需要在分母里對詞匯表中所有詞求和。通常情況下,Skip-Gram模型用到更多點。在下個視頻中,我會展示給你一個算法,它修改了訓練目標使其可以運行得更有效,因此它可以讓你應用在一個更大的訓練集上面,也可以學到更好的詞嵌入。
總結
以上是生活随笔為你收集整理的2.6 Word2Vec-深度学习第五课《序列模型》-Stanford吴恩达教授的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2.5 学习词嵌入-深度学习第五课《序列
- 下一篇: 2.7 负采样-深度学习第五课《序列模型