上次我一直在将预训练的词嵌入传递给 LSTM 来解决文本分类问题。通常,填充和未知类型有额外<pad>
的<unk>
替代品。当然,它们没有预训练的向量。
我想出的解决方案是
- 用随机值填充它们
- 用零填充它们
哪种方法更好/错误?常见的做法是什么?
注意:如果重要,我会使用 pytorch+torchtext。
上次我一直在将预训练的词嵌入传递给 LSTM 来解决文本分类问题。通常,填充和未知类型有额外<pad>
的<unk>
替代品。当然,它们没有预训练的向量。
我想出的解决方案是
哪种方法更好/错误?常见的做法是什么?
注意:如果重要,我会使用 pytorch+torchtext。
以我的经验,行之有效的是:
这将取决于您使用的框架和框架,例如使用带有 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
最后,您需要训练未知令牌。可以改善嵌入的一件事是对未知标记进行分类,例如使用正则表达式(如果它们像动词、形容词、名词、数字等)。以下标题为“未知单词”的文章的结尾给出了一些想法。