深度學習:詞嵌入Embedding

詞嵌入

詞嵌入其實就是將數據的原始表示表示成模型可處理的或者是更dense的低維表示(lz)。

One-hot Embedding

假設一共有m個物體,每個物體有自己唯一的id,那麼從物體的集合到R^{^{m}}有一個trivial的嵌入,就是把它映射到R^{^{m}}中的標準基,這種嵌入叫做One-hot embedding/encoding.

一般使用的低維embedding

應用中一般將物體嵌入到一個低維空間R^{^{n}}(n<<m),應用中一般將物體嵌入到一個低維空間R^{^{m}}R^{^{n}}的線性映射就好了。每一個n * m的矩陣M都定義了R^{^{m}}R^{^{n}}的一個線性映射:x \mapsto Mx。當x是一個標準基向量的時候,Mx對應矩陣M中的一列,這就是對應id的向量表示。

這個概念用神經網絡圖來表示如下:

從id(索引)找到對應的One-hot encoding,然後紅色的weight就直接對應了輸出節點的值(注意這裏沒有activation function),也就是對應的embedding向量。

1 M隨機初始化並且是可訓練的,查找x對應的embedding表示其實 等價於 找x在下面這個網絡中的權重,而這些權重是可訓練的,且對應於矩陣M。

2  關於嵌入維度數量(New Embedding維度)的一般經驗法則:

embedding_dimensions =  number_of_categories**0.25

也就是說,嵌入矢量維數應該是類別數量的 4 次方根。如詞彙量爲 81,建議維數爲 3。
低維向量嵌入在tensorflow中的實現:tf.nn.embedding_lookup()

embedding_map = tf.get_variable(  # 默認參數trainable = True,可訓練
        name="embedding_map",
        shape=[self.config.vocab_size, self.config.embedding_size],
        initializer=self.initializer)
seq_embeddings = tf.nn.embedding_lookup(embedding_map, self.input_seqs)

和下面類似:

matrix = np.random.random([1024, 64])  # 64-dimensional embeddings
ids = np.array([0, 5, 17, 33])
print matrix[ids]  # prints a matrix of shape [4, 64]

從id類特徵(category類)使用embedding_lookup的角度來講:

1.onehot編碼神經網絡處理不來。embedding_lookup雖然是隨機化地映射成向量,看起來信息量相同,但其實卻更加超平面可分。

2.embedding_lookup不是簡單的查表,id對應的向量是可以訓練的(帶有label信息),訓練參數個數應該是 category num*embedding size,也就是說lookup是一種全連接層。詳見 brain of mat kelcey

3.word embedding其實是有了一個距離的定義,即出現在同一上下文的詞的詞向量距離應該小,這樣生成向量比較容易理解。autoencode、pca等做一組基變換,也是假設原始特徵值越接近越相似。但id值的embedding應該是沒有距離可以定義,沒有物理意義,只是一種特殊的全連接層。
4.用embedding_lookup做id類特徵embedding由google的deep&wide提出。阿里 第七章 人工智能,7.6 DNN在搜索場景中的應用(作者:仁重) 中提下了面對的困難,主要是參數數量過多(引入紫色編碼層)和要使用針對稀疏編碼特別優化過的全連接層( Sparse Inner Product Layer )等。
5.在分類模型中用這種id類特徵,主要是希望模型把這個商品記住。但id類特徵維度太高,同一個商品的數據量也不大,因此也常常用i2i算法產出的item embedding來替代id特徵。

詞嵌入有其它很多方法如word2vec,bert等,embedding lookup只是其中一種。我們可以只使用簡單的embedding lookup讓模型自己去訓練;也可以將embedding lookup中的矩陣先通過word2vec訓練好進行初始化,再通過embedding lookup訓練;或者只使用word2vec進行初始化後,embedding lookup設置成不訓練。
 

Word2vec

其他的word Representation

句子embedding

1 詞向量直接求平均或者最大值:對句子中所有單詞直接求平均, 每個單詞的權重相同, 得到sentence embedding。

2 使用每個詞的TF-IDF值爲權重, 加權平均, 得到sentence embedding。

sif sentence embedding使用預訓練好的詞向量, 使用加權平均的方法, 對句子中所有詞對應的詞向量進行計算, 得到整個句子的embedding向量:模型的輸入是一個已有的word embedding,然後通過加權求平均的方法求得sentence的embedding,最後使用主成分分析去掉一些special direction,即在完成詞加權平均之後,移除所有行爲向量的公共主成分:v_s -= u*u^t*v_s。

        其中v_s表示加權平均之後的結果,u表示所有句子向量進行特徵分解之後,最大特徵值對應的特徵向量,相當於所有句子向量的最大主成分,這樣就把所有行爲鏈路中彼此相關的一部分去除,只保留反應序列特性的成分。

詞向量維度的選擇

詞向量集合的距離度量:PIP loss,基於此可以選擇最優詞向量維度

文章分析了LSA, Word2vec, Glove對於不同任務的最優維度

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章