在tensorflow中,我们经常会用到正则化项,比如kernel_regularizer、bias_regularizer和activity_regularizer。
对于网络层𝑦=𝑊𝑥+𝑏 ,他们的作用机制是相似的,区别是作用的对象不同,kernel_regularizer作用于权重𝑊,bias_regularizer作用于𝑏,而activity_regularizer则作用于该层的输出𝑦。
这里以kernel_regularizer为例,来简单介绍l1_regularizer与l2_regularizer的作用机制。首先看他们的定义公式:
𝐿2即为𝑤^2
𝐿1即|𝑤|
其中𝑤为权重矩阵,那么它们对应的导数为2𝑤 和𝑠𝑖𝑔𝑛(𝑤),设网络的学习率为𝑎,那么𝐿2对应的梯度为𝑎𝑤(为了梯度下降的方便,𝐿2正则化会除以2将求导得到的系数2约去,所以梯度的系数为𝑎),𝐿1对应的则为𝑎⋅𝑠𝑖𝑔𝑛(𝑤)。
在一次梯度更新过程中,𝐿2正则化的梯度更新公式为:
𝛿𝑤=𝑢−2𝑝𝑤
其中𝑢代表这一层的输入,也就是上一层的输出,𝑝是𝐿2正则化惩罚设置的权重参数。我们假设𝑢与𝑤均为正值,那么梯度的正负值将由下式决定:
𝑠𝑖𝑔𝑛(𝛿𝑤)=𝑠𝑖𝑔𝑛(𝑢/2𝑝−𝑤)
这就导致当𝑤小于𝑢/2𝑝时,梯度更新会使得𝑤变大,而𝑤大于𝑢/2𝑝时,又会使得𝑤变小,从而得到一个较平滑的权重矩阵,也就是说会倾向于认为每个点都有效。
而𝐿1的梯度更新公式为:
𝛿𝑤=𝑢−𝑝
梯度的正负值为:
𝑠𝑖𝑔𝑛(𝛿𝑤)=𝑠𝑖𝑔𝑛(𝑢−𝑝)
这时的𝑝就充当了一个阀值,当 𝑢 小于 𝑝, 𝐿1 正则化将使权重变小,当 𝑢 大于 𝑝, 𝐿1 正则化将使权重增大。所以𝐿1 正则化会倾向于产生少量特征,即权重矩阵中有非常多的0值。
参考资料:https://stats.stackexchange.com/questions/383310/difference-between-kernel-bias-and-activity-regulizers-in-keras