我目前正在Keras中实现序列模型,并希望利用两个(或多个)预训练的单词嵌入。目前,我的方法是将两个嵌入矩阵平均后再传递给Keras。但是,我想做加权平均。

当然,我可以将权重作为超参数的形式进行优化,但是我想知道一种作为模型一部分进行加权的方法,例如通过softmax密集层进行加权。理想情况下,我将有两个选择,第一个适合合并整个矩阵的权重,第二个具有单词级合并向量的权重。我还没有弄清楚如何正确地做,很乐意提出建议。

最佳答案

为了求平均,您需要两个嵌入都具有相同的输出大小。

您只需将它们堆叠在最后一个维度中,然后将它们传递到Dense层即可:

inputs = Input((length,))

embedding1 = getEmbeddingFor(inputs)
embedding2 = getEmbeddingFor2(inputs)

#stacks into shape (batch, length, embedding_size, 2)
stacked = Lambda(lambda x: K.stack([x[0],x[1]], axis=-1))([embedding1,embedding2])

#weights to (batch, length, embedding_size, 1)
weighted = Dense(1, use_bias=False)(stacked)

#removes the last dimension
weighted = Lambda(lambda x: K.squeeze(x, axis=-1))(weighted)




或者,如果您不介意拥有很多权重而不是仅仅拥有两个权重,并且如果大小不同,并且希望在权重方面获得更多智能,则可以执行一个非常简单的串联:

weighted = Concatenate()([embedding1, embedding2])
weighted = Dense(similarToSize)(weighted)


第二种方法听起来可能不像是加权,但是如果您想一会儿,两个嵌入对于相同的位置可能没有相同的含义,并且对两个不同性质的值求平均值可能不会带来很多好处。 (但是,当然,神经网络是模糊的,只有测试才能证明这一说法)

关于python - Keras:嵌入层的加权平均值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53971020/

10-12 17:47