见解1
有了Transformer框架后RNN完全可以废弃,这个观点荒谬至极。
举一个例子:
除了个别探索,所有seq2seq的decoder都是一种rnn结构,不管是基于cnn的还是transformer的。说实话,我甚至觉得将decoder部分直接换成lstm等结构效果会更好。
此外,大家都说transformer快而rnn慢,君不见transformer的效率是O(n^2)而rnn和cnn都是O(n),对于真正长的序列,transformer不管在速度上还是显存上都是瓶颈。
还有,大家觉得transformer的成功,是因为有bert这样的预训练模型可用,如果没有呢?随便给你一个(时间)序列数据集,你真有信心认为基于attention的模型比随便来两层lstm要好?
见解2
我们首先区分一个概念:广义Transformer和狭义Transformer,狭义Transformer指Attention is all you need那个结构,包含一个encoder一个decoder;广义Transformer指self-attention机制的各种应用。下面是我个人一些理解,感觉可能有不对或者不完整的
- 狭义Transformer在大数据的情况下超过RNN一点问题没有,而且是显著的超,目前在很多大数据任务都验证了,比如WMT数据集的机器翻译,BERT,以及最近的TTS(语音合成)。
- 狭义的Transformer在跑中等数据集(一百万)或者小数据(几万或者几千)和RNN谁好谁坏不一定,可能靠调参,不是那种直接默认参数配置就会比RNN好,我简单的跑过中等数据集的对话(Twitter)和摘要(CNN DailyMail),感觉没好多少。小数据反而更容易过拟合,按照一些paper报的结果反而RNN好
- 广义的Transformer又是另一个故事了,我个人理解self attention机制几乎在所有任务上好好调都有用,比如分类,阅读理解(QANet),小规模s2s(Universal Transformer)。比如QAnet和Universal Transformer大家如果有兴趣可以看一看,通过自己的Recurrent机制,能给性能带来很大的增益。Multi head attention和简单的Self attention都是很有用的结构上的trick
- 我忘了是ACL的哪篇文章了,做过一个实验。RNN对于50个词之前的词顺序就不敏感了,而对于100个词之前的就完全忘了,所以RNN在长序列上肯定是有问题的。不过Transformer的位置信息只靠Position Embedding,我个人觉得可能也有提升空间