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

问题描述 投票:0回答:2

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

问题

但问题是,LSTM 网络根本无法正确学习。例如,捷克语句子“Real vyhrál slavné derby s Barcelonou”被复制为“###uuu...uuu”(点的意思是,u 会继续到最后)。

在上面的教程中,没有提到要使用什么损失函数、激活函数或优化器,所以我搜索并发现,使用 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. 如果您认为这种方法行不通,您会建议采用其他方法吗?
python keras lstm recurrent-neural-network autoencoder
2个回答
0
投票

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

使用

sckit-learn
numpy
的示例:

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

0
投票
  1. 我认为您的模型还有更多问题,而不仅仅是使用哪些函数的问题。在对损失函数和优化函数进行任何实验之前,需要首先修复模型本身。

  2. 当您使用 LSTM 的堆叠版本(例如自动编码器)时,您需要将隐藏状态和单元状态从编码器传递到解码器,以便解码器拥有更多上下文。

  3. 此外,如果您正在使用语言模型,那么使用单词模型而不是字母模型会更好。尝试预处理您的数据以创建一袋单词,然后像对字母那样对它们进行热编码。

  4. 之后,我建议您向网络添加更多编码器和解码器,如下所示:

    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()
    
© www.soinside.com 2019 - 2024. All rights reserved.