深度学习笔记--多层感知器以及BP算法

简介

多层感知器,是指包含1个或多个隐层的前馈神经网络。
在这里插入图片描述

前馈神经网络的特点:

  1. 第0层为输入层,最后一层为输出层,中间层为隐层。
  2. 整个网络无反馈,信号从输入层向输出层单向传播,整个网络为有向无环图。
  3. 激活函数多使用连续非线性函数,如logistic函数。 3.激活函数多使用连续非线性函数,如logistic函数。
  4. 可看成多层logistic回归模型的组合。
  5. 具有解决复杂模式分类的能力,解决简单感知不能解决的线性不可分问题。

其可以解决单层感知器不能解决异或的问题(线性不可分问题),可以用来作多元分类问题,例如手写数字识别。
在这里插入图片描述

反向传播算法

反向传播算法是在Rumelhart 以及Hinton 在1986年在nature上发表出的一篇文章介绍。在该文章发表之前,神经网络又开始焕发青春(神经网络研究寒冬),原因是该算法可以很好的解决神经网络的模型参数训练问题。以下是该文章:
Rumelhart D E, Hinton G E, Williams R J. Learning representations by back-propagating errors[J]. nature, 1986, 323(6088): 533.
以下是我个人在学习李宏毅(Hung-yi Lee)教授课程的内容,其课程讲的反向传播算法很生成,也很容易理解。以下是课程的地址:http://speech.ee.ntu.edu.tw/~tlkagk/courses_MLSD15_2.html
同时,李教授在YouTobe上也讲解了很多其他深度学习算法的课程,都非常不错,有兴趣的读者可以观看:https://www.youtube.com/channel/UC2ggjtuuWvxrHHHiaDH1dlQ

学习神经网络,我们知道常用的梯度下降算法,首先需要定义损失函数。如下图所示,我们有多个样本,我们定义所有样本的总损失函数:
在这里插入图片描述
这里的话,只需要算一个样本的梯度 C r ( θ ) C^{r}\left ( \theta \right ) Cr(θ)就行了,将所有样本的进行加和就是所有的梯度了。
跟对某一个样本,来计算梯度 ▽ C r ( θ ) \triangledown C^{r}\left ( \theta \right ) Cr(θ)
针对网络中的某层的权重,计算偏微分,如下图所示:
在这里插入图片描述
在上图中,用到了微分计算中的链式法则。其中,上图中的损失函数对权重的偏微分,可以分成两部分。针对第一部分,比较容易求,求得的结果如下图所示:
在这里插入图片描述
针对第二部分,求起来还是很麻烦的,这里采用的是反向计算【反向传播】,从最后一层向隐层计算。如下图所示,核心包含两个部分,第一部分是怎么计算最后一层的偏微分,第二部分是怎么求找 l l l层与 l + 1 l+1 l+1层偏微分的关系
在这里插入图片描述
下面来计算 δ L \delta ^{L} δL,如下图所示:

在这里插入图片描述
在这里插入图片描述
计算** δ L \delta ^{L} δL使用的也是链式法则,计算起来很简单。

下面依旧利用链式法则寻找 δ l \delta ^{l} δl δ l + 1 \delta ^{l+1} δl+1的关系,如下图所示:
在这里插入图片描述
上图中的加和相当于是对 l + 1 l+1 l+1层的所有节点进行计算,求出具体的值如下图所示:在这里插入图片描述
这样就能获得每个节点的偏微分,从下图便能够看出反向的概念,即只要知道下一层的值,便能计算该层的值。
在这里插入图片描述
转化成矩阵相乘的结果,便可以计算得到 δ l \delta ^{l} δl δ l + 1 \delta ^{l+1} δl+1
在这里插入图片描述

参考

https://www.youtube.com/channel/UC2ggjtuuWvxrHHHiaDH1dlQ
http://speech.ee.ntu.edu.tw/~tlkagk/courses/MLDS_2015_2/Lecture/DNN backprop.ecm.mp4/index.html

BP多层感知器 源代码 神经网络 tic; %计时开始 clc; %清屏 clear all; %清除所有变量 disp('输入层神经元个数: 16'); %显示输入层神经元个数 input=16; disp('中间层神经元个数: 8'); %显示中间层神经元个数 middle=8; disp('输出层神经元个数: 3'); %显示输出层神经元个数 output=3; disp('输入模式1 2 3及其对应的输出:'); x1=[1;1;1;1;1;0;0;1;1;1;1;1;1;0;0;1]; %x1(16,1) y1=[1;0;0]; %y1(3,1) x2=[0;1;0;0;0;1;0;0;0;1;0;0;0;1;0;0]; %x2(16,1) y2=[0;1;0]; %y2(3,1) x3=[1;1;1;1;1;0;0;1;1;0;0;1;1;1;1;1]; %x3(16,1) y3=[0;0;1]; %y3(3,1) disp('形成一张供调用的样本向量表:'); disp('X_sample向量表:x1,x2,x3'); X_sample=[x1,x2,x3] %x1,x2,x3向量表>>>X(16,3) disp('X_sample向量表:y1,y2,y3'); Y_sample=[y1,y2,y3] %y1,y2,y3向量表>>>Yo(3,3) disp('初始化连接权矩阵:'); disp('显示初始化连接权矩阵v(16,8):v(i,j):v(input,middle):'); v=rands(input,middle); %初始化连接权矩阵v(i,j) :输入层与中间层的连接权>>>v(16,8) disp(v); %显示初始化连接权矩阵v(i,j) disp('显示初始化连接权矩阵w(8,3):w(j,k):w(middle,output):'); w=rands(middle,output); %初始化连接权矩阵w(j,t) :中间层与输出层的连接权>>>w(8,3) disp(w); %显示初始化连接权矩阵w(j,t) disp('初始化阈值矩阵:'); disp('中间层阈值矩阵th1(8,1):th1(j,1):th1(middle,1):'); th1=rands(middle,1); %初始化中间层阈值矩阵th1 :中间层的阈值>>>th1(8,1) disp(th1); %显示中间层阈值矩阵th1 disp('输出层阈值矩阵th2(3,1):th2(k,1):th2
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值