l1,l2 regularization
摘自tensorflow_core.python.keras.regularizers的class Regularizer:
Regularizers allow you to apply penalties on layer parameters or
layer activity during optimization.These penalties are summed into the
loss function that the network optimizes.
正则项可以在optimizer优化时对layer中的参数或者layer activity添加惩罚项,这些惩罚项最后会加到optimizer所优化的loss function里
在隐藏层中经常会使用正则来作为损失函数的惩罚项。换言之,为了约束w的可能取值空间从而防止过拟合,我们为该最优化问题加上一个约束,就是w的L1范数或者L2范数不能大于给定值。
tf.keras.regularizers提供了几种内置类来提供正则。分别是class L1、class L1L2、class L2、class Regularizer 、serialize。同时提供了三个参数作为可被正则化的对象:
Regularization penalties are applied on a per-layer basis. The exact
API will depend on the layer, but many layers (e.g.Dense
,Conv1D
,Conv2D
andConv3D
) have a unified API.
These layers expose 3 keyword arguments:
kernel_regularizer
: Regularizer to apply a penalty on the layer’s kernelbias_regularizer
: Regularizer to apply a penalty on the layer’s biasactivity_regularizer
: Regularizer to apply a penalty on the layer’s output
在每层基础上应用这个正则化惩罚,确切的API由该层决定,但是Dense
, Conv1D
, Conv2D
andConv3D
这些层有统一的API,有三种参数:
kernel_regularizer
:对该层中的权值矩阵layer.weights正则bias_regularizer
:对该层中的偏差矩阵layer.bias正则activity_regularizer
:对该层的输出值矩阵layer.bias正则
- 大多数情况下,使用
kernel_regularizer
就足够了; - 如果你希望输入和输出是接近的,你可以使用
bias_regularizer
; - 如果你希望该层的输出尽量小,你应该使用
activity_regularizer
。
在构造网络层时,将’kernel_regularizer’参数设为l2正则化函数,则tensorflow会将该权重变量(卷积核)的l2正则化项加入到集合 tf.GraphKeys.REGULARIZATOIN_LOSSES里。
在计算loss时使用tf.get_collection()来获取tf.GraphKeys.REGULARIZATOIN_LOSSES集合,然后相加即可:
l2_loss = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)
参考链接: