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

學習詞嵌入(Learning Word Embeddings)

在本節筆記中,你將要學習一些具體的算法來學習詞嵌入。

在深度學習應用於學習詞嵌入的歷史上,人們一開始使用的算法比較複雜,但隨著時間推移,研究者們不斷髮現他們能用更加簡單的算法來達到一樣好的效果,特別是在數據集很大的情況下。但有一件事情就是,現在很多最流行的算法都十分簡單,如果我一開始就介紹這些簡單的算法,你可能會覺得這有點神奇,這麼簡單的算法究竟是怎麼起作用的?

從稍微複雜一些的算法開始,因為我覺得這樣更容易對算法的運作方式有一個更直觀的瞭解,之後我們會對這些算法進行簡化,使你能夠明白即使一些簡單的算法也能得到非常好的結果,我們開始吧。

假如你在構建一個語言模型,並且用神經網絡來實現這個模型。於是在訓練過程中,你可能想要你的神經網絡能夠做到比如輸入:“I want a glass of orange ___.”,然後預測這句話的下一個詞。在每個單詞下面,我都寫上了這些單詞對應詞彙表中的索引。

實踐證明,建立一個語言模型是學習詞嵌入的好方法,我提出的這些想法是源於Yoshua Bengio,Rejean Ducharme,Pascal Vincent,Rejean Ducharme,Pascal Vincent還有Christian Jauvin。

吳恩達深度學習筆記(123) | NLP | 學習詞嵌入

下面我將介紹如何建立神經網絡來預測序列中的下一個單詞,讓我為這些詞列一個表格,“I want a glass of orange”,我們從第一個詞I開始,建立一個one-hot向量表示這個單詞I。這是一個one-hot向量(上圖編號1所示),在第4343個位置是1,它是一個10,000維的向量。然後要做的就是生成一個參數矩陣E,然後用E乘以O_4343,得到嵌入向量e_4343,這一步意味著e_4343是由矩陣E乘以one-hot向量得到的(上圖編號2所示)。

然後我們對其他的詞也做相同的操作,單詞want在第9665個,我們將E與這個one-hot向量(O_9665)相乘得到嵌入向量e_9665。對其他單詞也是一樣,a是字典中的第一個詞,因為a是第一個字母,由O_1得到e_1。同樣地,其他單詞也這樣操作。

於是現在你有許多300維的嵌入向量。我們能做的就是把它們全部放進神經網絡中(上圖編號3所示),經過神經網絡以後再通過softmax層(上圖編號4所示),這個softmax也有自己的參數,然後這個softmax分類器會在10,000個可能的輸出中預測結尾這個單詞。假如說在訓練集中有juice這個詞,訓練過程中softmax的目標就是預測出單詞juice,就是結尾的這個單詞。這個隱藏層(上圖編號3所示)有自己的參數,我這裡用W^[1] 和b^[1] 來表示,這個softmax層(上圖編號4所示)也有自己的參數W^[2] 和b^[2] 。如果它們用的是300維大小的嵌入向量,而這裡有6個詞,所以用6×300,所以這個輸入會是一個1800維的向量,這是通過將這6個嵌入向量堆在一起得到的。

吳恩達深度學習筆記(123) | NLP | 學習詞嵌入

實際上更常見的是有一個固定的歷史窗口,舉個例子,你總是想預測給定四個單詞(上圖編號1所示)後的下一個單詞,注意這裡的4是算法的超參數。

這就是如何適應很長或者很短的句子,方法就是總是隻看前4個單詞,所以說我只用這4個單詞(上圖編號2所示)而不去看這幾個詞(上圖編號3所示)。如果你一直使用一個4個詞的歷史窗口,這就意味著你的神經網絡會輸入一個1200維的特徵變量到這個層中(上圖編號4所示),然後再通過softmax來預測輸出,選擇有很多種,用一個固定的歷史窗口就意味著你可以處理任意長度的句子,因為輸入的維度總是固定的。所以這個模型的參數就是矩陣E,對所有的單詞用的都是同一個矩陣E,而不是對應不同的位置上的不同單詞用不同的矩陣。然後這些權重(上圖編號5所示)也都是算法的參數,你可以用反向傳播來進行梯度下降來最大化訓練集似然,通過序列中給定的4個單詞去重複地預測出語料庫中下一個單詞什麼。

事實上通過這個算法能很好地學習詞嵌入,原因是,如果你還記得我們的orange jucie,apple juice的例子,在這個算法的激勵下,apple和orange會學到很相似的嵌入,這樣做能夠讓算法更好地擬合訓練集,因為它有時看到的是orange juice,有時看到的是apple juice。如果你只用一個300維的特徵向量來表示所有這些詞,算法會發現要想最好地擬合訓練集,就要使apple(蘋果)、orange(橘子)、grape(葡萄)和pear(梨)等等,還有像durian(榴蓮)這種很稀有的水果都擁有相似的特徵向量。

這就是早期最成功的學習詞嵌入,學習這個矩陣E的算法之一

現在我們先概括一下這個算法,看看我們該怎樣來推導出更加簡單的算法。現在我想用一個更復雜的句子作為例子來解釋這些算法,假設在你的訓練集中有這樣一個更長的句子:“I want a glass of orange juice to go along with my cereal.”。

我們在上個幻燈片看到的是算法預測出了某個單詞juice,我們把它叫做目標詞(下圖編號1所示),它是通過一些上下文,在本例中也就是這前4個詞(下圖編號2所示)推導出來的。如果你的目標是學習一個嵌入向量,研究人員已經嘗試過很多不同類型的上下文。如果你要建立一個語言模型,那麼一般選取目標詞之前的幾個詞作為上下文。但如果你的目標不是學習語言模型本身的話,那麼你可以選擇其他的上下文。

吳恩達深度學習筆記(123) | NLP | 學習詞嵌入

比如說,你可以提出這樣一個學習問題,它的上下文是左邊和右邊的四個詞,你可以把目標詞左右各4個詞作為上下文(上圖編號3所示)。這就意味著我們提出了一個這樣的問題,算法獲得左邊4個詞,也就是a glass of orange,還有右邊四個詞to go along with,然後要求預測出中間這個詞(上圖編號4所示)。

提出這樣一個問題,這個問題需要將左邊的還有右邊這4個詞的嵌入向量提供給神經網絡,就像我們之前做的那樣來預測中間的單詞是什麼,來預測中間的目標詞,這也可以用來學習詞嵌入。

或者你想用一個更簡單的上下文,也許只提供目標詞的前一個詞,比如只給出orange這個詞來預測orange後面是什麼(上圖編號5所示),這將會是不同的學習問題。只給出一個詞orange來預測下一個詞是什麼(上圖編號6所示),你可以構建一個神經網絡,只把目標詞的前一個詞或者說前一個詞的嵌入向量輸入神經網絡來預測該詞的下一個詞。

還有一個效果非常好的做法就是上下文是附近一個單詞,它可能會告訴你單詞glass(上圖編號7所示)是一個鄰近的單詞。或者說我看見了單詞glass,然後附近有一個詞和glass位置相近,那麼這個詞會是什麼(上圖編號8所示)?這就是用附近的一個單詞作為上下文。

我們將在下節中把它公式化,這用的是一種Skip-Gram模型的思想。

這是一個簡單算法的例子,因為上下文相當的簡單,比起之前4個詞,現在只有1個,但是這種算法依然能工作得很好。

研究者發現:

如果你真想建立一個語言模型,用目標詞的前幾個單詞作為上下文是常見做法(上圖編號9所示)。

但如果你的目標是學習詞嵌入,那麼你就可以用這些其他類型的上下文(上圖編號10所示),它們也能得到很好的詞嵌入。我會在下節詳細介紹這些,我們會談到Word2Vec模型

總結一下,在本節中你學習了語言模型問題,模型提出了一個機器學習問題,即輸入一些上下文,例如目標詞的前4個詞然後預測出目標詞,學習了提出這些問題是怎樣幫助學習詞嵌入的。

在下節你將看到如何用更簡單的上下文和更簡單的算法來建立從上下文到目標詞的映射,這將讓你能夠更好地學習詞嵌入,一起進入下節學習Word2Vec模型


分享到:


相關文章: