1

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 替换它,这对应于一个特殊的完整 -零词向量。

以下是我的反思:

  1. 有些人喜欢在将语料库输入 GloVe 或 Word2Vec 模型之前,将未知单词转换为特殊单词,如“< unk >”。这是否意味着我们必须首先构建词汇并将一些低频单词(根据Min计数设置)更改为“”,然后才能在培训前?是不是比在训练 RNN 的时候把未知词变成 0 或者只是去掉它们更好?

  2. 就我而言,输入 LSTM 或 BLSTM 网络的尾随 0 会使输出混乱。尽管没有来自外部的新信息,但单元状态仍会在随后的每个时间步中更新,因此最终单元的输出将受到长尾随 0 的严重影响。并且我相信,BLSTM 会受到更大的影响,因为它还会以相反的顺序处理文本,例如 [0, 0, 0, ..., 0, 321, 231],特别是如果我们设置初始忘记门到 1.0 以在开始时培养记忆。我看到很多人使用填充,但是如果文本被填充到很长的长度并且在 BLSTM 的情况下会不会造成灾难?

对这些问题有任何想法吗?:-o

4

2 回答 2

2

我主要同意 Fabrice 上面的回答,但要添加一些评论:

  1. 永远不要将相同的令牌与 UNK 和 PAD 一起使用。大多数深度学习库都掩盖了 PAD,因为它不提供任何信息。另一方面,UNK 确实为您的模型提供了信息(这里有一个词,我们只是不知道它是什么,而且它可能是一个特殊的词),所以您不应该掩盖它。是的,这确实意味着在一个单独的预处理步骤中,您应该检查您的训练/测试数据,建立一个词汇表,例如前 10,000 个最常用的单词,并将其他所有内容都切换到 UNK。

  2. 如 1 中所述,大多数库只是掩盖(即忽略)填充字符,因此这不是问题。但正如你所说,你没有必要填充句子。例如,您可以在训练时按长度对它们进行分组,或者将句子一次一个地输入到您的模型中。

于 2017-07-12T14:18:58.170 回答
1

UNKNOWN根据经验,对and进行不同的嵌入PADDING是有帮助的。由于您正在进行文本分类,我想如果没有太多,删除它们不会太有害,但我对文本分类不够熟悉,无法肯定地说。

至于填充序列,您是否尝试过以不同方式填充序列?例如,为前向 LSTM 填充序列的开头,为后向 LSTM 填充序列的结尾。由于您使用零填充,因此激活不会那么强(如果有的话),并且您的 LSTM 现在将以您的序列而不是零结束,这可能会覆盖您的 LSTM 内存。

当然,这些只是我脑海中的建议(我没有足够的声誉发表评论),所以我没有答案。您必须自己尝试一下,看看它是否有帮助。我希望确实如此。

干杯。

于 2017-02-06T23:27:05.653 回答