发布时间:2024-02-10 17:30
谈起bp神经网络,很多人都非常熟悉,以前我也只是单纯的调包使用,后来由于课程需要,从原理入手,开始慢慢理解bp算法。
1、激活函数
首先谈一谈激活函数。激活函数有很多种,比较常见的有符号函数,ReLU函数,Sigmoid函数,Softmax函数等。实际上激活函数就是模拟大脑神经元的响应,而最简单的单层单个神经元构成的就是感知机。符号函数与ReLU函数在此不多赘述,主要讲一下Sigmoid函数和Softmax函数。
Sigmoid函数其实就是高中生物学习的S型曲线,由于其单增以及反函数单增等性质,Sigmoid函数常被用作神经网络的激活函数,也叫Logistic函数,用于隐层神经元输出。公式为:
代码实现为:
#sigmoid函数
def sigmoid(x):
return 1.0/(1+np.exp(-x))
也称为“归一化函数”。具体公式如下:
2、单层感知机
单层感知机即模拟神经元的操作,多重条件的输入对应某一个输出,通常用来进行分类问题。分类器的输入为N维向量 Xt={x0,x1,…,xn},权值为Wt={w0,w1,…,wn},采用一定的分类方式(如累加,与非等),将不同的输入进行一定的取值,以达到分类的目的。
但是,我们无法预先得知正确的分类权值,故此时我们就需要进行迭代纠错学习,以得到正确的权值。具体步骤如下:
通俗一点讲就是我们将所有的已知模型代入计算,如果结果不符,则更改权值,最终直到所有的样本都符合条件,就得到了最终的权值。
3、BP算法
单层感知机虽然方便,可是存在着一个重要的缺陷,无法解决线性不可分问题,只能解决线性可分问题。也是因为这个原因神经网络在历史的某一段时间较为沉寂- -。
而多层感知机相较于单层感知机多了隐含层这个概念。而BP算法是多层感知机的代表性算法,它将输出层观察到的误差沿着与输入信号传送方向相反的方向逐级向网络的输入层传播,从而指导各层神经元连接权值的调整。
简单点说,就是工作信号沿着网络正向传播(->),而误差信号沿着网络反向传播(<-)。先更新后面一层的权值,再更新前面一层的权值。实际上,BP算法就是采用梯度下降的方法去寻找最小值。它不断的调整自己的权值,以接近最终的最小值。
总体来说,BP神经网络的流程如下:
在第二步中,调整权值的最主要公式如下所示:
对于每一个训练样本,计算∂En/∂ωji,从而进行权值的相应调整。具体流程图如下图所示:
其中部分代码展示如下:
#定义输入层与隐藏层之间的初始权重
self.wih=numpy.random.normal(0.0,pow(self.hnodes,-0.5),(self.hnodes,self.inodes))
#定义隐藏层与输出层之间的初始权重
self.who=numpy.random.normal(0.0,pow(self.onodes,-0.5),(self.onodes,self.hnodes))
#利用梯度下降法更新迭代初始权重
self.who+=self.lr*numpy.dot((output_errors*final_outputs*(1-final_outputs)),
numpy.transpose(hidden_outputs))
self.wih+=self.lr*numpy.dot((hidden_errors*hidden_outputs*(1-hidden_outputs)),
(numpy.transpose(inputs)))
以上就是我对BP神经网络的简单理解,一直拖到快考试才终于大概写出来,后面如果有时间会再补充哒~