日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

[深度学习] 一篇文章理解 word2vec

發布時間:2023/12/15 pytorch 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [深度学习] 一篇文章理解 word2vec 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1 詞的獨熱編碼 One-Hot 表示

到目前為止最常用的詞表示方法是 One-hot Representation,這種方法把每個詞表示為一個很長的向量。這個向量的維度是詞表大小,其中絕大多數元素為 0,只有一個維度的值為 1,這個向量就代表了當前的詞。

考慮一下的三個特征:

["male", "female"]
["from Europe", "from US", "from Asia"]
["uses Firefox", "uses Chrome", "uses Safari", "uses Internet Explorer"]

將它換成獨熱編碼后,應該是:
feature1=[01,10]
feature2=[001,010,100]
feature3=[0001,0010,0100,1000]

?

比如如果將世界所有城市名稱作為語料庫的話,那這個向量會過于稀疏,并且會造成維度災難。

杭州 [0,0,0,0,0,0,0,1,0,……,0,0,0,0,0,0,0]
上海 [0,0,0,0,1,0,0,0,0,……,0,0,0,0,0,0,0]
寧波 [0,0,0,1,0,0,0,0,0,……,0,0,0,0,0,0,0]
北京 [0,0,0,0,0,0,0,0,0,……,1,0,0,0,0,0,0]

在語料庫中,杭州、上海、寧波、北京各對應一個向量,向量中只有一個值為1,其余都為0。

?

缺點分析:
1、向量的維度會隨著句子的詞的數量類型增大而增大;
2、任意兩個詞之間都是孤立的,無法表示語義層面上詞匯之間的相關信息,而這一點是致命的。

?

2 詞的分布式表示

傳統的獨熱表示僅僅將詞符號化,不包含任何語義信息。如何將語義融入到詞表示中?Harris 在 1954 年提出的“分布假說”為這一設想提供了理論基礎:上下文相似的詞,其語義也相似。Firth 在 1957年對分布假說進行了進一步闡述和明確:詞的語義由其上下文決定。

Dristributed representation可以解決One hot representation的問題,它的思路是通過訓練,將每個詞都映射到一個較短的詞向量上來。所有的這些詞向量就構成了向量空間,進而可以用普通的統計學的方法來研究詞與詞之間的關系。這個較短的詞向量維度是多大呢?這個一般需要我們在訓練時自己來指定。

比如下圖我們將詞匯表里的詞用"Royalty","Masculinity", "Femininity"和"Age"4個維度來表示,King這個詞對應的詞向量可能是(0.99,0.99,0.05,0.7)(0.99,0.99,0.05,0.7)。當然在實際情況中,我們并不能對詞向量的每個維度做一個很好的解釋。

?

?

我們將king這個詞從一個可能非常稀疏的向量坐在的空間,映射到現在這個四維向量所在的空間,必須滿足以下性質:

(1)這個映射是單設(不懂的概念自行搜索);
(2)映射之后的向量不會丟失之前的那種向量所含的信息。

這個過程稱為word embedding(詞嵌入),即將高維詞向量嵌入到一個低維空間。順便找了個圖


經過我們一系列的降維神操作,有了用Dristributed representation表示的較短的詞向量,我們就可以較容易的分析詞之間的關系了,比如我們將詞的維度降維到2維,有一個有趣的研究表明,用下圖的詞向量表示我們的詞時,我們可以發現:

?

?

本質:詞向量是訓練神經網絡時候的隱藏層參數或者說矩陣。

?

輸入是One-Hot Vector,Hidden Layer沒有激活函數,也就是線性的單元。Output Layer維度跟Input Layer的維度一樣,用的是Softmax回歸。當這個模型訓練好以后,我們并不會用這個訓練好的模型處理新的任務,我們真正需要的是這個模型通過訓練數據所學得的參數,例如隱層的權重矩陣。

?

什么是embedding?為什么說embedding是深度學習的基本操作?

簡單來說,embedding就是用一個低維的向量表示一個物體,可以是一個詞,或是一個商品,或是一個電影等等。這個embedding向量的性質是能使距離相近的向量對應的物體有相近的含義,比如 Embedding(復仇者聯盟)和Embedding(鋼鐵俠)之間的距離就會很接近,但 Embedding(復仇者聯盟)和Embedding(亂世佳人)的距離就會遠一些。

除此之外Embedding甚至還具有數學運算的關系,比如Embedding(馬德里)-Embedding(西班牙)+Embedding(法國)≈Embedding(巴黎)

從另外一個空間表達物體,甚至揭示了物體間的潛在關系,上次體會這樣神奇的操作還是在學習傅里葉變換的時候,從某種意義上來說,Embedding方法甚至具備了一些本體論的哲學意義。

言歸正傳,Embedding能夠用低維向量對物體進行編碼還能保留其含義的特點非常適合深度學習。在傳統機器學習模型構建過程中,我們經常使用one hot encoding對離散特征,特別是id類特征進行編碼,但由于one hot encoding的維度等于物體的總數,比如阿里的商品one hot encoding的維度就至少是千萬量級的。這樣的編碼方式對于商品來說是極端稀疏的,甚至用multi hot encoding對用戶瀏覽歷史的編碼也會是一個非常稀疏的向量。而深度學習的特點以及工程方面的原因使其不利于稀疏特征向量的處理。因此如果能把物體編碼為一個低維稠密向量再喂給DNN,自然是一個高效的基本操作。

?

?

3 兩種word2vec訓練模式

一般分為CBOW(Continuous Bag-of-Words 與Skip-Gram兩種模型。

  • CBOW模型的訓練輸入是某一個特征詞的上下文相關的詞對應的詞向量,而輸出就是這特定的一個詞的詞向量?!?/li>
  • Skip-Gram模型和CBOW的思路是反著來的,即輸入是特定的一個詞的詞向量,而輸出是特定詞對應的上下文詞向量。
  • CBOW對小型數據庫比較合適,而Skip-Gram在大型語料中表現更好。

    ?

    ?

    ?

    4 訓練模式詳細介紹

    ?

    A.?? CBOW(Continuous Bag-of-Words)

    CBOW的訓練模型如圖所示


    1 輸入層:上下文單詞的onehot. {假設單詞向量空間dim為V,上下文單詞個數為C}
    2 所有onehot分別乘以共享的輸入權重矩陣W. {VN矩陣,N為自己設定的數,初始化權重矩陣W}
    3 所得的向量 {因為是onehot所以為向量} 相加求平均作為隱層向量, size為1N.
    4 乘以輸出權重矩陣W' {NV}
    5 得到向量 {1V} 激活函數處理得到V-dim概率分布 {PS: 因為是onehot嘛,其中的每一維斗代表著一個單詞}
    6 概率最大的index所指示的單詞為預測出的中間詞(target word)與true label的onehot做比較,誤差越小越好(根據誤差更新權重矩陣)

    ?

    所以,需要定義loss function(一般為交叉熵代價函數),采用梯度下降算法更新W和W'。訓練完畢后,輸入層的每個單詞與矩陣W相乘得到的向量的就是我們想要的詞向量(word embedding),這個矩陣(所有單詞的word embedding)也叫做look up table(其實聰明的你已經看出來了,其實這個look up table就是矩陣W自身),也就是說,任何一個單詞的onehot乘以這個矩陣都將得到自己的詞向量。有了look up table就可以免去訓練過程直接查表得到單詞的詞向量了。

    舉個栗子:

    ?

    ?

    窗口大小是2,表示選取coffe前面兩個單詞和后面兩個單詞,作為input詞。

    ?


    假設我們此時得到的概率分布已經達到了設定的迭代次數,那么現在我們訓練出來的look up table應該為矩陣W。即,任何一個單詞的one-hot表示乘以這個矩陣都將得到自己的word embedding。

    ?

    CBOW模型的訓練輸入是某一個特征詞的上下文相關的詞對應的詞向量,而輸出就是這特定的一個詞的詞向量。

    我們的上下文大小取值為4,特定的這個詞是"Learning",也就是我們需要的輸出詞向量,上下文對應的詞有8個,前后各4個,這8個詞是我們模型的輸入。由于CBOW使用的是詞袋模型,因此這8個詞都是平等的,也就是不考慮他們和我們關注的詞之間的距離大小,只要在我們上下文之內即可。

    這樣我們這個CBOW的例子里,我們的輸入是8個詞向量,輸出是所有詞的softmax概率(訓練的目標是期望訓練樣本特定詞對應的softmax概率最大),對應的CBOW神經網絡模型輸入層有8個神經元,輸出層有詞匯表大小個神經元。隱藏層的神經元個數我們可以自己指定。通過深度神經網絡(DNN)的反向傳播算法,我們可以求出DNN模型的參數,同時得到所有的詞對應的詞向量。這樣當我們有新的需求,要求出某8個詞對應的最可能的輸出中心詞時,我們可以通過一次DNN前向傳播算法并通過softmax激活函數找到概率最大的詞對應的神經元即可。

    ?

    B.?? Skip-Gram

    從直觀上理解,Skip-Gram是給定input word來預測上下文。

    即輸入是特定的一個詞的詞向量,而輸出是特定詞對應的上下文詞向量。還是上面的例子,我們的上下文大小取值為4,?特定的這個詞"Learning"是我們的輸入,而這8個上下文詞是我們的輸出。

    ?

    這樣我們這個Skip-Gram的例子里,我們的輸入是特定詞, 輸出是softmax概率排前8的8個詞,對應的Skip-Gram神經網絡模型輸入層有1個神經元,輸出層有詞匯表大小個神經元。隱藏層的神經元個數我們可以自己指定。通過DNN的反向傳播算法,我們可以求出DNN模型的參數,同時得到所有的詞對應的詞向量。這樣當我們有新的需求,要求出某1個詞對應的最可能的8個上下文詞時,我們可以通過一次DNN前向傳播算法得到概率大小排前8的softmax概率對應的神經元所對應的詞即可。

    ?

    接下來我們來看看如何訓練我們的神經網絡。

    假如我們有一個句子“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')。

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

  • 也就是說模型的輸出概率代表著到我們詞典中每個詞有多大可能性跟input word同時出現。例如:如果我們向神經網絡模型中輸入一個單詞“Soviet“,那么最終模型的輸出概率中,像“Union”, ”Russia“這種相關詞的概率將遠高于像”watermelon“,”kangaroo“非相關詞的概率。因為”Union“,”Russia“在文本中更大可能在”Soviet“的窗口中出現。

    ?

    我們將通過給神經網絡輸入文本中成對的單詞來訓練它完成上面所說的概率計算。圖中給出了一些我們的訓練樣本的例子。我們選定句子“The quick brown fox jumps over lazy dog”,設定我們的窗口大小為2(window_size=2),也就是說我們僅選輸入詞前后各兩個詞和輸入詞進行組合。下圖中,藍色代表input word,方框內代表位于窗口內的單詞。Training Samples(輸入, 輸出)

    ?

    ?

    上圖中的window size設為了2,表示將前2和后2的詞作為標簽,中心詞作為輸入,來構建數據集。

    ?

    訓練過程

    先提出一個假設:

    每個詞有兩個詞向量,一個稱為中心詞向量,一個稱為背景詞向量

    如果有N個詞,為每個詞隨機初始化兩個詞向量,因此最終我們有2*N個詞向量需要訓練。
    再提出一個規則:

    同一個詞,作為輸入(中心詞)時,使用中心詞向量,作為輸出(背景詞)時,使用背景詞向量。

    現在我們來看輸入一個樣本(New, York)時的訓練過程:


    訓練時,將New的中心詞向量,分別與所有詞的背景詞向量進行點積。假設有N個詞,那么這一步操作將會產生N個值,然后再將這N個值進行Softmax歸一化。最終將N個值轉換為輸入New,輸出每個詞的概率。
    例如:假設Dot("New", "Man")=42,歸一化后P("New", "Man")=0.001,意味著輸入“New”,輸出“Man”的概率是0.001


    但是別忘了,輸入的訓練樣本是("New", "York"),因此我們希望提升 P("New", "York"),打壓 P("New", “其他所有詞”)。這樣,這個樣本就訓練完了。需要強調的是,此時"New"用的是它的中心詞向量,而“其他所有詞”使用的是背景詞向量。
    ?

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

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

    ?

    再次提醒,最終我們需要的是訓練出來的權重矩陣。那么到底什么是我們通常意義上所說的詞向量 呢?

    其實就是我們上面所說的輸入向量矩陣 中每一行對應的權重向量。于是這個權重矩陣自然轉換成了word2vec的lookup table。

    ?

    當然在訓練word2vec的過程中還有很多工程技巧,比如用negative sampling或Hierarchical Softmax減少詞匯空間過大帶來的計算量,對高頻詞匯進行降采樣避免對于這些低信息詞匯的無謂計算等。

    Negative Sampling(簡稱NEG)使用隨機采用替代Softmax計算概率,它是另一種更嚴謹的抽樣模型NCE的簡化版本。

    Hierarchical Softmax是用輸出值的霍夫曼編碼代替原本的One-Hot向量,用霍夫曼樹替代Softmax的計算過程。

    在具體實現的時候最好參考Google的原文 Distributed Representations of Words and Phrases and their Compositionalit

    ?

    5 Skip-grams訓練和Negative Sampling

    由上部分可知,Word2Vec模型是一個超級大的神經網絡(權重矩陣規模非常大)。例如:我們擁有10000個單詞的詞匯表,我們如果想嵌入300維的詞向量,那么我們的輸入-隱層權重矩陣和隱層-輸出層的權重矩陣都會有 10000 x 300 = 300萬個權重,在如此龐大的神經網絡中進行梯度下降是相當慢的。更糟糕的是,你需要大量的訓練數據來調整這些權重并且避免過擬合。百萬數量級的權重矩陣和億萬數量級的訓練樣本意味著訓練這個模型將會是個災難

    解決方案:

    • 將常見的單詞組合(word pairs)或者詞組作為單個“words”來處理
    • 對高頻次單詞進行抽樣來減少訓練樣本的個數
    • 對優化目標采用“negative sampling”方法,這樣每個訓練樣本的訓練只會更新一小部分的模型權重,從而降低計算負擔

    Word pairs and "phases"

    一些單詞組合(或者詞組)的含義和拆開以后具有完全不同的意義。比如“Boston Globe”是一種報刊的名字,而單獨的“Boston”和“Globe”這樣單個的單詞卻表達不出這樣的含義。因此,在文章中只要出現“Boston Globe”,我們就應該把它作為一個單獨的詞來生成其詞向量,而不是將其拆開。同樣的例子還有“New York”,“United Stated”等。

    在Google發布的模型中,它本身的訓練樣本中有來自Google News數據集中的1000億的單詞,但是除了單個單詞以外,單詞組合(或詞組)又有3百萬之多。

    對高頻詞抽樣

    在上一部分中,對于原始文本為“The quick brown fox jumps over the laze dog”,如果使用大小為2的窗口,那么我們可以得到圖中展示的那些訓練樣本。

    ?

    但是對于“the”這種常用高頻單詞,這樣的處理方式會存在下面兩個問題:

  • 當我們得到成對的單詞訓練樣本時,("fox", "the") 這樣的訓練樣本并不會給我們提供關于“fox”更多的語義信息,因為“the”在每個單詞的上下文中幾乎都會出現

  • 由于在文本中“the”這樣的常用詞出現概率很大,因此我們將會有大量的(”the“,...)這樣的訓練樣本,而這些樣本數量遠遠超過了我們學習“the”這個詞向量所需的訓練樣本數

  • Word2Vec通過“抽樣”模式來解決這種高頻詞問題。它的基本思想如下:對于我們在訓練原始文本中遇到的每一個單詞,它們都有一定概率被我們從文本中刪掉,而這個被刪除的概率與單詞的頻率有關。

    wi是一個單詞,z(wi)是單詞w出現的次數與總單詞個數的比值。例如“peanut”在1 billion 單詞語料中出現了1000次,那么z('peanut')=1E-6?? 在代碼中有個參數sample來控制subsampling出現的概率,默認值為0.001. sample值越小代表單詞保留的概率越小。
    P(Wi)是保留該單詞的概率:
    ?

    ?

    Negative Sampling

    訓練一個神經網絡意味著要輸入訓練樣本并且不斷調整神經元的權重,從而不斷提高對目標的準確預測。每當神經網絡經過一個訓練樣本的訓練,它的權重就會進行一次調整。

    所以,詞典的大小決定了我們的Skip-Gram神經網絡將會擁有大規模的權重矩陣,所有的這些權重需要通過數以億計的訓練樣本來進行調整,這是非常消耗計算資源的,并且實際中訓練起來會非常慢。

    負采樣(negative sampling)解決了這個問題,它是用來提高訓練速度并且改善所得到詞向量的質量的一種方法。不同于原本每個訓練樣本更新所有的權重,負采樣每次讓一個訓練樣本僅僅更新一小部分的權重,這樣就會降低梯度下降過程中的計算量。

    當我們用訓練樣本 ( input word: "fox",output word: "quick") 來訓練我們的神經網絡時,“ fox”和“quick”都是經過one-hot編碼的。如果我們的詞典大小為10000時,在輸出層,我們期望對應“quick”單詞的那個神經元結點輸出1,其余9999個都應該輸出0。在這里,這9999個我們期望輸出為0的神經元結點所對應的單詞我們稱為“negative” word。

    當使用負采樣時,我們將隨機選擇一小部分的negative words(比如選5個negative words)來更新對應的權重。我們也會對我們的“positive” word進行權重更新(在我們上面的例子中,這個單詞指的是”quick“)。

    在論文中,作者指出指出對于小規模數據集,選擇5-20個negative words會比較好,對于大規模數據集可以僅選擇2-5個negative words。

    如果使用了 negative sampling 僅僅去更新positive word- “quick” 和選擇的其他 10 個negative words 的結點對應的權重,共計 11 個輸出神經元,相當于每次只更新 300 x 11 = 3300 個權重參數。對于 3百萬 的權重來說,相當于只計算了千分之一的權重,這樣計算效率就大幅度提高。

    ?

    我們使用“一元模型分布(unigram distribution)”來選擇“negative words”。個單詞被選作negative sample的概率跟它出現的頻次有關,出現頻次越高的單詞越容易被選作negative words。每個單詞被選為“negative words”的概率計算公式:

    其中 f(ωi)代表著單詞出現的頻次,而公式中開3/4的根號完全是基于經驗的。

    在代碼負采樣的代碼實現中,unigram table有一個包含了一億個元素的數組,這個數組是由詞匯表中每個單詞的索引號填充的,并且這個數組中有重復,也就是說有些單詞會出現多次。那么每個單詞的索引在這個數組中出現的次數該如何決定呢,有公式,也就是說計算出的負采樣概率*1億=單詞在表中出現的次數。

    有了這張表以后,每次去我們進行負采樣時,只需要在0-1億范圍內生成一個隨機數,然后選擇表中索引號為這個隨機數的那個單詞作為我們的negative word即可。一個單詞的負采樣概率越大,那么它在這個表中出現的次數就越多,它被選中的概率就越大。

    ?

    ?

    ?

    參考:

  • https://www.jianshu.com/p/471d9bfbd72f
  • https://www.jianshu.com/p/cede3ae146bb
  • https://www.jianshu.com/p/cede3ae146bb
  • http://mccormickml.com/2016/04/19/word2vec-tutorial-the-skip-gram-model/
  • https://www.jianshu.com/p/56554a63410f
  • 總結

    以上是生活随笔為你收集整理的[深度学习] 一篇文章理解 word2vec的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。