【问题标题】:Adding bias to embedding layer in Keras向 Keras 中的嵌入层添加偏差
【发布时间】:2019-02-10 14:10:03
【问题描述】:

我正在使用 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 层(甚至不确定这样做是否合乎逻辑或正确)以便在点积之后添加偏差,但我也无法真正让它工作。

我真的很想在模型中添加偏见。

【问题讨论】:

  • 您确定要“添加”偏见吗?添加不应该向维度大小添加任何额外的元素......
  • @DanielMöller 好吧,你的措辞是对的,更像是我想考虑偏见。我说“添加”,因为这是我在代码中尝试过的,但显然我遗漏了一些东西,而且无论如何这不是正确的做法。
  • @SzymonMaszke 我所做的并不完全是 word2vec(尽管它是基于它的,如您所见),但我将它用于推荐系统(因此,item 嵌入),所以偏见实际上可能会有所作为。我知道偏差仍然是嵌入,因为嵌入层没有 use bias 选项。您所说的关于连接的内容实际上可能有效,我想尝试一下,但我该如何使用它?我的意思是就像我拥有的​​嵌入,但连接它而不是 add ?
  • 如果您正在考虑他们在神经网络中所说的实际偏差,那么嵌入就不存在偏差。嵌入不是操作。偏差被“添加”(求和运算)到先前运算的结果中。添加两个嵌入与具有单个嵌入完全相同。连接两个嵌入与拥有更大的嵌入完全相同。因此,没有理由要向嵌入添加或连接任何内容。现在,如果你在“点之后”做一些事情(那么你就有了一个手术),它可能会有所作为。
  • @SzymonMaszke,由于有问题的操作后有FlattenDense(1),所以中间发生的事情不会影响输入和输出形状。

标签: python keras embedding bias-neuron


【解决方案1】:

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

我不知道dot 之后的维度(点是奇怪的行为,哈哈),但如果它是 3D (batch, embedding, embedding),则需要在连接之前展平。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    相关资源
    最近更新 更多