如何在整个词汇预测中使用 LSTM 自动编码器模型,同时将单词呈现为嵌入

how to have a LSTM Autoencoder model over the whole vocab prediction while presenting words as embedding

所以我一直在研究 LSTM Autoencoder model。我还创建了这个模型的各种版本。

1. 使用已经训练好的词嵌入创建模型: 在这种情况下,我使用已经训练好的 Glove 向量的权重作为特征(文本数据)的权重。 这是结构:

inputs = Input(shape=(SEQUENCE_LEN, EMBED_SIZE), name="input")
    encoded = Bidirectional(LSTM(LATENT_SIZE), merge_mode="sum", name="encoder_lstm")(inputs)
    encoded =Lambda(rev_entropy)(encoded)
    decoded = RepeatVector(SEQUENCE_LEN, name="repeater")(encoded)
    decoded = Bidirectional(LSTM(EMBED_SIZE, return_sequences=True), merge_mode="sum", name="decoder_lstm")(decoded)
    autoencoder = Model(inputs, decoded)
    autoencoder.compile(optimizer="sgd", loss='mse')
    autoencoder.summary()
    checkpoint = ModelCheckpoint(filepath='checkpoint/{epoch}.hdf5')
    history = autoencoder.fit_generator(train_gen, steps_per_epoch=num_train_steps, epochs=NUM_EPOCHS, validation_data=test_gen, validation_steps=num_test_steps, callbacks=[checkpoint])
  1. 在第二种情况下,我在模型本身中实现了词嵌入层:

这是结构:

inputs = Input(shape=(SEQUENCE_LEN, ), name="input")
embedding = Embedding(input_dim=VOCAB_SIZE, output_dim=EMBED_SIZE, input_length=SEQUENCE_LEN,trainable=False)(inputs)
encoded = Bidirectional(LSTM(LATENT_SIZE), merge_mode="sum", name="encoder_lstm")(embedding)
decoded = RepeatVector(SEQUENCE_LEN, name="repeater")(encoded)
decoded = LSTM(EMBED_SIZE, return_sequences=True)(decoded)
autoencoder = Model(inputs, decoded)
autoencoder.compile(optimizer="sgd", loss='categorical_crossentropy')
autoencoder.summary()   
checkpoint = ModelCheckpoint(filepath=os.path.join('Data/', "simple_ae_to_compare"))
history = autoencoder.fit_generator(train_gen, steps_per_epoch=num_train_steps, epochs=NUM_EPOCHS,  validation_steps=num_test_steps)
  1. 在第三种情况下,我没有使用任何嵌入技术,而是使用了 one hot encoding 作为特征。这是模型的结构:

    `inputs = Input(shape=(SEQUENCE_LEN, VOCAB_SIZE), name="input")
    encoded = Bidirectional(LSTM(LATENT_SIZE, kernel_initializer="glorot_normal",), merge_mode="sum", name="encoder_lstm")(inputs)
    encoded = Lambda(score_cooccurance,  name='Modified_layer')(encoded)
    decoded = RepeatVector(SEQUENCE_LEN, name="repeater")(encoded)
    decoded = LSTM(VOCAB_SIZE, return_sequences=True)(decoded)
    autoencoder = Model(inputs, decoded)
    sgd = optimizers.SGD(lr=0.1, decay=1e-6, momentum=0.9, nesterov=True)
    autoencoder.compile(optimizer=sgd, loss='categorical_crossentropy')
    autoencoder.summary()   
    checkpoint = ModelCheckpoint(filepath='checkpoint/50/{epoch}.hdf5')
    history = autoencoder.fit_generator(train_gen, steps_per_epoch=num_train_steps, epochs=NUM_EPOCHS, callbacks=[checkpoint])`
    

    如您所见,在第一个和第二个模型中 Embed_size 中的 decoding 是该层中的神经元数量。它导致编码器层的输出形状变为[Latent_size, Embed_size]

    第三个模型中,encoder的输出shape为[Latent_size, Vocab_size].

现在我的问题

是否可以通过嵌入的方式来改变模型的结构来将我的词表示到模型中,同时在解码器层中具有 vocab_size

我需要让编码层的 output_shape 成为 [Latent_size, Vocab_size],同时出于显而易见的原因,我不想将我的特征表示为 one_hot encoding

如果您能与我分享您的想法,我将不胜感激。 一个想法可能是添加更多层,考虑到我不希望在最后一层有任何成本 Embed_size

您的问题:

Is it doable to change the structure of the model in a way I have embedding for representing my words to the model, and at the same time having vocab_size in the decoder layer?

我喜欢使用 Tensorflow 转换器模型作为参考: https://github.com/tensorflow/models/tree/master/official/transformer

在语言翻译任务中,模型输入往往是标记索引,然后对其进行嵌入查找,结果形状为 (sequence_length, embedding_dims);编码器本身在这个形状上工作。 解码器输出也往往是 (sequence_length, embedding_dims) 的形状。例如上面的模型,然后通过在输出和嵌入向量之间进行点积,将解码器输出转换为 logits。这是他们使用的转换:https://github.com/tensorflow/models/blob/master/official/transformer/model/embedding_layer.py#L94

我会推荐一种类似于语言翻译模型的方法:

  • pre-stage:
    • input_shape=(sequence_length, 1) [ 即 token_index 在 [0.. vocab_size)
  • 编码器:
    • input_shape=(sequence_length, embedding_dims)
    • output_shape=(latent_dims)
  • 解码器:
    • input_shape=(latent_dims)
    • output_shape=(sequence_length, embedding_dims)

Pre-processing 将令牌索引转换为 embedding_dims。这可用于生成编码器输入和解码器目标。

Post 处理以将 embedding_dims 转换为 logits(在 vocab_index space 中)。

I need to have output_shape of encoder layer be [Latent_size, Vocab_size] and at the same time I don't want to represent my features as the one_hot encoding for the obvious reason.

听起来不对。通常,人们试图用 auto-encoder 实现的是为句子提供一个嵌入向量。因此编码器的输出通常为 [latent_dims]。解码器的输出需要翻译成 [sequence_length, vocab_index (1) ] 这通常是通过从嵌入 space 转换为 logits 然后将 argmax 转换为 token 来完成的指数.