大家好,又见面了,我是你们的朋友全栈君。
看了CSDN上介绍MLP的文章,有介绍原理,有介绍公式的,这篇文章是基于当时看很多篇别人的博整理的笔记(未标注原文出处,原文作者有意见请联系晴嫣,保证添加到参考链接中),MLP整体思路。
单层感知器是最简单的神经网络。它包含输入层和输出层,输入层和输出层直接相连。
单个感知器无法解决非线性问题,由多个感知器组合可以来实现非线性分类面
但是简单的组合,得到的依旧是线性分类器,为了解决这个问题,有了MLP,MLP是单层感知机的推广,与单层感知机的本质区别是增加了隐含层。
隐藏层的神经元与输入层是全连接的,假设输入层用向量X表示,则隐藏层的输出就是f(W1X+b1),W1是权重(也叫连接系数),b1是偏置,函数f可以是常用的sigmoid函数或者tanh函数,特点是连续可微。。
最后就是输出层,其实隐藏层到输出层可以看成是一个多类别的逻辑回归,也即softmax回归,所以输出层的输出就是softmax(W2X1+b2),X1表示隐藏层的输出f(W1X+b1)。
因此,MLP所有的参数就是各个层之间的连接权重以及偏置,包括W1、b1、W2、b2。对于一个具体的问题,如何确定这些参数。求解最佳的参数是一个最优化问题,解决最优化问题,最简单的就是梯度下降法了(SGD):首先随机初始化所有参数,然后迭代地训练,不断地计算梯度和更新参数,直到满足某个条件为止(比如误差足够小、迭代次数足够多时)。这个过程涉及到代价函数、规则化(Regularization)、学习速率(learning rate)、梯度计算等。
因为这种联接图没有闭环或回路。我们可以用反向传播法(back propagation)来训练上述这个神经网络。
反向传播算法分二步进行,即信号的正向传播和误差的反向传播。这两个过程的工作简述如下。
1.正向传播
在逐层处理的过程中,每一层神经元的状态只对下一层神经元的状态产生影响。在输出层把现行输出和期望输出进行比较,如果现行输出不等于期望输出,则进入反向传播过程。
2.反向传播
反向传播时,把误差信号按原来正向传播的通路反向传回,并对每个隐层的各个神经元的权系数进行修改,以望误差信号趋向最小。
BP算法具体流程如下:
①前向传播:给各连接权值分别赋一个区间(-1,1)内的随机数,选择一个数据输入,从第一层开始,计算每一层输出并保存各层输出。
②反向传播:计算最后一层输出和目标输出的差e=t-a,并根据公式计算最后一层的敏感性,其中为网络第M层输出函数对净输入n求导,最后一层为线性函数,求导为1。按照公式计算前一层的敏感性,直到第一层,其中为第m层到m-1层的权值。
③调权值:可以从第一层开始,也可以从最后一层开始进行调权。
④选择下一个输入,继续上面的过程,直到网络收敛为止。
BP算法存在的问题:
(1)梯度越来越稀疏:从顶层越往下,误差校正信号越来越小;
(2)收敛到局部最小值:尤其是从远离最优区域开始的时候(随机值初始化会导致这种情况的发生);
(3)一般,我们只能用有标签的数据来训练:但大部分的数据是没标签的,而大脑可以从没有标签的的数据中学习。
由此提出改进算法:
基于动量的BP学习算法
由于BP算法的收敛速度比较慢,可能有多个局部极小点,有不稳定性,故提出基于动量的BP算法。它能平滑振荡提高收敛性能。故引入一个动量系数 ,当动量系数增加时,振荡减小,从而有利于减少振荡数目,保持平均值。
动量可以维持算法稳定的前提下使用更高的学习速度。动量法降低了网络对于误差曲面局部细节的敏感性,有效的抑制网络陷入局部最小。
可变学习速度的BP算法
它试图在较平坦的曲面提高学习速度,而在斜率增大时减小学习速度。它的规则如下:
1)如果误差平方(在整个训练集上)在权值更新后增加了百分数z (典型值为1%至5%),则取消权值更新,学习速度乘上一个因子 (1 > r > 0),并且动量系数 g 置为 0。
2)如果误差平方在权值更新后减少,则接受权值更新,并且学习速度乘上一个因子 h>1,如果动量系数 g 先前被置为0,则恢复到先前的值。
3)如果误差平方的增加少于z,则接受权值更新,但是学习速度和动量系数不变。
改进的BP算法也有些缺点:需要设置一些额外的参数,并且算法性能对参数变化很敏感,参数的选择还和问题有关。容易使一些能收敛的数据变得不可收敛。目前还有许多的改进算法,这些方法中应用最广的是增加了冲量(动量)项的改进BP算法。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/150157.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...