未知填充的初始嵌入?

数据挖掘 深度学习 nlp lstm 词嵌入
2021-09-21 05:03:32

上次我一直在将预训练的词嵌入传递给 LSTM 来解决文本分类问题。通常,填充和未知类型有额外<pad><unk>替代品。当然,它们没有预训练的向量。

我想出的解决方案是

  1. 用随机值填充它们
  2. 用零填充它们

哪种方法更好/错误?常见的做法是什么?

注意:如果重要,我会使用 pytorch+torchtext。

2个回答

以我的经验,行之有效的是:

  • 对于填充,填充零向量嵌入(作为图像数据填充中的像素强度)是唯一且最佳的解决方案。
  • 对于没有预训练嵌入的单词,你应该尝试训练它们:就像你做的那样,在初始化时用随机值填充它们,但将它们设置为可训练。

这将取决于您使用的框架和框架,例如使用带有 tf.nn.dynamic_rnn 的 tensorflow,如果您传递长度大小:

https://www.tensorflow.org/api_docs/python/tf/nn/dynamic_rnn

sequence_length:(可选)大小为 [batch_size] 的 int32/int64 向量。用于在超过批处理元素的序列长度时复制状态和清零输出。所以它更多的是为了正确性而不是性能。

因此它不会在这些序列上进行训练。

但是,如果您需要传递填充标记,则主要取决于您如何管理 LSTM 初始状态。如果您有一个零初始状态并希望以这种方式保持它,您将用零填充,同样如果您有一个随机初始状态,您将用随机数填充。

除非您通常对 sequence_length 进行 senunknownd,否则您将需要使用不同的标记来填充和未知单词。

以下是关于填充的一些话:(请注意,当它使用 tf.nn.dynamic_rnn 时,它会提供 sequence_length):

https://r2rt.com/recurrent-neural-networks-in-tensorflow-iii-variable-length-sequences.html

这是对管理 LSTM 初始状态的不同方法的分析(请注意,当它使用 tf.nn.dynamic_rnn 时,它不会提供 sequence_length):

https://r2rt.com/non-zero-initial-states-for-recurrent-neural-networks.html

最后,您需要训练未知令牌。可以改善嵌入的一件事是对未知标记进行分类,例如使用正则表达式(如果它们像动词、形容词、名词、数字等)。以下标题为“未知单词”的文章的结尾给出了一些想法。

https://stathwang.github.io/part-of-speech-tagging-with-trigram-hidden-markov-models-and-the-viterbi-algorithm.html