关于 L1 在实操中常不能得到真正稀疏性的原因,有一个听起来很奇怪,细品又有点道理的解释:当参数使用float方式存储时,计算机进行浮点数的四则运算很难得到完美的 0 值。
冷不丁看到,感觉离了大谱。
当我们专注于算法推导的时候,几乎没人想到这里来,但听到这个解释后,又打心眼里觉得对。这理论也是我在查阅 FTRL 资料的时候看到的,它莫名契合 FTRL 追求实际落地的出发点。
这里贴一个链接,是一个关于 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)
结论如下:
关于近端梯度下降,可参考这里:Xinyu Chen:机器学习 | 近端梯度下降法 (proximal gradient descent)