一、神经网络介绍(Neural network)
神经网络是一种人类由于受到生物神经细胞结构启发而研究出的一种算法体系。
经典的神经网络。这是一个包含三个层次的神经网络。我们称图中的圆圈为神经元,左边三个神经元组成的一列为输入层,中间神经元列为隐藏层,右边神经元列为输出层,神经元之间的箭头为权重(或参数)。权重具体的值需要通过神经网络的训练才能获得。
我们实际生活中的学习体现在大脑中就是一系列神经网络回路的建立与强化,多次重复的学习能让回路变得更加粗壮,使得信号的传递速度加快,最后对外表现为“深刻”的记忆。人工神经网络的训练也借鉴于此,如果某种映射关系出现很多次,那么在训练过程中就相应调高其权重。
1、感知器(单层神经网络):
感知器是一种二元分类器,它是神经网络的基石。感知器是对神经细胞的模拟:
一个神经元通常具有多个树突 ,主要用来接受传入信息,而轴突只有一条,轴突尾端有许多轴突末梢,可以给其他多个神经元传递信息。轴突末梢跟其他神经元的树突产生连接,从而传递信号。
神经元是计算单元,相当于神经元细胞的细胞核,利用输入的数据进行计算,然后输出,一般由一个线性计算部分和一个非线性计算部分组成;输入层和输出层实现数据的输入输出,相当于细胞的树突和轴突末梢;隐藏层指既不是输入也不是输出的神经元层,一个神经网络可以有很多个隐藏层。
输入以向量的形式表示x=(x0,x1, x2),你可以把它们理解为不同的特征维度,其中的x0是偏置单元(bias unit),相当于线性回归中的常数项。在经过“神经元”(激活函数)的计算后,感知器会输出一个大于0或小于0的数。箭头上的数字代表每个特征的权量(weights),相当于线性回归模型的参数,是收集信息的神经突触。
总结:单层的神经网络其实就是一个逻辑回归函数。
2、多层神经网络
单层感知器虽然可以建立与门、或门、非门等,但无法建立更为复杂的异或门(XOR),即两个输入相同时输出1,否则输出0。
为了更为直观地理解这个问题,我们可以看下图:
模型有两个输入(input1和input2),我们可以线性地区分或门的两类情况:即同时为0时在左下角,其它情况在右上角;与门的情况也可以线性地区分,即输出同时为1时在右上角,其它情况在左下角。但异或门呢?这种情况是无法作出线性区分的,也就是说,单层感知器无法实现异或门。
我们在输入层和输出层之间加入两个单元的隐藏层:对于隐藏层的a_1单元(上标2代表这是第2层)来说,它实际上是且门(都为1时才输出1);对a_2单元来说,它的逻辑是(not x_1) and (not x_2),即同时为0时才输出1。而从隐藏层到输出层,是逻辑或。如下图所示:
用神经网络如何实现异或门?
因为上面感知器的激活函数是线性函数。这种情况下,神经网络的输出也只是输入的某种线性函数,只不过是通过网络的形式来进行加权。线性函数的线性组合仍然是线性函数。也就是说,即便是多层的感知器,激活函数为线性时也无法实现输入00和输入11时的输出比输入01和10时大,即非线性。
把激活函数换为Sigmoid函数:
总结: 多层神经网络其实就是一组神经元连接在一起的集合。
神经网络的第一层是输入层,值为xi,最后一层是输出层,如果作为分类算法训练则有多少个类别就应该有多少个对应的输出单元,对应的输出单元被激活代表着分类的结果。隐藏层可以有多层,每层可以有多个单元,规模越大训练的模型越复杂。而对于隐藏层中的每个单元本身都是一个逻辑回归的过程,也就是说每个隐藏单元都训练出了一个比前一层更加复杂的特征,这样一层接一层我们就可以训练出越来越复杂的特征,直到得到结果。一般凭经验来确定隐藏层到底应该有多少个节点,在测试的过程中也可以不断调整节点数以取得最佳效果。
二、为什么需要神经网络
首先,神经网络应用在分类问题中效果很好。 工业界中分类问题居多。LR或者linear SVM更适用线性分割。如果数据非线性可分(现实生活中多是非线性的),LR通常需要靠特征工程做特征映射,增加高斯项或者组合项;SVM需要选择核。 而增加高斯项、组合项会产生很多没有用的维度,增加计算量。GBDT可以使用弱的线性分类器组合成强分类器,但维度很高时效果可能并不好。
从逻辑回归看,单层感知器只能解决线性问题。要解决非线性问题,需要引入多层感知器(加入隐层)。
三、神经网络的发展历程
从单层神经网络(感知器)开始,到包含一个隐藏层的两层神经网络,再到多层的深度神经网络,一共有三次兴起过程。神经网络为什么能这么火热?简而言之,就是其学习效果的强大。随着神经网络的发展,其表示性能越来越强。
从单层神经网络,到两层神经网络,再到多层神经网络,下图说明了,随着网络层数的增加,以及激活函数的调整,神经网络所能拟合的决策分界平面的能力。
快速发展的外因:更强的计算性能,更多的数据,以及更好的训练方法。
四、前向传播
在已经训练好权值的神经网络上,预测的工作是通过前向传播来实现的,所谓的“前向”就是从输入层到输出层的方向。整个传播过程就是沿着神经网络的方向在每个神经元上做逻辑回归,不断训练出更加复杂的特征,最后得到输出。以下图的神经网络为例:
五、代价函数与正则化
六、后向传播(bp算法)
BP算法是一种计算偏导数的有效方法,它的基本原理是:利用前向传播最后输出的结果来计算误差的偏导数,再用这个偏导数和前面的隐藏层进行加权求和,如此一层一层的向前传下去,直到输入层(不计算输入层),最后利用每个节点求出的偏导数来更新权重。
BP的思想就是:利用输出后的误差来估计输出层前一层的误差,再用这层误差来估计更前一层误差,如此获取所有各层误差估计。这里的误差估计可以理解为某种偏导数,我们就是根据这种偏导数来调整各层的连接权值,再用调整后的连接权值重新计算输出误差。直到输出的误差达到符合的要求或者迭代次数溢出设定值。
BP网络的数学原理:
激活函数的求导:
用什么方法最小化L?用随机梯度下降。也就是对每个训练样本都使权重往其负梯度方向变化。现在的任务就是求L对连接权重w的梯度。
直观的BP神经网络的工作过程总结如下:
实例:
学习率是一个预先设置好的参数,用于控制每次更新的幅度。
此后,对全部数据都反复进行这样的计算,直到输出的误差达到一个很小的值为止。
这里介绍的是计算完一条记录,就马上更新权重,以后每计算完一条都即时更新权重。实际上批量更新的效果会更好,方法是在不更新权重的情况下,把记录集的每条记录都算过一遍,把要更新的增值全部累加起来求平均值,然后利用这个平均值来更新一次权重,然后利用更新后的权重进行下一轮的计算,这种方法叫批量梯度下降(Batch Gradient Descent)。
七、随机初始化权重参数
在神经网络中训练初始化时,要特别注意不能使Θ中的值都相同,这样会使每一层的神经元都训练出完全相同的特征,神经网络就完全无法工作了。因此,在训练开始前,应该对Θ进行随机的初始化。
对每一个Θ值(权重参数)随机初始化为一个[ -ε , ε ]范围的值:
八、梯度检测
当Θ为实数时:[ J(Θ+ε)- J(Θ - ε)] / 2 给出图像在改点的导数的近似值。
当Θ是一个n维向量时:
反向传播是计算代价函数关于所有参数的导数或偏导数的一种有效方法。
用梯度检测得到的导数值与反向传播所计算出的导数值进行比较,如果一样或者数值相近,就可以确定反向传播的实现是正确的。
总结:
神经网络的整个过程:
1、选择网络架构:多少个隐藏层(默认一个最合理),每层多少个隐藏单元(越多越好)
2、构建网络,随机初始化权重参数
3、计算出代价函数(损失函数)
4、反向传播计算出代价函数J(Θ)关于所有参数的导数或偏导数
5、梯度检测方法计算出导数值,把反向传播计算得到的导数值与其进行比较,看是否相等或相近。
6、比较后,值相近,以后停用梯度检测
7、用最优化算法,如梯度下降算法来最小化J(Θ)
参考: