前几天在 v2 发了个 DL 相关的帖子受到很多帮助。最近又遇到一个问题是,如果我想跑一个自行设计的网络结构,如果以 LSTM 输出结果接线性层那么前者应该输出单层,但如果想接到 cnn 上是否要要把输出结果转换成双层呢?
比如 batch_size 设置为 32 ,一个句子有 20 个词,一个词有 8 个维度表示,那么一个 LSTM 层的输出结构应该类似以下:
tensor([32, 20, 8]) -> (转换成[32, 8, 20]) -> nn.LSTM(20, 64) -> tensor([32, 8, 64])
但是因为分析句子,双向分析似乎是比较合理的,那么当把 nn.LSTM 设置为双向后,它的输出结果会变成[32,8,128],这时候如果再接入 1dCNN 的话,感觉 CNN 的窗口捕捉不太符合人类逻辑?
所以有必要转换成[32,8,2,64],或者转换成[32,16,64]这种的吗? LSTM 的输出结果一般认为还有序列特性吗?还是完全无法理解的高维信息?
1
rpman 2022-06-27 18:12:50 +08:00
恭喜你发现了 bidirectional LSTM
然后你还会发现 highway LSTM 然后你还会发现怎么改都不如 Attention 然后发现 Transformer |
2
Richard14 OP @rpman 没有啥发现不发现的吧,现在就是在按顺序学习,但是没有老师学得不好。1L 忘说了,位置编码对情感分析类任务应该是效果更好的,但是我觉得序列任务 lstm 肯定还是有用处不能不了解,所以这贴里不讨论位置编码相关的。。
|
3
rpman 2022-06-27 18:47:47 +08:00
@Richard14 正经回答吧
你这里 1dCNN 是接在 timestep 上,是否 concat 双向 embedding 对结果并没有影响 |
4
rpman 2022-06-27 18:53:28 +08:00 2
双向 RNN 说是双向,但它只能 look forward 或者 look backward 。
要更 general 就只能堆叠层数,但 RNN 在 timestep 上的 dependency 非常影响性能,LSTM 更是搓得不行。印象里当年就没超过 4 层的。 既然你要做分析句子,早日放弃 RNN 早日获得新生。 |