还记得我们之前用经度和纬度来进行分箱吗? 仅仅是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。
下一次我们将会用独热编码来处理