【学习笔记】稀疏性正则化(l1正则化)

还记得我们之前用经度和纬度来进行分箱吗? 仅仅是2个特征进行分箱组合就让我们的输入特征数量暴增。假设我们现在有k个特征需要来分箱,每个分为长度为k的独热编码。那么我们输入特征就为 k^k个,这种指数增长会占用我们大量ram。这是我们需要办法来拯救我们的ram。那么一个好的方法就是让我们的部分权重为0,正好为0的权重会使相应特征从模型中移除。会节省我们的ram同时也会降低我们模型中的噪点。

很遗憾的是我们之前使用的l2正则化并不能解决这个问题,l2正则化会让我们权重降低,但并不会让权重降为0。

这里l0正则化会让我们的问题变成非凸问题,这里我们用l1正则化(Lasso regression)来代替l0正则化,它具有凸优化的优势,方便我们计算。(顺便一提l2正则化又叫岭回归Ridge regression) (在tf中,l2正则化会除以2),比如:

x = tf.constant([3.0, 4.0])

sess = tf.Session()

print(sess.run(tf.contrib.layers.l2_regularizer(1.0)(x)))

>>>12.5

 

l1和l2降低权重的方法:

l1降低是权重的绝对值

l2降低权重的平方

 

因此l1和l2具有不同的导数(微分):

l1 的导数为k(一个常数,与权重无关).

l2的导数为 2*权重.

 

文章这里给了一个易懂的解释:

 我们可以把 l1正则化相当于每次对weights减去一个常数,并且由于在0处具有不连续性,出现负数则会变为0.

l2则是每次移除weights的x%,所以不会得到0。

 

下一次我们将会用独热编码来处理特征,原文本来在介绍神经网络之前并没有添加隐藏层,我这里则是一直都添加了隐藏层,不过这个概念并不难,只要稍微运用下搜索引擎就可以得到易于理解的答案。

至于整个反向传播的流程,建议不要急着去研究,深入去理解其中的数学算法自然对我们理解神经网络有很大帮助,但是其中涉及到的一些数学知识还是比较艰深的。

至于正则化,则是为了让weights矩阵的condition number降低,此举是为了降低对输入值的敏感性。我们只要记住可以防止过拟合就够了。(个人理解,如果有勿烦请指出。)

一般来说l1正则化的效果不如l2,当我们输入的均是独热码的时候,l1可以将weights降为0这点,会节省我们的ram。

请注意一下,我们l2正则化和l2范数的算法略微有点区别的,我们没有开根号,同时tf还除了2 。

暂时先说这么多,很多问题还没有想到,想到哪写到哪了。

你可能感兴趣的:(【学习笔记】稀疏性正则化(l1正则化))