为什么keras嵌入不学习(用于推荐系统)

why keras embedding not learning (for recommendation system)

我正在尝试使用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
....

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

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

对于低于 0.5 的所有预测,我们得到 class 0,否则为 1