詞匯表征 word representation
在上一周我們提到了通常的一個詞匯表征的方法是通過建立一個包含全部獨立單詞的詞匯表,對于其中的每一個單詞在對應的索引位置上建立 One-hot 編碼。例如如果詞匯表的長度是 10,000,那么對于索引位置為 9527 的一個單詞,其編碼后的向量為一個長度為 10,000,索引位置 9527 處為 1 其他位置全 0 的向量,這里也可以知道對于詞匯表進行 One-hot 編碼的到的也是一個大型的稀疏矩陣。
這一編碼方式的一個重要的缺點是它無法有效的對于學到的知識進行泛化,例如如果通過訓練使得網(wǎng)絡了解到 orange juice 這兩個詞同時出現(xiàn)概率非常高,仍然無法有效的使的 apple juice 也獲得同樣類似的知識,其中的一個原因就是任意兩個 one-hot 編碼向量的內積為 0。
另一種表征方式就是通過學習使得網(wǎng)絡對于詞匯基于屬性或特征進行表征,與在 CNN 中網(wǎng)絡所提取的特征變得十分抽象類似,在實際情形中 RNN 學習到的特征不一定直觀的等同于我們日常對于詞匯屬性的歸類方式,但這不妨礙其可以通過這種方式準確的將知識進行泛化。
Embeddings are important for input to machine learning. Classifiers, and neural networks more generally, work on vectors of real numbers. They train best on dense vectors, where all values contribute to define an object. However, many important inputs to machine learning, such as words of text, do not have a natural vector representation. Embedding functions are the standard and effective way to transform such discrete input objects into useful continuous vectors.
例如在下圖中網(wǎng)絡對于 apple 和 orange 進行特征表征時,二者很多類似屬性部分就會出現(xiàn)相近的概率值。

在網(wǎng)絡通過學習對于詞匯進行表征時,也可以通過一定的方式來將這些表征可視化,其中一個重要的可視化方式就是 t-sne embeddings,這種方法可以將高維的分類投影在二維平面,并且會保留類似詞匯的臨近狀態(tài)。
word embeddings
在課程中 Andrew 講到 word embeddings 一詞,我一直找不到合適的翻譯方式。其核心是通過一定的方法將詞匯向量化的過程,理解這個概念的更好的方式是將其與 One-hot enconding 對比:
在 One-hot encoding 中,向量的維數(shù)和詞匯表的長度相同,并且每一個單詞被任意的賦予一個索引位置,這使得不同的詞匯之間沒有任何的相似性和關聯(lián)性,表征詞匯的矩陣是稀疏的
word embedding 想要實現(xiàn)的是構建以特征為基礎的,參數(shù)密集的低維的向量來對詞匯進行表征,并且具有相同語義的詞匯的向量之間具有較大的相似性
Word embeddings are a type of (vectorized) word representation that allows words with similar meaning to have a similar representation ... Each word is represented by a real-valued vector, often tens or hundreds of dimensions. This is contrasted to the thousands or millions of dimensions required for sparse word representations, such as a one-hot encoding ... The distributed representation is learned based on the usage of words. This allows words that are used in similar ways to result in having similar representations, naturally capturing their meaning. - Jason Brownlee
在我看來這個概念和 CNN 中的 bottleneck features 類似,word embeddings 是通過借用巨大的語料庫訓練得到的特征來對詞匯進行向量化的標記,并且一旦通過大量的語料庫完成標記,在實際應用中可以使用較少的訓練詞匯來通過遷移學習的方式獲得高質量的訓練結果。
使用基于特征標記的 word embeddings 的另外一個優(yōu)點是可以通過對比具有類似特征的向量來進行類比,例如如果將基于 embeddings 得到的對應 man, women, king, queen 的詞匯向量 word vector 做比較可以發(fā)現(xiàn) eman - ewoman ≈ eking - equeen,這種近似關系也就等同于自然語言中的類比。

在算法實現(xiàn)中,為了讓算法可以獲知上述的相似關系,可以定義一個相似函數(shù) sim( ) 使得對于任意詞匯向量 ew,令其等于 argmax(sim(ew, eking - eman + ewoman))。最基本的相似函數(shù)可以是余弦距離,也即 sim(u, v) = cosθ = dot(u.T, V) / ||u||2||v||2,為了理解這個余弦距離也可以將其與 相關系數(shù) 進行類比。
Embedding matrix
假設我們需要網(wǎng)絡學習的 Embedding matrix 有 300 個特征,并且詞匯表中有 10,000 個單詞,那么這個 embedding matrix 將是一個 300 x 10,000 的矩陣,記做 E,此時如果我們將這個矩陣與任意個 One-hot encoding 得到的維數(shù)為 10,000 x 1 的詞匯向量 Ow 做乘法的結果是一個維數(shù)為 300 x 1 的向量,且等同于提取 E 中的第 w 列,即 E?Ow = ew。在實際模型構建中,我們會隨機初始化 E,然后通過梯度下降不斷更新 E 中的數(shù)值。在 Andrew 的課堂中他依然采用的是權重參數(shù)在前的矩陣乘法形式,因此維數(shù)上需要格外注意。
Word embedding 的相關算法
在自然語言中,詞匯與詞匯之間的相關關系是不等的,也即有些詞匯與另外一些詞匯同時出現(xiàn)的概率更高,這就啟發(fā)我們在網(wǎng)絡訓練時希望網(wǎng)絡可以獲知詞匯之間的關聯(lián)關系,也即可以在將語句拆分成單詞的基礎上,構建詞語之間的關聯(lián)關系。并且 Andrew 提到在自然語言處理研究領域的一個趨勢是用于 word embedding 的算法隨著時間的推移有更加簡潔的趨勢,因此后面介紹的幾個算法其實現(xiàn)的復雜性逐漸降低,但令人意外的是效果保持不變或更好。
在構建 word embedding 時,一個比較重要的超參數(shù)是給予預測部分提供的語境信息的多少,一般如果在做語言建模時,都會選擇緊鄰被預測詞匯的前幾個單詞,而如果是希望通過模型訓練來構建 word embedding 時,則可以選擇被預測詞匯左右兩側的幾個單詞、緊鄰被預測詞匯的 1 個單詞或者被預測詞匯附近的某一個單詞。

詞匯-向量模型 Word2Vec model
論文的原作者在構建 Word2Vec 這個語言模型的時候提出了基于連續(xù)詞袋模
continuous bag-of-words model 和基于連續(xù) skip-grams 模型兩種方式。其中
skip-grams 是與 n-grams 對應的,后者指的是一個語句中 n 個連續(xù)的詞匯構成的序列,而 skip-grams 與其采用預測詞匯附近的固定 n 個單詞作為語境信息,我們可以將采樣窗口設置成一個超參數(shù)來構建語境-目標對 context-target pair:首先通過隨機選取一個詞匯作為語境 context 信息,在其附近某預先設定的范圍如 ±5 個詞匯長度內隨機提取另一個詞匯作為目標 target 信息,在用語料庫中所有的 context-target 對來對網(wǎng)絡進行訓練,從而使得網(wǎng)絡獲知當輸入為某個單詞時,輸出語料庫中全部單詞對應作為目標的概率。

The network is going to learn the statistics from the number of times each pairing shows up. So, for example, the network is probably going to get many more training samples of (“Soviet”, “Union”) than it is of (“Soviet”, “Sasquatch”). When the training is finished, if you give it the word “Soviet” as input, then it will output a much higher probability for “Union” or “Russia” than it will for “Sasquatch”. - Chris Mccormick
比較令人驚訝的是這個看起來非常復雜和抽象的任務竟然可以通過只包含一個隱藏層的神經(jīng)網(wǎng)絡來實現(xiàn),依然采用前面 Andrew 使用的 Embedding Matrix 的維數(shù),如果輸入為 1 x10,000 的 one-hot encoding 向量,我們想創(chuàng)建包含 300 個特征的 Embedding Matrix,那么在網(wǎng)絡的隱藏層就需要包含 300 個單元,并且隱藏層不做任何的激活,再將隱藏層的輸出傳遞給由 10,000 個單元構成的 softmax 回歸分類:P(t | c) = eθtTec / ΣeθjTec,j = 1, 2, 3, ... , 10,000 ,通過梯度下降使得網(wǎng)絡的輸出逐漸的逼近給定的目標值,既可以實現(xiàn)網(wǎng)絡的學習。

對于這個隱藏層,由于輸入的維數(shù)是 10,000,在此基礎上如果設定 Embedding matrix 的特征數(shù)量為 300,則這個矩陣中的參數(shù)有 300 x 10,000 = 3,000,000 個參數(shù),因此這個算法實現(xiàn)起來真正的難度在于其龐大的計算量。Google 的幾位作者為了減少計算量,算法實現(xiàn)的時候采用的是基于二分法原理的 Hierarchical softmax,并且對于常用的詞匯會被放置在分叉樹的起始層級,以便其被更快的找到。
上述示例運算中由于輸入是 one-hot encoding 的 1 x 1000 向量,且只有索引位置所在處為 1,其余元素全為 0,因此在實際計算中對應的 Embedding matrix 的每一行就是對應相應輸入詞匯的詞匯向量 word vector。
GloVe
<to be added>