Embeding

一、“嵌入”(Embeding)

自然語言處理少不了這個過程,尤其是神經(jīng)網(wǎng)絡(luò)模型,需要進行嵌入,那么什么是嵌入?我們先看看詞典怎么解釋

Embed這個詞,英文的釋義為, fix (an object) firmly and deeply in a surrounding mass, 也就是“嵌入”之意。例如:One of the bullets passed through Andrea's chest before embedding itself in a wall.

另外,這個詞(的分詞形式)在數(shù)學(xué)上也是一個專有名詞,Embedding,它廣泛存在于包括代數(shù)、拓撲與幾何等諸多數(shù)學(xué)領(lǐng)域。它主要表征某個數(shù)學(xué)結(jié)構(gòu)中的一個實例被包含在另外一個實例中,例如一個group它同時又是一個subgroup。

二、詞嵌入(Word Embedding)

前面我們之所以要討論Embedding在數(shù)學(xué)上的意思,就是因為這名稱其實特別具有一種誤導(dǎo)性,尤其是在翻譯成中文的時候會令漢語思維下的我們更加難于把握住它的本質(zhì)。

Word Embedding并不是要把單詞像貼瓷磚那樣鑲嵌進什么地方。更重要的是,我們在把單詞嵌入進另外一個空間時,要做到單射和structure-preserving,或者說我們更專注的是映射關(guān)系,而最終得到每個單詞在另外一個空間中的表達也僅僅是之前設(shè)計好的映射關(guān)系的很自然的表達。

Word embedding 是NLP中一組語言模型(language modeling)和特征學(xué)習(xí)技術(shù)(feature learning techniques)的總稱,這些技術(shù)會把詞匯表中的單詞或者短語(words or phrases)映射成由實數(shù)構(gòu)成的向量上。
最簡單的一種Word Embedding方法,就是基于詞袋(BOW)的One-Hot表示。這種方法,把詞匯表中的詞排成一列,對于某個單詞 A,如果它出現(xiàn)在上述詞匯序列中的位置為 k,那么它的向量表示就是“第 k 位為1,其他位置都為0 ”的一個向量。

例如,有語料庫如下:

John likes to watch movies. Mary likes movies too.
John also likes to watch football games.

把上述語料中的詞匯表整理出來并排序(具體的排序原則可以有很多,例如可以根據(jù)字母表順序,也可以根據(jù)出現(xiàn)在語料庫中的先后順序)

假設(shè)我們的詞匯表排序結(jié)果如下:

{"John": 1, "likes": 2, "to": 3, "watch": 4, "movies": 5, "also":6, "football": 7, "games": 8, "Mary": 9, "too": 10}

那么則有如下word的向量表示:

John: [1, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
likes: [0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
……

此時,你也可以進一步地把文檔也表示成向量。方法就是直接將各詞的詞向量表示加和,于是則有原來的兩句話的向量表示如下:

[1, 2, 1, 1, 2, 0, 0, 0, 1, 1]
[1, 1, 1, 1, 0, 1, 1, 1, 0, 0]

One-hot方法很簡單,但是它的問題也很明顯:

  1. 它沒有考慮單詞之間相對位置的關(guān)系;
  2. 詞向量可能非常非常長!

針對第一個問題,你可能會想到n-gram方法,這確實是一個策略,但是它可能會導(dǎo)致計算量的急劇增長。因為n-gram已經(jīng)在之前的文章中解釋過了,下面我們來看另外一個方法:共現(xiàn)矩陣 (Cocurrence matrix)。
一個非常重要的思想是,我們認為某個詞的意思跟它臨近的單詞是緊密相關(guān)的。這是我們可以設(shè)定一個窗口(大小一般是5~10),如下窗口大小是2,那么在這個窗口內(nèi),與rests 共同出現(xiàn)的單詞就有l(wèi)ife、he、in、peace。然后我們就利用這種共現(xiàn)關(guān)系來生成詞向量。


共軛矩陣

例如,現(xiàn)在我們的語料庫包括下面三份文檔資料:

I like deep learning.

I like NLP.

I enjoy flying.

作為示例,我們設(shè)定的窗口大小為1,也就是只看某個單詞周圍緊鄰著的那個單詞。此時,將得到一個對稱矩陣——共現(xiàn)矩陣。因為在我們的語料庫中,I 和 like做為鄰居同時出現(xiàn)在窗口中的次數(shù)是2,所以下表中I 和like相交的位置其值就是2。這樣我們也實現(xiàn)了將word變成向量的設(shè)想,在共現(xiàn)矩陣每一行(或每一列)都是對應(yīng)單詞的一個向量表示。



雖然Cocurrence matrix一定程度上解決了單詞間相對位置也應(yīng)予以重視這個問題。但是它仍然面對維度災(zāi)難。也即是說一個word的向量表示長度太長了。這時,很自然地會想到SVD或者PCA等一些常用的降維方法。當然,這也會帶來其他的一些問題,例如,我們的詞匯表中有新詞加入,那么就很難為他分配一個新的向量。但這并非本文要討論的重點,我們不再贅述。

三、Word2Vec

我們已經(jīng)見識了兩種詞嵌入的方式。而現(xiàn)在最常用、最流行的方法,就是Word2Vec。這是Tomas Mikolov在谷歌工作時發(fā)明的一類方法,也是由谷歌開源的一個工具包的名稱。具體來說,Word2Vec中涉及到了兩種算法,一個是CBOW一個是Skip-Gram。這也是因為深度學(xué)習(xí)流行起來之后,基于神經(jīng)網(wǎng)絡(luò)來完成的Word Embedding方法。

Word2Vec之所以現(xiàn)在這么流行,不同于之前的一些Word Embedding方法,
它能夠自動實現(xiàn):

  1. 單詞語義相似性的度量;
  2. 詞匯的語義的類比。
    此處,語義的類比,反應(yīng)的是類似下面這種關(guān)系:
  • “國王” – “王后” ≈ “男” – “女”
  • “英國” – “倫敦” ≈ “法國” – “巴黎” ≈ “首都”

SKip-Gram

對于Skip-Gram模型來說,它是要Generates each word in context given centre word。如下圖所示:


Skip-Gram

所以總概率定義為:


Skip-Gram概率

其中下標denotes position in running text. 對于每個單詞而言,則有
SkipGram

CBOW

對于CBOW模型來說,Condition on context, and generate centre word。如下圖所示:


下面我們將在Python中實際使用一下Word2Vec,可以直接使用gensim [1],其實現(xiàn)了Word2Vec。語料庫來自NLTK中的Brown語料庫。實際中要獲得更高質(zhì)量的模型,往往意味著需要更大的語料庫,當然這也意味著更多的訓(xùn)練時間。
Word2Vec比較占用時間,一般來說使用文件緩存機制,加速運行

import gensim, logging, os
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
 
import nltk
corpus = nltk.corpus.brown.sents()
 
fname = 'brown_skipgram.model'
if os.path.exists(fname):
    # load the file if it has already been trained, to save repeating the slow training step below
    model = gensim.models.Word2Vec.load(fname)
else:
    # can take a few minutes, grab a cuppa
    model = gensim.models.Word2Vec(corpus, size=100, min_count=5, workers=2, iter=50) 
    model.save(fname)

現(xiàn)在已經(jīng)得到模型了,接下來我們來評估一下這個模型的質(zhì)量。我們要評估一下下面這幾個詞之間的相近(或伴隨)程度。

words = "woman women man girl boy green blue did".split()
for w1 in words:
    for w2 in words:
        print(w1, w2, model.similarity(w1, w2))

輸出

woman woman 1.0
woman women 0.3451595268
woman man 0.607956254336
woman girl 0.761190251497
woman boy 0.558522930154
woman green 0.24118403927
woman blue 0.178044251325
woman did 0.0751838683173
women woman 0.3451595268
women women 1.0
women man 0.126646555737
women girl 0.292825346454
women boy 0.298552943639
women green 0.104096393379
women blue 0.0930137564485
women did 0.152766770859

圖形化的結(jié)果顯示:

import numpy as np
import matplotlib.pyplot as plt

%matplotlib inline
M = np.zeros((len(words), len(words)))
for i, w1 in enumerate(words):
    for j, w2 in enumerate(words):
        M[i,j] = model.similarity(w1, w2)
plt.imshow(M, interpolation='nearest')
plt.colorbar()

ax = plt.gca()
ax.set_xticklabels([''] + words, rotation=45)
ax.set_yticklabels([''] + words)

你也可以從詞匯表中提取出跟某個單詞(例如woman)最相關(guān)的k個詞:

print(model.most_similar(positive=['woman'], topn=10))

轉(zhuǎn)載

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容