文章轉載自公衆号

機器學習初學者 , 作者 機器學習初學者
自2013年以來,word2vec一直是一種有效的詞嵌入的方法,本文把word2vec用圖解的方式進行,全篇沒有數學公式,非常通俗易懂,推薦初學者閱讀。
(原文作者:jalammar,翻譯:黃海廣)。
備注:這個是另一個版本的翻譯,網上也有其它版本的翻譯,都是獨立完成的。
原文連結:
https://jalammar.github.io/illustrated-word2vec/
這篇文章的代碼傳到了本站的github:
https://github.com/fengdu78/machine_learning_beginner/tree/master/word2vec
正文開始
我發現嵌入的概念是機器學習中最迷人的想法之一。如果您曾經使用Siri,Google智能助理,Alexa,谷歌翻譯,甚至智能手機鍵盤進行下一詞預測,那麼您很有可能從這個已經成為自然語言處理模型核心的想法中受益。在過去的幾十年中,使用嵌入技術進行神經模型已有相當大的發展(最近的發展包括BERT和GPT2 等尖端模型的語境化嵌入)。
自2013年以來,Word2vec一直是一種有效建立單詞嵌入的方法。除了詞嵌入字的方法之外,它的一些概念已經被證明可以在非語言任務中有效地建立推薦引擎和了解順序資料。比如Airbnb,阿裡巴巴,Spotify和Anghami這樣的公司都從NLP世界中創造出這一優秀的工具并将其用于生産中,進而為新型推薦引擎提供支援。
我們将讨論嵌入的概念,以及使用word2vec生成嵌入的機制。
讓我們從一個例子開始,了解使用向量來表示事物。
您是否知道五個數字(向量)的清單可以代表您的個性?
個性嵌入:你的個性怎麼樣?
使用0到100的範圍表示你的個性(其中0是最内向的,100是最外向的)。
五大人格特質測試,這些測試會問你一個問題清單,然後在很多方面給你打分,内向/外向就是其中之一。
圖:測試結果示例。它可以真正告訴你很多關于你自己的事情,并且在學術、個人和職業成功方面都具有預測能力。
假設我的測試得分為38/100。我們可以用這種方式繪制:
讓我們将範圍切換到從-1到1:
了解一個人,一個次元的資訊不夠,是以讓我們添加另一個次元 - 測試中另一個特征的得分。
你可能不知道每個次元代表什麼,但仍然可以從一個人的個性的向量表示中獲得了很多有用的資訊。
我們現在可以說這個向量部分代表了我的個性。當你想要将另外兩個人與我進行比較時,向量化表示的有用性就出現了。在下圖中,兩個人中哪一個更像我?
處理向量時,計算相似度得分的常用方法是餘弦相似度:
一号人物與我的餘弦相似度得分高,是以我們的性格比較相似。
然而,兩個方面還不足以捕獲有關不同人群的足夠資訊。幾十年的心理學研究已經研究了五個主要特征(以及大量的子特征)。是以我們在比較中使用所有五個次元:
我們沒法在二維上繪制出來五個次元,這是機器學習中的常見挑戰,我們經常需要在更高次元的空間中思考。但好處是餘弦相似度仍然有效。它适用于任意數量的次元:
嵌入的兩個中心思想:
- 我們可以将人(事物)表示為數字的向量。
- 我們可以很容易地計算出相似的向量彼此之間的關系。
詞嵌入
我們導入在維基百科上訓練的GloVe向量:
import gensimimport gensim.downloader as apimodel = api.load('glove-wiki-gigaword-50')
model["king"]#檢視“king”最相似的單詞
[('prince', 0.8236179351806641), ('queen', 0.7839042544364929), ('ii', 0.7746230363845825), ('emperor', 0.7736247181892395), ('son', 0.766719400882721), ('uncle', 0.7627150416374207), ('kingdom', 0.7542160749435425), ('throne', 0.7539913654327393), ('brother', 0.7492411136627197), ('ruler', 0.7434253096580505)]
這是一個包含50個數字的清單,我們無法說清楚裡面的值代表什麼。我們把所有這些數字放在一行,以便我們可以比較其他單詞向量。讓我們根據它們的值對單元格進行顔色編碼(如果它們接近2則為紅色,如果它們接近0則為白色,如果它們接近-2則為藍色)
import seaborn as snsimport matplotlib.pyplot as pltimport numpy as npplt.figure(figsize=(15, 1))sns.heatmap([model["king"]], xticklabels=False, yticklabels=False, cbar=False, vmin=-2, vmax=2, linewidths=0.7)plt.show()
我們将忽略數字并僅檢視顔色以訓示單元格的值,我們将“King”與其他詞語進行對比:
plt.figure(figsize=(15, 4))sns.heatmap([ model["king"], model["man"], model["woman"], model["king"] - model["man"] + model["woman"], model["queen"],], cbar=True, xticklabels=False, yticklabels=False, linewidths=1)plt.show()
看看“man”和“woman”是如何彼此更相似的,他們中的任何一個都是“king”?這告訴你一些事情。這些向量表示捕獲了這些單詞的資訊/含義/關聯。
這是另一個示例清單(通過垂直掃描列來查找具有相似顔色的列):
有幾點需要指出:
- 所有這些不同的單詞都有一個直的紅色列。它們在這個次元上是相似的(我們不知道每個次元代碼是什麼)
- 你可以看到“woman”和“girl”在很多地方是如何相似的。與“man”和“boy”一樣
- “boy”和“girl”也有彼此相似的地方,但與“woman”或“man”不同。這些是否可以編寫一個模糊的青年概念?可能。
- 除了最後一個字之外的所有字都代表着人。我添加了一個對象“water”來顯示類别之間的差異。例如,您可以看到藍色列一直向下并在嵌入“water”之前停止。
- 有一個明顯的地方,“king”和“queen”彼此相似,并與所有其他人不同。類比
我們可以添加和減去單詞嵌入并獲得有趣的結果,最有名的例子是公式:“king” - “man” + “woman”:
model.most_similar(positive=["king