Keras:如何在损失函数中使用层的权重?

Posted

技术标签:

【中文标题】Keras:如何在损失函数中使用层的权重?【英文标题】:Keras : How to use weights of a layer in loss function? 【发布时间】:2018-04-30 09:48:05 【问题描述】:

我正在 keras 中实现自定义损失函数。模型是autoencoder。第一层是嵌入层,它将大小为(batch_size, sentence_length) 的输入嵌入到(batch_size, sentence_length, embedding_dimension) 中。然后模型将嵌入压缩成一定维度的向量,最后必须重构嵌入(batch_size, sentence_lenght, embedding_dimension)

但是嵌入层是可训练的,损失必须使用嵌入层的权重(我必须对我词汇表的所有词嵌入求和)。

例如,如果我想以玩具为例进行训练:“猫”。 sentence_length is 2 并假设 embedding_dimension is 10vocabulary size is 50,所以嵌入矩阵的形状为 (50,10)。 Embedding 层的输出X 的形状为(1,2,10)。然后它传入模型,输出X_hat,形状也是(1,2,10)。必须训练模型以最大化表示“the”的向量X_hat[0]与嵌入层中表示“the”的向量X[0]最相似的概率,“cat”也是如此。但是损失是这样的,我必须计算XX_hat之间的余弦相似度,通过X_hat的余弦相似度和嵌入矩阵中的每个嵌入(50,因为词汇量为50)的总和进行归一化,它们是嵌入层权重的列。

但是如何在训练过程的每次迭代中访问嵌入层中的权重?

谢谢!

【问题讨论】:

可以破解模型以使嵌入的输出进入损失函数,但采用层的权重似乎会增加更复杂的工作...... 您确定要这样做吗?归一化总和可能会爆炸。您是否有任何论文描述了您的方法?也许你在那里有一个 softmax 输出。 我尝试实现在 NIPS 2017 上接受的这篇论文。arxiv.org/pdf/1708.04729.pdf。可能我论文不是很懂,但是看Equation 1。分母对We中嵌入的词汇的所有单词取余弦相似度,也就是embedding matrix。 【参考方案1】:

这似乎有点疯狂,但似乎有效:网络没有创建我将在 model.compile 中传递的自定义损失函数,而是在我调用的函数中计算损失(来自arxiv.org/pdf/1708.04729.pdf 的公式 1)使用 Lambda:

loss = Lambda(lambda x: similarity(x[0], x[1], x[2]))([X_hat, X, embedding_matrix])    

并且网络有两个输出:X_hatloss,但我对 X_hat 的权重为 0,而 loss 为拥有所有权重:

model = Model(input_sequence, [X_hat, loss])
model.compile(loss=mean_squared_error,
              optimizer=optimizer,
              loss_weights=[0., 1.])

当我训练模型时:

for i in range(epochs):
    for j in range(num_data):
        input_embedding = model.layers[1].get_weights()[0][[data[j:j+1]]]
        y = [input_embedding, 0] #The embedding of the input
        model.fit(data[j:j+1], y, batch_size=1, ...)

这样,模型被训练为使 loss 趋向于 0,当我想使用经过训练的模型的预测时,我使用第一个输出,即重构 X_hat

【讨论】:

你认为这行得通吗?因为在计算图中,model.layer[1] 的权重在进行自动微分时不会出现。如果我错了,请纠正我。

以上是关于Keras:如何在损失函数中使用层的权重?的主要内容,如果未能解决你的问题,请参考以下文章

Keras 中具有样本权重的自定义损失函数

每个示例具有不同权重的 Keras 自定义损失函数

keras中的加权mse自定义损失函数 - 自定义权重

Keras中带有权重的自定义损失函数

Keras 自定义损失函数,用于传递 y_true 和 y_pred 以外的参数

Tensorflow+keras使用keras API保存模型权重plot画loss损失函数保存训练loss值