神经网络入门-笔记

文章目录
原文地址:https://ngunauj.github.io

动机
对于非线性分类问题,如果用多元线性回归进行分类,需要构造许多高次项,导致特征特多学习参数过多,从而复杂度太高。
直线方程y=kx+b改为二次曲线方程y=ax^ 2+bx+c时,参数(Parameter)由2个(分别是k、b)变为3个(分别是a、b、c),特征(Feature)由1个(x)变为2个(x^2和x)。三次曲线和复杂的多项式回归会增加更多的参数和特征。

前面讲的是总结一串数字的规律,现实生活中我们往往要根据多个特征(多串数字)来分析一件事情,每个原始特征我们都看作是一个维度(Dimension)。例如一个学生的学习成绩好坏要根据语文、数学、英语等多门课程的分数来综合判断,这里每门课程都是一个维度。当使用二次曲线和多变量(多维)拟合的情况下,特征的数量会剧增,特征数=维度^2/2 这个公式可以大概计算出特征增加的情况,例如一个100维的数据,二次多项式拟合后,特征会增加到100x100/2=5000个。
下面是一张50x50像素的灰度图片,如果用二次多项式拟合的话,它有多少个特征呢?——大约有3百万!
它的维度是50x50=2500,特征数=2500x2500/2=3,125,000。如果是彩色图片,维度会增加到原来的3倍,那么特征数将增加到接近3千万了!
现实中,一张图片不肯能是50x50的,很显然,前面的那些回归方法已经不够用了,我们急需找到一种数学模型,能够在此基础上不断减少特征,降低维度。
神经元
有一种假说:“智能来源于单一的算法(One Learning Algorithm)”。如果这一假说成立,那么利用单一的算法(神经网络)处理世界上千变万化的问题就成为可能。我们不必对万事万物进行编程,只需采用以不变应万变的策略即可。有越来越多的证据证明这种假说,例如人类大脑发育初期,每一部分的职责分工是不确定的,也就是说,人脑中负责处理声音的部分其实也可以处理视觉影像。
下图是单个神经元(Neuron)
12
下面是单个神经元的数学模型
13
解释一下:+1代表偏移值(偏置项, Bias Units);X1,X2,X2代表初始特征;w0,w1,w2,w3代表权重(Weight),即参数,是特征的缩放倍数;特征经过缩放和偏移后全部累加起来,此后还要经过一次激活运算然后再输出。激活函数有很多种,后面将会详细说明。

1
2
3
4
5
6
7
设x1 = 10,x2 = 30, x3 = 8;
w0 = 2, w1 = -1, w2 = 0.5, w3 = 6
x = 1*w0 + x1*w1 + x2*w2 + x3*w3
= 2 + 10*(-1) + 30*0.5 + 8*6
= 55
此时如果激活函数y = x/5那么输出值 y = 55 /5 = 11
X1*w1+X2*w2+...+Xn*wn这种计算方法称为加权求和(Weighted Sum)法

这个数学模型有什么意义呢?下面我对照前面那个 y=kx+b 直线拟合的例子来说明一下
14
这时我们把激活函数改为Purelin(45度直线),Purelin就是y=x,代表保持原来的值不变。
这样输出值就成了 Y直线点 = b + X直线点乘k,即y=kx+b。看到了吧,只是换了个马甲而已,还认的出来吗?下一步,对于每个点都进行这种运算,利用Y直线点和Y样本点计算误差,把误差累加起来,不断地更新b、k的值,由此不断地移动和旋转直线,直到误差变得很小时停住(收敛)。这个过程完全就是前面讲过的梯度下降的线性回归。
一般直线拟合的精确度要比曲线差很多,那么使用神经网络我们将如何使用曲线拟合?答案是使用非线性的激活函数即可,最常见的激活函数是Sigmoid(S形曲线),Sigmoid有时也称为逻辑回归(Logistic Regression),简称logsig。
y=logsig(x)=1/(1+exp(-x))
还有一种S形曲线也很常见到,叫双曲正切函数(tanh),或称tansig,可以替代logsig。
y=tansig(x)=(exp(x)-exp(-x))/(exp(x)+exp(-x))
15
【注】激活函数的意义:为了限制y的范围在0~1之间,同时保持x的线性和单调方向。S函数的好处是,其导函数是规则的连续函数,易于计算传递误差(Sigmoid导数 = Sigmoid(1-Sigmoid)).同时在S形中间区域具有最大的斜率,能够保持数据的灵敏度。
*神经网络

下面是几种比较常见的网络形式:
15

  • 左边蓝色的圆圈叫“输入层”,中间橙色的不管有多少层都叫“隐藏层”,右边绿色的是“输出层”。
  • 每个圆圈,都代表一个神经元,也叫节点(Node)。
  • 输出层可以有多个节点,多节点输出常常用于分类问题。
  • 理论证明,任何多层网络可以用三层网络近似地表示。
  • 一般凭经验来确定隐藏层到底应该有多少个节点,在测试的过程中也可以不断调整节点数以取得最佳效果。
    计算方法:
    16
  • 虽然图中未标识,但必须注意每一个箭头指向的连线上,都要有一个权重(缩放)值。
  • 输入层的每个节点,都要与的隐藏层每个节点做点对点的计算,计算的方法是加权求和+激活,前面已经介绍过了。(图中的红色箭头指示出某个节点的运算关系)
  • 利用隐藏层计算出的每个值,再用相同的方法,和输出层进行计算。
  • 隐藏层用都是用Sigmoid作激活函数,而输出层用的是Purelin。这是因为Purelin可以保持之前任意范围的数值缩放,便于和样本值作比较,而Sigmoid的数值范围只能在0~1之间。
  • 起初输入层的数值通过网络计算分别传播到隐藏层,再以相同的方式传播到输出层,最终的输出值和样本值作比较,计算出误差,这个过程叫前向传播(Forward Propagation)。
    前面讲过,使用梯度下降的方法,要不断的修改k、b两个参数值,使最终的误差达到最小。神经网络可不只k、b两个参数,事实上,网络的每条连接线上都有一个权重参数,如何有效的修改这些参数,使误差最小化,成为一个很棘手的问题。从人工神经网络诞生的60年代,人们就一直在不断尝试各种方法来解决这个问题。直到80年代,误差反向传播算法(BP算法)的提出,才提供了真正有效的解决方案,使神经网络的研究绝处逢生。
    BP算法是一种计算偏导数的有效方法,它的基本原理是:利用前向传播最后输出的结果来计算误差的偏导数,再用这个偏导数和前面的隐藏层进行加权求和,如此一层一层的向后传下去,直到输入层(不计算输入层),最后利用每个节点求出的偏导数来更新权重。
    17
    为了便于理解,后面我一律用“残差(error-term)”这个词来表示误差的偏导数。
    输出层→隐藏层:残差 = -(输出值-样本值) 激活函数的导数
    隐藏层→隐藏层:残差 = (右层每个节点的残差加权求和)
    激活函数的导数
    如果输出层用Purelin作激活函数,Purelin的导数是1,输出层→隐藏层:残差 = -(输出值-样本值)
    如果用Sigmoid(logsig)作激活函数,那么:Sigmoid导数 = Sigmoid*(1-Sigmoid)
    输出层→隐藏层:残差 = -(Sigmoid输出值-样本值) x Sigmoid x (1-Sigmoid) = -(输出值-样本值)x输出值x(1-输出值)
    隐藏层→隐藏层:残差 = (右层每个节点的残差加权求和) x 当前节点的Sigmoid x (1-当前节点的Sigmoid)
    此后,对全部数据都反复进行这样的计算,直到输出的误差达到一个很小的值为止。
    以上介绍的是目前最常见的神经网络类型,称为前馈神经网络(FeedForward Neural Network),由于它一般是要向后传递误差的,所以也叫BP神经网络(Back Propagation Neural Network)。
    BP神经网络的特点和局限:
  • BP神经网络可以用作分类、聚类、预测等。需要有一定量的历史数据,通过历史数据的训练,网络可以学习到数据中隐含的知识。在你的问题中,首先要找到某些问题的一些特征,以及对应的评价数据,用这些数据来训练神经网络。
  • BP神经网络主要是在实践的基础上逐步完善起来的系统,并不完全是建立在仿生学上的。从这个角度讲,实用性 > 生理相似性。
  • BP神经网络中的某些算法,例如如何选择初始值、如何确定隐藏层的节点个数、使用何种激活函数等问题,并没有确凿的理论依据,只有一些根据实践经验总结出的有效方法或经验公式。
  • BP神经网络虽然是一种非常有效的计算方法,但它也以计算超复杂、计算速度超慢、容易陷入局部最优解等多项弱点著称,因此人们提出了大量有效的改进方案,一些新的神经网络形式也层出不穷。
    1
    2
    3
    4
    5
    6
    7
    这里介绍的是计算完一条记录,就马上更新权重,以后每计算完一条都即时更新权重。实际上批量更新的效果会更好,方法是在不更新权重的情况下,把记录集的每条记录都算过一遍,把要更新的增值全部累加起来求平均值,然后利用这个平均值来更新一次权重,然后利用更新后的权重进行下一轮的计算,这种方法叫批量梯度下降(Batch Gradient Descent)。
    reference:http://c.tieba.baidu.com/p/3013551686?pid=49703036815&see_lz=1

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
,