Word2vec是一個基於神經網絡的語言模型,設計目標是用來計算機率P(w|context),即詞w在其上下文context下的條件機率。這裏的context是一個句子中詞w周圍緊連着的n個詞。有了P(w|context),就能夠用相似n-gram模型的方法計算出一個句子的機率。語言模型在NLP領域有着普遍的應用,好比智能拼音輸入法、語音識別和機器翻譯等領域都須要使用語言模型。儘管如此,word2vec模型真正強大的地方在於其不只僅是一個比n-gram等傳統語言模型精準度更高的工具,而在於其訓練過程所產生的附屬品(詞向量)有着更加普遍的應用。算法
那究竟什麼是詞向量呢?在NLP任務中,咱們將天然語言交給機器學習算法來處理,但機器沒法直接理解人類的語言。所以,首先要作的事情就是將語言數學化,詞向量就是對天然語言數學化的一種很好的方式。網絡
一種最簡單的詞向量是one-hot representation,就是用一個很長的向量來表示一個詞,向量的長度是詞典D的大小N,向量的份量只有一個爲1,其餘全爲0,1的位置對應該詞在詞典中的索引。這種詞向量表示有一些缺點:容易受維數災難的困擾,尤爲是應用於Deep Learning場景時;同時,也不能很好地刻畫詞與詞之間的類似性。框架
另外一種詞向量是Distributed Representation,它最先是Hinton於1986年提出來的,能夠克服one-hot representation的上述缺點。其基本想法是:經過訓練將某種語言中的每一個詞映射成一個固定長度的短向量。全部這些向量構成一個詞向量空間,每一個向量是該空間中的一個點,在這個空間上引入「距離」,就能夠根據詞之間的距離來判斷它們之間的(詞法、語義上的)類似性了。Word2vec模型所產生的副產品就是這種Distributed Representation的詞向量。機器學習
如何獲取Distributed Representation的詞向量呢?有不少不一樣的模型能夠用來估計詞向量,包括LSA矩陣分解模型、 PLSA 潛在語義分析機率模型、LDA 文檔生成模型。此外,利用神經網絡算法也是一種經常使用的方法,word2vec就是很好的一個例子。分佈式
詞向量在信息檢索中有着普遍的應用,好比能夠基於詞向量作相關詞挖掘。注意,詞向量只是針對「詞」來提的,事實上,咱們也能夠針對更細粒度或更粗粒度來進行推廣,如字向量,句子向量和文檔向量,它們可以爲字、句子、文檔等單元提供更好的表示。大粒度的文本向量表示有着更加實際和普遍的應用。函數
對於神經網絡,機器是很笨的,它理解不了咱們人本身組建的更高層的天然語言,必須先把詞處理成它能夠理解的數學形式,就是將詞映射成詞向量。工具
對於圖像來講,圖像自己就是一種原生態的數據,人肉眼看到的就是這樣一種數據,它沒有通過任何的變幻和總結,因此人腦是怎麼處理圖片的,就能夠用神經網絡讓機器去模仿人腦的處理方式,來完成這麼一件事件。但文本不同,文本是人有智慧後本身定義的一些符號組織起來的數據,不是原生態的數據,因此你必須把文本還原成計算機能夠理解的形式,也就是這裏要講的詞向量編碼。學習
不一樣文明構建的語言之間具備類似性編碼
咱們但願從一個語系(英語)到另外一個語系(西班牙語),映射到向量空間中後可以保持住他們的分佈,好比說下圖中左邊的two,對應西班牙語向量空間中dos,他們的位置是差很少的。 spa
一會會看到word2vec使得咱們可以學習到這樣一種關係,不少地方喜歡把他叫近義詞,但其實他只是一種關聯,因此咱們但願咱們可以獲取詞和詞之間更底層的一些關聯,好比說國王和女王之間的關係,與男人和女人之間的關係,其實很是很是相近的。因此我但願Vking減去Vqueen 與 Vman減去Vwomen,所能達到的結果應該是差很少的,國王和女王,與男人和女人,本質上是差很少的一件事。在進行此編碼以後,能很好的保證原始文本的一些信息。人在這麼多背景知識的狀況下,理解到的這樣一些信息,咱們但願作完詞編碼後,依據能保持背景知識裏頭所理解的這些東西。
傳統方式是構建一個詞典(Dict)
很難分別細節上的差異,好比你想知道美麗和好看更接近些,仍是美麗和漂亮更接近些,你無法知道!!,同義詞可能他們同義的方向不同。前面的詞袋模型只關心詞出沒出現,不關心的出現順序,好比:Mike love you; you love mike. 他們是兩個不一樣的句子。
咱們但願捕捉到這中順序,那麼經過2-gram將句子的順序保留下來。
表1:模型參數的數量只是一個統計,不用關心它是怎麼算出來的。有些n-gram的term出現的頻次是很是很是低的,可是你硬要開闢一些空間來存儲它,它只要露了一次面,你就要給它開一個位置,因此這個向量會很是很是的長,很是很是的sparse(稀疏)。
language model常常看那些詞會接在那些詞的後面。如何找出來錯誤的表達好比:you love I; you love me.
工業界不多使用這種機率連乘的方式,由於連乘後的機率值很是很是的小。通常會採用log求和的形式。Distributed representation解析:你要讓我本身去承擔這個東西很難,因此我把它分發下去,我它丟到各個子節點或者classed上面,而後再把這些東西彙總回來。
用一個詞附近的其餘詞來分佈式的表示這個詞。
像這裏我不知道banking這個詞倒地是個什麼樣的含義。當你見過不少個,好比一萬個有banking這個詞的句子後,你會知道banking放到哪一個上下文中是最合適的。應該可以體會到這個詞好像和什麼東西是相關的,我雖然不知道banking這個詞的明確含義,但我大概能知道這個東西表達的是和那些信息是相關的。窗口大小:若是要了解你的經濟情況,應該瞭解你周圍的幾個朋友合適。
共現的頻率:一次或屢次。
靠它多近的這些人是都會被考慮到的,這就是局域窗的問題。
這是一個對稱矩陣,你每一行或每一列天生就能夠做爲詞向量來用,例如I這個詞向量就能夠用第一行來表示,I的朋友就是like和enjoy,由於他們常常一塊兒出現。用當前詞周圍的詞來定義當前詞。
維度過高了,並且很是稀疏,那怎麼在保留原的信息基礎上把維度降下來呢?
從座標中能夠看出i和like與enjoy的距離是差很少的。
神經網絡最怕的東西就是維度過高,維度過高的話和後面的神經元鏈接時計算量會很是大,因此我但願這些稀疏的向量可以嵌入到一個稠密的向量,將向量作一個壓縮,SVD彷佛能夠解決這樣一個問題,但SVD和神經網絡差別有點大,帶來的問題是,你會看到不少地方word2vec並非提早訓練好,像FM作一個embedding,其中有這麼一個環節 它們會把FM嵌入到deeplearning這樣一個大框架當中,嵌入的條件必定是它自己的模式或者方式是相似的,但SVD它不是這樣一套邏輯,因此它不合適。爲了解決這個問題提出了NNLM,是word2vec的前身。
NNLM(Neural Network Language model)是word2vec的前身,起初是爲了解決語言模型這個問題,當你的語言模型上升到bi-gram,有不少稀疏性的問題,統計也很差統計,作平滑效果也不是很好,因此用統計的方式很是好時間,得把所有的語料都過一遍,最後還要一個很大的存儲空間,由於須要把全部詞的出現機率全都存下來。
目標函數就是一個最大似然,參數t(窗口)是能夠滑動的,將窗口往前移。嚴格來講是個乘法的關係,但因爲工程的關係,把轉成求和的log形式。滑動窗口會遍歷整個語料庫去求和,因此他的計算量和語料庫大小成正比
輸入層的下一層叫projection layer(投影層),矩陣是C是你這10w個詞的詞向量,詞的列向量一個一個組合起來的這麼一個矩陣,假設如今你須要映射到300維的稠密向量,那麼矩陣C就是300*10W的矩陣,這個C的權重是隨機初始化的,由於我也不知道最終的權重是多少。
爲何叫投影層,由於one-hot編碼的向量只有一個位置是1,其它位置都是0,與矩陣C作運算,就至關於取出其中C矩陣的對應一列。
拿到了w1,w2,w3這3個詞各自的300位稠密向量後,它(投影層)會作一件事情,它把這3個詞向量作一個拼接,獲得一個900維的一個向量,假設投影層的下一個hidden層是500維,那麼900會和這500作一個全鏈接。
最後一層是一個softmax的線性分類器,最後一層的維度和你詞表的維度是一致的也是10W維,我最後要獲得的結果是詞表中10w個詞向量的機率中最大的那個。
word2vec中涉及到的兩個模型,CBOW模型(Continuous Bag-Of-Words Model)和Skip-gram模型(Continuous Skip-gram Model)。CBOW是已知當前詞的上下文,來預測當前詞,而Skip-gram則相反,是在已知當前詞的狀況下,預測其上下文。
上一個介紹的模型在projection layer作了一個拼接,在這裏他以爲這種拼接的維度過高,直接作了一個求和,求和以後直接去預測中間這個詞,因此速度很快。依據要預測的是這10w個詞當中的哪個詞。
我 喜歡 觀看 巴西 足球 世界盃,按以前的方式,我須要將轉成6維長度的向量,若是以爲6維長度的向量平鋪開來很麻煩,能夠利用huffman tree來處理,在樹中作決策只有往左走和往右走(0和1)。如何是上面的模型最後一層的權重會是300*10w這個多個θ(權重),由於你要保證作完乘法以後得1*10w的向量,這個計算量實在太大了。這裏他作了一件事情,他把這些詞都編碼成一個Huffman tree以後,把θ放到了樹上,在作決策的樹節點上都留了一個權重,每到一個節點都是計算一次往哪邊走,由於走了4詞,最後要使得這四個決策乘積最大,每一次決策都當作是LR模型。
針對足球這個詞,咱們能夠獲得以下的結果:
考慮上面巴西世界盃的例子,從根結點到足球這一葉子結點的過程當中,咱們經歷了四次分支,每次分支至關於作了一次二分類。既然是從二分類的角度來考慮問題,那麼對於每個非葉子結點,就須要爲其左右孩子結點指定一個類別,即哪一個是正類(標籤爲1),哪一個是負類(標籤爲0)。碰巧,除根結點外,樹中每一個結點都對應了一個取值爲0或1的Huffman編碼。所以在word2vec中,將編碼爲0的結點定義爲負類,編碼爲0的點定義爲正類。那問題是爲何就能夠選一部分負樣本,他作法是:
每一個詞出現的頻次不同,既然頻次不同,那採用的權重也不同,根據權重去決定採用多長的線段分給這個詞所處的線段,例如:我(300) 喜歡(200) 你(100),那麼在這10^8次方當中拿出3\5的區域給了"我"這個字,拿出2\5的區域給了"喜歡"這個字,有拿出1\5的區域給了"你"這個字。隨機產生一個1-10^8之間的隨機數,這個隨機數落在那斷裏面,再看這一段屬於誰的區域(我,喜歡,你),你會丟499次獲得499個負樣本,若是你擲到了正樣本 那就從新擲,用獲得的499個負樣本和1個正樣本作softmax分類。