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

ttp71kqs  于 2023-10-19  发布在  其他
关注(0)|答案(2)|浏览(147)

我试图在文本序列(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.如果你认为这种方法行不通,你会建议另一种方法吗?

rlcwz9us

rlcwz9us1#

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

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

inb24sb22#

1.我认为你的模型有更多的问题,而不仅仅是使用什么函数的问题。在对损失和优化函数进行任何实验之前,首先需要修复模型本身。
1.当你使用堆栈版本的LSTM(如自动编码器)时,你需要将隐藏状态和单元状态从编码器传递到解码器,以便解码器拥有更多的上下文。
1.另外,如果您正在使用语言模型,那么使用单词模型比使用字母模型要好得多。试着预处理你的数据来创建一个单词包,然后像处理字母一样对它们进行热编码。
1.在此之后,我建议你像这样添加更多的编码器和解码器到网络中:

import tensorflow as tf

n_input_words = 100
n_features = 10000
latent_dim = 100
n_future = 10

encoder_inputs = tf.keras.layers.Input(shape=(n_input_words, n_features))
encoder_l1 = tf.keras.layers.LSTM(latent_dim, return_sequences = True, return_state=True)(encoder_inputs)
encoder_states1 = encoder_l1[1:]
encoder_l2 = tf.keras.layers.LSTM(latent_dim, return_state=True)(encoder_l1[0])
encoder_states2 = encoder_l2[1:]

decoder_inputs = tf.keras.layers.RepeatVector(n_future)(encoder_l2[0])
decoder_l1 = tf.keras.layers.LSTM(100, return_sequences=True)(decoder_inputs,initial_state = encoder_states1)
decoder_l2 = tf.keras.layers.LSTM(100, return_sequences=True)(decoder_l1,initial_state = encoder_states2)
decoder_outputs2 = tf.keras.layers.Dense(n_features, input_shape = decoder_l2.shape)(decoder_l2)
model_e2d2 = tf.keras.models.Model(encoder_inputs,decoder_outputs2)
model_e2d2.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])

model_e2d2.summary()

至于你的损失函数,我认为KL分歧或胡贝尔会表现得很好。

相关问题