keras中embedding層是如何將一個正整數(下標)轉化為具有固定大小的向量的?

word embedding首先應該是應用到NLP處理中的一個技術,但是看到有人將這種方法用在推薦系統中,這樣做的合理性在哪?


用在推薦系統中的合理性在於他們都是處理矩陣的一個手段。只是在NLP里是doc-word矩陣,推薦系統里是user-item矩陣。

keras里咋搞的不清楚。mxnet里知道,在src/operator/embeding-inl.h 里,通過lookup的方法做的。

tensorflow也是通過lookup的方法。只是tf是基於CPU實現的,mxnet是基於GPU實現的。

keras如果背後用的tf的引擎,那麼就和tf一樣。


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

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

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

3、word embedding其實是有了一個距離的定義,即出現在同一上下文的詞的詞向量距離應該小,這樣生成向量比較容易理解。autoencode、pca等做一組基變換,也是假設原始特徵值越接近越相似。但id值的embedding應該是沒有距離可以定義,沒有物理意義,只是一種特殊的全連接層。

4、用embedding_lookup做id類特徵embedding由google的deepwide提出,但隱藏了具體實現細節。阿里第七章 人工智慧,7.6 DNN在搜索場景中的應用(作者:仁重) 中提下了面對的困難,主要是參數數量過多(引入紫色編碼層)和要使用針對稀疏編碼特別優化過的全連接層( Sparse Inner Product Layer )等。

5、在分類模型中用這種id類特徵,主要是希望模型把這個商品記住。但id類特徵維度太高,同一個商品的數據量也不大,因此也常常用i2i演算法產出的item embedding來替代id特徵。


發現樓上幾位有些理解有偏差,我把我的理解說下,大家可以探討:

Embedding 層可以參考word2vec 或 glov 演算法原理,利用單層神經網路做詞的向量化,一般來說輸入為word 在字典中的位置(一般不用one-hot),輸出為向量空間上的值。

Embedding的主要作用是將詞的向量訓練也放入到模型中,形成一個end-to-end結構,而這樣 Embedding 層訓練出來的向量可以更好的適應相應任務。

不是作為降維使用,而是作為一種特徵表示使用。


Character-level Convolutional Networks for Text
Classification

Efficient Character-level Document Classification by
Combining Convolution and Recurrent Layers

Very Deep Convolutional Networks
for Natural Language Processing

這三篇都是基於char-level的卷積神經網路來解決文本分類問題的

第一篇是基於one-hot encoding,然後輸進去進行卷積

第二篇是同樣基於one-hot encoding,但是經過了embedding layer,文章說作用是通過embedding layer將輸入數據與W Matrix從而輸出一個fixed size和降低維度的"a sequence of dense, real-
valued vectors"

第三篇直接用的look up table把char sequence轉換成了a fixed-sized padded text作為model的輸入,也是體現了fixed size

所以我覺得embedding layer就是作為一個look up table的存在,將各類輸入經過轉換得到padded和fixed size的,low dimension的model的輸入.所以只要model用到了Matrix,經過encoding的輸入,都能放這個layer.具體這個能不能像word-level一樣pre-trained的話,我再思考一下.

有錯誤請指正...


嵌入層通過查表將整數(一般是單詞在詞典中的位置下標)轉換成一個固定長度的向量。

向量的取值是隨機初始化(embeddings_initializer="uniform")並可訓練的。也可以通過嵌入層的weights參數載入預訓練好的詞向量,並設置為不可訓練(trainable=False)。


說白了就是:問題中的一個整數應該是one hot coding中每個word對應一個id,而embedding矩陣里的每一行對一個word的向量,embedding矩陣里的行號就是id,所以從一個id可以變成一個向量。從數學緯度上看,就是從一個高維空間映射到一個低維連續空間~


降維呀,one hot之後維度過高,深度學習對這種高維稀疏特徵不感冒,embedding到低維連續空間可以提升結果


個人拙見。

嵌入層Embedding - Keras中文文檔

1,輸入不是onehot只是下標列表,輸出向量。看起來更像是升維了(本質上降維了)。

2,演算法裡面沒有用w2v等東西初始化,全是 randomly initialized。

3,embedding層的向量表達被BP訓練。應該是基於fasttext的實現。不確定,我看範例猜的。


請參考@王哲 同學的答案,題主是將Keras里的Embedding類和WordEmbedding概念混淆了。Keras里的Embedding僅僅是一個做Embedding的工具,用來將Word Id轉換為WordEmbedding的一種工具。如果沒有向Embedding傳遞weights矩陣,得到的就是隨機初始化的WordEmbedding,它不表達語義;當向Embedding傳遞weights矩陣,得到的就是語義化的WordEmbedding。至於如何獲得weights矩陣,就是其他答主提到的GloVe Word2Vec之類的演算法了。


對於詞典非常大,例如1億,vector維度為100,每一維用float,佔用的內存將非常大呀。


keras中的 Embedding層只是簡單地將輸入里的詞下標轉換成向量。向量值對應權重矩陣下標獲得。

模型中的Embedding層的權重可以接受訓練,但是單純這個層來說是沒有像word2vec這樣的功能的。

當然,可以將訓練好的詞向量表作為權重導入,這樣Embedding層相當於一個預處理層。文檔里有個例子:

在Keras模型中使用預訓練的詞向量 - Keras中文文檔


推薦閱讀:

Keras使用VGG16訓練圖片分類?
機器學習、深度學習入坑之路?
深度學習伺服器配置(4-5w預算)?
Keras,Theano,pytorch,caffe2 哪個更好一些,應該怎麼嘗試學習?

TAG:深度學習DeepLearning | wordembedding | Keras |