首页 文章

(双向)RNN用于简单文本分类

提问于
浏览
1

TL; DR:双向RNN是否对简单的文本分类有帮助并且是填充邪恶的?

在我最近的工作中,我为同一个任务创建了一个LSTM模型和一个BLSTM模型,即文本分类 . LSTM模型做得非常好,但我决定给BLSTM一个机会,看看它是否可能进一步提高准确性 . 最后,我发现BLSTM收敛得慢得多,令人惊讶的是,它过度拟合,即使我以50%的概率应用辍学 .

在实现中,我使用展开的RNN用于LSTM和BLSTM,期望更快的训练 . 为了满足要求,我手动将输入文本填充到固定长度 .

假设我们有一句话“我早上睡得很晚,错过了对Nebuchadnezzar的采访”,然后在转换为一系列预训练的单词嵌入指数时用0填充 . 所以我们得到类似[21,43,25,64,43,25,6,234,23,0,0,29,0,0,0,...,0]的东西 . 请注意,“th”(应该是“the”)是一个拼写错误,名称“Nebuchadnezzar”太罕见,因此它们都不在词汇表中,因此我们将其替换为0,这对应于特殊的全部 - 零字矢量 .

以下是我的反思:

  • 有些人喜欢改变生词进入一个特殊的词,如“<UNK>”喂胼到手套箱或Word2Vec模型前 . 这是否意味着我们必须首先构建词汇和改变一些低频词(按分钟计设置)为“<UNK>”培训过吗?是否比将未知单词更改为0或在训练RNN时删除它们更好?

  • 对于LSTM或BLSTM网络的尾随0,就我而言,使输出混乱 . 虽然没有来自外部的新信息,但是对于随后的每个时间步,单元状态仍然会更新,因此最终单元的输出将受到长尾0的严重影响 . 而且我相信,BLSTM会受到更大影响,因为它也会按照逆序处理文本,就像[0,0,0,...,0,321,231],特别是如果我们设置初始值忘记门到1.0,以便在开始时培养记忆力 . 我看到很多人都使用填充但是如果文本填充到很长的时间并且在BLSTM的情况下它不会导致灾难吗?

对这些问题有什么想法吗? :-o

2 回答

  • 1

    根据经验,为 UNKNOWNPADDING 进行不同的嵌入是有帮助的 . 如果你对文本分类不够熟悉,那么你就不会有太大的危害了 .

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

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

    干杯 .

  • 1

    我主要同意Fabrice上面的回答,但补充一些意见:

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

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

相关问题