【问题标题】:why keras embedding not learning (for recommendation system)为什么 keras 嵌入不学习(用于推荐系统)
【发布时间】:2020-05-11 05:38:09
【问题描述】:

我正在尝试使用 keras 嵌入来做一个协同过滤风格的推荐系统。是传统的用户项目得分(二进制:0,1)数据格式:

  user_id item_id score
   1       4       0
   1       2       0
   ...
   3000    32      1

我使用了以下模型,但训练曲线在不同时期没有变化。我想知道训练损失基本没有改变但不同时期的准确性是相同的可能是什么原因。

user_input=Input(shape=(1,),name='user_input',dtype='int64')
user_embedding=Embedding(n_users,n_latent_factors,name='user_embedding',\
                         embeddings_initializer='he_normal', 
                  embeddings_regularizer=l2(1e-6))(user_input)   
user_vec=Flatten(name='FlattenUsers')(user_embedding)
user_vec=Dropout(0.30)(user_vec)

item_input=Input(shape=(1,),name='item_input',dtype='int64')
item_embedding=Embedding(n_items,n_latent_factors,name='item_embedding', \
                         embeddings_initializer='he_normal',
                  embeddings_regularizer=l2(1e-6))(item_input)
item_vec=Flatten(name='FlattenItems')(item_embedding)
item_vec=Dropout(0.30)(item_vec)

sim=dot([user_vec,item_vec],name='Simalarity-Dot-Product',axes=1)
nn = Concatenate()([user_vec, item_vec])
nn =Dense(50,activation='relu')(nn)
nn =Dropout(0.4)(nn)
nn =Dense(1,activation='relu')(nn)
nn_model =keras.models.Model([user_input, item_input],nn)
nn_model.summary()

nn_model.compile(optimizer=Adam(lr=1e-3, decay = 0.9),loss='binary_crossentropy', metrics=['accuracy'])
history_v3 = nn_model.fit([train.user_id,train.item_id],train.score, batch_size= batch_size,
                          epochs =10, validation_data = ([valid.user_id,valid.item_id],valid.score),
                          verbose = 1)

Epoch 1/10
912357/912357 [==============================] - 39s 43us/step - loss: 3.4449 - accuracy: 0.4674 - val_loss: 2.6401 - val_accuracy: 0.4534
Epoch 2/10
912357/912357 [==============================] - 38s 43us/step - loss: 3.3249 - accuracy: 0.4674 - val_loss: 2.5783 - val_accuracy: 0.4534
....

【问题讨论】:

    标签: tensorflow keras python-embedding recommender-systems


    【解决方案1】:

    考虑到是二分类任务,建议你在最后一层使用sigmoid作为激活函数,而不是relu。 Sigmoid 产生输出向量,其中每个元素在区间 [0,1] 中并且不互斥,我们可以将其解释为概率。您可以通过这种方式检索真实类中的预测:

    (nn_model.predict([test.user_id,test.item_id]).ravel()>0.5)+0
    

    我们将所有低于 0.5 的预测归为 0 类,否则为 1

    【讨论】:

      猜你喜欢
      • 2020-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-13
      • 1970-01-01
      • 2012-02-07
      • 1970-01-01
      相关资源
      最近更新 更多