CNN - L1 正则的稀疏性
这一回我们把目光转向正则化。Caffe 中提供了两种正则化:L2 和 L1,也是大家最耳熟能详的正则化算法了。从刚开始学习机器学习开始,有关经验风险和结构风险,bias and variance,过拟合等一系列的概念都和正则化有着密切的关系。
在当年经典的机器学习课本中,大师们经常用这样一张图来教导我们:
(图片来自网络,侵删)
从上面这张图可以看出,损失函数的主体是一个凸函数,它的等高线均匀地向外扩散。因此正方形的 L1 正则更容达到参数的稀疏性,而圆形的 L2 正则则不太容易达到这个效果。所以多年以来,大家一直在心中默默记住:L1 可以达到参数稀疏化的效果。而且,在浅层模型中,大多数情况下 L1 的稀疏效果还是不错的。当然,理论上依然存在使用 L1 正则却无法达到稀疏效果的情况,这个比较特殊就不细说了。
当然,如果要详细讲述 L1 正则相关的故事,恐怕相当于又打开了一个新天地。恐怕其中所涉及到的各位大师前辈的精妙算法又是数不胜数。关于这些话题有时间我们慢慢再聊,现在我们来看看 L1 在 CNN 上的表现。
MNIST 的 L1 正则实验
我们这一次同样采用 MNIST 作为实验。训练数据和测试数据一切正常,所采用的模型也是我们之前所提到的那个正常的模型,非线性部分采用 ReLU。唯一不同的是我们讲正则化的方法改为 L1。我们依然使用 Caffe 进行训练,经过 10000 轮的训练,我们得到了如下的精确率:
0.9766
看上去比 L2 正则在 10000 轮训练后的精度 0.9912 要差一些啊,宝宝不开心。
既然精度已经差一些了,那么我们看看 L1 的正则在稀疏性上的表现。这时候我们要拿 L2 正则训练出的参数和 L1 正则训练的参数进行比较,比较的方式也是直接利用参数的数值去看他们的数据分布情况:
首先是 L1 正则的两张图,我们只关注极小的某个区间下的参数直方图,首先是 conv1 层的参数:
可以看出在 1e-7 的范围下,没有参数等于 0。然后是 conv2 层:
在 1e-9 的范围下,只有一个参数等于 0。然后是 L2 正则的参数结果,首先是 conv1 层:
然后是 conv2 层:
从分布中可以看出,L2 参数没有像 L1 那样特别小的参数,L1 参数确实比 L2 更靠近 0,但是并没有到达 0 这个地方。
这是为什么呢?
首先,CNN 的参数和 Loss 关系并不是凸函数,而教科书上讲的例子都是凸函数,所以从这个初始条件来看就不一样,所以最终的结果也自然不一样。对于非凸的函数,情况比上面的图复杂的多。
其次,Caffe 中求解 L1 的算法使用的是最基础的 subgradient descent,这种方法在求解的绝对稀疏性上是有劣势的,对于这个问题,我们可以举一个简单的例子做展示。
我们可以简单地列出 subgradient_descent 的 python 代码:
def subgradient_descent(x, grad, lr, lambda):
x -= lr * (grad + lambda * sign(x))
我们初始化一个小量的数据集,用于 L1 正则的训练:
def genData(n, p, s):
A = np.random.normal(0, 1, (n,p))
opt_x = np.zeros(p)
random_index_list = random.sample(range(p), s)
for i in random_index_list:
opt_x[i] = np.random.normal(0,10)
e = np.random.normal(0,1,n)
b = np.dot(A,opt_x.T) + e.T
return A, b
A, b = genData(100, 50, 20)
上面的代码中理想的最优参数共有 50 维,其中有 30 维都被设置为 0。我们希望 subgradient 的优化算法可以学到这样的稀疏性。
不过实际情况是,当训练结束时,没有一个参数真正等于 0,只是接近 0。
然而我们采用其他的 subgradient 算法时,参数可以优化到 0。(比方说 proximal gradient descent)
举一次优化的结果为例,理想参数如下所示:
opt_x
[ 0.00000000e+00 0.00000000e+00 -8.89068011e+00 0.00000000e+00
0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00
0.00000000e+00 9.79677398e+00 0.00000000e+00 -1.53016548e+01
1.01055968e+01 2.08989507e+01 0.00000000e+00 -4.16464326e+00
1.76916005e+01 0.00000000e+00 0.00000000e+00 0.00000000e+00
0.00000000e+00 0.00000000e+00 0.00000000e+00 5.00900104e+00
-9.35102012e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00
0.00000000e+00 -7.13791761e+00 0.00000000e+00 0.00000000e+00
0.00000000e+00 -2.79487453e+01 3.11610679e+00 0.00000000e+00
0.00000000e+00 2.14217260e+00 6.00126451e+00 6.58569031e+00
4.52257852e+00 0.00000000e+00 -2.68944021e-02 0.00000000e+00
0.00000000e+00 0.00000000e+00 -5.51801700e+00 1.31847462e+00
-1.81286404e+01 0.00000000e+00]
subgradient 给出的结果是:
subgradient_process
[ 1.71781432e-07 -1.47628627e-07 -8.74652150e+00 -1.72402237e-07
5.39554174e-08 2.85199917e-07 2.09696332e-07 5.44626181e-08
1.42748391e-07 9.09983860e+00 -1.34269176e-07 -1.48617035e+01
9.73235939e+00 2.00436077e+01 2.01599098e-07 -4.07292753e+00
1.69462946e+01 2.24365336e-01 -1.00920339e-04 -5.21839170e-03
-9.68581468e-04 -1.93440885e-07 3.31274645e-01 4.36451104e+00
-9.05097771e-01 -1.58529600e-07 9.90021826e-08 -2.60871187e-01
1.40025608e-07 -6.60147937e+00 -7.96634585e-05 1.24702253e-07
4.38641043e-08 -2.70520316e+01 2.73945615e+00 2.80055535e-07
2.02949781e-07 2.52015283e+00 5.89734589e+00 6.33872176e+00
4.64813524e+00 1.17230844e-07 -1.24874200e-01 -2.53462109e-02
3.01514888e-07 2.72601191e-07 -5.18595641e+00 1.24439798e+00
-1.77537445e+01 -3.96211798e-08]
而 proximal gradient descent 给出的是:
proximal_gradient_process
[ -0. 0. -8.65370345 0.
0. 0. 0. 0.
0. 9.30621127 -0. -15.07056666
9.76129302 20.45180052 0. -4.11430611
17.16825959 0. -0. -0.
-0. -0. 0. 4.55458453
-0.81317833 0. -0. -0.07547525
-0. -6.73065609 -0. -0.
-0. -27.54904074 2.87046799 0.
0. 2.23054671 5.8947849 6.36406299
4.61893832 -0. -0. -0.
0. 0. -5.26100017 1.19033131
-17.77335708 -0. ]
从稀疏性的效果来看一目了然。
那么在 Caffe 中想利用 L1 正则来获得稀疏性是不太可能的。当然,还有一个更重要的问题,L1 的稀疏性真的是我们需要的么?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论