Recipe if Deep Learning
不断修改模型,使其在训练集上可以达到好的结果,再把其运用到测试集上,若效果不好,则是过拟合了。
但是!
Do not always blame Overfitting
不要所有不好的performance就说overfitting
如图中,56层的performance的test erro比20层的高,这不一定是过拟合了,因为再去检查训练集上的error,可能发现56层的依然比20层的高。
56层比20层效果差,未必是因为欠拟合,他的网络层数多,未必是能力不行。
针对不同的状况使用不同的方法
dropout只有在 测试集上 模型效果不好的时候运用,而不是在训练集上 模型效果不好的时候用,那样只会越train越差。
在训练集上效果不好
更换一些新的激活函数。
在以前使用sigmoid激活函数的时候,Deeper usually does not imply better!这个在训练集上就没有训练好,所以不是过拟合。
Vanishing Gradient Problem梯度消失
上图中出现的原因就是梯度消失,在靠近输入层的地方参数对于最后loss function的微分是很小的,而在靠近输出层的地方,对于最后loss function的微分是很大的。
所以在设定同样的learning rate的时候,在靠近输入层的地方参数的更新很慢,在靠近输出层的地方参数的更新很快。
在输入几乎还是random的时候,输出就几乎已经converge收敛。在输入几乎还是random的时候,输出就根据这些random的数据找到了局部最优,然后就收敛了,loss的下降速率很慢。
此刻模型效果很差,因为他converge是基于random的参数得到的output 来converge的。
sigmoid本身就把正负无穷的数压缩在0到1之间,所以导致敏感度低,如果是指数就是放大差距,这总感觉
加上一个参数也不行
如何解决——ReLU
好处:
1、计算速度快
2、有生物学上的理由
3、无穷多的有着不同bias的sigmoid的叠加结果
4、可以解决梯度消失的问题
把output为0的neural拿掉,剩下的neural都是output=input的linear的时候,网络是一个瘦长的线性网络。
之前梯度消失是因为:sigmoid会把大的input变成小的output,线性的output=input,不会有递减的情况发生。
maxout!妙啊!
ReLU是maxout可以做到的!
在测试集上效果不好
Review
使用一阶导数来估计二阶导数
梯度大,学习率也大,每次更新的幅度就很大,比较容易跳过最优点
陡峭的地方学习率要小,平坦的地方学习率要大
给现在新的gradient大的weight,给过去的旧的gradient小的weight。
在高原很慢,卡在鞍点,卡在局部最优
局部最优在一个很大的神经网络中,可能是很平滑的,没有多少局部最优,当卡在局部最优时,多数情况就是全局最优距离,或者很接近全局最优。
真实世界中,会由于惯性,一直走,最后会走到比局部最优更好的全局最优点
Review: Vanilla Gradient Descent
加上Momentum的思想之后
有一个新的gradient并不会使得参数更新方向完全改变,因为有惯性,所以只会对原来方向有一定的影响。
v
i
v^i
vi是过去所有梯度的总和
λ \lambda λ如果是小于0的值,越之前的gradient,他的weight越小,反而越在意现在的gradient,但是过去的gradient也会对现在有一定的影响。
移动 = -
∂
L
/
∂
w
+
M
o
m
e
n
t
u
m
\partial{L}/\partial{w} + Momentum
∂L/∂w+Momentum
可能也会跳出global minimum
在training data上得到好的结果,但是在testing data上的结果依然不好。
Early stopping
使用验证集来模拟测试集,找到合适的位置
Regularization
重新定义了要去最小化的loss function,多了一项L2 regularization,因为加regularization是为了平滑,而bias和function的平滑程度无关,所以不需要加bias。
weight不断变小,权重衰减weight decay
最后参数不会都变成0,因为还有后面的一项。
Dropout
在训练的时候,每次更新参数之前,对每一个neural(包括input layer里的element)做sampling,来决定这个neural是否被丢掉,以p的概率被丢掉。
网络结构变细长了,再用这个网络进行训练。
在每一次更新参数之前,都要重新进行sample,每次更新参数的时候拿来训练的网络结构是不一样的,所以在做重新sample的结果是不一样的。
在使用dropout的时候,在训练集上的performance是会变差的。但是测试集上的performance会变好。
在测试的时候不做dropout,如果在训练的时候dropout概率是p,则在测试的时候是1-p
使用Dropout直觉的理由
为什么训练和测试的weight不一样?
例如30%,train时w相当于过载,正常量级*10/7。test的时候要做还原,乘上7/10
Dropout is a kind of ensemble
使用dropout的时候,相当于训练了一把有着不同结构的网络,每个model可能variance很大,如果model很复杂的话,bias平均起来就很小
这个解释有问题:因为每次失活都随机产生一个NN,而且只训练了那么一次,并不是训练了固定个NN,所以应该是等分的交叉验证
如果在模型比较复杂的时候,这个方法会比较有用。
random forest随机森林也是用了这个思想。
用dropout相当于使用了 2 M 2^M 2M个网络来训练
使用一个mini-batch就相当于训练了一个网络
网络中的一些参数是共享的,即一个网络的结构只用一个batch训练,但是一个weight可能用了好几个weight训练。
把测试数据丢给一把网络,最后求平均值,但是这样在实际使用中是不可行的,因为这一把网络实在是太多了,运算量太大。
所以,当一个网络不做dropout,是一个完整的网络的时候,把权重weight全乘上1-p,和前面那种方法结果是一致的。
因为weight都接受了横向集成训练
举个例子
但是只有在激活函数是线性的时候,两种情况才会相等,但是神奇地方在于dropout没有使用线性的激活函数,但是它最终确实是work了!
amazing!
可以推测:
maxout和ReLU的网络相对于sigmoid来说更接近linear,所以dropout在使用maxout和ReLU的网络时候,performance确实比较好。