Backpropagation
在神经网络中,却是拥有着大量的可能多达上百万个的参数,是一个百万维的向量,传统的求微分方法行不通,这样就需要应用Backpropagation去有效的计算出微分
Chain Rule
Tips for Training DNN
deep learning 的方法:三步法大纲,define-goodness-pick
1、一般的机器学习方法(如KNN,决策树等)不会在train好的模型上检查training data的结果,因为NN在training data上都没有办法获得很好的正确率,所以要先回头看一下要对模型做什么修改,才能使得在training set上取得比较好的正确率。
2、在training set获得好的结果,但在testing set上获得不好的结果,这个才是overfitting,所以并不是说在training set获得好的结果就是overfitting。这个时候要回去做一些工作解决overfitting这个问题,解决overfitting的同时会使得结果在training set上的结果性能变差,那么此时这个时候要回到上面1中,就是training data上没有办法获得很好的正确率,应该回头去修改模型。
————————————————
版权声明:本文为CSDN博主「CatcousCherishes」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44790306/article/details/117477996
在上图中,56层的模型对比20层的模型,无论是在training set还是testing set上表现都要差,这个事情并不是Overfitting的原因,而是没有训练好
dropout ,这个方法如果training set表现很好,testing set上不行,用dropout可以提高准确率。但如果training set表现不行,testing set上也不行,用dropout 就会越来越差。
修正training data上效果不好的方法:new activation function和adaptive learning rate
(在training data上训练结果不好)第一种解决方案是:new activation function
当region<0微分就是0,>0微分就是1。反正input不可能正好是0,所以就忽略不可导的那个点。
变种之后,防止小于零的输入input求导后为0(不然就没有办法更新参数)。右边的进一步把0.01参数变成一个超参数(可以从gradient descent中学出来的)。
当不同的input输入,得到的z 是不一样的,group中的最大值是不一样的,我们的training set有很多笔data,每次不同的data输入,网络结构都不一样,所以每个element都会被training到。
(在training data上训练结果不好)第二种解决方案是: adaptive learning rate
需要一个动态变化的调整learning rate。就要用到用RMSProp
原来的adagrade,是固定的,这里添加了α的σ,和(1-α)的gradient,即倾向于新的gradient,还是旧的gradient。如下图:
解决上面问题的方法就是动量梯度下降法。
review vanilla gradient,
往梯度的反方向走,选择初始值,计算权重θ处的gradient ▽L(θ),结合learning rate,计算并更新得到的权重θ1。直到gradient趋近于0的时候,停止更新参数θ。
Momentum相当于利用指数加权平均给Loss function加入了一个惯性,RMSprop给梯度加了摩擦力
前面讲的都是training data就已经不好的解决方案了,下面讲在trainning data上训练的结果好,在test data上效果不好的处理方法
利用一个validation set(验证)。这样validation set的total loss最小的时候,就找到early stpping 的epoch的值,停止训练,得到参数
重新定义需要minimizing的loss function,加入regularization是为了让objective function更加平滑,防止过拟合,防止方差太大,与bias无关。
dropout
1.在training的时候:
每次update参数之前,对每一个Neuron(包括input_layer)做sampling,决定这个Neuron按一定机率p丢掉,跟它相连的weight也被丢掉,结果得到一个细长的Network。如下图:
2.在testing的时候:
不做dropout
假设training时的删除神经元的概率为p,则在testing时,所有的weight都要乘以(1-p)。
如下图:
类似随机森林。dropout 就是终极的ensemble的方式,理论上dropout 就是training 了一大把的network structure。
在testing 的过程中,按照ensemble的逻辑本来应该是把上面的training 好的一大把的network 拿出来,然后把testing data丢入这些个network中,然后把最后的结果做average,就是结果了,但是实际上这个计算量是非常大的,显然是很难计算处理的。
激活函数是线性函数(ReLU,Maxout的时候dropout 比较好用的)
Why Deep
why deep而不是why shallow?
给出两组实验
第一组就是:越深的神经网络,其参数越多,模型也就越复杂,当然能够拟合更为复杂的函数
第二组表明:单增加netural的数目,不增加layer时没办法提高准确率的。
Deep -> Modularization,在Deep Learning中怎么去做模组化,是机器会自动构建模组化的函数。模组化的好处是使模型变得简单了,这样training data就不需要那么多。而且实际上做Deep Learning 的data是比较少的,如果有很多的话,那直接查表就行。