Word2Vec是谷歌團隊提出的,讓詞向量在天然語言處理當中再度流行,而且推廣到了廣告、搜索、推薦等各個領域當中。Word2Vec顧名思義,就是一個生成對詞的向量表達的模型。假設咱們使用一組句子組成的語料庫做爲訓練數據,其中一句長度爲\(T\)的句子爲\(w_1,w_2,...,w_T\),假設每一個詞都與最相鄰的詞關係最爲密切。那麼這種密切的關係能夠分爲兩種:html
這裏借用一下參考圖示:
算法
不過從經驗上來說,Skip-gram效果要好一些。函數
假如咱們選取了\(2c+1\)長度的滑動窗口,從語料庫中抽取一個句子而後從左到右不斷滑動窗口。每移動一次,窗口中的詞就造成了一個訓練樣本。有了訓練樣本,咱們就能夠定義優化目標。以Skip-gram爲例,每一個詞\(w_t\)都決定了相鄰詞\(w_{t+j}\),基於極大似然估計的方法,咱們但願全部樣本的條件機率\(p(w_{t+j}|w_t)\)之積最大,咱們使用對數機率來表示目標函數爲優化
那麼咱們如何定義條件機率\(p(w_{t+j}|w_t)\)呢?在多分類問題當中,一般使用softmax函數。咱們但願,經過詞向量的向量表示,能夠用內積直觀的表示出語義的接近程度。那麼咱們能夠用\(w_o\)表明\(w_{t+j}\),也就是輸出詞;用\(w_i\)表示\(w_t\),也就是輸入詞。spa
咱們容易忽略一個事實,那就是輸入詞和輸出詞的向量表達並不在一個向量空間當中,輸入向量表達和輸出向量表達能夠用以下圖來表示:
htm
在這裏,輸入向量表達就是輸入層到隱層的權重矩陣\(W_{v\times N}\),而輸出向量表達就是隱層到輸出層的權重矩陣\(W'_{Nt\times V}\)。因爲輸入向量通常是one-hot形式的向量,那麼輸入向量矩陣\(W_{v\times N}\)的每一行對應的權重向量就是一樣意義上的「詞向量」,它也能夠被看作是一個查找表,如如數向量是10000詞的one-hot向量,隱層維度爲300,那麼輸入層到隱層的權重向量爲\(10000\times 300\)。在轉化爲詞向量的查找表以後,每行的權重變成了對應詞的Embedding向量。blog
因爲語料庫中的詞數量巨大,對每一個詞都要預測偏差是巨大的計算量,所以,爲了減輕訓練復旦,每每採用負樣本的方法進行訓練,也就是須要對採樣出的幾個負樣本進行計算預測偏差。從多分類問題退化成了一個近似二分類問題。以下所示:ip
\(v'_{w_o}\)是輸出詞向量(正樣本),而\(W_{neg}\)是負樣本集合,\(v'_{w_j}\)是負樣本詞向量,因爲負樣本集合的大小很是有限,一般來講小於10,在每次梯度降低爹地啊過程當中,計算複雜度能夠縮小爲原來的1/1000(假設詞表爲10000)。get