TL; DR:双向RNN有助于简单的文本分类吗?填充有弊吗?
在最近的工作中,我为同一任务(即文本分类)创建了LSTM模型和BLSTM模型。 LSTM模型做得很好,但我还是决定试一下BLSTM,看看它是否可能进一步提高精度。最后,即使我以50%的概率应用了Dropout,我也发现BLSTM收敛慢得多,而且令人惊讶的是,它拟合过度。
在实现中,我对LSTM和BLSTM都使用了展开的RNN,期望可以更快地进行训练。为了满足要求,我手动将输入文本填充到固定长度。
假设我们有一句话“我睡得很晚,错过了对尼布甲尼撒的采访”,当转换为一系列预训练词嵌入索引时,该词的末尾将填充0。所以我们得到类似[21,43,25,64,43,25,6,234,23,0,0,29,0,0,0,...,0]的信息。请注意,“ th”(应为“ the”)是一个错字,而名称“ Nebuchadnezzar”太少了,因此词汇表中都没有这两个词,因此我们也将其替换为0,这表示特殊的全零词向量。
这是我的感想:
有些人喜欢变化的生词变成像一个特殊的词“”喂胼到手套箱或Word2Vec模型前。这是否意味着我们必须首先构建的词汇和改变一些低频词(按分钟计设置)为“”之前的训练?它比训练RNN时将未知单词更改为0或只删除它们更好吗?
就我而言,输入到LSTM或BLSTM网络中的尾随0会使输出混乱。尽管没有外界的新信息,但信元状态仍会在随后的每个时间步中更新,因此最终信元的输出将受到长尾随0的严重影响。我相信,BLSTM也会受到更大的影响,因为它也会以相反的顺序处理文本,例如[0,0,0,...,0,321,231],特别是如果我们设置了初始忘记在开始时进入1.0来增强记忆力。我看到很多人都使用填充,但是如果将文本填充得足够长(对于BLSTM而言),会不会造成灾难?
对这些问题有什么想法吗? :-o
最佳答案
我基本上同意Fabrice的上述回答,但要补充一些意见:
永远不要对UNK和PAD使用相同的令牌。大多数深度学习库都掩盖了PAD,因为它不提供任何信息。另一方面,UNK确实为您的模型提供了信息(这里有一个词,我们只是不知道它是什么,而且可能是一个特殊的词),因此您不应掩饰这一点。是的,这的确意味着您应该在单独的预处理步骤中浏览培训/测试数据,建立例如10,000个最常用单词的词汇表,然后将其他所有内容切换为UNK。
如第1节所述,大多数库只是掩盖(即忽略)填充字符,因此这不是问题。但是正如您所说,您不必填充句子。例如,您可以在训练时按长度将它们分组,或者一次将一个句子输入模型中。
关于machine-learning - (双向)RNN用于简单文本分类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35580662/