前言:神经网络的研究早在20世纪40年代就已经开始了,发展到今天形成了庞大的体系并且具有多学科交叉的特点。
由于神经网络具有多学科交叉的特点,所以对于神经网络的定义不一。我们采用最广泛的一种定义,即由Kohonen于1988年提出的:神经网络(neural networks)是由具有适应性的简单单元组成的广泛并行互联的网络,它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应。
下面我们来看看经久不衰的M-P神经元模型。
为了便于理解,我对这个模型做一个简单的解释:n个神经元分别产生各自的输入x1、x2······xn,各自附有连接权重w1、w2······wn,输入值与接收的神经元阈值seta进行比较,通过激活函数产生输出。
常见的激活函数:
x= linspace(0,1,101);
y = [zeros(1,50),ones(1,51)];
plot(x,y);
x= [-100:0.1:100];
y=1./(1+exp(-x) );
plot(x,y);
……另外激活函数还有很多这里就不一一列举了。需要指出的是单位阶跃函数是我们理想的激活函数,但由于其不是很光滑,性质不是很好,大多数情况下我们使用其他函数来代替单位激活函数。
为了更好地理解感知机与多层网络,我们首先可以建立逻辑与、或、非、异或、或非、与非的概念。
与:当所有输入条件同时满足1,输出1;输入条件只要有0即输出0。
或:输入条件有1即输出1;一个1也没有才输出0。
非:输出结果与输入条件取反。即0为1,1为0。
异或:对于两个输入门,输入条件相同为0,不同为1
或非:对于两个输入门,两输入条件都不为1时输出1;否则输出0。
与非:当输入条件都为1时反而输出0。
感知机由两层神经元组成,即输入层接受外界信号后加权传递给输出层。
我们知道
假定f为单位阶跃函数,通过控制权重和阈值可以实现逻辑与或非运算。那么我们很容易想到,权重和阈值如何确定呢?
答案是“学习”。其实阈值可看作固定输入为-1的“哑结点”,对应的连接权重为Wn+1,这样的话“学习”就等同于对于权重的学习。遵循“知错就改”的学习规则,即:
其中η(0<η<1)成为学习率,感知机根据估计值的错误程度进行调整。
实际上,感知机仅有一层功能神经元,即仅有输出层进行激活函数处理,能力有限,对于解决异或等逻辑问题显得能力不足。
先来谈谈线性可分与非线性可分问题:
此处就不给出严密的定义了,线性可分即为用一个线性超平面可以将两类模式分开,反之即为非线性可分。
对于异或问题,有:
只能用两个线性超平面将两类分割,这样,我们原有的具有两层神经元的感知机就要扩展层数了,发展为多层神经网络,引入的层处于输入层和输出层之间,称为隐层,那么就有单隐层前馈网络与双隐层前馈网络。如果网络拓扑结构上不存在环或者回路,那么称之为多层前馈神经网络。
要发展多层神经网络,就必须有强大的算法支撑,毕竟感知机的“知错就改”型学习规则太简单了。下面我们来看看至今为止最成功的神经网络算法——误差反向传播法。
对于具体的推导,方法不一,入手角度也不一,我用隐层到输出层的权重推导了1h,十分复杂,很容易就搞错了符号和下标。
推荐:[https://blog.csdn.net/u010858605/article/details/69857957]
关于累积BP与标准BP:
首先我们应该明确,BP算法的目标是最小化训练集上的累积误差,但标准BP算法每次只针对单个训练样例更新权重,更新显得更加频繁,处理更加复杂,时间也较长,并且不同次更新可能互相抵消。累积BP算法针对累积误差最小化,处理速度较快,但在某些问题中,累积误差减小到一定程度后难以下降,这时标准BP算法可能就取得较好的解。
由于神经网络的功能实在是太强大了,其往往遭遇过拟合问题,指的是模型对于训练集高度拟合,但对于测试集的测试误差却不断升高。那么如何解决呢?
将数据集分为训练集和验证集,若训练集误差降低但验证集误差上升那么停止训练,同时返回具有最小验证集误差的连接权和阈值
正则化的方法也不一,但基本思想都是一致的,即在误差目标函数中增加一个用于描述网络复杂度的部分,误差由经验误差和网络复杂度加权求和决定。
其实通俗地理解正则化就是使参数矩阵变得稀疏,淡化或忽略某些特征的影响,因而缓解了过拟合现象。
我们欲求寻找一组合适的参数使得误差目标函数取得全局最小,这是一个参数寻优过程。我们知道,全局最小一定是局部最小,局部最小却不一定是全局最小。有时我们可能陷入了局部最小,这个问题需要解决。
·······
另外需要指出的是,这些算法均为启发式算法,缺乏数学保障。
神经网络、机器学习、深度学习……发展实在是太快了,持续更新ing