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 10
和 vocabulary size is 50
,所以嵌入矩阵的形状为 (50,10)
。 Embedding 层的输出X
的形状为(1,2,10)
。然后它传入模型,输出X_hat
,形状也是(1,2,10)
。必须训练模型以最大化表示“the”的向量X_hat[0]
与嵌入层中表示“the”的向量X[0]
最相似的概率,“cat”也是如此。但是损失是这样的,我必须计算X
和X_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_hat
和 loss
,但我对 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:如何在损失函数中使用层的权重?的主要内容,如果未能解决你的问题,请参考以下文章