Introduction
正则化,regularization,也即 约束 。是防止过拟合的诸多手段之一,很常用。
常命名为 weight loss ,或 decay loss。
通过 限制 参数值域空间,显式地 控制了 模型复杂度,从而避免了过拟合。
假设待正则的网络层参数为 ω \omega ω (omega) ,通用表达为: ∣ ∣ ω ∣ ∣ k = x 1 k + x 2 k + x 3 k k || \omega ||_{k} = \sqrt[k]{x^k_1 + x^k_2 + x^k_3} ∣∣ω∣∣k=kx1k+x2k+x3k 。
正则类型 | 约束公式 | 一阶导 | 特性 | 最终药效 |
---|---|---|---|---|
L1正则化 | λ ∥ ω ∥ 1 = λ N ∑ i N ∣ ω i ∣ \lambda\Vert{\omega}\Vert_1 = \frac{\lambda}{N} \sum_{i}^N |{\omega_i}| λ∥ω∥1=Nλ∑iN∣ωi∣ | λ ⋅ s i g n ( ω ) \lambda\cdot sign(\omega) λ⋅sign(ω) | 绝对值的导数不连续,不好求导。 梯度都是 − λ -\lambda −λ或 λ \lambda λ,逐步将不重要的特征都置0。 | 网络较稀疏,大量的0值 |
L2正则化 | λ 2 ∥ ω ∥ 2 2 = λ 2 N ∑ i N ω i 2 \frac{\lambda}{2}\Vert{\omega}\Vert^2_2 = \frac{\lambda}{2N} \sum_{i}^N {\omega_i}^2 2λ∥ω∥22=2Nλ∑iNωi2 | λ ⋅ ω \lambda\cdot \omega λ⋅ω | 常用,好求导。 对大数和离群点更敏感,梯度越靠近0就越小。 | 基本都是很靠近0的小数 |
正则化手段
正则化手段包括了:
L1正则化、L2正则化、Elastic网络正则化、最大范数约束、随机失活、使用验证集。
L1正则化
l 1 = λ ∣ ∣ ω ∣ ∣ 1 = ∑ i ∣ ω i ∣ l_{1} = \lambda || \omega ||_{1} = \sum_{i} | \omega_{i} | l1=λ∣∣ω∣∣1=i∑∣ωi∣
λ \lambda λ :取值越大,则对模型复杂度的 约束程度 越大。
L2正则化
深度学习中 | 机器学习中 | |
---|---|---|
L2正则化 的 别名 | 权重衰减 (weight decay) | 岭回归 (ridge regression) |
l 2 = 1 2 λ ∣ ∣ ω ∣ ∣ 2 2 l_{2} = \frac{1}{2} \lambda || \omega ||_{2}^{2} l2=21λ∣∣ω∣∣22
Note:
- 现在正则化一般用L2正则化,因为其便于求导,从而方便优化;
- L1正则化求导不易,大家一般不用。
Elastic网络正则化
Elastic网络正则化 = L1正则化 + L2正则化
功效 | |
---|---|
L1正则化 | 约束参数量级 + 稀疏化参数(可以造就更多的0值) |
L2正则化 | (只能)约束参数量级 |
l E l a s t i c = l 1 + l 2 = λ 1 ∣ ∣ ω ∣ ∣ 1 + λ 2 ∣ ∣ ω ∣ ∣ 2 2 l_{Elastic} = l_{1} + l_{2} = \lambda_{1} || \omega ||_{1} + \lambda_{2} || \omega ||_{2}^{2} lElastic=l1+l2=λ1∣∣ω∣∣1+λ2∣∣ω∣∣22
最大范数约束
最大范数约束,max norm constraints,通过 向 参数量级的范数 设置上限,从而正则化 (即 约束) 模型复杂度。
∣ ∣ ω ∣ ∣ 2 < c || \omega ||_{2} < c ∣∣ω∣∣2<c
c c c:一般取 1 0 3 ∼ 1 0 4 10^3 \sim 10^4 103∼104 数量级。
随机失活
随机失活,dropout,2012年于AlexNet中被提出。
Note :
- 只针对 全连接层 进行操作;
- 训练阶段和测试阶段的操作不同。
训练阶段
按概率p 随机 将神经元 置 0 [如下(b)图]
,以 缓解 神经元之间 隐形的协同适应,从而达到降低模型复杂度的目的:
别看dropout之后的网络只是原网络的一个 子网络 ,复杂度不比原网络。但由于每个神经元的dropout是 随机dropout,因此每一轮都相当于在一个 新的 子网络上训练。那么最终得到的模型便是 无数个 子网络 共同训练 的成果,效果自然会更好。
然后麻烦也来了,训练阶段的每个神经元要事先添加一道概率流程:
对应的公式变化如下如下:
-
没有dropout的神经网络:
-
有dropout的神经网络:
Tensorflow 中的 dropout API 如下:
tf.nn.dropout
其中,根据 keep_prob参数项 随机进行 dropout 。
# coding=utf-8
import tensorflow as tf
import numpy as np
inputs = np.random.uniform(-10, 10, size=[3, 3])
features = tf.placeholder_with_default(input=inputs, shape=[3, 3])
# 随机失活
output_dropout = tf.nn.dropout(features, keep_prob=0.5)
with tf.Session() as sess:
print '\nfeatures :\n', sess.run(features)
print '\n----------\n'
print '\ndropout :\n', sess.run(output_dropout)
features :
[[ 0.53874537 -3.09047282 -2.88714205]
[-1.92602402 -1.56025457 3.64309646]
[-9.13147387 8.37367913 -7.9849204 ]]
----------
dropout :
[[ 0. -6.18094565 -5.77428411]
[ -0. -3.12050914 7.28619293]
[-18.26294775 16.74735827 -0. ]]
测试阶段
所有 神经元均呈 激活态,但其权重 需乘上
p
p
p 以保证各权重能有和 训练阶段 相同的 期望值 :
使用验证集
具体见:深度学习: 验证集 & 测试集 区别 。
[1] 理解dropout