徹底理解 NLP中的word2vec

2021-10-21 11:10:10 字數 2141 閱讀 8023

首先簡單概括一下 word2vec 的思想:

word2vec的目的是用指定維度的向量來表示詞庫中的每乙個詞,這些向量更利於後期進行各種nlp任務;每個詞語對應的詞向量本質上是語言模型中的一些權重引數,因此我們需要通過訓練網路的方式得到這些權重的最優值,換句話說,我們通過**未知詞的方式訓練網路,目的並不是真的要去使用模型**未知詞,而是提取網路的網路的權重引數 進而得到詞向量,然後拿這些詞向量作為詞語的另一種表示形式去進行別的模型裡完成nlp任務

word2vec的目的是通過訓練語言模型得到詞向量,而早在 2003 年大牛 bengio 就已經提出了神經網路語言模型(neural network language model, nnlm)該模型在學習語言模型的同時,也得到了詞向量;因此我們先要了解一下nnlm模型

語言模型是乙個多分類問題,給定前 n-1 個單詞,**第 n 個單詞是什麼。 在 nnlm 中詞向量可以認為是神經網路語言模型訓練的副產物。

nnlm的結構如下:

模型的內部運算流程如下:

輸入每個詞的one-hot 編碼

對每個輸入點乘權重矩陣 c,得到每個詞對應的詞向量

將所有詞的詞向量拼接成乙個長向量

將長向量輸入隱藏層

隱藏層將輸入點乘隱藏層的權重矩陣並加偏置後 通過tanh函式輸出到輸出層

輸出層點成輸出層權重矩陣w並加偏置後通過softmax函式輸出**每個詞的概率(輸出層節點數=詞庫容量)

上圖中的虛線表示從詞向量到輸出層的類似殘差的結構,這裡先不做贅述

這裡最模型的輸入和詞向量的計算著重說明一下:

模型的輸入是詞庫中詞的one-hot編碼

對詞進行 one-hot 編碼的過程如下:

用和詞庫容量大小(v)的維度來表示乙個詞語,詞庫中的第n個詞語的第n維置為1,其餘位置置為0

輸入詞語的one-hot編碼(1行v列)點乘矩陣c(v行m列)會得到對應的詞向量,得到的是乙個1行m列的向量(m的維度是人為指定的);但由於one-hot向量特殊性,兩者點乘等價於提取c矩陣中詞語序號對應的行,因此我們可以理解為,c矩陣中按行儲存著詞庫中每個詞的詞向量;這個c矩陣本是通過學習得到的網路引數一般情況下不會實際價值,這就是為什麼說詞向量矩陣是nnlm的副產物。

word2vec有兩種網路結構 cbow 和 skip-gram ;和 nnlm的不同之處在於cbow 和 skip-gram摒棄了nnlm的隱藏層結構、沒有使用啟用函式並且將nnlm的詞向量拼接轉換成了 詞向量求均值

由於nnlm的目的是用來**,而word2vec的目的是用來得到詞向量矩陣(網路的權重引數),所以得到的**結果並不需要絕對準確,只要相對準確就即可;換句話說,我們只需將模型優化到極限,並不需要模型得到最準確的**結果。因此cbow 和 skip-gram兩種網路結構中都摒棄了nnlm中的隱藏層;

如上文所述,word2vec的目的是得到網路的權重矩陣,cbow 和 skip-gram只是兩種訓練網路的方式,cbow通過上下文**中間詞的方式訓練網路,skip-gram通過中間詞**上下文的方式訓練網路

模型的內部運算流程如下:

輸入每個詞的one-hot 編碼

對每個輸入點乘權重矩陣 c,得到每個詞對應的詞向量

將所有詞向量的每一維求均值後的到均值向量並將均值向量輸出到輸出層

輸出層點成輸出層權重矩陣w並通過softmax函式輸出**每個詞的概率(輸出層節點數=詞庫容量)

模型的內部運算流程如下:

輸入中間詞的one-hot 編碼

對輸入one-hot 編碼點乘權重矩陣 c,得到中間詞對應的詞向量並輸出到隱含層

對輸入的詞向量點乘權重矩陣w,並輸出的輸出層

對每個輸出層節點使用softmax函式輸出每個輸出節點**每個詞的概率

(每個輸出層輸出節點數=詞庫容量)

參考文章:

6. 語言模型(二)—— 神經網路語言模型(nnlm)

TensorFlow 讀書筆記 Word2Vec

由於暫時不會深入接觸nlp相關領域,所以本章的內容就不過多涉及了,以後會進行學習,應該。word2vec又稱word embeddings,中文稱為 詞向量 詞嵌入 等。影象和語音天然可以表示為稠密向量,自然語言處理領域在word2vec之前都是使用離散符號,如 中國 表示為5178,北京 表示為3...

NLP中啟用函式的理解

1 啟用函式將線性變換轉變成非線性。y xw b y sigma xw b y xw b xw bxw b xw b 是在x基礎上做的線性變換 仿射變換 總體來說做的平移 旋轉和縮放,加入啟用函式後,原來的變換是非線性的。上式也可以理解為,在x xx基礎上先過mlp,再加啟用函式。在實際訓練中,發現...

徹底理解Python中的yield

閱讀別人的python原始碼時碰到了這個yield這個關鍵字,各種搜尋終於搞懂了,在此做一下總結 通常的for.in.迴圈中,in後面是乙個陣列,這個陣列就是乙個可迭代物件,類似的還有鍊錶,字串,檔案。它可以是mylist 1,2,3 也可以是mylist x x for x in range 3 ...