LSTM 内的 Tensorflow 序列到序列 LSTM(嵌套)

Tensorflow sequence-to-sequence LSTM within LSTM (nested)

我想构建一个带有特殊词嵌入的 LSTM,但我对它的工作原理有一些疑问。

您可能知道,一些 LSTM 对字符进行操作,因此它是字符输入,字符输出。我想做同样的事情,对单词进行抽象,以学习使用嵌套的 LSTM 在单词上进行稳健的嵌入,以抵抗轻微的字符级错误。

因此,一个微小的 LSTM 将在单词的每个字母上展开,然后这将创建单词的嵌入。然后,句子中的每个嵌入词将作为输入馈送到更高级别的 LSTM,后者将在每个时间步在词级别上运行,而不是在字符上运行。

问题: - 我再也找不到谈论那个的研究论文了。如果你知道我在说什么,我想为我想做的事情命名。 - 是否已经存在一些 TensorFlow 开源代码? - 否则,您对如何实施有想法吗?神经网络的输出可能更难处理,因为我们需要撤消词嵌入以对具有输出嵌套 LSTM 的字符进行训练。整个事情应该作为一个单元训练一次(工作流程:LSTM 字符输入,LSTM 单词,LSTM 字符输出)。

我猜 rnn_cell.MultiRNNCell 会将 LSTM 堆叠在一起,而不是嵌套它们。

否则,您会建议将嵌入(输入和输出)训练为主要 LSTM 之外的自动编码器吗?

我不知道你指的是哪篇论文。

但这里有一个关于如何在 TensorFlow 中实现类似的东西的想法:

您可以创建 2 个 LSTMCells

如果您想支持每个单词的可变字符数和每个序列的可变单词数,您可以复制和调整 dynamic_rnn 的代码(参见 rnn.py) 您可以创建一个嵌套的 while 循环,而不是单个 while 循环。对字符进行操作的内部调用第一个 LSTMCell 并在每个单词后重置状态。外层对嵌入词(内层循环的输出)进行操作并调用第二个 LSTMCell。

通常,您是否应该单独训练嵌入取决于您有多少可用数据。如果您没有大量数据训练,则单独嵌入(在可能不同的数据集上)可能有意义。如果你负担得起并且你的模型训练得很好,那么训练嵌入和你的整个网络会有好处,因为字符的含义可以是特定于任务的。

但我想知道这种方法与先进行拼写更正然后使用标准词嵌入相比如何。然后你可以使用一些 standard embedding tools 和一个带有 dynamic_rnn 的 LSTMCell。

您可能在谈论 this paper。他们似乎没有发布他们的代码..

我认为您不必 "undo the word embedding",因为您可以同时针对两个目标进行训练:

  • 对于每个单词,相对于该单词的真实字符,产生的字符损失一次。 CE 损失看起来很适合这个。
  • 解码器(由内部 LSTM)产生的 "word embeddings" 相对于编码器(由应用于字符的外部 LSTM)产生的词嵌入的一个损失。例如,我在考虑 MSE 损失。

(有道理吗?)

出于好奇,您是否设法实现了这个想法?我打算在 Pytorch 中尝试一下