天天看點

DeepLearning.ai學習筆記(五)序列模型 -- week2 自然語言處理與詞嵌入

一、詞彙表征

首先回顧一下之前介紹的單詞表示方法,即one hot表示法。

如下圖示,“Man”這個單詞可以用 \(O_{5391}\) 表示,其中O表示One_hot。其他單詞同理。

但是這樣的表示方法有一個缺點,看是看下圖中右側給出的例子,比如給出這麼一句不完整的話:

I want a glass of orange ___

假設通過LSTM算法學到了空白處應該填“juice”.但是如果将orange改成apple,即

I want a glass of apple ___

那麼是否也需要從頭開始學習“apple juice”嗎?能否通過建構“apple” 與 “orange” 的聯系讓它不需要重學就能進行判斷呢?是以下面給出了一種改進的表示方法,稱之為“詞嵌入(Word Embedding)”

DeepLearning.ai學習筆記(五)序列模型 -- week2 自然語言處理與詞嵌入

我們知道單詞與單詞之間是有很多共性的,或在某一特性上相近,比如“蘋果”和“橙子”都是水果;或者在某一特性上相反:

比如“父親”在性别上是男性,“母親”在性别上是女性,通過建構他們其中的聯系可以将在一個單詞學習到的内容應用到其他的單詞上來提高模型的學習的效率,下面是一個簡化的表格用以說明:

DeepLearning.ai學習筆記(五)序列模型 -- week2 自然語言處理與詞嵌入

原版

DeepLearning.ai學習筆記(五)序列模型 -- week2 自然語言處理與詞嵌入

漢化版

(上面兩個表格分别是課堂上吳大大的講義和由大資料文摘整理得到的)

簡單介紹一下上面的表格的意思:

以“性别(Gender)”這一特征為例,若以-1表示男性,1表示女性,那麼顯然“Man”在該特征上的值為-1,其他同理,不再贅述。

此時對于單詞“orange”和“apple”來說他們會共享很多的特性,比如都是水果,都是圓形,都可以吃,也有些不同的特性比如顔色不同,味道不同,但因為這些特性讓RNN模型了解了他們的關系,也就增加了通過學習一個單詞去預測另一個的可能性。

假設所用的特征有300個,那麼每一個單詞就是由這300個特征值組成,因為這個次元是很高的了,是以可以使用$ t-SNE$算法将它們映射到二維空間之後進行可視化聚類,可以得到如下的效果圖:

DeepLearning.ai學習筆記(五)序列模型 -- week2 自然語言處理與詞嵌入

上圖通過聚類将詞性相類似的單詞在二維空間聚為一類,是以這也就可以了解為什麼這叫做"詞嵌入(Word Embedding)"了,即把原來由多元的特征空間表示單詞嵌入到二維空間中去了。

二、使用詞嵌入

下面介紹詞嵌入的實用場景。

以下圖為例,該圖表示的是輸入一段話,判斷出人名。通過學習判斷可以知道orange farmer指的應該是人,是以其對應的主語Sally Johnson就應該是人名了,是以其對應位置輸出為1。

DeepLearning.ai學習筆記(五)序列模型 -- week2 自然語言處理與詞嵌入

那如果把orange換成apple呢?通過詞嵌入算法可以知道二者詞性類似,而且後面跟着farmer,是以也能确認Robert Lin是人名。

DeepLearning.ai學習筆記(五)序列模型 -- week2 自然語言處理與詞嵌入

我們繼續替換,我們将apple farmer替換成不太常見的durian cultivator(榴蓮繁殖員)。此時詞嵌入中可能并沒有durian這個詞,cultivator也是不常用的詞彙。這個時候怎麼辦呢?我們可以用到遷移學習。

DeepLearning.ai學習筆記(五)序列模型 -- week2 自然語言處理與詞嵌入

詞嵌入遷移學習步驟如下:

1.學習含有大量文本語料庫的詞嵌入(一般含有10億到1000億單詞),或者下載下傳預訓練好的詞嵌入

2.将學到的詞嵌入遷移到相對較小規模的訓練集(例如10萬詞彙),這個時候就能展現出相比于使> 用one hot表示法,使用詞嵌入的優勢了。如果是使用one hot,那麼每個單詞是1*100000表> 示,而用詞嵌入後,假設特征次元是300,那麼隻需要使用1*300的向量表示即可。

3.(可選) 這一步驟就是對新的資料進行fine-tune。

DeepLearning.ai學習筆記(五)序列模型 -- week2 自然語言處理與詞嵌入

詞嵌入其實與之前卷積神經網絡人臉識别課程中介紹的Siamese網絡有類似的地方。

即二者都是使用相同的評價模型對不同對象進行距離運算,距離越近則越相似

例如Siamese網絡是将兩張人臉圖像分别送到相同的CNN模型中計算出特征值并求出內插補點,來進行判斷二者的相似度。詞嵌入則是使用兩個單詞的特征次元進行相似度計算。

DeepLearning.ai學習筆記(五)序列模型 -- week2 自然語言處理與詞嵌入

但是二者也有差别,以Siamese網絡為例,無論輸入的人臉圖像是什麼,其總能計算出二者的相似度。而詞嵌入不同,因為有的單詞并不出現在某一個詞嵌入資料集中,是以此時則無法計算相似度。

三、詞嵌入的特性

我們小時候都做過反義詞或者近義詞的題目吧,那假如告訴機器“Man”↔“Woman”,那麼能否退出“King”所對應的單詞呢?

這個問題被稱作詞彙的類比問題(或推理),通過研究詞嵌入的特征就可以解決這種問題。

​如下圖示,我們用\(e_{Man}\)來表示“Man”這個單詞,其向量為[-1,0.01,0.03,0.09]。“Woman”同理,二者的差異向量為\(e_{Man}-e_{Woman}=[-2,0,0,0]\)(為友善了解,結果做了簡化)。

我們可以很容易知道“King”和“Queen”是相對應的,并且它們之間的差異向量也是[-2,0,0,0]。

DeepLearning.ai學習筆記(五)序列模型 -- week2 自然語言處理與詞嵌入

大部分時候對于人而言,是很容易找到一對相近的單詞的,那麼計算機如何找呢?其實按照上面的計算方法已經告訴我們了,即隻要滿足如下關系式的即可:

已知單詞A和單詞B是對應的,求與單詞C相對應的單詞D,則有如下等式:

\(e_A - e_B \, \approx \, e_C-e_D\)

其中\(D\)滿足\(argmax_w \;\, Similarity(e_D, e_A-e_B+e_C)\)

注意上面的相似度函數為餘弦公式,即:

\[Similarity(u,v)=\frac{u^Tv}{||u||_2||v||_2}

\]

當然也可以用其他距離公式。

如下圖用幾何方式能夠更容易了解,即隻要找到與向量\(\vec{AB}\)最接近平行的向量\(\vec{CD}\)即可。

DeepLearning.ai學習筆記(五)序列模型 -- week2 自然語言處理與詞嵌入

四、嵌入矩陣

如下圖示,左邊是詞嵌入矩陣,每一清單示該單詞的特征向量,每一行表示所有單詞在某一特征上的值的大小,這個矩陣用\(E\)表示,假設其次元是(300,10000)。

右邊矩陣是某一列單詞的One hot向量,這裡以orange為例,其Onehot向量為\(O_{6257}=[0,…,1,…,0]\)。

DeepLearning.ai學習筆記(五)序列模型 -- week2 自然語言處理與詞嵌入

那麼已知詞嵌入矩陣和某一個單詞的Onehot向量,那麼該單詞的特征向量則滿足如下等式:

\[E*O_j=e_j

* 表示矩陣乘法

DeepLearning.ai學習筆記(五)序列模型 -- week2 自然語言處理與詞嵌入

這種擷取某個單詞特征向量的方法涉及太多運算,是以一般在實際操作中是直接對詞嵌入矩陣做列選擇即可得到所需單詞的特征向量的。

說一下這一小節的感受,雖然最後吳大大也說了在實際操作中隻需要做列選擇就可以了,但是不明白他為什麼還要介紹前面所謂的矩陣相乘運算。。。。

五、學習詞嵌入

下圖展示了預測單詞的方法,即給出缺少一個單詞的句子:

“I want a glass of orange ___”

計算方法是将已知單詞的特征向量都作為輸入資料送到神經網絡中去,然後經過一系列計算到達 Softmax分類層,在該例中輸出節點數為10000個。經過計算juice機率最高,是以預測為

“I want a glass of orange juice”

DeepLearning.ai學習筆記(五)序列模型 -- week2 自然語言處理與詞嵌入

在這個訓練模式中,是通過全部的單詞去預測最後一個單詞然後反向傳播更新詞嵌表E

假設要預測的單詞為W,詞嵌表仍然為E,需要注意的是訓練詞嵌表和預測W是兩個不同的任務。

如果任務是預測W,最佳方案是使用W前面n個單詞建構語境。

如果任務是訓練E,除了使用W前全部單詞還可以通過:前後各4個單詞、前面單獨的一個詞、前面語境中随機的一個詞(這個方式也叫做 Skip Gram 算法),這些方法都能提供很好的結果。

六、Word2Vec

視訊中一直沒有給 Word2Vec 下一個明确的定義,我們再次下一個非正式定義便于了解:

“word2vec” 是指将詞語word 變成向量vector 的過程,這一過程通常通過淺層的神經網絡完成,例如CBOW或者skip gram,這一過程同樣可以視為建構詞嵌表E的過程”。

1.Skip-grams

​下圖詳細的展示了Skip-grams。即先假設Context(上下文)是orange,而Target(預測詞)則是通過設定視窗值得到的,例如設定為緊鄰的後一個單詞,此時Target則為juice,設定其他視窗值可以得到其他預測詞。

注意這個過程是用來建構詞嵌表的,而不是為了真正的去預測,是以如果預測效果不好并不用擔心。

DeepLearning.ai學習筆記(五)序列模型 -- week2 自然語言處理與詞嵌入

2.Skip-grams公式

Skip-grams模型可用如下表達式表示:

\[O_{c}\rightarrow E \rightarrow e_{c} \rightarrow \underset{Softmax}{Output} \rightarrow \hat{y}

Softmax公式為(假設輸出節點數為10000):

\[p(t|c)=\frac{e^{θ_t^Te_c}}{\sum_{j=1}^{10000}e^{θ_j^Te_c}}

\(θ_t\) 表示與t有關的參數。

損失函數:

\[l(\hat{y},y)=\sum_{i=1}^{10000}y_ilog\hat{y_i}

DeepLearning.ai學習筆記(五)序列模型 -- week2 自然語言處理與詞嵌入

3.解決計算量大的問題

上面在使用Softmax的時候有一個很明顯的問題,那就是計算量過于繁瑣,是以為了解決計算量大的問題,提出了如下圖所示的方法,即Hierachical Softmax(分層的Softmax)

簡單的來說就是通過使用二叉樹的形式來減少運算量。

例如一些常見的單詞,如the、of等就可以在很淺的層次得到,而像durian這種少用的單詞則在較深的層次得到。

DeepLearning.ai學習筆記(五)序列模型 -- week2 自然語言處理與詞嵌入

七、負采樣

對于skip gram model而言,還要解決的一個問題是如何取樣(選擇)有效的随機詞 c 和目标詞 t 呢?如果真的按照自然随機分布的方式去選擇,可能會大量重複的選擇到出現次數頻率很高的單詞比如說“the, of, a, it, I, ...” 重複的訓練這樣的單詞沒有特别大的意義。

如何有效的去訓練標明的詞如 orange 呢?在設定訓練集時可以通過“負取樣”的方法, 下表中第一行是通過和上面一

樣的視窗法得到的“正”(1)結果,其他三行是從字典中随機得到的詞語,結果為“負”(0)。通過這樣的負取樣法

可以更有效地去訓練skip gram model.

Context Word Target
orange juice 1
king
book
the
of

![image.png](https://ask.qcloudimg.com/draft/1215004/4wylflpbqi.png)

負取樣的個數**k**由資料量的大小而定,上述例子中為4. 實際中資料量大則 **k = 2 ~ 5**,資料量小則可以相對大一些**k = 5 ~ 20**

通過負取樣,我們的神經網絡訓練從softmax預測每個詞出現的頻率變成了經典binary logistic regression問題,機率公式用 sigmoid 代替 softmax進而大大提高了速度。

\(x_1=(orange, juice) \rightarrow y_1=1\)

\(x_2=(orange, king) \rightarrow y_2=0\)

\(...\)

\(P(y=1|c,t)=\sigma(\theta_t^Te_c)\)

最後我們通過一個并沒有被理論驗證但是實際效果很好的方式來确定每個被負選樣選中的機率為:

\(P(w_i)=\frac{f(w_i^{\frac{3}{4}})} {\sum_{j=1}^{10000}f(w_j^{\frac{3}{4}})}\)

DeepLearning.ai學習筆記(五)序列模型 -- week2 自然語言處理與詞嵌入

八、GloVe詞向量

GloVe(Global vectors for word representation)雖然不想Word2Vec模型那樣流行,但是它也有自身的優點,即簡單。

下面先介紹該算法定義的變量的含義:

如下圖示,\(X_{ij}\)表示單詞i在語境j中出現的次數,i就相當于前面内容中提到的t(target),j相當于之前的c(context)。

DeepLearning.ai學習筆記(五)序列模型 -- week2 自然語言處理與詞嵌入

該算法的主要方法是最小化如下公式(假設共有10000個單詞):

\[\sum_{i=1}^{10000}\sum_{j=1}^{10000}f(x_{ij})(\theta_i^Te_j+b_i+b_j'-logx_{ij})^2

當\(x_{ij}=0\)時,\(f(x_{ij})=0\),并且定義\(0log0=0\)。

是以\(f(x_{ij})\)這麼一個權重項就可以避免當\(x_{ij}=0\)時上面的式子是無窮大了。

同時對于像“the、of、a”等這些常用的詞,權重項可以給與适當的權重。而對于像“durian”這類不常用到的單詞,也可以給到更大但不至于過分的權重。

DeepLearning.ai學習筆記(五)序列模型 -- week2 自然語言處理與詞嵌入

九、情緒分類

平時上淘寶我們都會對買的東西給出文字評價和對應的星級評價,如下圖示。

商家可以通過對這些資料來建構一個情緒分類器,進而可以在一些社交平台上如微網誌、QQ等大家的文字評論然後對應輸出相應的星級等級,這樣就可以更容易知道自家店是蒸蒸日上還是日落西山了,2333。

DeepLearning.ai學習筆記(五)序列模型 -- week2 自然語言處理與詞嵌入

下圖展示了情緒分類器的模型。

可以看到下圖中的模型先将評語中各個單詞通過 詞嵌表(資料量一般比較大,例如有100Billion的單詞數) 轉化成對應的特征向量,然後對所有的單詞向量做求和或者做平均,然後建構Softmax分類器,最後輸出星級評級。

DeepLearning.ai學習筆記(五)序列模型 -- week2 自然語言處理與詞嵌入

但是上面的模型存在一個問題,一般而言如果評語中有像"good、excellent"這樣的單詞,一般都是星級評分較高的評語,但是該模型對下面這句評語就顯得無能為力了:

“Completely lacking in good taste, good service, and good ambience.”

該評語中出現大量的good,如果直接做求和或者平均運算,經過分類器得到的輸出很大機率上是高星級評分的,但這顯然與該評語的本意不符。

DeepLearning.ai學習筆記(五)序列模型 -- week2 自然語言處理與詞嵌入

之是以上面的模型存在那樣的缺點,就是因為它沒有把單詞的時序考慮進去,是以我們可以使用RNN構模組化型來解決這種問題。RNN模型如下圖示:

DeepLearning.ai學習筆記(五)序列模型 -- week2 自然語言處理與詞嵌入

另外使用RNN模型還有另一個好處,假設測試集中的評語是這樣的

“Completely absent of good taste, good service, and good ambience.”

該評語隻是将lacking in替換成了absent of,而且我們即使假設absent并沒有出現在訓練集中,但是因為詞嵌表很龐大,是以詞嵌表中包含absent,是以算法依舊可以知道absent和lacking有相似之處,最後輸出的結果也依然可以保持正确。

DeepLearning.ai學習筆記(五)序列模型 -- week2 自然語言處理與詞嵌入

十、詞嵌入除偏

現如今機器學習已經被用到了很多領域,例如銀行貸款決策,履歷篩選。但是因為機器是向人們學習,是以好的壞的都會學到,例如他也會學到一些偏見或者歧視。

如下圖示

當說到Man:程式員的時候,算法得出Woman:家庭主婦,這顯然存在偏見。

又如Man:Doctor,算法認為Woman:Nurse。這顯然也存在其實和偏見。

上面提到的例子都是性别上的歧視,詞嵌入也會反映出年齡歧視、性取向歧視以及種族歧視等等。

人類在這方面已經做的不對了,是以機器應當做出相應的調整來減少歧視。

DeepLearning.ai學習筆記(五)序列模型 -- week2 自然語言處理與詞嵌入

下面将主要從性别歧視上來舉例說明如何讓機器學習消除偏見。

下圖展示了一些單詞,你可以在心裡先想想你看到這些單詞的第一時間認為他們所對應的性别是什麼吧~~~

DeepLearning.ai學習筆記(五)序列模型 -- week2 自然語言處理與詞嵌入

下面正式介紹算法步驟:

  • 1.識别偏見方向

因為該例子是以消除性别歧視為目的,是以我們需要計算出圖中這些單詞之間的距離的平均值,進而作為偏見方向(bias direction)

\(e_{he}-e_{she}\)

\(e_{boy}-e_{girl}\)

\(e_{grandmother}-e_{grandfather}\)

将上面所求做平均運算,得到的向量方向即為偏見方向。

為友善了解,已在圖中畫出偏見方向,其餘299D(除gender以外的其他單詞特征)向量與偏見方向正交,也在下圖中畫出。

DeepLearning.ai學習筆記(五)序列模型 -- week2 自然語言處理與詞嵌入
  • 2.詞性中和

像“boy,girl”這類詞在性别詞性上是很明确的,而且不存在歧視,是以無需中和(Neutralize)。

而圖中的babysister、doctor則需要中和,具體方法就是将該詞像非偏見方向投影得到一個新的坐标。

DeepLearning.ai學習筆記(五)序列模型 -- week2 自然語言處理與詞嵌入
  • 3.單詞對等距離化

如下圖示,雖然babysister中和化,但是它還是離grandmother更近,是以依舊帶有偏見

DeepLearning.ai學習筆記(五)序列模型 -- week2 自然語言處理與詞嵌入

是以我們還需要将grandmother、grandfather這類與性别有關的對應詞等距分布在非偏見方向的兩側(紅色剪頭表示移動方向,紅色點表示移動後的新坐标),如下圖示。

DeepLearning.ai學習筆記(五)序列模型 -- week2 自然語言處理與詞嵌入

MARSGGBO ♥原創 2018-3-24

繼續閱讀