本文是吳恩達老師的深度學習課程[1]筆記部分。 做者:黃海廣[2] 主要編寫人員:黃海廣、林興木(第四全部底稿,第五課第一二週,第三週前三節)、祝彥森:(第三課全部底稿)、賀志堯(第五課第三週底稿)、王翔、胡瀚文、 餘笑、 鄭浩、李懷鬆、 朱越鵬、陳偉賀、 曹越、 路皓翔、邱牧宸、 唐天澤、 張浩、 陳志豪、 遊忍、 澤霖、沈偉臣、 賈紅順、 時超、 陳哲、趙一帆、 胡瀟楊、段希、於衝、張鑫倩 參與編輯人員:黃海廣、陳康凱、石晴路、鍾博彥、向偉、嚴鳳龍、劉成 、賀志堯、段希、陳瑤、林家泳、王翔、 謝士晨、蔣鵬 備註:筆記和做業(含數據、原始做業文件)、視頻都在 github[3]中下載。 我將陸續將課程筆記發佈在公衆號「機器學習初學者」,敬請關注。
上週咱們學習了RNN、GRU單元和LSTM單元。本週你會看到咱們如何把這些知識用到NLP上,用於天然語言處理,深度學習已經給這一領域帶來了革命性的變革。其中一個很關鍵的概念就是詞嵌入(word embeddings),這是語言表示的一種方式,可讓算法自動的理解一些相似的詞,好比男人對女人,好比國王對王后,還有其餘不少的例子。經過詞嵌入的概念你就能夠構建NLP應用了,即便你的模型標記的訓練集相對較小。這周的最後咱們會消除詞嵌入的誤差,就是去除不想要的特性,或者學習算法有時會學到的其餘類型的誤差。git
如今咱們先開始討論詞彙表示,目前爲止咱們一直都是用詞彙表來表示詞,上週提到的詞彙表,多是10000個單詞,咱們一直用one-hot向量來表示詞。好比若是man(上圖編號1所示)在詞典裏是第5391個,那麼就能夠表示成一個向量,只在第5391處爲1(上圖編號github
舉個例子,假如你已經學習到了一個語言模型,當你看到「I want a glass of orange ___」,那麼下一個詞會是什麼?極可能是juice。即便你的學習算法已經學到了「I want a glass of orange juice」這樣一個極可能的句子,但若是看到「I want a glass of apple ___」,由於算法不知道apple和orange的關係很接近,就像man和woman,king和queen同樣。因此算法很難從已經知道的orange juice是一個常見的東西,而明白apple juice也是很常見的東西或者說常見的句子。這是由於任何兩個one-hot向量的內積都是0,若是你取兩個向量,好比king和queen,而後計算它們的內積,結果就是0。若是用apple和orange來計算它們的內積,結果也是0。很難區分它們之間的差異,由於這些向量內積都是同樣的,因此沒法知道apple和orange要比king和orange,或者queen和orange類似地多。算法
換一種表示方式會更好,若是咱們不用one-hot表示,而是用特徵化的表示來表示每一個詞,man,woman,king,queen,apple,orange或者詞典裏的任何一個單詞,咱們學習這些詞的特徵或者數值。編程
舉個例子,對於這些詞,好比咱們想知道這些詞與Gender(性別)的關係。假定男性的性別爲-1,女性的性別爲+1,那麼man的性別值可能就是-1,而woman就是-1。最終根據經驗king就是-0.95,queen是+0.97,apple和orange沒有性別可言。網絡
另外一個特徵能夠是這些詞有多Royal(高貴),因此這些詞,man,woman和高貴沒太關係,因此它們的特徵值接近0。而king和queen很高貴,apple和orange跟高貴也沒太大關係。app
那麼Age(年齡)呢?man和woman通常沒有年齡的意思,也許man和woman隱含着成年人的意思,但也多是介於young和old之間,因此它們(man和woman)的值也接近0。而一般king和queen都是成年人,apple和orange跟年齡更沒什麼關係了。機器學習
還有一個特徵,這個詞是不是Food(食物),man不是食物,woman不是食物,king和queen也不是,但apple和orange是食物。ide
固然還能夠有不少的其餘特徵,從Size(尺寸大小),Cost(花費多少),這個東西是否是alive(活的),是否是一個Action(動做),或者是否是Noun(名詞)或者是否是Verb(動詞),仍是其餘的等等。函數
若是咱們可以學習到一個300維的特徵向量,或者說300維的詞嵌入,一般咱們能夠作一件事,把這300維的數據嵌入到一個二維空間裏,這樣就能夠可視化了。經常使用的可視化算法是t-SNE算法,來自於Laurens van der Maaten 和 Geoff Hinton的論文。若是觀察這種詞嵌入的表示方法,你會發現man和woman這些詞彙集在一塊(上圖編號1所示),king和queen彙集在一塊(上圖編號2所示),這些都是人,也都彙集在一塊兒(上圖編號3所示)。動物都彙集在一塊兒(上圖編號4所示),水果也都彙集在一塊兒(上圖編號5所示),像一、二、三、4這些數字也彙集在一塊兒(上圖編號6所示)。若是把這些生物當作一個總體,他們也彙集在一塊兒(上圖編號7所示)。學習
在網上你可能會看到像這樣的圖用來可視化,300維或者更高維度的嵌入。但願你能有個總體的概念,這種詞嵌入算法對於相近的概念,學到的特徵也比較相似,在對這些概念可視化的時候,這些概念就比較類似,最終把它們映射爲類似的特徵向量。這種表示方式用的是在300維空間裏的特徵表示,這叫作嵌入(embeddings)。之因此叫嵌入的緣由是,你能夠想象一個300維的空間,我畫不出來300維的空間,這裏用個3維的代替(上圖編號8所示)。如今取每個單詞好比orange,它對應一個3維的特徵向量,因此這個詞就被嵌在這個300維空間裏的一個點上了(上圖編號9所示)apple這個詞就被嵌在這個300維空間的另外一個點上了(上圖編號10所示)。爲了可視化,t-SNE算法把這個空間映射到低維空間,你能夠畫出一個2維圖像而後觀察,這就是這個術語嵌入的來源。
詞嵌入已是NLP領域最重要的概念之一了,在天然語言處理領域。本節視頻中你已經知道爲何要學習或者使用詞嵌入了,下節視頻咱們會深刻講解如何用這些算法構建NLP算法。
上一個視頻中,你已經瞭解不一樣單詞的特徵化表示了。這節你會看到咱們如何把這種表示方法應用到NLP應用中。
詞嵌入可以達到這種效果,其中一個緣由就是學習詞嵌入的算法會考察很是大的文本集,也許是從網上找到的,這樣你能夠考察很大的數據集能夠是1億個單詞,甚至達到100億也都是合理的,大量的無標籤的文本的訓練集。經過考察大量的無標籤文本,不少都是能夠免費下載的,你能夠發現orange(橙子)和durian(榴蓮)相近,farmer(農民)和cultivator(培育家)相近。所以學習這種嵌入表達,把它們都彙集在一塊,經過讀取大量的互聯網文本發現了orange(橙子)和durian(榴蓮)都是水果。接下來你能夠把這個詞嵌入應用到你的命名實體識別任務當中,儘管你只有一個很小的訓練集,也許訓練集裏有100,000個單詞,甚至更小,這就使得你可使用遷移學習,把你從互聯網上免費得到的大量的無標籤文本中學習到的知識,可以分辨orange(橙子)、apple(蘋果)和durian(榴蓮)都是水果的知識,而後把這些知識遷移到一個任務中,好比你只有少許標記的訓練數據集的命名實體識別任務中。固然了,這裏爲了簡化我只畫了單向的RNN,事實上若是你想用在命名實體識別任務上,你應該用一個雙向的RNN,而不是這樣一個簡單的。
總結一下,這是如何用詞嵌入作遷移學習的步驟。
第一步,先從大量的文本集中學習詞嵌入。一個很是大的文本集,或者能夠下載網上預訓練好的詞嵌入模型,網上你能夠找到很多,詞嵌入模型而且都有許可。
第二步,你能夠用這些詞嵌入模型把它遷移到你的新的只有少許標註訓練集的任務中,好比說用這個300維的詞嵌入來表示你的單詞。這樣作的一個好處就是你能夠用更低維度的特徵向量代替原來的10000維的one-hot向量,如今你能夠用一個300維更加緊湊的向量。儘管one-hot向量很快計算,而學到的用於詞嵌入的300維的向量會更加緊湊。
第三步,當你在你新的任務上訓練模型時,在你的命名實體識別任務上,只有少許的標記數據集上,你能夠本身選擇要不要繼續微調,用新的數據調整詞嵌入。實際中,只有這個第二步中有很大的數據集你纔會這樣作,若是你標記的數據集不是很大,一般我不會在微調詞嵌入上費力氣。
當你的任務的訓練集相對較小時,詞嵌入的做用最明顯,因此它普遍用於NLP領域。我只提到一些,不要太擔憂這些術語(下問列舉的一些NLP任務),它已經用在命名實體識別,用在文本摘要,用在文本解析、指代消解,這些都是很是標準的NLP任務。
詞嵌入在語言模型、機器翻譯領域用的少一些,尤爲是你作語言模型或者機器翻譯任務時,這些任務你有大量的數據。在其餘的遷移學習情形中也同樣,若是你從某一任務A遷移到某個任務B,只有A中有大量數據,而B中數據少時,遷移的過程纔有用。因此對於不少NLP任務這些都是對的,而對於一些語言模型和機器翻譯則否則。
最後,詞嵌入和人臉編碼之間有奇妙的關係,你已經在前面的課程學到了關於人臉編碼的知識了,若是你上了卷積神經網絡的課程的話。你應該還記得對於人臉識別,咱們訓練了一個Siamese網絡結構,這個網絡會學習不一樣人臉的一個128維表示,而後經過比較編碼結果來判斷兩個圖片是不是同一我的臉,這個詞嵌入的意思和這個差很少。在人臉識別領域
這節視頻裏,你看到如何用詞嵌入來實現這種類型的遷移學習,而且經過替換原來的one-hot表示,而是用以前的嵌入的向量,你的算法會泛化的更好,你也能夠從較少的標記數據中進行學習。接下來我會給你展現一些詞嵌入的特性,這以後再討論學習這些詞嵌入的算法。下個視頻咱們會看到詞嵌入在作類比推理中發揮的做用。
到如今,你應該明白了詞嵌入是如何幫助你構建天然語言處理應用的。詞嵌入還有一個迷人的特性就是它還能幫助實現類比推理,儘管類比推理可能不是天然語言處理應用中最重要的,不過它能幫助人們理解詞嵌入作了什麼,以及詞嵌入可以作什麼,讓咱們來一探究竟。
這是一系列你但願詞嵌入能夠捕捉的單詞的特徵表示,假如我提出一個問題,man若是對應woman,那麼king應該對應什麼?大家應該都能猜到king應該對應queen。可否有一種算法來自動推導出這種關係,下面就是實現的方法。
在繼續下一步以前,我想再說明一下左邊的這幅圖(上圖編號1所示),在以前咱們談到過用t-SNE算法來將單詞可視化。t-SNE算法所作的就是把這些300維的數據用一種非線性的方式映射到2維平面上,能夠得知t-SNE中這種映射很複雜並且很非線性。在進行t-SNE映射以後,你不能老是指望使等式成立的關係,會像左邊那樣成一個平行四邊形,儘管在這個例子最初的300維的空間內你能夠依賴這種平行四邊形的關係來找到使等式成立的一對類比,經過t-SNE算法映射出的圖像多是正確的。但在大多數狀況下,因爲t-SNE的非線性映射,你就無法再期望這種平行四邊形了,不少這種平行四邊形的類比關係在t-SNE映射中都會失去原貌。
圖1:兩個向量之間角度的餘弦是衡量它們有多類似的指標,角度越小,兩個向量越類似。
從學術上來講,比起測量類似度,這個函數更容易測量的是相異度,因此咱們須要對其取負,這個函數才能正常工做,不過我仍是以爲餘弦類似度用得更多一點,這二者的主要區別是它們對
和
之間的距離標準化的方式不一樣。
詞嵌入的一個顯著成果就是,可學習的類比關係的通常性。舉個例子,它能學會man對於woman至關於boy對於girl,由於man和woman之間和king和queen之間,還有boy和girl之間的向量差在gender(性別)這一維都是同樣的。它還能學習Canada(加拿大)的首都是Ottawa(渥太華),而渥太華對於加拿大至關於Nairobi(內羅畢)對於Kenya(肯尼亞),這些都是國家中首都城市名字。它還能學習big對於bigger至關於tall對於taller,還能學習Yen(円)對於Janpan(日本),円是日本的貨幣單位,至關於Ruble(盧比)對於Russia(俄羅斯)。這些東西都可以學習,只要你在大型的文本語料庫上實現一個詞嵌入學習算法,只要從足夠大的語料庫中進行學習,它就能自主地發現這些模式。
在本節視頻中,你見到了詞嵌入是如何被用於類比推理的,可能你不會本身動手構建一個類比推理系統做爲一項應用,不過但願在這些可學習的類特徵的表示方式可以給你一些直觀的感覺。你還看知道了餘弦類似度能夠做爲一種衡量兩個詞嵌入向量間類似度的辦法,咱們談了許多有關這些嵌入的特性,以及如何使用它們。下節視頻中,咱們來討論如何真正的學習這些詞嵌入。
接下來咱們要將學習詞嵌入這一問題具體化,當你應用算法來學習詞嵌入時,其實是學習一個嵌入矩陣,咱們來看一下這是什麼意思。
在本節視頻中,你將要學習一些具體的算法來學習詞嵌入。在深度學習應用於學習詞嵌入的歷史上,人們一開始使用的算法比較複雜,但隨着時間推移,研究者們不斷髮現他們能用更加簡單的算法來達到同樣好的效果,特別是在數據集很大的狀況下。但有一件事情就是,如今不少最流行的算法都十分簡單,若是我一開始就介紹這些簡單的算法,你可能會以爲這有點神奇,這麼簡單的算法到底是怎麼起做用的?稍微複雜一些的算法開始,由於我以爲這樣更容易對算法的運做方式有一個更直觀的瞭解,以後咱們會對這些算法進行簡化,使你可以明白即便一些簡單的算法也能獲得很是好的結果,咱們開始吧。
假如你在構建一個語言模型,而且用神經網絡來實現這個模型。因而在訓練過程當中,你可能想要你的神經網絡可以作到好比輸入:「I want a glass of orange _.」, 而後預測這句話的下一個詞。在每一個單詞下面,我都寫上了這些單詞對應詞彙表中的索引。實踐證實,創建一個語言模型是學習詞嵌入的好方法,我提出的這些想法是源於Yoshua Bengio,Rejean Ducharme,Pascal Vincent,Rejean Ducharme,Pascal Vincent還有Christian Jauvin。
實際上更常見的是有一個固定的歷史窗口,舉個例子,你老是想預測給定四個單詞(上圖編號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(榴蓮)這種很稀有的水果都擁有類似的特徵向量。
這就是早期最成功的學習詞嵌入,學習這個矩陣
的算法之一。如今咱們先歸納一下這個算法,看看咱們該怎樣來推導出更加簡單的算法。如今我想用一個更復雜的句子做爲例子來解釋這些算法,假設在你的訓練集中有這樣一個更長的句子:「I want a glass of orange juice to go along with my cereal.」。咱們在上個幻燈片看到的是算法預測出了某個單詞juice,咱們把它叫作目標詞(下圖編號1所示),它是經過一些上下文,在本例中也就是這前4個詞(下圖編號2所示)推導出來的。若是你的目標是學習一個嵌入向量,研究人員已經嘗試過不少不一樣類型的上下文。若是你要創建一個語言模型,那麼通常選取目標詞以前的幾個詞做爲上下文。但若是你的目標不是學習語言模型自己的話,那麼你能夠選擇其餘的上下文。
好比說,你能夠提出這樣一個學習問題,它的上下文是左邊和右邊的四個詞,你能夠把目標詞左右各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模型。
在上個視頻中你已經見到了如何學習一個神經語言模型來獲得更好的詞嵌入,在本視頻中你會見到 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模型中,咱們要作的是抽取上下文和目標詞配對,來構造一個監督學習問題。上下文不必定老是目標單詞以前離得最近的四個單詞,或最近的
個單詞。咱們要的作的是隨機選一個詞做爲上下文詞,好比選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。
這裏有一些解決方案,如分級(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就不會那麼頻繁地地出現了。你可能不會想要你的訓練集都是這些
在上個視頻中,你見到了Skip-Gram模型如何幫助你構造一個監督學習任務,把上下文映射到了目標詞上,它如何讓你學到一個實用的詞嵌入。可是它的缺點就在於softmax計算起來很慢。在本視頻中,你會看到一個改善過的學習問題叫作負採樣,它能作到與你剛纔看到的Skip-Gram模型類似的事情,可是用了一個更加有效的學習算法,讓咱們來看看這是怎麼作到的。
在本視頻中大多數的想法源於Tomas Mikolov,Ilya Sutskever,Kai Chen,Greg Corrado 和 Jeff Dean。
(Mikolov T, Sutskever I, Chen K, et al. Distributed Representations of Words and Phrases and their Compositionality[J]. 2013, 26:3111-3119.)
咱們在這個算法中要作的是構造一個新的監督學習問題,那麼問題就是給定一對單詞,好比orange和juice,咱們要去預測這是不是一對上下文詞-目標詞(context-target)。
在這個例子中orange和juice就是個正樣本,那麼orange和king就是個負樣本,咱們把它標爲0。咱們要作的就是採樣獲得一個上下文詞和一個目標詞,在這個例子中就是orange 和juice,咱們用1做爲標記,我把中間這列(下圖編號1所示)叫作詞(word)。這樣生成一個正樣本,正樣本跟上個視頻中生成的方式如出一轍,先抽取一個上下文詞,在必定詞距內好比說正負10個詞距內選一個目標詞,這就是生成這個表的第一行,即orange– juice -1的過程。而後爲了生成一個負樣本,你將用相同的上下文詞,再在字典中隨機選一個詞,在這裏我隨機選了單詞king,標記爲0。而後咱們再拿orange,再隨機從詞彙表中選一個詞,由於咱們設想,若是隨機選一個詞,它極可能跟orange沒關聯,因而orange–book–0。咱們再選點別的,orange可能正好選到the,而後是0。仍是orange,再可能正好選到of這個詞,再把這個標記爲0,注意of被標記爲0,即便of的確出如今orange詞的前面。
總結一下,生成這些數據的方式是咱們選擇一個上下文詞(上圖編號2所示),再選一個目標詞(上圖編號3所示),這(上圖編號4所示)就是表的第一行,它給了一個正樣本,上下文,目標詞,並給定標籤爲1。而後咱們要作的是給定幾回,好比K次(上圖編號5所示),咱們將用相同的上下文詞,再從字典中選取隨機的詞,king、book、the、of等,從詞典中任意選取的詞,並標記0,這些就會成爲負樣本(上圖編號6所示)。出現如下狀況也不要緊,就是若是咱們從字典中隨機選到的詞,正好出如今了詞距內,好比說在上下文詞orange正負10個詞以內。
你已經瞭解了幾個計算詞嵌入的算法,另外一個在NLP社區有着必定勢頭的算法是GloVe算法,這個算法並不如Word2Vec或是Skip-Gram模型用的多,可是也有人熱衷於它,我認爲多是由於它簡便吧,咱們來看看這個算法。
Glove算法是由Jeffrey Pennington,Richard Socher和Chris Manning發明的。
(Pennington J, Socher R, Manning C. Glove: Global Vectors for Word Representation[C]// Conference on Empirical Methods in Natural Language Processing. 2014:1532-1543.)
這就是GloVe算法的內容,我認爲這個算法的一個疑惑之處是若是你看着這個等式,它實在是太簡單了,對吧?僅僅是最小化,像這樣的一個二次代價函數(上圖編號3所示)是怎麼可以讓你學習有意義的詞嵌入的呢?可是結果證實它確實有效,發明者們發明這個算法的過程是他們以歷史上更爲複雜的算法,像是newer language模型,以及以後的Word2Vec、Skip-Gram模型等等爲基礎,同時但願可以簡化全部以前的算法才發明的。
在咱們總結詞嵌入學習算法以前,有一件更優先的事,咱們會簡單討論一下。就是說,咱們以這個特製的表格做爲例子來開始學習詞向量,咱們說,第一行的嵌入向量是來表示Gender的,第二行是來表示Royal的,而後是是Age,在以後是Food等等。可是當你在使用咱們瞭解過的算法的一種來學習一個詞嵌入時,例如咱們以前的幻燈片裏提到的GloVe算法,會發生一件事就是你不能保證嵌入向量的獨立組成部分是可以理解的,爲何呢?
沒必要擔憂,若是你沒有學過線性代數的話會,和這個算法同樣有一個簡單證實過程。你不能保證這些用來表示特徵的軸可以等同於人類可能簡單理解的軸,具體而言,第一個特徵多是個Gender、Roya、Age、Food Cost和Size的組合,它也許是名詞或是一個行爲動詞和其餘全部特徵的組合,因此很難看出獨立組成部分,即這個嵌入矩陣的單行部分,而後解釋出它的意思。儘管有這種類型的線性變換,這個平行四邊形映射也說明了咱們解決了這個問題,當你在類比其餘問題時,這個方法也是行得通的。所以儘管存在特徵量潛在的任意線性變換,你最終仍是能學習出解決相似問題的平行四邊形映射。
這就是詞嵌入學習的內容,你如今已經瞭解了一些學習詞嵌入的算法了,你能夠在本週的編程練習裏更多地運用它們。下節課講解怎樣使用這些算法來解決情感分類問題。
情感分類任務就是看一段文本,而後分辨這我的是否喜歡他們在討論的這個東西,這是NLP中最重要的模塊之一,常常用在許多應用中。情感分類一個最大的挑戰就是可能標記的訓練集沒有那麼多,可是有了詞嵌入,即便只有中等大小的標記的訓練集,你也能構建一個不錯的情感分類器,讓咱們看看是怎麼作到的。
這是一個情感分類問題的一個例子(上圖所示),輸入x
是一段文本,而輸出y是你要預測的相應情感。好比說是一個餐館評價的星級,
好比有人說,"The dessert is excellent."(甜點很棒),並給出了四星的評價;
"Service was quite slow"(服務太慢),兩星評價;
"Good for a quick meal but nothing special"(適合吃快餐但沒什麼亮點),三星評價;
還有比較刁鑽的評論,"Completely lacking in good taste, good service and good ambiance."(徹底沒有好的味道,好的服務,好的氛圍),給出一星評價。
若是你能訓練一個從x到y的映射,基於這樣的標記的數據集,那麼你就能夠用來蒐集你們對你運營的餐館的評價。一些人可能會把你的餐館信息放到一些社交媒體上,Twitter、Facebook、Instagram或者其餘的社交媒體,若是你有一個情感分類器,那麼它就能夠看一段文本而後分析出這我的對你的餐館的評論的情感是正面的仍是負面的,這樣你就能夠一直記錄是否存在一些什麼問題,或者你的餐館是在蒸蒸日上仍是每況愈下。
情感分類一個最大的挑戰就是可能標記的訓練集沒有那麼多。對於情感分類任務來講,訓練集大小從10,000到100,000個單詞都很常見,甚至有時會小於10,000個單詞,採用了詞嵌入可以帶來更好的效果,尤爲是隻有很小的訓練集時。
接下來你能夠這樣作,這節咱們會講幾個不一樣的算法。這是一個簡單的情感分類的模型,假設有一個句子"dessert is excellent",而後在詞典裏找這些詞,咱們一般用10,000個詞的詞彙表。咱們要構建一個分類器可以把它映射成輸出四個星,給定這四個詞("dessert is excellent"),咱們取這些詞,找到相應的one-hot向量,因此這裏(上圖編號1所示)就是
這裏用的平均值運算單元,這個算法適用於任何長短的評論,由於即便你的評論是100個詞長,你也能夠對這一百個詞的特徵向量求和或者平均它們,而後獲得一個表示一個300維的特徵向量表示,而後把它送進你的softmax分類器,因此這個平均值運算效果不錯。它實際上會把全部單詞的意思給平均起來,或者把你的例子中全部單詞的意思加起來就能夠用了。
這個算法有一個問題就是沒考慮詞序,尤爲是這樣一個負面的評價,"Completely lacking in good taste, good service, and good ambiance.",可是good這個詞出現了不少次,有3個good,若是你用的算法跟這個同樣,忽略詞序,僅僅把全部單詞的詞嵌入加起來或者平均下來,你最後的特徵向量會有不少good的表示,你的分類器極可能認爲這是一個好的評論,儘管事實上這是一個差評,只有一星的評價。
咱們有一個更加複雜的模型,不用簡單的把全部的詞嵌入都加起來,咱們用一個RNN來作情感分類。咱們這樣作,首先取這條評論,"Completely lacking in good taste, good service, and good ambiance.",找出每個one-hot向量,這裏我跳過去每個one-hot向量的表示。用每個one-hot向量乘以詞嵌入矩陣
,獲得詞嵌入表達,而後把它們送進RNN裏。RNN的工做就是在最後一步(上圖編號1所示)計算一個特徵表示,用來預測
,這是一個多對一的網絡結構的例子,咱們以前已經見過了。有了這樣的算法,考慮詞的順序效果就更好了,它就能意識到"things are lacking in good taste",這是個負面的評價,「not good」也是一個負面的評價。而不像原來的算法同樣,只是把全部的加在一塊兒獲得一個大的向量,根本意識不到「not good」和 「good」不是一個意思,"lacking in good taste"也是如此,等等。
若是你訓練一個這樣的算法,最後會獲得一個很合適的情感分類的算法。因爲你的詞嵌入是在一個更大的數據集裏訓練的,這樣效果會更好,更好的泛化一些沒有見過的新的單詞。好比其餘人可能會說,"Completely absent of good taste, good service, and good ambiance.",即便absent這個詞不在標記的訓練集裏,若是是在一億或者一百億單詞集裏訓練詞嵌入,它仍然能夠正確判斷,而且泛化的很好,甚至這些詞是在訓練集中用於訓練詞嵌入的,可是能夠不在專門用來作情感分類問題的標記的訓練集中。
以上就是情感分類的問題,我但願你能大致瞭解。一旦你學習到或者從網上下載詞嵌入,你就能夠很快構建一個頗有效的NLP系統。
如今機器學習和人工智能算法正漸漸地被信任用以輔助或是制定極其重要的決策,所以咱們想盡量地確保它們不受非預期形式偏見影響,好比說性別歧視、種族歧視等等。本節視頻中我會向你展現詞嵌入中一些有關減小或是消除這些形式的偏見的辦法。
本節視頻中當我使用術語bias時,我不是指bias自己這個詞,或是偏見這種感受,而是指性別、種族、性取向方面的偏見,那是不一樣的偏見,同時這也一般用於機器學習的學術討論中。不過咱們討論的大部份內容是詞嵌入是怎樣學習類比像Man:Woman,就像King:Queen,不過若是你這樣問,若是Man對應Computer Programmer,那麼Woman會對應什麼呢?因此這篇論文(上圖編號1所示:Bolukbasi T, Chang K W, Zou J, et al. Man is to Computer Programmer as Woman is to Homemaker? Debiasing Word Embeddings[J]. 2016.)的做者Tolga Bolukbasi、Kai-Wei Chang、James Zou、Venkatesh Saligrama和 Adam Kalai發現了一個十分可怕的結果,就是說一個已經完成學習的詞嵌入可能會輸出Man:Computer Programmer,同時輸出Woman:Homemaker,那個結果看起來是錯的,而且它執行了一個十分不良的性別歧視。若是算法輸出的是Man:Computer Programmer,同時Woman:Computer Programmer這樣子會更合理。同時他們也發現若是Father:Doctor,那麼Mother應該對應什麼呢?一個十分不幸的結果是,有些完成學習的詞嵌入會輸出Mother:Nurse。
所以根據訓練模型所使用的文本,詞嵌入可以反映出性別、種族、年齡、性取向等其餘方面的偏見,一件我尤爲熱衷的事是,這些偏見都和社會經濟狀態相關,我認爲每一個人不論你出身富裕仍是貧窮,亦或是兩者之間,我認爲每一個人都應當擁有好的機會,同時由於機器學習算法正用來制定十分重要的決策,它也影響着世間萬物,從大學錄取到人們找工做的途徑,到貸款申請,不論你的的貸款申請是否會被批准,再到刑事司法系統,甚至是判決標準,學習算法都在做出很是重要的決策,因此我認爲咱們儘可能修改學習算法來儘量減小或是理想化消除這些非預期類型的偏見是十分重要的。
至於詞嵌入,它們可以輕易學會用來訓練模型的文本中的偏見內容,因此算法獲取到的偏見內容就能夠反映出人們寫做中的偏見。在漫長的世紀裏,我認爲人類已經在減小這些類型的偏見上取得了進展,幸運的是對於人工智能來講,實際上我認爲有更好的辦法來實現更快地減小AI領域中相比與人類社會中的偏見。雖然我認爲咱們仍未實現人工智能,仍然有許多研究許多難題須要完成來減小學習算法中這些類型的偏見。
本節視頻裏我想要作的是與大家分享一個例子,它是一篇論文的一套辦法,就是下面引用的這篇由Bolukbasi和其餘人共同撰寫的論文,它是研究減小詞嵌入中偏見問題的。就是這些,假設說咱們已經完成一個詞嵌入的學習,那麼babysitter就是在這裏,doctor在這裏,grandmother在這裏,grandfather在這裏,也許girl嵌入在這裏,boy嵌入在這裏,也許she嵌在這裏,he在這裏(上圖編號1所示的區域內),因此首先咱們要作的事就是辨別出咱們想要減小或想要消除的特定偏見的趨勢。
爲了便於說明,我會集中討論性別歧視,不過這些想法對於全部我在上個幻燈片裏說起的其餘類型的偏見都是通用的。這個例子中,你會怎樣辨別出與這個偏見類似的趨勢呢?主要有如下三個步驟:
2、中和步驟,因此對於那些定義不確切的詞能夠將其處理一下,避免偏見。有些詞本質上就和性別有關,像grandmother、grandfather、girl、boy、she、he,他們的定義中本就含有性別的內容,不過也有一些詞像doctor和babysitter咱們想使之在性別方面是中立的。同時在更一般的狀況下,你可能會但願像doctor或babysitter這些詞成爲種族中立的,或是性取向中立的等等,不過這裏咱們仍然只用性別來舉例說明。對於那些定義不明確的詞,它的基本意思是不像grandmother和grandfather這種定義裏有着十分合理的性別含義的,由於從定義上來講grandmothers是女性,grandfather是男性。因此對於像doctor和babysitter這種單詞咱們就能夠將它們在這個軸(上圖編號1所示)上進行處理,來減小或是消除他們的性別歧視趨勢的成分,也就是說減小他們在這個水平方向上的距離(上圖編號2方框內所示的投影),因此這就是第二個中和步。
3、均衡步,意思是說你可能會有這樣的詞對,grandmother和grandfather,或者是girl和boy,對於這些詞嵌入,你只但願性別是其區別。那爲何要那樣呢?在這個例子中,babysitter和grandmother之間的距離或者說是類似度其實是小於babysitter和grandfather之間的(上圖編號1所示),所以這可能會加劇不良狀態,或者多是非預期的偏見,也就是說grandmothers相比於grandfathers最終更有可能輸出babysitting。因此在最後的均衡步中,咱們想要確保的是像grandmother和grandfather這樣的詞都可以有一致的類似度,或者說是相等的距離,和babysitter或是doctor這樣性別中立的詞同樣。這其中會有一些線性代數的步驟,但它主要作的就是將grandmother和grandfather移至與中間軸線等距的一對點上(上圖編號2所示),如今性別歧視的影響也就是這兩個詞與babysitter的距離就徹底相同了(上圖編號3所示)。因此整體來講,會有許多對像grandmother-grandfather,boy-girl,sorority-fraternity,girlhood-boyhood,sister-brother,niece-nephew,daughter-son這樣的詞對,你可能想要經過均衡步來解決他們。
最後一個細節是你怎樣纔可以決定哪一個詞是中立的呢?對於這個例子來講doctor看起來像是一個應該對其中立的單詞來使之性別不肯定或是種族不肯定。相反地,grandmother和grandfather就不該是性別不肯定的詞。也會有一些像是beard詞,一個統計學上的事實是男性相比於比女性更有可能擁有鬍子,所以也許beard應該比female更靠近male一些。
所以論文做者作的就是訓練一個分類器來嘗試解決哪些詞是有明肯定義的,哪些詞是性別肯定的,哪些詞不是。結果代表英語裏大部分詞在性別方面上是沒有明肯定義的,意思就是說性別並是其定義的一部分,只有一小部分詞像是grandmother-grandfather,girl-boy,sorority-fraternity等等,不是性別中立的。所以一個線性分類器可以告訴你哪些詞可以經過中和步來預測這個偏見趨勢,或將其與這個本質是299D的子空間進行處理。
最後,你須要平衡的詞對的數其實是很小的,至少對於性別歧視這個例子來講,用手都可以數出來你須要平衡的大部分詞對。完整的算法會比我在這裏展現的更復雜一些,你能夠去看一下這篇論文了解詳細內容,你也能夠經過編程做業來練習一下這些想法。
如何對兩個單詞除偏,好比:"actress「(「女演員」)和「actor」(「演員」)。均衡算法適用於您可能但願僅經過性別屬性不一樣的單詞對。舉一個具體的例子,假設"actress「(「女演員」)比「actor」(「演員」)更接近「保姆」。經過將中和應用於"babysit"(「保姆」),咱們能夠減小與保姆相關的性別刻板印象。可是這仍然不能保證"actress「(「女演員」)和「actor」(「演員」)與"babysit"(「保姆」)等距。均衡算法能夠解決這個問題。
總結一下,減小或者是消除學習算法中的偏見問題是個十分重要的問題,由於這些算法會用來輔助制定愈來愈多的社會中的重要決策,在本節視頻中分享了一套如未嘗試處理偏見問題的辦法,不過這還是一個許多學者正在進行主要研究的領域。
參考資料
[1]
深度學習課程: https://mooc.study.163.com/university/deeplearning_ai
[2]
黃海廣: https://github.com/fengdu78
[3]