【花师小哲】当代炼金术(神经网络)前沿(5)——稀疏网络与特征筛选

其实这一篇才是预定第4篇,只不过七巧板的论文实在是太好玩了,于是就稍微把这篇放一放。
这里需要纠正一下,之前动态我是说这篇文章是讲attention的,其实说错了,attention在这里确实只是关注的意思,不是“attention is all you need”的attention机制的意思。这篇文章是讲稀疏训练的。
这篇我就有些可以分享的东西了,不像上一篇只能简单列举下做了什么工作。

1.从神经网络到矩阵
之前的专栏中我们讲了基础的神经网络:
其中,最基础和最经典的就是全连接神经网络,如图所示:

这里,我们再稍微讲的更具体一些,即我们把这个网络转变成机器能懂的东西。我们只关注输入层和第一层隐藏层(即和输入层直接相连的那一层)。
我们要用到的数学工具是线性代数。假设输入层有m个节点,那我们就可以把它写成一个m*1的向量,同理,假设第一层隐藏层有n个节点,我们也可以将他写成一个n*1的向量,那么问题来了,怎样把一个m*1的向量变成一个n*1的向量呢?很简单,你需要的知识一个m*n的矩阵。而这个m*n的矩阵刚好就代表了从输入层到第一层隐藏层的所有边的权重。
于是,整个神经网络就可以写成y=W2(W1(x))这样的形式,整个神经网络只不过是矩阵运算而已。当然,正向确实非常简单,但反向传播会难很多。

2.稀疏网络与稀疏矩阵
全连接网络有什么问题的,显而易见的问题就是慢,毕竟每次训练都要更新全部的参数。而且,并不是所有参数都是有用的,有些参数可能只发挥了很小的作用。
于是乎,有人开始想办法把训练好的网络做“剪枝”,即对于训练好的全连接神经网络中不重要的边剪掉。这种方法经过发展,就变成了直接训练稀疏网络,即一开始神经网络的边就不是全连接的,如图所示:

这种改法其实对于我们如何表示神经网络其实影响不大,还是y=W2(W1(x))这样的式子,只不过W2和W1变成了稀疏矩阵。稀疏矩阵其实就是一个大矩阵中只有少量元素是有用的矩阵,这一块各种编程语言都能很好地支持稀疏矩阵了,所以由全连接网络到稀疏网络碰到的困难其实不大。

3.特征筛选
一个基本点:对于输入的数据,不同特征对结果的影响是不一样的,例如我们有三个特征:①a:星球的表面温度②b:星球的直径③c:小明的身高,以此来预测次星球的寿命。这时候,③基本上是和问题完全无关的特征。
如果我们使用线性回归来做的话,估计可能会得到这样一个公式:
y=10a+8b+0.01c+6(这个式子肯定不对,只是举例子),可以看到权重大的特征相对更重要(当然,实际应用是要做其他处理的,否则d=c/1000这样的特征好像就有用了)。
但是,这个式子是不对的,如果我们有强迫症,那么0.01也是不允许的,这个就该是0。或者说,我们应该把特征c直接排除掉。
解决这个东西的方法例如经典的LASSO回归(LASSO虽然并不是专门来解决这个问题的,但由于L1范数的特点,确实经常能够达到这种效果)等。也有其他很多其他的方法,本论文就是使用稀疏神经网络来完成特征筛选的。

4.具体方法
本文使用的是动态稀疏网络,很好理解,就是稀疏连接并不是静态设置好的,而是会在运算过程中不断迭代变化的,具体来说是增加一些可能有用的边并删除一些作用较少的边,整个过程如图所示:

一个直觉是如果一个特征(输入层的一个节点)连接了更多的节点,那么它就是更重要的,此论文就是通过这种方法来实现特征筛选的。

稀疏矩阵计算还是很重要的一个研究的。