返回介绍

CNN - L1 正则的稀疏性

发布于 2025-02-25 23:04:58 字数 5490 浏览 0 评论 0 收藏 0

这一回我们把目光转向正则化。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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文