我目前正在Keras中实现序列模型,并希望利用两个(或多个)预训练的单词嵌入。目前,我的方法是将两个嵌入矩阵平均后再传递给Keras。但是,我想进行加权平均。
当然,我可以将权重作为超参数的一种形式进行优化,但是我想知道一种作为模型一部分进行加权的方法,例如,通过softmax密集层进行加权。理想情况下,我将有两个选择,第一个适合合并整个矩阵的权重,第二个具有在单词级别合并向量的权重。我还没有弄清楚如何正确地做,很乐意提出建议。
答案 0 :(得分:1)
为求平均,您需要两个嵌入都具有相同的输出大小。
您只需将它们堆叠到最后一个维度中,然后将它们传递到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)
或者,如果您不介意拥有很多权重而不是仅仅拥有两个权重,并且如果大小不同,并且希望在权重方面获得更多智能,则可以执行一个非常简单的串联: / p>
weighted = Concatenate()([embedding1, embedding2])
weighted = Dense(similarToSize)(weighted)
第二种方法听起来可能不像是加权,但是如果您想一会儿,两个嵌入对于相同的位置可能没有相同的含义,并且对两个不同性质的值求平均值可能不会带来很多好处。 (但是,当然,神经网络是模糊的,只有测试才能证明这一说法)