大脑的基本计算单位是神经元(neuron)。人类的神经系统中大约有860亿个神经元,它们被大约$10^{14}-10^{15}$个突触(synapses)连接起来。下面图表的左边展示了一个生物学的神经元,右边展示了一个常用的数学模型。每个神经元都从它的树突获得输入信号,然后沿着它唯一的轴突(axon)产生输出信号。轴突在末端会逐渐分枝,通过突触和其他神经元的树突相连。
在神经元的计算模型中,沿着轴突传播的信号(比如$x_0$)将基于突触的突触强度(比如$w_0$),与其他神经元的树突进行乘法交互(比如$w_0x_0$)。其观点是,突触的强度(也就是权重$w$),是可学习的且可以控制一个神经元对于另一个神经元的影响强度(还可以控制影响方向:使其兴奋(正权重)或使其抑制(负权重))。在基本模型中,树突将信号传递到细胞体,信号在细胞体中相加。如果最终之和高于某个阈值,那么神经元将会激活,向其轴突输出一个峰值信号。在计算模型中,我们假设峰值信号的准确时间点不重要,是激活信号的频率在交流信息。基于这个速率编码的观点,将神经元的激活率建模为激活函数(activation function)$f$,它表达了轴突上激活信号的频率。
换句话说,每个神经元都对它的输入和权重进行点积,然后加上偏差,最后使用非线性函数(或称为激活函数)。
只要在神经元的输出端有一个合适的损失函数,就能让单个神经元变成一个线性分类器。
二分类Softmax分类器:可以把$\displaystyle\sigma(\Sigma_iw_ix_i+b)$看做其中一个分类的概率$P(y_i=1|x_i;w)$,其他分类的概率为$P(y_i=0|x_i;w)=1-P(y_i=1|x_i;w)$,因为它们加起来必须为1。根据这种理解,可以得到交叉熵损失,然后将它最优化为二分类的Softmax分类器(也就是逻辑回归)。因为sigmoid函数输出限定在0-1之间,所以分类器做出预测的基准是神经元的输出是否大于0.5。
二分类SVM分类器:或者可以在神经元的输出外增加一个最大边界折叶损失(max-margin hinge loss)函数,将其训练成一个二分类的支持向量机。
Sigmoid:$$\sigma(x) = 1 / (1 + e^{-x})$$
Tanh:
其实tanh神经元是一个简单放大的sigmoid神经元,具体说来就是:$tanh(x)=2\sigma(2x)-1$。
Rectified Linear Unit(ReLU):$$f(x) = \max(0, x)$$
ReLU函数即为一个关于0的阈值函数。它具有以下的一些优缺点:
Leaky ReLU:$$f(x) = \mathbb{1}(x < 0) (\alpha x) + \mathbb{1}(x>=0) (x)$$
为了解决“ReLU死亡”的问题,Leaky ReLU在$x<0$时给出了一个很小的负数梯度值,即式中的$\alpha$。这个激活函数的表现很好,但是效果并不是很稳定。
Kaiming He在2015年发布的论文Delving Deep into Rectifiers中提出了一种新方法PReLU,把负区间上的斜率当做每个神经元中的一个参数。
Maxout:$$f(x)=\max(w_1^Tx+b_1, w_2^Tx + b_2)$$
该方法由Goodfellow等提出,ReLU和Leaky ReLU都是这个公式的特殊情况。
Maxout神经元拥有ReLU单元的所有优点(线性操作和不饱和),而没有它的缺点(死亡的ReLU单元)。然而和ReLU对比,它每个神经元的参数数量增加了一倍,这就导致整体参数的数量激增。
TLDR: “What neuron type should I use?” Use the ReLU non-linearity, be careful with your learning rates and possibly monitor the fraction of “dead” units in a network. If this concerns you, give Leaky ReLU or Maxout a try. Never use sigmoid. Try tanh, but expect it to work worse than ReLU/Maxout.
将神经网络算法以神经元的形式图形化:神经网络被建模成神经元的集合,神经元之间以无环图的形式进行连接。也就是说,一些神经元的输出是另一些神经元的输入。
通常神经网络模型中神经元是分层的。
对于普通神经网络,最普通的层的类型是全连接层(fully-connected layer)。全连接层中的神经元与其前后两层的神经元是完全成对连接的,但是在同一个全连接层内的神经元之间没有连接。
命名规则:输入层并不被计算在神经网络的层数内,故N层神经网络即具有N-1个隐藏层和输出层,另外还有一个输入层。研究者们也会使用人工神经网络(Artificial Neural Networks 缩写ANN)或者多层感知器(Multi-Layer Perceptrons 缩写MLP)来指代神经网络。
输出层:输出层的神经元一般不具有激活函数。因为输出层大多用于表示分类评分值,因此是任意值的实数,或者某种实数值的目标数。
确定网络尺寸:用来度量神经网络的尺寸的标准主要有两个:一个是神经元的个数,另一个是参数的个数,用下示的两个网络为例:
不断重复的矩阵乘法与激活函数交织。将神经网络组织成层状的一个主要原因,就是这个结构让神经网络算法使用矩阵向量操作变得简单和高效。
全连接层的前向传播一般就是先进行一个矩阵乘法,然后加上偏置并运用激活函数。
理解具有全连接层的神经网络的一个方式是:可以认为它们定义了一个由一系列函数组成的函数族,网络的权重就是每个函数的参数。
拥有至少一个隐层的神经网络是一个通用的近似器。神经网络可以近似任何连续函数。
虽然在理论上深层网络(使用了多个隐层)和单层网络的表达能力是一样的,但是就实践经验而言,深度网络效果比单层网络好。
看起来如果数据不是足够复杂,则似乎小一点的网络更好,因为可以防止过拟合。然而并非如此,防止神经网络的过拟合有很多方法(L2正则化,dropout和输入噪音等)。在实践中,使用这些方法来控制过拟合比减少网络神经元数目要好得多。
不要减少网络神经元数目的主要原因在于小网络更难使用梯度下降等局部方法来进行训练:虽然小型网络的损失函数的局部极小值更少,也比较容易收敛到这些局部极小值,但是这些最小值一般都很差,损失值很高。相反,大网络拥有更多的局部极小值,但就实际损失值来看,这些局部极小值表现更好,损失更小。
正则化强度是控制神经网络过拟合的好方法