我试图在文本序列(Web文章的标题)上构建一个LSTM自动编码器,主要是通过复制https://blog.keras.io/building-autoencoders-in-keras.html中提到的基本示例。输入是80个(最大标题长度)长度为40(数据集中的字符数)的独热向量。检查预测的输出与输入相同,因为它是自动编码器。我有大约60 k个序列用于测试模型,但最终,我想在320 k的整个集合上运行它。
问题
但问题是,LSTM网络根本没有正确学习。例如,捷克语的句子“真实的vyhrál slavné derby s dogonou”被复制为"#uuu. uuu“(点的意思是,u的持续到最后)。
在上面的教程中,它没有提到使用什么损失函数,激活函数或优化器,所以我搜索并发现,使用LSTM RMSProp 优化器效果最好。我试过了,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.你会使用什么样的损失函数?
1.二进制/分类交叉熵是计算整个输出矩阵的损失还是单个时间步(输出矩阵中的行)的损失?我想实现后者。
1.如果你认为这种方法行不通,你会建议另一种方法吗?
2条答案
按热度按时间rlcwz9us1#
我认为更好的损失函数是“汉明损失”,它计算两组样本之间的平均汉明损失或汉明距离。因此,您可以计算矩阵中所有行之间的距离。
以
sckit-learn
和numpy
为例:inb24sb22#
1.我认为你的模型有更多的问题,而不仅仅是使用什么函数的问题。在对损失和优化函数进行任何实验之前,首先需要修复模型本身。
1.当你使用堆栈版本的LSTM(如自动编码器)时,你需要将隐藏状态和单元状态从编码器传递到解码器,以便解码器拥有更多的上下文。
1.另外,如果您正在使用语言模型,那么使用单词模型比使用字母模型要好得多。试着预处理你的数据来创建一个单词包,然后像处理字母一样对它们进行热编码。
1.在此之后,我建议你像这样添加更多的编码器和解码器到网络中:
至于你的损失函数,我认为KL分歧或胡贝尔会表现得很好。