1.L2正则化
L2正则化就是给损失函数加一个对参数的限制值,也叫正则项。正则化的交叉熵损失函数为:
一个通用的写法是:
正则化的主要目的是学习较小的权重,同时获得较小的损失,而正则系数的作用,就是在两者之间做一个权衡。
通过一个例子,来证明为什么正则化可以防止过拟合:
求偏导数得到:
1.正则化可以让模型更简单
2.正则化之后,小的输入变化,不会导致太大的输出变化
如左图所示,考虑只有两个参数的情况,在($w_1, w_2$)平面上,可以画出目标函数的等高线,而对参数的约束,见图中的黑线,L1的约束形成了一个“菱形”
Dropout是一种廉价的Bagging集成近似,具体来说,dropout训练的模型,包括整个网络的所有可能的子网络,如图所示:
dropout的目标是在指数级数量的这么多个神经网络模型上近似bagging,但是直接训练这么多个模型需要花费太太太太太太多运行时间和内存。
所以dropout的作者提出了一种近似训练这么多个模型的方法,就是在训练的过程中,每次都以一定的概率随机丢弃一些输入单元或隐藏单元,从而形成不同的模型结构,这样每次训练的都是不同的模型。
那么问题来了,训练的时候,训练了N多个模型,在预测的时候用哪个呢?
答案是,用整个网络,,所有输入单元和隐藏单元则都不会被丢弃,但是每个单元的权重都会乘以在训练过程中被包含的概率值,从而近似得到bagging的效果,这种方法叫做权重比例推断(weight scaling inference rule)。
从数学的角度看,dropout的做法是,近似计算得到所有模型的几何平均。
*两个数a和b的算术平均值为$(a+b)/2$,几何平均值为$\sqrt{ab}$
在做inference的时候,理论上bagging需要计算所有模型的算术平均结果:
在dropout的情况下,通过掩码$u$定义每个子模型的概率分布$p(y|u,x)$。所有掩码的算术平均值为:
对应的几何平均值为:
$$p^{-}{ensemble}(y|x) = \sqrt[2^d]{\prod{u}p(y|x,u)}$$
tf.nn.dropout(
x,
keep_prob,
noise_shape=None,
seed=None,
name=None
)
With probability keep_prob, outputs the input element scaled up by 1 / keep_prob, otherwise outputs 0. The scaling is so that the expected sum is unchanged.
tensorflow的做法是,在训练的时候,将权重增大,即除以(1/keep_prob),而在inference的时候,权重保持不变。
从另外一个角度看,dropout减小了模型的有效容量,为了抵消这种影响,需要增大模型规模。