深度学习的一些经验和体会

从2010年开始使用神经网络,那么多年来真的感觉神经网络发展很快。当年还在各种佩服Sigmoid和Tanh的巧妙,现在居然已经普遍使用 Relu 了。这几年最震撼我的成果有 Rectifier, Dropout, ResNet, GRU 它们分布从深度、规则化、图像和内存几个方面优化了神经网络。在Seq2seq方面,最震撼我的有 Attention Decoder, 让Sequence解码的时候可以 Look into particular input。


工具方面

我最早时用 theano搭配 lasagne ,后来改用 tensorflow了,这主要是因为原来theano的开发者去了google,tensorflow继承了 theano的优点,并在此基础上改进了很多缺点,特别是在与编程者交互方面,所以我改用tensorflow 是必然的过程。


算法方面

估计大家刚接触深度神经网络时,都会先接触 greedy layer-wise pretrain 吧,Autoencoder就是最出名的一种,但这个技术现在没有那么厉害了,现在通常直接训练不预训练。具体来讲如果在有标记训练集一定的情况下,用Autoencoder pre-train 和 不pretrain 其实是没有太大。比如说MNIST里,若用50k个训练数据做pretrain 然后fine-tune 其实和直接 fine-tune 的准确度是一样的!所以不要盲崇pretrain,当我们有大量无标记数据时,我们用大量数据pretrain,这才会让fine-tune时精度提高,这是因为pretrain时学习了很多特征,而这些特征是有标记数据中没有的!pretrain 还有另外一个作用是为了当层数很多时用来初始化参数,但现在已经有很多很好的初始化方法了,所以不是特别情况,pretrain没有意义。如果你觉得我的经验不对,你可以尝试 Denosing Autoencoder , 你会发现 Denosing Autoencoder 训练出来的特征,其实和Dropout 的特征是一样的,在输入层做 dropout,其实和Denoising Dutoencoder 的Denosing是一样的,都是为了生成很多被腐蚀的数据。我在帝国理工读博时写过一个深度学习库  TuneLayer (https://github.com/zsdonghao)  ,后来变成组里的主力库了,里面有 Denosing Autoencoder 和 Dropout 的例子代码,它会自动保存训练过程中学习到的特征图,你可以用它来验证我的经验。如果你用 Vanilla Autoencoder 来 pretrain,然后用 Dropout 来fine-tune,你会发现 Autoencoder 训练出来的特征会被打散,然后变成Denosing Autoencoder 的特征!RNN方面,现在硬件已经很强了,所以很少人会再用Vanilla RNN。而LSTM有很多种变种,但你只要知道它们的效果基本一样就行,只有在特定情况不同的LSTM才会有不同的效果。在LSTM里面,今年最出名的变种当然是 GRU 啦,但它出名不是因为它比其它LSTM准确哦,而是因为它把LSTM 的 forget, input gate 简化成只有一个 update gate 了!这样的好处是模型变小了,然后运算变小了,但准确度不变!


先写到这里,有空再继续写~~



你可能感兴趣的:(深度学习的一些经验和体会)