Python 向Keras中的嵌入层添加偏差

Python 向Keras中的嵌入层添加偏差,python,keras,embedding,bias-neuron,Python,Keras,Embedding,Bias Neuron,我正在使用keras构建一个模型,以便使用带有负采样的skipgram来学习单词嵌入。我的输入是一对单词:(上下文单词,目标单词)当然,标签1表示积极的一对,0表示消极的一对。 我需要做的是给模型添加偏差。偏差应该是每个输入的目标词的偏差,而不是两个词的偏差 到目前为止,我有代码: input_u = Input((1,)) input_v = Input((1,)) item_embedding = Embedding(input_dim = items_size,

我正在使用keras构建一个模型,以便使用带有负采样的skipgram来学习单词嵌入。我的输入是一对单词:(上下文单词,目标单词)当然,标签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'])
然而,我似乎无法让它工作。代码正在运行,但与没有偏差的模型相比,我的损失更大,精确度更低。所以我觉得我做错了什么。另外,当我检查大小时,我仍然得到嵌入维度的大小,而不是嵌入维度+1

我曾考虑过使用另一个密集层(甚至不确定它是否符合逻辑或正确),以便在点积之后添加偏差,但我也无法真正让它工作


我真的很想得到一些帮助,为模型添加偏差。

如果您想要
维度+1
,您需要的是
串联
,而不是
添加


我不知道
dot
后的尺寸(dot是一种奇怪的行为,lol),但如果是3D
(批处理、嵌入、嵌入)
,则需要在连接之前展平

您确定要“添加”偏差吗?添加不应该在尺寸上添加任何额外的元素。…@DanielMöller好吧,你的措辞是对的,这更像是我想考虑到偏差。我说“添加”,因为这是我在代码中尝试过的,但显然我遗漏了一些东西,这无论如何都不是正确的方法。@SzymonMaszke我没有完全使用word2vec(尽管正如您所看到的,它是基于它的),但我将其用于推荐系统(因此,项目嵌入),因此偏见实际上可能会有所不同。我理解偏见仍然是一种嵌入,因为对于嵌入层没有使用偏见选项。你所说的连接可能真的有用,我想尝试一下,不过我该如何使用它呢?我的意思是,就像我的嵌入一样,但是连接它而不是添加?如果你想的是实际的偏差,就像他们在神经网络中所说的那样,没有嵌入的偏差。嵌入不是操作。偏差被“添加”(求和运算)到先前运算的结果中。添加两个嵌入与使用单个嵌入完全相同。连接两个嵌入与拥有更大的嵌入完全相同。因此,没有理由希望向嵌入添加或连接任何内容。现在,如果你正在做一些“点后”(然后你有一个操作),它可能会有所不同。@ SzymonMaszke,因为有一个<代码>扁平化< /代码>和一个<代码>稠密(1)< /代码>在有问题的操作之后,中间发生的事情不会影响输入和输出形状。