机器学习(2)——神经网络
一:前言
1.1 生物神经元
1.1.1 结构
神经细胞是构成神经系统的基本单元,称为生物神经元,简称神经元。神经元主要由树突、轴突、细胞体三部分组成,如下图:
1.1.2 工作原理
神经元的信息传递和处理是一种电化学信号,树突由于电化学作用受外界的刺激,通过胞体内的活动体现为轴突点位,当轴突点位达到一定的值形成神经脉冲或动作电位;再通过轴突末梢传递给其他的神经元,从控制论的观点来看;这一过程可以看作一个多输入单输出非线性系统的动态过程。
1.2 人工神经网络(Artificial Neural Network——ANN)
人工神经网络是加州理工大学的科学家在一个名为线形阈值函数的简单的神经模型上建立的。这个神经元模型接受输入信号,并通过一个正权数或着负权数来增强每个信号,如果输入信号的加权总和超过某个阈(这个词读“yu”四声)值,神经元会放电,产生一个输出信号。
人工神经网路具有非线性适应性信息处理能力。
1.3 感知器(Perception)
感知器可以说是人工神经网络的一个里程碑,首先我们不要被它的名字所误导,因为从根本上将感知器就是做决策的。单个感知器是对神经元最基本概念的模拟,它只包含很少网路(神经网络)的概念。它的工作原理其实已经在1.2中讲到了,这里就不做进一步的描述了。但是要注意一个不同点——输出信号,人工神经网络本身的话,是超过阈值产生输出信号,而感知器呢?当超过阈值时,输出1;小于阈值时,输出0。
从数学角度分析的话,感知器就是一个线性函数,他计算超平面,这个可以在后续分析中感知到。
用图形将感知器抽象后的结果如下:
-
x1,x2,⋯,xn 就代表我们的输入信号 -
w1,w2,⋯,wn 代表每个输入信号的增益权重 -
∑ni=1wixi 代表输入信号的加权总和,这个方程被称为**函数(Activation Function) -
f 代表**阀(Firing Threshold),即在这部我们需要将加权总和的结果和指定的阈值作比较。当大于阈值的时候输出一个值,小于阈值的时候输出另外一个值。
1.4 神经网络
神经网路是一种应用类似于大脑神经突触连接结构进行信息处理的数据类型。
神经元之间突触的联系强度可变,这种可变性我们可以从Hebb规则了解,而这个可变性也是我们学习和记忆的基础。
由心理学家W.S.McCulloch和数理逻辑学家W.Pitts建构的MP模型,提出了神经元的形式化数学描述和网络构造方法,证明了单个神经元可以执行逻辑功能:且、或、异或。而这个也是神经网络能够被使用在机器学习中重要的一点。
二:感知器实现逻辑功能
2.1 AND(且)
假设感知器接受到两个信号
我们在直角坐标系中以
这里呢。由于我们已经在场景中限定了我们只关注了0,1的情况;通过在坐标系中绘制的图形或者直接通过计算我们可以看到当前这个感知器其实在实现一个AND(且)的功能。
这个例子我们就在感知器中通过相关的权重以及阈值的设置,实现了逻辑与功能。
2.2 OR(或)
同样的我们以2.1中的输入信号标准为前提。但是我们这里要修改相应的阈值或者权重来实现逻辑或的功能。这里的答案有很多,这里我想到的一组答案:即
同样的我们可以通过在直角坐标系中将这种情况绘制出来(更加直观,推荐使用这种,更易于理解)或者通过计算的方式,你会发现,我们通过改变权重和阈值已经实现了逻辑或功能。
2.3 NOT(非)
针对这个问题我们的场景需要变换一下。这里我们讨论一个输入信号(非针对的是一个具体值,而不是二个或多个)。输入信号
同样的这个问题的答案有很多,这里呢?我提供我自己想到的一组:
通过画图或者计算,我们可以发现感知器已经实现了逻辑非功能
2.4 XOR(异或)
如果不了解什么是异或的话,可以先看一下百度百科——异或,异或又被称为二进制半加运算,其运算法则相当于不带进位的二进制加法。
先说个题外话,如果你去了解神经网络的发展历史,你会发现,就是因为异或这个问题,曾导致神经网络进入到低谷,因为数学家并不能证明神经网络能够时间逻辑异或功能。如果对神经网路的发展感兴趣的话,可以看下这篇文章——人工神经网络简介
首先给出异或值对应的表格:
|
|
AND | OR | XOR |
---|---|---|---|---|
0 | 1 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
如果你在前边在直角坐标系中绘制了相应的图标的时候,同时结合公式和一些数学上的理解,你会发现如果我们使用一个感知器是不能够实现逻辑异或功能的。因为如果我们实现逻辑异或功能,你会发现我们需要在直角坐标系分为三个部分,绘制两条直线,但是我们只有两个输入信号,是无法实现这个操作的,所以我们需要用到两个感知器来实现这个功能。如下图所示:
我们首先需要一个感知器,对两个输入变量求和,然后将结果作为第三个输入信号,和其它两个输入信号传输给第二个神经元。此时我们就需要设置三个权重和阈值
经过计算之后你就会发现实现了逻辑异或功能。
2.5 总结
这里呢?列出了感知器实现逻辑功能的几个场景,做这个场景的目的主要是为了:感受感知器的强大功能;初步感受感知器权重以及阈值。
三:感知器学习
本章就开始分析机器学习的正片,感知器学习或者说感知器训练(Perception Training)。
感知器训练的本质:Given Examples, find weights that map inputs to outputs. 即通过训练集,寻找可以将输入信号映射到输出信号的权重。所以如果我们要实习那感知器训练的话,我们需要一个系统帮我们去寻找权重。
这里呢我们讨论两种情况:Perception Rule(感知器规则)和Gradient descent(梯度下降,或者说德尔塔定律——the delta rule)。这两者的区别在于:前者是利用阈值输出的,后者不利用阈值输出。
3.1 Perception Rule
每个感知器在最初的时候都会有一个默认的权重和阈值。我们在训练的时候,需要计算每一次根据输入信号真是的输出信号,和真实的结果进行对比,然后进行比对结果,查看我们需要进行怎样的权重调整,使其能够符合我们的训练集。请先看下边的三个公式:
这里默认将阈值设置为0。但是如果考虑阈值函数的工作方式,那么我们就需要0将替换为
y |
|
分析 |
---|---|---|
1 | 1 | 正确 |
1 | 0 | 权重过小 |
0 | 1 | 权重过大 |
0 | 0 | 正确 |
大家想一想是不是,对于第二种情况1和0,你设置的权重过小,导致输入信号的增益过小达不到阈值导致输出为0。对应的0和1,由于设置的权重过大,导致输入信号增益过大超过了指定的阈值造成了这种错误。
这里呢就需要提到一点:学习频率,为什么会设置这个学习频率呢,因为你在调整权重的时候,我们并不知道我们设置的权重会不会造成权重过高或者过低,所以通过提供学习频率来控制调整权重过度的问题。
注意事项:
感知器好的地方在于如果我们的数据是线性可分的感知器规则就可以得出结果,我们只需要无限次迭代有限次就可以得到合适的权重。而这里就会牵引出另外一个问题——停机问题,如果有兴趣可以私下的研究下。当然对于非线性可分性以及线性非可分性的数据集,感知器规则就不适用了。
3.2 Gradient Descent(梯度下降)
针对3.1的算法。我们需要一个在用于非线性可分性或线性非可分性时更健壮的学习算法。而梯度下降就是这样一个算法。
相比于感知器规则,我们设定了相应的阈值(不管是默认设置为0,还是说设置了一个动态设定的阈值,然后将其作为一个权值做相应的处理)。梯度下降是在没有阈值的基础上做处理的。请看下边的公式:
这里的a代表加权总和;y代表进行阈值判断;E(w)又称为权值向量是真实的输出信息与训练集的输出信息进行比较。这里相比感知器规则的不同点是,感知器规则输出信号是1,0;而梯度下降的输出结果是加权总和。所以后者是没有阈值处理的。
为什么权值向量会乘以
E(w)进行求偏导,根据实际求导过程,你会发现如果不加
这里只提供求偏导后的结果?
根据微积分中偏导的含义,我们可以通过分析权值获取到相应的最小误差,最后的到我们最终的模型,然后就可以把这个模型运用到实际的分析中去。
如果和之前的感知器规则进行比较,你会发现两者非常的相似,当然这里也可以使用学习频率来控制调整过度的问题。
3.3 两种学习规则的比较
上边的两个公式分别对应感知器规则和梯度下降两个学习规则在获取最小测量误差时候的公式核心。
学习规则的比较:
- 前者使用了阈值化而后者没有使用阈值化操作。
- 前者仅能够处理线性数据;而后者同时还可以处理线性可分性和非线性不可分行数据集的学习算法。
- 前者保证了有限收敛性;后则只会收敛与局部最优解。
如果我们进一步的进行分析,为什么前者只能够处理线性数据集呢?这是因为如果我们对结果做了阈值化处理的话,这个结果是不可导的,因为数据集会在分解的时候发生跳跃,这是其根本原因。如下图:
那么我们能不能对其做一些相应的处理,使阈值化后的数据可导呢?
答案是,有。我们需要对阈值做柔化处理。如下图中红线所示,我们把起变成一个可导函数即可:
Sigmoid函数
首先根据这个函数的结果你会发现我们的阈值化的值是不是很想想呀?如果你想具体的了解一下可以查看Sigmoid.
这种函数的好处在于,函数可以求导,那么我们就可以将梯度下降的算法运用到整个函数中去。如果我们对这个函数进行求导会得到如下公式:
我们对这个求导结果进行分析,你会发现当值趋近于无穷的时候,结果为0;而a的值为0的时候,职位
针对柔化处理函数我们会将其结合在**函数中做相应的处理。
当然还有许多其它的柔化处理函数。如果后续有时间,我会将其补充上去。
四:神经网络
前面的讲解大部分是针对某单个神经元进行讲解的,但是在实际的运用过程中可能用到不止一个或者一层神经元。下面呢,是一个神经网路的草图:
这里的
如果我们对圣经网络中每个神经元都进行柔化处理的话,那么我们的这个神经元就可以实现对非线性数据集的操作。那将会使我们的模型更加的健壮,避免限定误差。
这里需要提到另外一种概念——反向传播,它的核心思想是以计算有益的方式来组织链式法则。按照一般的逻辑来说信息会从输入经过梯度下降到输出,而反向传播这是在传出来的同时将误差信息从输出流回到输入,这样我们就可以根据相应的内容做相应的调整。
这里要注意的就是,如果做了柔化处理的话,和感知器规则是有一定区别的,他并没有做严格意义上的阈值化处理,同时我们也不能够保证在有限的时间内收敛。
我们编写的误差函数,在现实中是会出现许多局部最优解。怎么理解这个局部最优解呢,请先看下图:
单个神经元对应的求导公式对应的是左边的图,我们可以很容易的就找到了相应的最小误差点。但是当上升到神经网络的时候,数据就会变的非常的复杂,求导后的公式就可能变成右边的结果,由于相关条件限制我们可能只找到红点所在的位置就认为我们找到了最小误差,但是实际上我们并没有找到真正的最小误差,这个就被称之为局部最优解。
五:优化和偏差
5.1 优化权重
- 冲量
- 使用更高阶的导数以便更好地优化。我们关注点的点需要上升到真个权值组中而不能只关注一个权值。
- 随机优化思想
- 如果换一个角度思考,又是并不是数据的问题,而是我们设计的结构无语复杂。我们需要降低这个复杂度。例如:回归算法的复杂度与多项式的次数有关,次数越大,想想那个公式就不想再做进一步的处理了。而这个也就是我们讨论的过拟合问题。
导致神经网络结构变复杂的原因:
- 更多的神经元
- 更多的神经元层级
- 更大的权值。所以在实际的过程中我们需要控制权值在一个合理的范围之内。
5.2 限定偏差
5.3 喜好偏差
参考文档: