TL;DR:双向 RNN 对简单的文本分类有用吗?填充是邪恶的吗?
在我最近的工作中,我为同一任务创建了一个 LSTM 模型和一个 BLSTM 模型,即文本分类。LSTM 模型做得很好,但我决定试一试 BLSTM,看看它是否可以进一步提高准确性。最后,我发现 BLSTM 的收敛速度要慢得多,而且令人惊讶的是,它过拟合了,尽管我以 50% 的概率应用了 dropout。
在实现中,我对 LSTM 和 BLSTM 都使用了展开的 RNN,期望更快的训练。为了满足要求,我手动将输入文本填充到固定长度。
假设我们有一个句子“我早上睡得很晚,错过了对 Nebuchadnezzar 的采访”,然后在转换为预训练词嵌入的索引数组时在其末尾填充 0。所以我们得到类似 [21, 43, 25, 64, 43, 25, 6, 234, 23, 0, 0, 29, 0, 0, 0, ..., 0]。请注意,“th”(应该是“the”)是一个错字,而且“Nebuchadnezzar”这个名字太少见了,所以它们都没有出现在词汇表中,所以我们也用 0 替换它,这对应于一个特殊的完整 -零词向量。
以下是我的反思:
有些人喜欢在将语料库输入 GloVe 或 Word2Vec 模型之前,将未知单词转换为特殊单词,如“< unk >”。这是否意味着我们必须首先构建词汇并将一些低频单词(根据Min计数设置)更改为“”,然后才能在培训前?是不是比在训练 RNN 的时候把未知词变成 0 或者只是去掉它们更好?
就我而言,输入 LSTM 或 BLSTM 网络的尾随 0 会使输出混乱。尽管没有来自外部的新信息,但单元状态仍会在随后的每个时间步中更新,因此最终单元的输出将受到长尾随 0 的严重影响。并且我相信,BLSTM 会受到更大的影响,因为它还会以相反的顺序处理文本,例如 [0, 0, 0, ..., 0, 321, 231],特别是如果我们设置初始忘记门到 1.0 以在开始时培养记忆。我看到很多人使用填充,但是如果文本被填充到很长的长度并且在 BLSTM 的情况下会不会造成灾难?
对这些问题有任何想法吗?:-o