向Keras的嵌入层添加偏见

时间:2019-02-10 14:10:03

标签: python keras embedding bias-neuron

我正在使用keras构建模型,以便使用带有负采样的skipgram学习单词嵌入。我的输入是一对单词:(context_word,target_word),当然,对于正数标签为 1 ,对于负数标签为 0 。 我需要做的是给模型增加偏差。偏差应仅是每个输入的目标词的偏差,而不是两个词的偏差。

直到现在我有了代码:

input_u = Input((1,))
input_v = Input((1,))

item_embedding = Embedding(input_dim = items_size, 
                           output_dim = embed_dim,                           
                           name = 'item_embedding')

bias_embedding = Embedding(input_dim = items_size, 
                           output_dim = 1, 
                           embeddings_initializer = 'zeros', 
                           name = 'bias_embedding')

u = item_embedding(input_u)
v = item_embedding(input_v)
b_v = bias_embedding(input_v)

dot_p_layer = merge.dot([u, v], axes = 1)
with_bias = merge.add([dot_p_layer, b_v])
flattenned = Flatten()(with_bias)

output_layer = Dense(1, 
                     activation = 'sigmoid', 
                     use_bias = False)(flattenned)
print (output_layer.shape)

model = Model(inputs=[input_u, input_v], outputs=output_layer)
model.compile(loss='binary_crossentropy', optimizer = 'adam', metrics = ['accuracy'])

但是,我似乎无法正常工作。该代码正在运行,但我比没有偏见的模型得到了更高的损失和更低的准确性。所以我想我做错了什么。另外,当我检查尺寸时,我仍然得到嵌入尺寸的尺寸,而不是 embedding dimension + 1

我考虑过使用另一个 Dense 层(甚至不确定是逻辑上还是正确的做法),以便在点积之后添加偏差,但我也无法使其工作。

我真的很想为模型增加偏差。

1 个答案:

答案 0 :(得分:2)

如果您想要dimension + 1,则在寻找concatenate,而不是add

我不知道dot之后的尺寸(点是奇怪的行为,大声笑),但是如果是3D (batch, embedding, embedding),则需要在连接之前展平。