<sup id="k62se"></sup>
<xmp id="k62se"><option id="k62se"></option>
<object id="k62se"><tr id="k62se"></tr></object><rt id="k62se"><wbr id="k62se"></wbr></rt>
<tt id="k62se"></tt>
<bdo id="k62se"><label id="k62se"></label></bdo>
  • <menu id="k62se"><sup id="k62se"></sup></menu>
    安防峰會
    您正在使用IE低版瀏覽器,為了您的雷鋒網賬號安全和更好的產品體驗,強烈建議使用更快更安全的瀏覽器
    人工智能開發者 正文
    發私信給AI研習社
    發送

    3

    一文詳解 Word2vec 之 Skip-Gram 模型(結構篇)

    本文作者:AI研習社 2017-06-22 12:06
    導語:這可能是關于 Skip-Gram 模型最詳細的講解。

    雷鋒網按:這是一個關于 Skip-Gram 模型的系列教程,依次分為結構、訓練實現三個部分,本文為第一部分:結構篇,后面兩個部分我們將陸續發布,敬請期待。原文作者天雨粟,原載于作者知乎專欄,雷鋒網(公眾號:雷鋒網)已獲授權。

    這次的分享主要是對Word2Vec模型的兩篇英文文檔的翻譯、理解和整合,這兩篇英文文檔都是介紹Word2Vec中的Skip-Gram模型。下一篇專欄文章將會用TensorFlow實現基礎版Word2Vec的skip-gram模型,所以本篇文章先做一個理論鋪墊。

    原文英文文檔請參考鏈接:

    - Word2Vec Tutorial - The Skip-Gram Model

    http://t.cn/Rc5RfJ2

    - Word2Vec (Part 1): NLP With Deep Learning with Tensorflow (Skip-gram)

    http://t.cn/RoVEiUB

    什么是Word2Vec和Embeddings?

    Word2Vec是從大量文本語料中以無監督的方式學習語義知識的一種模型,它被大量地用在自然語言處理(NLP)中。那么它是如何幫助我們做自然語言處理呢?Word2Vec其實就是通過學習文本來用詞向量的方式表征詞的語義信息,即通過一個嵌入空間使得語義上相似的單詞在該空間內距離很近。Embedding其實就是一個映射,將單詞從原先所屬的空間映射到新的多維空間中,也就是把原先詞所在空間嵌入到一個新的空間中去。

    我們從直觀角度上來理解一下,cat這個單詞和kitten屬于語義上很相近的詞,而dog和kitten則不是那么相近,iphone這個單詞和kitten的語義就差的更遠了。通過對詞匯表中單詞進行這種數值表示方式的學習(也就是將單詞轉換為詞向量),能夠讓我們基于這樣的數值進行向量化的操作從而得到一些有趣的結論。比如說,如果我們對詞向量kitten、cat以及dog執行這樣的操作:kitten - cat + dog,那么最終得到的嵌入向量(embedded vector)將與puppy這個詞向量十分相近。

    模型

    Word2Vec模型中,主要有Skip-Gram和CBOW兩種模型,從直觀上理解,Skip-Gram是給定input word來預測上下文。而CBOW是給定上下文,來預測input word。本篇文章僅講解Skip-Gram模型。

    一文詳解 Word2vec 之 Skip-Gram 模型(結構篇)

    Skip-Gram模型的基礎形式非常簡單,為了更清楚地解釋模型,我們先從最一般的基礎模型來看Word2Vec(下文中所有的Word2Vec都是指Skip-Gram模型)。

    Word2Vec模型實際上分為了兩個部分,第一部分為建立模型,第二部分是通過模型獲取嵌入詞向量。Word2Vec的整個建模過程實際上與自編碼器(auto-encoder)的思想很相似,即先基于訓練數據構建一個神經網絡,當這個模型訓練好以后,我們并不會用這個訓練好的模型處理新的任務,我們真正需要的是這個模型通過訓練數據所學得的參數,例如隱層的權重矩陣——后面我們將會看到這些權重在Word2Vec中實際上就是我們試圖去學習的“word vectors”。基于訓練數據建模的過程,我們給它一個名字叫“Fake Task”,意味著建模并不是我們最終的目的。

    上面提到的這種方法實際上會在無監督特征學習(unsupervised feature learning)中見到,最常見的就是自編碼器(auto-encoder):通過在隱層將輸入進行編碼壓縮,繼而在輸出層將數據解碼恢復初始狀態,訓練完成后,我們會將輸出層“砍掉”,僅保留隱層。

    The Fake Task

    我們在上面提到,訓練模型的真正目的是獲得模型基于訓練數據學得的隱層權重。為了得到這些權重,我們首先要構建一個完整的神經網絡作為我們的“Fake Task”,后面再返回來看通過“Fake Task”我們如何間接地得到這些詞向量。

    接下來我們來看看如何訓練我們的神經網絡。假如我們有一個句子“The dog barked at the mailman”

    • 首先我們選句子中間的一個詞作為我們的輸入詞,例如我們選取“dog”作為input word;

    • 有了input word以后,我們再定義一個叫做skip_window的參數,它代表著我們從當前input word的一側(左邊或右邊)選取詞的數量。如果我們設置skip_window=2,那么我們最終獲得窗口中的詞(包括input word在內)就是['The', 'dog','barked', 'at']。skip_window=2代表著選取左input word左側2個詞和右側2個詞進入我們的窗口,所以整個窗口大小span=2x2=4。另一個參數叫num_skips,它代表著我們從整個窗口中選取多少個不同的詞作為我們的output word,當skip_window=2,num_skips=2時,我們將會得到兩組 (input word, output word) 形式的訓練數據,即 ('dog', 'barked')('dog', 'the')

    • 神經網絡基于這些訓練數據將會輸出一個概率分布,這個概率代表著我們的詞典中的每個詞是output word的可能性。這句話有點繞,我們來看個栗子。第二步中我們在設置skip_window和num_skips=2的情況下獲得了兩組訓練數據。假如我們先拿一組數據 ('dog', 'barked') 來訓練神經網絡,那么模型通過學習這個訓練樣本,會告訴我們詞匯表中每個單詞是“barked”的概率大小。

    模型的輸出概率代表著到我們詞典中每個詞有多大可能性跟input word同時出現。舉個栗子,如果我們向神經網絡模型中輸入一個單詞“Soviet“,那么最終模型的輸出概率中,像“Union”, ”Russia“這種相關詞的概率將遠高于像”watermelon“,”kangaroo“非相關詞的概率。因為”Union“,”Russia“在文本中更大可能在”Soviet“的窗口中出現。我們將通過給神經網絡輸入文本中成對的單詞來訓練它完成上面所說的概率計算。下面的圖中給出了一些我們的訓練樣本的例子。我們選定句子“The quick brown fox jumps over lazy dog”,設定我們的窗口大小為2(window_size=2),也就是說我們僅選輸入詞前后各兩個詞和輸入詞進行組合。下圖中,藍色代表input word,方框內代表位于窗口內的單詞。

    一文詳解 Word2vec 之 Skip-Gram 模型(結構篇)

    我們的模型將會從每對單詞出現的次數中習得統計結果。例如,我們的神經網絡可能會得到更多類似(“Soviet“,”Union“)這樣的訓練樣本對,而對于(”Soviet“,”Sasquatch“)這樣的組合卻看到的很少。因此,當我們的模型完成訓練后,給定一個單詞”Soviet“作為輸入,輸出的結果中”Union“或者”Russia“要比”Sasquatch“被賦予更高的概率。

    模型細節

    我們如何來表示這些單詞呢?首先,我們都知道神經網絡只能接受數值輸入,我們不可能把一個單詞字符串作為輸入,因此我們得想個辦法來表示這些單詞。最常用的辦法就是基于訓練文檔來構建我們自己的詞匯表(vocabulary)再對單詞進行one-hot編碼。

    假設從我們的訓練文檔中抽取出10000個唯一不重復的單詞組成詞匯表。我們對這10000個單詞進行one-hot編碼,得到的每個單詞都是一個10000維的向量,向量每個維度的值只有0或者1,假如單詞ants在詞匯表中的出現位置為第3個,那么ants的向量就是一個第三維度取值為1,其他維都為0的10000維的向量(ants=[0, 0, 1, 0, ..., 0])。

    還是上面的例子,“The dog barked at the mailman”,那么我們基于這個句子,可以構建一個大小為5的詞匯表(忽略大小寫和標點符號):("the", "dog", "barked", "at", "mailman"),我們對這個詞匯表的單詞進行編號0-4。那么”dog“就可以被表示為一個5維向量[0, 1, 0, 0, 0]。

    模型的輸入如果為一個10000維的向量,那么輸出也是一個10000維度(詞匯表的大小)的向量,它包含了10000個概率,每一個概率代表著當前詞是輸入樣本中output word的概率大小。

    下圖是我們神經網絡的結構:

    一文詳解 Word2vec 之 Skip-Gram 模型(結構篇)

    隱層沒有使用任何激活函數,但是輸出層使用了sotfmax。

    我們基于成對的單詞來對神經網絡進行訓練,訓練樣本是 ( input word, output word ) 這樣的單詞對,input word和output word都是one-hot編碼的向量。最終模型的輸出是一個概率分布。

    隱層

    說完單詞的編碼和訓練樣本的選取,我們來看下我們的隱層。如果我們現在想用300個特征來表示一個單詞(即每個詞可以被表示為300維的向量)。那么隱層的權重矩陣應該為10000行,300列(隱層有300個結點)。

    Google在最新發布的基于Google news數據集訓練的模型中使用的就是300個特征的詞向量。詞向量的維度是一個可以調節的超參數(在Python的gensim包中封裝的Word2Vec接口默認的詞向量大小為100, window_size為5)。

    看下面的圖片,左右兩張圖分別從不同角度代表了輸入層-隱層的權重矩陣。左圖中每一列代表一個10000維的詞向量和隱層單個神經元連接的權重向量。從右邊的圖來看,每一行實際上代表了每個單詞的詞向量。

    一文詳解 Word2vec 之 Skip-Gram 模型(結構篇)

    所以我們最終的目標就是學習這個隱層的權重矩陣。

    我們現在回來接著通過模型的定義來訓練我們的這個模型。

    上面我們提到,input word和output word都會被我們進行one-hot編碼。仔細想一下,我們的輸入被one-hot編碼以后大多數維度上都是0(實際上僅有一個位置為1),所以這個向量相當稀疏,那么會造成什么結果呢。如果我們將一個1 x 10000的向量和10000 x 300的矩陣相乘,它會消耗相當大的計算資源,為了高效計算,它僅僅會選擇矩陣中對應的向量中維度值為1的索引行(這句話很繞),看圖就明白。

    一文詳解 Word2vec 之 Skip-Gram 模型(結構篇)

    我們來看一下上圖中的矩陣運算,左邊分別是1 x 5和5 x 3的矩陣,結果應該是1 x 3的矩陣,按照矩陣乘法的規則,結果的第一行第一列元素為0 x 17 + 0 x 23 + 0 x 4 + 1 x 10 + 0 x 11 = 10,同理可得其余兩個元素為12,19。如果10000個維度的矩陣采用這樣的計算方式是十分低效的。

    為了有效地進行計算,這種稀疏狀態下不會進行矩陣乘法計算,可以看到矩陣的計算的結果實際上是矩陣對應的向量中值為1的索引,上面的例子中,左邊向量中取值為1的對應維度為3(下標從0開始),那么計算結果就是矩陣的第3行(下標從0開始)—— [10, 12, 19],這樣模型中的隱層權重矩陣便成了一個”查找表“(lookup table),進行矩陣計算時,直接去查輸入向量中取值為1的維度下對應的那些權重值。隱層的輸出就是每個輸入單詞的“嵌入詞向量”。

    輸出層

    經過神經網絡隱層的計算,ants這個詞會從一個1 x 10000的向量變成1 x 300的向量,再被輸入到輸出層。輸出層是一個softmax回歸分類器,它的每個結點將會輸出一個0-1之間的值(概率),這些所有輸出層神經元結點的概率之和為1。

    下面是一個例子,訓練樣本為 (input word: “ants”, output word: “car”) 的計算示意圖。

    一文詳解 Word2vec 之 Skip-Gram 模型(結構篇)

    直覺上的理解

    下面我們將通過直覺來進行一些思考。

    如果兩個不同的單詞有著非常相似的“上下文”(也就是窗口單詞很相似,比如“Kitty climbed the tree”和“Cat climbed the tree”),那么通過我們的模型訓練,這兩個單詞的嵌入向量將非常相似。

    那么兩個單詞擁有相似的“上下文”到底是什么含義呢?比如對于同義詞“intelligent”和“smart”,我們覺得這兩個單詞應該擁有相同的“上下文”。而例如”engine“和”transmission“這樣相關的詞語,可能也擁有著相似的上下文。

    實際上,這種方法實際上也可以幫助你進行詞干化(stemming),例如,神經網絡對”ant“和”ants”兩個單詞會習得相似的詞向量。

    詞干化(stemming)就是去除詞綴得到詞根的過程。

    雷鋒網相關閱讀:

    一文詳解 Word2vec 之 Skip-Gram 模型(訓練篇)

    一文詳解 Word2vec 之 Skip-Gram 模型(實現篇)

    25 行 Python 代碼實現人臉檢測——OpenCV 技術教程

    雷鋒網版權文章,未經授權禁止轉載。詳情見轉載須知

    分享:
    相關文章

    文章點評:

    表情

    編輯

    聚焦數據科學,連接AI開發者。
    當月熱門文章
    最新文章
    請填寫申請人資料
    姓名
    電話
    郵箱
    微信號
    作品鏈接
    個人簡介
    為了您的賬戶安全,請驗證郵箱
    您的郵箱還未驗證,完成可獲20積分喲!
    請驗證您的郵箱
    立即驗證
    完善賬號信息
    您的賬號已經綁定,現在您可以設置密碼以方便用郵箱登錄
    立即設置 以后再說
    江苏11选5投注