AI研习图书馆,发现不一样的世界
炼丹笔记
深度学习炼丹笔记四
一、深度学习建模与调试流程
首先,我们需要查看训练集上的模型表现结果怎么样。当然,一些特殊的机器学习模型没必要这么做,比如决策树、KNN、Adaboost 之类的传统算法,理论上在训练集上一定能做到完全正确,因此没有必要进行检查的。
Deep Learning 里面过拟合并不是首要的问题,或者说想要把神经网络训练得好,至少先在训练集上结果非常好,再考虑那些改善过拟合的技术(BN,Dropout 之类的)。否则的话就要去检查三个 step 哪里有问题,如下图所示。
Deep Learning 中的方法一般是为了解决两个主要问题而提出,即:
- 训练集做得不好;
- 训练集做得好,测试集做得不好。
实际应用的时候首先要搞清楚自己面对的问题,选择对应的技巧。 二、激活函数 1. sigmoid
梯度消失:网络很深的时候,靠近输入的 hidden layers 的梯度对损失函数影响很小, 参数更新的就很慢;靠近输出的情况反之。前面几层的参数都还没怎么更新的时候就收敛了。
原因也比较简单,反向传播的时候每经过一层,都会乘上小于 1 的数(sigmoid 函数会把输入压到 0~1 之间),结果就越来越衰减。
可以早期用 RBM ,先训练好前面几层。
2. ReLU计算快;有些生物学的来源;相当于无穷多个不同偏置的sigmoid函数叠加;不存在梯度消失。
输出要么是0,要么是输入本身,相当于把原来的网络变成一个 thinner linear network。
这样网络还是非线性的吗? 是。只要输入的变化比较大,跨越函数分段,网络依旧具有非线性。 好像不可微?
确实。但做浮点运算也几乎不会正好要在原点处计算微分,所以直接忽略这个问题。
一些变种,网上有人亲测过确实会有提升,不过我目前还没有尝试。
3. maxout network
每个神经元的激活函数的具体形式,是可以学习来的(不一定非得像 ReLU 那样在原点分段):
哪些神经元要被 group 起来是事先决定的(比如随机2个或者3个一组之类的,几个一组也可以作为一个参数来学习)。
ReLU 就是特殊情况下的 maxout ;但 maxout 可以实现更多可能的激活函数(具体是什么样的函数,根本上是由参数 w 决定的)。 怎么训练?
给定一个输入,是能够知道每次取 max,留下的是哪一条路径。训练去掉不作用的神经元之后的“瘦长”的线性网络就行了。
怎么保证参数都能被更新?
训练的时候每次给不同的输入数据,去掉的神经元是不一样的。所以一直给不同的输入,差不多每个参数都会被更新到。
初闻不知曲
中意,再听已是曲中人~
祝你深度学习快乐~~