介绍一个完完整整的,与我们实际使用一摸一样的多层感知机的反向传播方式

多层感知机MLP & 反向传播

与多输出感知机相比

有多层节点(绿色的)

δkk是由Okk和tk得到的

所以δ一共有k个

我们此时求的是E对Wjk的导

这是输出节点前的最后一层,前面还有好多层

也就是我们需要求E对Wij的导数

其实δk定义为从当前节点开始,即从k层的节点开始,到最终的输出层的梯度的导数的信息,只要拿到了这个信息,再乘上O节点的输出,就可以得到E对Wjk的导数

假如本层是k层,上一层是j层,知道了δk就可以求δj

比如我们要求E对Wij的导

只需要知道这一层j层的的δj和上一层的一个节点i的输出Oi

而δj是怎么求出来的呢

当前节点j的输出和下一层k的δk

所以,通过这样的顺序,可以从后往前不停地迭代,就可以计算出前面所有层的偏微分的信息,得到之后就可以使用链式法则的梯度更新方式来更新权值W

优化问题实战

2D函数优化实例

himmelblau function  专门用来检测优化器的效果

有四个局部最小值,这四个也都是全局最小解,值都是0

import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import torchdef himmelblau(x):return (x[0] ** 2 + x[1] - 11) ** 2 + (x[0] + x[1] ** 2 - 7) ** 2x = np.arange(-6,6,0.1)
y = np.arange(-6,6,0.1)
print('x,y range: ', x.shape, y.shape)
X, Y = np.meshgrid(x,y)
print('X,Y maps:',X. shape,Y. shape)
Z = himmelblau([X, Y])fig = plt.figure('himmelblau')
ax = fig.gca(projection='3d')
ax.plot_surface(X,Y,Z)
ax.view_init(60,-30)
ax.set_xlabel('x')
ax.set_ylabel('y')
plt.show()

这个图像是可以转动的

随机梯度下降法

import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import torchdef himmelblau(x):return (x[0] ** 2 + x[1] - 11) ** 2 + (x[0] + x[1] ** 2 - 7) ** 2x = np.arange(-6,6,0.1)
y = np.arange(-6,6,0.1)
print('x,y range: ', x.shape, y.shape)
X, Y = np.meshgrid(x,y)
print('X,Y maps:',X. shape,Y. shape)
Z = himmelblau([X, Y])fig = plt.figure('himmelblau')
ax = fig.gca(projection='3d')
ax.plot_surface(X,Y,Z)
ax.view_init(60,-30)
ax.set_xlabel('x')
ax.set_ylabel('y')
plt.show()#Gradient Descent
x = torch.tensor([0.,0.], requires_grad=True)  #初始化值设定为0,0
optimizer = torch.optim.Adam([x], lr=1e-3)  #优化器,目标是x,学习率是1e-3
for step in range(20000): pred=himmelblau(x)optimizer.zero_grad()  #梯度清零pred.backward() #会生成x和y的梯度信息optimizer.step() #会将x和y更新为x'和y'if step % 2000 == 0: print('step {}: x = {}, f(x) = {}'.format(step, x.tolist(), pred.item()))

我们优化的不是loss(error)了,而是函数的预测值

我们以前是求对W的微分,现在是

optimizer = torch.optim.Adam([x], lr=1e-3)

这句话是 优化器,目标是x,学习率是1e-3

意思就是只要你得到梯度以后,这句话就可以自动完成这个操作

        ∇x是x的梯度

只要你下面调用一次optimizer.step() 它就会更新一次这个过程

正确找到一个点

下面我们改变一下初始化

import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import torchdef himmelblau(x):return (x[0] ** 2 + x[1] - 11) ** 2 + (x[0] + x[1] ** 2 - 7) ** 2x = np.arange(-6,6,0.1)
y = np.arange(-6,6,0.1)
print('x,y range: ', x.shape, y.shape)
X, Y = np.meshgrid(x,y)
print('X,Y maps:',X. shape,Y. shape)
Z = himmelblau([X, Y])fig = plt.figure('himmelblau')
ax = fig.gca(projection='3d')
ax.plot_surface(X,Y,Z)
ax.view_init(60,-30)
ax.set_xlabel('x')
ax.set_ylabel('y')
plt.show()#Gradient Descent
x = torch.tensor([4.,0.], requires_grad=True)  #初始化值设定为0,0
optimizer = torch.optim.Adam([x], lr=1e-3)  #优化器,目标是x,学习率是1e-3
for step in range(20000): pred=himmelblau(x)optimizer.zero_grad()  #梯度清零pred.backward() #会生成x和y的梯度信息optimizer.step() #会将x和y更新为x'和y'if step % 2000 == 0: print('step {}: x = {}, f(x) = {}'.format(step, x.tolist(), pred.item()))

找到了另一个局部最小值

再改一下

import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import torchdef himmelblau(x):return (x[0] ** 2 + x[1] - 11) ** 2 + (x[0] + x[1] ** 2 - 7) ** 2x = np.arange(-6,6,0.1)
y = np.arange(-6,6,0.1)
print('x,y range: ', x.shape, y.shape)
X, Y = np.meshgrid(x,y)
print('X,Y maps:',X. shape,Y. shape)
Z = himmelblau([X, Y])fig = plt.figure('himmelblau')
ax = fig.gca(projection='3d')
ax.plot_surface(X,Y,Z)
ax.view_init(60,-30)
ax.set_xlabel('x')
ax.set_ylabel('y')
plt.show()#Gradient Descent
x = torch.tensor([-4.,0.], requires_grad=True)  #初始化值设定为0,0
optimizer = torch.optim.Adam([x], lr=1e-3)  #优化器,目标是x,学习率是1e-3
for step in range(20000): pred=himmelblau(x)optimizer.zero_grad()  #梯度清零pred.backward() #会生成x和y的梯度信息optimizer.step() #会将x和y更新为x'和y'if step % 2000 == 0: print('step {}: x = {}, f(x) = {}'.format(step, x.tolist(), pred.item()))

又换了一个点

深度学习与神经网络(三)——多层感知机 反向传播 优化实战相关推荐

  1. 【深度学习】基于Pytorch多层感知机的高级API实现和注意力机制(三)

    [深度学习]基于Pytorch多层感知机的高级API实现和注意力机制(三) 文章目录 [深度学习]基于Pytorch多层感知机的高级API实现和注意力机制(三) 1 权重衰减 1.1 范数 1.2 L ...

  2. 深度学习笔记其三:多层感知机和PYTORCH

    深度学习笔记其三:多层感知机和PYTORCH 1. 多层感知机 1.1 隐藏层 1.1.1 线性模型可能会出错 1.1.2 在网络中加入隐藏层 1.1.3 从线性到非线性 1.1.4 通用近似定理 1 ...

  3. 【深度学习】基于Pytorch多层感知机的高级API实现和注意力机制(二)

    [深度学习]基于Pytorch多层感知机的高级API实现和注意力机制(二) 文章目录1 代码实现 2 训练误差和泛化误差 3 模型复杂性 4 多项式回归4.1 生成数据集4.2 对模型进行训练和测试4 ...

  4. 【深度学习】基于Pytorch多层感知机的高级API实现和注意力机制(一)

    [深度学习]基于Pytorch多层感知机的高级API实现和注意力机制(一) 文章目录 1 概述 2 从线性到非线性-激活函数2.1 ReLU函数2.2 sigmoid函数2.3 tanh函数 3 注意 ...

  5. 动手学深度学习(PyTorch实现)(五)--多层感知机

    多层感知机 1. 基本知识 2. 激活函数 2.1 ReLU函数 2.2 Sigmoid函数 2.3 tanh函数 2.4 关于激活函数的选择 3. PyTorch实现 3.1 导入相应的包 3.2 ...

  6. 深度学习:神经网络中的前向传播和反向传播算法推导

    1. 神经网络 这是一个常见的神经网络的图: 这是一个常见的三层神经网络的基本构成,Layer L1是输入层,Layer L2是隐含层,Layer L3是隐含层,当我们输入x1,x2,x3等数据时,通 ...

  7. 深度学习入门(6)误差反向传播基础---计算图与链式法则

    在我的第三篇博文<深度学习入门(3)神经网络参数梯度的计算方式>中详细介绍了通过微分方式计算神经网络权重参数的梯度.但是数值微分的方式计算梯度效率较低.后续博文会介绍另外一种更加高效的梯度 ...

  8. 深度学习入门|第5章 误差反向传播法(二)

    误差反向传播法 前言 此为本人学习<深度学习入门>的学习笔记 四.简单层的实现 本节将用 Python 实现前面的购买苹果的例子.这里,我们把要实现的计算图的乘法节点称为"乘法层 ...

  9. 深度学习与神经网络-吴恩达-第二周优化算法

    一.Mini-batch梯度下降法 前面介绍的向量化方法能够让我们高效的处理m个样本数据,模型输入的也就是m个样本按列堆叠而成的矩阵X,同样地,输入数据的标签也是m个样本标签按列堆叠而成的矩阵Y.但是 ...

最新文章

  1. html5 漏洞,HTML 5漏洞可致硬盘遭垃圾数据填满
  2. 看见到洞见之引子(一)机器学习算法
  3. 文本界面安装linux 7,安装 CentOS7 后必做的事 [最小化、文本界面]
  4. python如何使用字典_Python-如何使用点“。” 访问字典成员?
  5. 监听浏览器是否被缩放 - 案例篇
  6. UNIX不带缓存的IO函数
  7. NIO系列六:流行 NIO Framework netty 和 mina 性能测评与分析
  8. Centos6.5 x86_64系统安装kvm虚拟机—基础篇
  9. atitit. js 跨界面 页面 web cs 传值方法总结
  10. WMware Mac 一些优化
  11. 产品经理/技术总监的能力模型
  12. 【LINUX】自己整理的干货,拿去看吧,不谢!!!。。。。。。。。。。。。
  13. 史上最纯净的Win7专业版系统
  14. 若依代码生成使用教程
  15. 列表推导式+生成器+面向对象一(对象的结构+类的定义)2020-22-23
  16. matlab练习程序(渲染三原色)
  17. error LNK2001: 无法解析的外部符号 __imp____iob_func
  18. 微信打不开链接怎么办,微信跳转外部浏览器打开
  19. 使用security和jwt进行安全登录
  20. Leetcode- 岛屿数量

热门文章

  1. Linux 上的/proc/sysrq-trigger的使用
  2. [日知录18]pcl点云
  3. (c语言)Saving James Bond - Hard Version (30分)
  4. Hive 快速上手--官网中文翻译
  5. 享存Mobox-由简到繁企业文件管理系统
  6. 如何查看 Linux 系统安装的时间
  7. 【模糊推理】模糊逻辑图像边缘检测,原理+matlab代码~
  8. js实现超出显示省略号
  9. kotlin开发-快速入门与实践-王志强
  10. 2016年4月12日。