|
一、逻辑回归(logistic regression)的局限性
在面临二值或者多值分类问题时,我们可以用逻辑回归进行分类,其中逻辑回归函数为:

式1.1
在线性分类中,特征变量之间相互独立时,逻辑回归是个很高效的分类算法,此时:

式1.2
但是在非线性分类中,特征变量之间就会出现相关关系,如下图:

图1-1
则式1.2则需要变成:

式1.3
假如一共有100个特征变量,在线性分类中,逻辑回归只训练出100个最佳参数便可,但是在非线性分类中,所需要训练的参数数量则会变得非常多!所以逻辑回归对于非线性分类问题来说不是一个好的算法,而神经网络算法则可以很好解决这一问题!
二、神经网络算法结构
高中生物基本忘记得差不多了,不过依稀还记得我们大脑对外界的大概反应过程可以描述为外界的刺激信号传进某部分的神经元系统,信号经过神经元一层层地传递下去,最终在某部分的神经元系统产生脉冲信号,驱使身体的某个部位作出反应。神经元的结构如下:

图2-1
输入信号从突触(dendrites)进入后,转化为化学信号,经过神经元细胞一系列的处理,最终在轴突末梢(axon terminals)转换为输出信号。借鉴大脑的这一生理结构,我们可以把信号在神经元中的处理过程用激活函数 g(z) 来抽象表示,因此神经元的等效简单数学模型为:

图2-2
其中 x 为输入信号, \theta 可以理解为用来区分不同神经元,毕竟不同神经元对相同外部输入信号的处理过程是不同的。激活函数 g(z) 的输入 z 一般为: z=\theta_{1}x_{1}+\theta_{2}x_{2}+\theta_{3}x_{3} 。
回顾大脑对外界的反应过程,收到外界刺激信号后,信号经众多神经元层层作用,并最终在某一终端神经元产生输出信号,驱动身体某部位做出反应。因此我们可以把若干个神经元的数学模型拼在一起并分层,便有望模拟大脑对外界的反应过程,因此得到神经网络的结构为:

图2-3
其中Layer1为输入层,该层没有神经元;Layer2为隐藏层,隐藏层的层数不局限于单个,可以有两个以上;Layer3为输出层,为单层,但可以由很多神经元组成。假设某一神经网络有 n 层,其中第 1 和第 n 层为输入层和输出层,第 2,3,...,n-1 层均属于隐藏层。根据这一原则,神经网络的结构也可以变身为下图:

图3-4
其中黄圈的代表输入层,黑圈的代表隐藏层以及蓝圈的代表输出层。
2.1 正向传播(forward propagation)
同时,我们用 a_{i}^{(l)} 来表示第 l 层中的第 i 个神经元的输出,若该层的神经元数量有n个,则该层的输出可以用向量 a^{(l)} 表示:

同时我们用矩阵 W^{(l)} 来表示第 l 层与第 l+1 层之间的传播参数,其中m为第 l+1 层的单元数量,n为第 l 层的单元数量:

并且用 z_{i}^{(l+1)} 表示第 l+1 层中第 i 个单元的加权输入总和:

式2.1
因此,可得:

式2.2
根据式2.1和式2.2,我们便可以根据输入信号 x 以及各层之间的参数矩阵得到最终的输出,该过程称为正向传播,拿图2-3举例来说,它的正向传播过程为:

2.2 偏差项(bias)的必要性
一般来说,我们需要在神经元的等效数学模型中加入一个偏差项,图2-2变为:

设 b_{i}^{(l)} 为第 l+1 层中第 i 个单元的输入偏差项,则式2.1变为:

式2.3
至于加入偏差项的必要性,我来举一个例子:一个sigmoid函数 f(w_{0}\ast x) ,当参数 w_{0} 取不同值时,如图所示:

可以看到参数 w_{0}只能改变函数的陡峭程度,但如果要左右平移呢,单靠 w_{0} 显然无法做到,需要加入一个偏差项,即 f(w_{0}\ast x+b) 才行;到这里,便不难理解神经元的输入为何要加入偏差项,其目的是为了提高预测的准确性。
2.3 激活函数(activation function) g(z) 的选取
根据信号在神经元的作用机制,当输入信号强度达到某种界限(threshold)时,神经元细胞才会被激活,产生高电平并刺激下一层神经元。就比如说你睡着了,如果要把你叫醒,则需要超过某一种强度的干扰才行,可能这种说法相对于医学中的神经元作用机制不够严谨,但我相信整体逻辑是相一致的。根据这种作用机制,我们很快就能想到阶跃函数。
2.3.1 阶跃函数(step function)
阶跃函数的数学表达式为:

式2.4
但是阶跃函数作为激活函数有一个很大的弊端:在分类问题中,一共有k类,神经网络的输出单元有k个,当阶跃函数作为激活函数时,就会有很大概率出现多个输出单元都为1的情况,而导致无法做出预测。而如果我们可以把输出值变为连续值,通过比较每个输出值的大小来选择类别,便可以改善这一弊端,于是我们就有了线性函数。
2.3.2 线性函数
线性函数的数学表达式为: f(x)=cx ,虽然线性函数可以使输出便为连续值,但是它的导数为常数 c ,这个导致了一个问题,就是每次我们通过反向传播(后面会讲到!)求到的梯度都是一样的。而且线性函数通过一层层的嵌套,最后得到的输出等效函数也是一个线性函数,这使得我们不能用来解决非线性分类的问题!因此,为了改善这一弊端,便有了sigmoid函数。
2.3.3 sigmoid函数
sigmoid函数的数学表达式为:

式2.5
函数如图所示:

sigmoid函数能解决之前线性函数带来的弊端,它的弊端在于它的左右两侧斜率很小甚至为0,这会让神经网络的参数在反向传播时有可能会陷入更新速度很慢甚至不更新的情况,不过在现实中,sigmoid函数是最常用的激活函数之一。
2.3.4 Tanh函数
Tanh函数的数学表达式为:

式2.6
函数如图所示:

tanh函数与sigmoid函数作用类似,区别在于两者的值域范围不同,以及tanh在中间区域的导数比sigmoid的要大。
除了以上的选项,激活函数还可以选取ReLu,Leaky ReLu以及softmax函数等等,相关信息可以参考:
三、神经网络的直觉认识
在这一节,我们取sigmoid函数为神经网络的激活函数,即 g(x)=\frac{1}{1+e^{-x}} ,下面将用简单的神经网络结构搭建数字电路中的逻辑模块,假设输入 x_{1},x_{2} 的取值为0和1,逻辑“与”门的神经网络结构图为:

图3-1
把输入的加权总和代入到激活函数中,便可以得到该模块的真值表:

图3-2
不难得到输出函数为: h_{\theta}(x)=x_{1}\bullet x_{2} 。按照相同的原理,我们可以得到逻辑“或”门的神经网络结构:

图3-3
以及逻辑“非”门:

图3-4
因此,学过数字电路的话,我们知道通过这些基本门电路的各种组合,是可以实现很多复杂的功能。因此,我们也可以在神经网络中通过设置合适的参数以及各神经元之间的配合,也是可以实现复杂的分类问题!
四、反向传播算法(back propagation algorithm)
说完对神经网络的直觉认识后,新的问题便来了:如何设置合适的参数完成复杂的分类问题呢?
回顾线性回归亦或是逻辑回归,寻找最佳参数的办法便是求取代价函数关于参数的偏导,然后通过梯度下降法或者是牛顿法找到最优参数,而寻找神经网络的最优参数的方法也是一样。
首先来求取一下神经网络结构的代价函数 J(W,b) ,要注意的是代价函数可以是很多函数,并不唯一,只要它能够起到衡量神经网络预测值与真实值之间的误差就可以,详细了解可以参考网友Daniel Waston的回答:
在这里,我们将采用预测值与真实值之间的平方差作为代价函数,当只有一个样本时,代价函数为:

式4.1
假设s_{l} 代表第 l 层单元的数量, n_{l} 为神经网络结构的层数, \delta^{(l)}_{i} 为代价函数关于第 l 层中的第 i 个神经元加权输入总和 z^{(l)}_{i} 的偏导,因此可得:

式4.2
根据神经网络的正向传播过程,我们可以得到:

式4.3
因此,类比推理,当 l\in\left\{ n_{l}-1,n_{l}-2,...,1 \right\} 时,有:

式4.4
在前面式子的基础上,我们便很容易求出代价函数关于参数的偏导:

式4.5

式4.6
为方便运算,将式4.2、式4.4、式4.5以及式4.6转换成矩阵形式,得到:

式4.7

式4.8

式4.9

式4.10
因此,观察式4.7-式4.10,我们便得到BP算法的步骤:
- 把输入信号代入神经网络中,通过正向传播得到输出 a^{(n_{l})} 。
- 利用式4.7求出 \delta^{(n_{l})} 。
- 使 l=n_{l}-1 到 1 ,利用式4.8依次求出对应的 \delta^{(l)} 。
- 使 l=n_{l}-1 到 1,利用式4.9和式4.10依次求出偏导 \frac{\partial J(W,b,x,y)}{\partial W^{(l)}} 和 \frac{\partial J(W,b,x,y)}{\partial b^{(l)}} 。
要注意的是前面的推导都是在样本库只有一个样本的情况下进行,现在假设样本库中有m个样本,并进行参数正则化(regularization),代价函数变为:

式4.11
在前面BP算法的基础上,我们便可以使用梯度下降法来寻找最优参数,具体步骤如下:
- 对于l=n_{l}-1 到 1,使 \Delta W^{(l)}=0,\Delta b^{(l)}=0 。
- 从 i=1 到 m 中,对于所有的 l ,使:

3.更新参数:

至此,反向传播算法讲述完毕,上述相关推导参考:
五、结语
本篇文章首先从逻辑回归对于非线性分类器的局限性,引出神经网络算法;同时借鉴大脑神经元的工作模式,并进行数学模型化,得到神经网络结构,进而讲述神经网络的前向传播算法以及激活函数;与此同时,借助用神经网络构建逻辑模块的例子来阐明对于神经网络的一个直觉认识;最后,通过层层数学推导得到神经网络的后向传播算法。值得注意的是,本篇文章未给出神经网络的相关项目,考虑到为了避免文章过于冗杂,相关项目将在下一篇文章展出。 |
|