1. 正则化的相关概念
正则化是一种常见的解决过拟合问题的处理方式。一般有两种正则化方式,L1正则化和L2正则化。
其中常用的是L2正则化。两者的定义可以看下图:
可以看出,之所以叫L2正则化,是因为它是平方项之和。所以以后从名字,就可以写出它们的表达式。
- L1正则化可以产生稀疏权值矩阵,即产生一个稀疏模型,可以用于特征选择
- L2正则化可以防止模型过拟合(overfitting);一定程度上,L1也可以防止过拟合
L1正则化为何可以产生稀疏矩阵,这个放后面解释。下面先解释一下如何使用正则化。
一般而言,我们会把所有的参数(一般是w,b)的平方项,再乘一个正则化参数(lambda)。把这个项一起加在损失函数的后面,然后进行优化。
但Keras的方式不是这样,你可以选择某些层的参数,最后模型会将你选择的参数放入损失函数里面,一起优化。
例如:
from keras import regularizers
model.add(Dense(64, input_dim=64,
kernel_regularizer=regularizers.l2(0.01)
则表示将这个Dense层的权重参数W,进行正则化操作。
因为我们的模型往往是有很多层的,所以有你想要正则化的层,那么你需要向上面一样操作。
正则项在优化过程中层的参数或层的激活值添加惩罚项,这些惩罚项将与损失函数一起作为网络的最终优化目标
惩罚项基于层进行惩罚,目前惩罚项的接口与层有关,但Dense, Conv1D, Conv2D, Conv3D
具有共同的接口。
这些层有三个关键字参数以施加正则项:
-
kernel_regularizer
:施加在权重上的正则项,为keras.regularizer.Regularizer
对象 (即对W) -
bias_regularizer
:施加在偏置向量上的正则项,为keras.regularizer.Regularizer
对象 (即对b) -
activity_regularizer
:施加在输出上的正则项,为keras.regularizer.Regularizer
对象
最后,解释一下为何L1正则化能产生稀疏矩阵。
假设只有一个参数为w,损失函数为L(w),分别加上L1正则项和L2正则项后有:
假设L(w)在0处的倒数为d0,即
则可以推导使用L1正则和L2正则时的导数。
引入L2正则项,在0处的导数
引入L1正则项,在0处的导数,因为有绝对值,所以求导是要考虑正负号。
从上面的求导我们知道,在0处,导数可能不存在。
可见,引入L2正则时,代价函数在0处的导数仍是d0,无变化。
而L1正则化后,导数可能不存在。我们知道,取得极值的点,可能有两种,第一 是导数为0,第二是导数不存在。所以在w处可能取到极值。而我们优化的目标就是取到极值,所以,很大可能我们会来到w=0这个点。因此可能会存在很多w的值为0.
这里只解释了有一个参数的情况,如果有更多的参数,也是类似的。因此,用L1正则更容易产生稀疏解。