利用Keras,在神经网络中实现正则化

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正则更容易产生稀疏解。
 

发布了449 篇原创文章 · 获赞 197 · 访问量 25万+

猜你喜欢

转载自blog.csdn.net/qq_40774175/article/details/105470149