TL; DR:双向RNN是否有助于简单的文本分类,并且是填充邪恶的?
在我最近的工作中,我为同一个任务创建了一个LSTM模型和一个BLSTM模型,即文本分类。 LSTM模型做得非常好,但我决定给BLSTM一个机会,看它是否可能进一步提高准确性。最后,我发现BLSTM的收敛速度要慢得多,而且令人惊讶的是,它过度拟合,即使我以50%的概率应用了辍学。
在实施中,我对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,这对应于特殊的全部 - 零字矢量。
以下是我的反思:
有些人更喜欢将未知单词更改为特殊单词,例如“< unk>”在将语料库输入GloVe或Word2Vec模型之前。这是否意味着我们必须首先构建词汇表并将一些低频词(根据最小计数设置)更改为“< unk>”训练前?是否比将未知单词更改为0或在训练RNN时删除它们更好?
就我而言,进入LSTM或BLSTM网络的尾随0会使输出混乱。虽然没有来自外部的新信息,但是对于随后的每个时间步,单元状态仍然会更新,因此最终单元的输出将受到长尾0的严重影响。而且我相信,BLSTM会受到更大影响,因为它也会按照逆序处理文本,就像[0,0,0,...,0,321,231],特别是如果我们设置初始值忘记门到1.0,以便在开始时培养记忆力。我看到很多人都使用填充但如果文本填充到很长的时间并且在BLSTM的情况下它不会导致灾难吗?
关于这些问题的任何想法? :-o
答案 0 :(得分:1)
根据经验,对UNKNOWN
和PADDING
进行不同的嵌入会很有帮助。由于你正在进行文本分类,我想如果没有太多但是删除它们不会太有害但我对文本分类不够熟悉,无法确定地说。
至于填充序列,您是否尝试过以不同的方式填充序列?例如,为前向LSTM填充序列的开头,为后向LSTM填充序列的结尾。由于你用零填充,激活不会那么强(如果有的话),你的LSTM现在将以你的序列而不是零来结束,这可能会覆盖你的LSTM内存。
当然,这些只是我头脑中的建议(我没有足够的声誉来评论)所以我没有答案。你必须自己尝试一下,看看它是否有帮助。我希望如此。
干杯。
答案 1 :(得分:1)
我主要同意Fabrice上面的答案,但是要添加一些评论:
您永远不应该使用与UNK和PAD相同的令牌。大多数深度学习库都掩盖了PAD,因为它不提供任何信息。另一方面,UNK确实为你的模型提供了信息(这里有一个词,我们只是不知道它是什么,它可能是一个特殊的词),所以你不应该掩盖它。是的,这确实意味着在一个单独的预处理步骤中,您应该查看您的训练/测试数据,建立一个词汇,比如最常见的10,000个单词,并将其他所有单词切换到UNK。
如1中所述,大多数库只是掩盖(即忽略)填充字符,因此这不是问题。但正如你所说,没有必要填写句子。例如,您可以在训练时按长度对它们进行分组,或者将句子一次一个地输入到模型中。