我正在keras中实现自定义丢失功能 . 该模型是 autoencoder
. 第一层是嵌入层,它将大小为 (batch_size, sentence_length)
的输入嵌入到 (batch_size, sentence_length, embedding_dimension)
中 . 然后,模型将嵌入压缩为特定维度的向量,最后必须重建嵌入 (batch_size, sentence_lenght, embedding_dimension)
.
但是嵌入层是可训练的,并且损失必须使用嵌入层的权重(我必须总结我的词汇表的所有单词嵌入) .
例如,如果我想训练玩具例子:"the cat" . sentence_length is 2
并假设 embedding_dimension is 10
和 vocabulary size is 50
,因此嵌入矩阵的形状为 (50,10)
. 嵌入层的输出 X
的形状为 (1,2,10)
. 然后它传入模型,输出 X_hat
,形状 (1,2,10)
. 必须训练模型以最大化表示'the'的向量 X_hat[0]
与嵌入层中表示'the'的向量 X[0]
最相似的概率,对于'cat'也是如此 . 但是我必须计算 X
和 X_hat
之间的余弦相似度,通过 X_hat
的余弦相似度之和以及嵌入矩阵中的每个嵌入(50,因为词汇量大小为50)归一化,这是列的嵌入层的权重 .
但是,如何在培训过程的每次迭代中访问嵌入层中的权重?
谢谢 !
1 回答
它似乎有点疯狂,但它似乎工作:而不是创建我将在model.compile中传递的自定义丢失函数,网络计算我用Lambda调用的函数中的损失(来自arxiv.org/pdf/1708.04729.pdf的公式1):
并且网络有两个输出:
X_hat
和loss
,但我重量X_hat
有0重量和损失以具有所有重量:当我训练模型时:
这样,模型被训练为朝向0,当我想使用训练模型的预测时,我使用第一个输出,即重建
X_hat