今天的文章介紹了嵌入這一概念,并且舉了一個(gè)簡單的例子來說明如何在 TensorFlow 中訓(xùn)練嵌入,此外還說明了如何使用 TensorBoard Embedding Projector 查看嵌入(真實(shí)示例http://projector.tensorflow.org/?hl=zh-CN)。前兩部分適合機(jī)器學(xué)習(xí)或 TensorFlow 新手,而 Embedding Projector 指南適合各個(gè)層次的用戶。
有關(guān)這些概念的另一個(gè)教程,請(qǐng)參閱《機(jī)器學(xué)習(xí)速成課程》的 “嵌入” 部分(https://developers.google.cn/machine-learning/crash-course/embeddings/video-lecture?hl=zh-CN)。
嵌入是從離散對(duì)象(例如字詞)到實(shí)數(shù)向量的映射。例如,英語字詞的 300 維嵌入可能包括:
blue: (0.01359, 0.00075997, 0.24608, ..., -0.2524, 1.0048, 0.06259)blues: (0.01396, 0.11887, -0.48963, ..., 0.033483, -0.10007, 0.1158)orange: (-0.24776, -0.12359, 0.20986, ..., 0.079717, 0.23865, -0.014213)oranges: (-0.35609, 0.21854, 0.080944, ..., -0.35413, 0.38511, -0.070976)
這些向量中的各個(gè)維度通常沒有固有含義,機(jī)器學(xué)習(xí)所利用的是向量的位置和相互之間的距離這些整體模式。
嵌入對(duì)于機(jī)器學(xué)習(xí)的輸入非常重要。分類器(更籠統(tǒng)地說是神經(jīng)網(wǎng)絡(luò))適用于實(shí)數(shù)向量。它們訓(xùn)練密集向量時(shí)效果最佳,其中所有值都有助于定義對(duì)象。不過,機(jī)器學(xué)習(xí)的很多重要輸入(例如文本的字詞)沒有自然的向量表示。嵌入函數(shù)是將此類離散輸入對(duì)象轉(zhuǎn)換為有用連續(xù)向量的標(biāo)準(zhǔn)和有效方法。
嵌入作為機(jī)器學(xué)習(xí)的輸出也很有價(jià)值。由于嵌入將對(duì)象映射到向量,因此應(yīng)用可以將向量空間中的相似性(例如歐幾里德距離或向量之間的角度)用作一項(xiàng)強(qiáng)大而靈活的標(biāo)準(zhǔn)來衡量對(duì)象相似性。一個(gè)常見用途是找到最近的鄰點(diǎn)。例如,下面是采用與上述相同的字詞嵌入后,每個(gè)字詞的三個(gè)最近鄰點(diǎn)和相應(yīng)角度:
blue: (red, 47.6°), (yellow, 51.9°), (purple, 52.4°)blues: (jazz, 53.3°), (folk, 59.1°), (bluegrass, 60.6°)orange: (yellow, 53.5°), (colored, 58.0°), (bright, 59.9°)oranges: (apples, 45.3°), (lemons, 48.3°), (mangoes, 50.4°)
這樣應(yīng)用就會(huì)知道,在某種程度上,蘋果和橙子(相距 45.3°)的相似度高于檸檬和橙子(相距 48.3°)。
TensorFlow 中的嵌入
要在 TensorFlow 中創(chuàng)建字詞嵌入,我們首先將文本拆分成字詞,然后為詞匯表中的每個(gè)字詞分配一個(gè)整數(shù)。我們假設(shè)已經(jīng)完成了這一步,并且word_ids是這些整數(shù)的向量。例如,可以將 “I have a cat.” 這個(gè)句子拆分成[“I”, “have”, “a”, “cat”, “.”],那么相應(yīng)word_ids張量的形狀將是[5],并且包含 5 個(gè)整數(shù)。為了將這些字詞 ID 映射到向量,我們需要?jiǎng)?chuàng)建嵌入變量并使用tf.nn.embedding_lookup函數(shù),如下所示:
word_embeddings = tf.get_variable(“word_embeddings”, [vocabulary_size, embedding_size])embedded_word_ids = tf.nn.embedding_lookup(word_embeddings, word_ids)
完成此操作后,示例中張量embedded_word_ids的形狀將是[5, embedding_size],并且包含全部 5 個(gè)字詞的嵌入(密集向量)。在訓(xùn)練結(jié)束時(shí),word_embeddings將包含詞匯表中所有字詞的嵌入。
嵌入可以通過很多網(wǎng)絡(luò)類型進(jìn)行訓(xùn)練,并具有各種損失函數(shù)和數(shù)據(jù)集。例如,對(duì)于大型句子語料庫,可以使用遞歸神經(jīng)網(wǎng)絡(luò)根據(jù)上一個(gè)字詞預(yù)測下一個(gè)字詞,還可以訓(xùn)練兩個(gè)網(wǎng)絡(luò)來進(jìn)行多語言翻譯。字詞的向量表示教程中介紹了這些方法。
直觀顯示嵌入
TensorBoard 包括Embedding Projector,這是一款可讓您以交互的方式直觀顯示嵌入的工具。此工具可以讀取模型中的嵌入,并以二維或三維方式渲染這些嵌入。
Embedding Projector 具有三個(gè)面板:
數(shù)據(jù)面板:位于左上方,您可以在其中選擇運(yùn)行、嵌入變量和數(shù)據(jù)列,以對(duì)點(diǎn)進(jìn)行著色和標(biāo)記
投影面板:位于左下方,您可以在其中選擇投影類型
檢查工具面板:位于右側(cè),您可以在其中搜索特定點(diǎn)并查看最近鄰點(diǎn)的列表
投影
Embedding Projector 提供三種方法來降低數(shù)據(jù)集的維度。
t-SNE:一種非線性不確定性算法(T 分布式隨機(jī)鄰點(diǎn)嵌入),它會(huì)嘗試保留數(shù)據(jù)中的局部鄰點(diǎn),通常以扭曲全局結(jié)構(gòu)為代價(jià)。您可以選擇是計(jì)算二維還是三維投影。
PCA:一種線性確定性算法(主成分分析),它嘗試用盡可能少的維度捕獲盡可能多的數(shù)據(jù)可變性。PCA 會(huì)突出數(shù)據(jù)中的大規(guī)模結(jié)構(gòu),但可能會(huì)扭曲本地鄰點(diǎn)。Embedding Projector 會(huì)計(jì)算前 10 個(gè)主成分,您可以從中選擇兩三個(gè)進(jìn)行查看。
自定義:線性投影到您使用數(shù)據(jù)中的標(biāo)簽指定的水平軸和垂直軸上。例如,您可以通過為 “左” 和 “右” 指定文本格式來定義水平軸。Embedding Projector 會(huì)查找標(biāo)簽與 “左” 格式相匹配的所有點(diǎn),并計(jì)算這些點(diǎn)的形心;“右” 格式與此類似。穿過這兩個(gè)形心的線定義了水平軸。同樣地,計(jì)算與 “上” 和 “下” 文本格式相匹配的點(diǎn)的形心可定義垂直軸。
要查看其他實(shí)用文章,請(qǐng)參閱如何有效使用 t-SNE和直觀介紹主成分分析。
探索
您可以使用自然的點(diǎn)擊并拖動(dòng)手勢(shì)來縮放、旋轉(zhuǎn)和平移,從而進(jìn)行直觀探索。將鼠標(biāo)懸停在某個(gè)點(diǎn)上即可看到該點(diǎn)的所有元數(shù)據(jù)。您還可以檢查最近的鄰點(diǎn)子集。點(diǎn)擊某個(gè)點(diǎn)以后,右窗格中會(huì)列出最近的領(lǐng)點(diǎn),以及到當(dāng)前點(diǎn)的距離。投影中還會(huì)突出顯示最近的鄰點(diǎn)。
有時(shí),將視圖限制為點(diǎn)的子集并僅投影這些點(diǎn)非常有用。要執(zhí)行此操作,您可以通過多種方式選擇點(diǎn):
點(diǎn)擊某個(gè)點(diǎn)之后,其最近的鄰點(diǎn)也會(huì)處于選中狀態(tài)
搜索之后,與查詢匹配的點(diǎn)會(huì)處于選中狀態(tài)
啟用選擇,點(diǎn)擊某個(gè)點(diǎn)并拖動(dòng)可定義選擇范圍
然后,點(diǎn)擊右側(cè)檢查工具窗格頂部的 “隔離 nnn 個(gè)點(diǎn)” 按鈕。下圖顯示已選擇 101 個(gè)點(diǎn),因此用戶可以點(diǎn)擊 “隔離 101 個(gè)點(diǎn)”:
在字詞嵌入數(shù)據(jù)集中選擇 “重要” 一詞的最近鄰點(diǎn)
高級(jí)技巧:使用自定義投影進(jìn)行過濾可能會(huì)非常有用。我們?cè)谙聢D中濾出了 “政治” 一詞的 100 個(gè)最近鄰點(diǎn),并將它們投影到 “最差” - “最優(yōu)” 向量上作為 x 軸。y 軸是隨機(jī)的。這樣一來,我們可以發(fā)現(xiàn) “想法”、“科學(xué)”、“視角”、“新聞” 這些字詞位于右側(cè),而 “危機(jī)”、“暴力” 和 “沖突” 這些字詞位于左側(cè)。
自定義投影控件。 “政治” 的鄰點(diǎn)到 “最優(yōu)” - “最差” 向量的自定義投影
要分享您的發(fā)現(xiàn),可以使用右下角的書簽面板并將當(dāng)前狀態(tài)(包括任何投影的計(jì)算坐標(biāo))保存為小文件。接著可以將 Projector 指向一個(gè)包含一個(gè)或多個(gè)這些文件的集合,從而生成下面的面板。然后,其他用戶就可以查看一系列書簽。
元數(shù)據(jù)
如果您使用嵌入,則可能需要向數(shù)據(jù)點(diǎn)附加標(biāo)簽/圖片。您可以通過生成一個(gè)元數(shù)據(jù)文件(其中包含每個(gè)點(diǎn)的標(biāo)簽),并在 Embedding Projector 的數(shù)據(jù)面板中點(diǎn)擊 “加載數(shù)據(jù)” 來完成此操作。
元數(shù)據(jù)可以是標(biāo)簽,也可以是圖片,它們存儲(chǔ)在單獨(dú)的文件中。如果是標(biāo)簽,則格式應(yīng)該是TSV 文件(制表符顯示為紅色),其中第一行包含列標(biāo)題(以粗體顯示),而后續(xù)行包含元數(shù)據(jù)值。例如:
Word FrequencyAirplane 345Car 241...
假設(shè)元數(shù)據(jù)文件中的行順序與嵌入變量中的向量順序相匹配,但標(biāo)題除外。那么,元數(shù)據(jù)文件中的第 (i+1) 行對(duì)應(yīng)于嵌入變量的第 i 行。如果 TSV 元數(shù)據(jù)文件僅有一列,那么不會(huì)有標(biāo)題行,并且假設(shè)每行都是嵌入的標(biāo)簽。我們之所以包含此例外情況,是因?yàn)樗c常用的“詞匯表文件”格式相匹配。
要將圖片用作元數(shù)據(jù),您必須生成一個(gè)sprite 圖片,其中包含小縮略圖,嵌入中的每個(gè)向量都有一個(gè)小縮略圖。sprite 應(yīng)該按照行在前的順序存儲(chǔ)縮略圖:將第一個(gè)數(shù)據(jù)點(diǎn)放置在左上方,最后一個(gè)數(shù)據(jù)點(diǎn)放在右下方,但是最后一行不必填充,如下所示。
點(diǎn)擊 此鏈接 可查看 Embedding Projector 中的一個(gè)有趣縮略圖示例(https://tensorflow.google.cn/images/embedding-mnist.mp4?hl=zh-CN)。
迷你版常見問題解答
“嵌入” 是一種操作還是一種事物?都是。人們一直說的是在向量空間中嵌入字詞(操作),以及生成字詞嵌入(事物)。兩者的共同點(diǎn)在于嵌入這一概念,即從離散對(duì)象到向量的映射。創(chuàng)建或應(yīng)用該映射是一種操作,但映射本身是一種事物。
嵌入是高維度還是低維度?視情況而定。例如,與可包含數(shù)百萬個(gè)字詞和短語的向量空間相比,一個(gè) 300 維的字詞和短語向量空間通常被視為低維度(且密集)空間。但從數(shù)學(xué)角度上來講,它是高維度空間,顯示的很多屬性與人類直覺了解的二維和三維空間大相徑庭。
嵌入與嵌入層是否相同?不同。嵌入層是神經(jīng)網(wǎng)絡(luò)的一部分,而嵌入則是一個(gè)更寬泛的概念。
-
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4777瀏覽量
100985 -
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8434瀏覽量
132865 -
tensorflow
+關(guān)注
關(guān)注
13文章
329瀏覽量
60576
原文標(biāo)題:如何在 TensorFlow 中訓(xùn)練嵌入
文章出處:【微信號(hào):tensorflowers,微信公眾號(hào):Tensorflowers】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論