序列上的LSTM自动编码器 - 什么是丢失函数?

时间:2017-03-15 17:26:53

标签: python keras lstm recurrent-neural-network autoencoder

我正在尝试在文本序列(网络文章的标题)上构建LSTM自动编码器,主要是通过复制https://blog.keras.io/building-autoencoders-in-keras.html中提到的基本示例。输入是80(最大标题长度)长度为40的单热矢量(数据集中的ascii字符数)。检查预测的输出与输入相同,因为它是自动编码器。我有大约60k序列用于测试模型,但最终,我想在320k的整个集合上运行它。

问题

但问题是,LSTM网络根本没有正确学习。例如,捷克语句“Realvyhrálslavnéderbys Barcelonou”被复制为'### uuu ... uuu'(点表示你的情况一直持续到最后)。

在上面的教程中,它没有提到要使用的损失函数,激活函数或优化器,因此我搜索并发现,使用LSTM RMSProp 优化器效果最佳。我试过RELU,Tanh,Softmax等作为激活函数,尽管它们都没有做得更好。我最犹豫的是损失功能。我认为二进制或分类交叉熵可以很好地工作,但这可能是我错的地方。平均误差也没有产生任何好的结果。

到目前为止我的模型

input_sentence = Input(shape=(max_title_length, number_of_chars), dtype='int32')
tofloat = Lambda(function=lambda x: tf.to_float(x))(input_sentence)
encoder = LSTM(latent_dim, activation='tanh')(tofloat)

decoder = RepeatVector(max_title_len)(encoder)
decoder = LSTM(number_of_chars, return_sequences=True, activation='tanh')(decoder)
autoencoder = Model(input=input_sentence, output=decoder)

autoencoder.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])

所以问题

  1. 你会使用什么损失函数?
  2. 二进制/分类交叉熵是否计算整个输出矩阵或单个时间步长(输出矩阵中的行)的损耗?我想实现后者。
  3. 如果您认为这种方法不起作用,您会建议另一种吗?

1 个答案:

答案 0 :(得分:0)

我认为你的案例更好的损失函数是“汉明损失”,它计算两组样本之间的平均汉明损失或汉明距离。 因此,您可以计算矩阵中所有行之间的距离。

sckit-learnnumpy的示例:

>>> hamming_loss(np.array([[0, 1], [1, 1]]), np.zeros((2, 2)))
0.75