2017-06-12 38 views
0

我有成對的電影女巫包含2783個功能。 的矢量定義爲:如果所述特徵是在電影它的1否則其爲0。 示例:沒有一個熱矢量輸入的負抽樣跳過克模型

movie 1 = [0,0,1,0,1,0,1 ...] & movie 2 = [1,0,1,1,1,0,1 ...] 

每對具有用於標籤1或0。

movie1,movie2=0 
movie1,movie4=1 
movie2,movie150=0 

輸入是類似到SGNS(Skip gram negative sampling)word2vec模型。 我的目標是找到程序之間的相似性並學習每部電影的嵌入。 我想創建一種'kens'的SGNS實現。然而,我的輸入不是一個熱門,我不能使用嵌入層。我試圖使用濃密圖層並將它們與點積合併。我不確定模型架構,我有錯誤。

from keras.layers import Dense,Input,LSTM,Reshape 
from keras.models import Model,Sequential 

    n_of_features = 2783 
    n_embed_dims = 20 

    # movie1 vectors 
    word= Sequential() 
    word.add(Dense(n_embed_dims, input_dim=(n_words,))) 

    # movie2 vectors 
    context = Sequential() 
    context.add(Dense(n_embed_dims, input_dim=n_words,)) 

    model = Sequential() 

    model.add(keras.layers.dot([word, context], axes=1)) 

    model.add(Dense(1, activation='sigmoid')) 

    model.compile(optimizer='rmsprop', 
        loss='mean_squared_error') 

如果有人有一個想法如何實現它。

回答

0

如果你沒有與Keras結合,你可以通過將每部電影變成一個合成的「文檔」來爲每個功能創建標記。然後,在純PV-DBOW模式下使用「Paragraph Vectors」實現來學習每個電影的矢量。 (在純PV-DBOW中,密集的doc-vectors被用於預測文檔中的每個單詞,而不考慮順序/單詞鄰接/等等。它有點像skip-gram,但是訓練對是不是'word to every nearby word',而是'doc-token to every doc in doc word'。)

在gensim中,初始化參數爲dm=0的Doc2Vec類使用純PV-DBOW模式。

+0

嗨@gojomo 感謝您的回答。我不希望模型學習在特徵之間但在項目向量之間跳過克對。 什麼是doc2vec輸入?這是兩個電影功能的序列,標籤是1還是0? – user3351370

+0

如果你的目標是要學習每個電影矢量,並且(如果一切正常)爲了反映這些矢量的相似性以反映電影的相似性,那麼我描述的設置 - 文檔(gensim中的'TaggedDocument'類)對於每部電影,每個包含每個功能標記的文檔(PV-DBOW模式)都可能工作。在這種情況下,類似skip-gram的對總是(movieN) - >(featureM),但仍傾向於根據共同特徵來排列各種movieN向量。 (在這種情況下,將特徵缺失作爲'not-featureM'標記進行編碼也是有用的,我不確定。)[cont'd] – gojomo

+0

如果你需要類似SGNS的東西,但只需要movieN) - >(movieM)對,我不知道如何處理您的0值對,因爲SGNS只將輸入正值(文中存在)對作爲輸入值。 (它綜合了隨機的負面例子 - 偶爾會與正面的例子相沖突,但最終噪音並沒有太大的傷害。)但是,你可以將你的正面對放入Word2Vec訓練中:將所有這些對變成短的假句,比如'['movie1 ','movie4']'等。在運行所有這些'句子'之後,'movieN'標記可以學習你尋找的那種載體。 – gojomo