深度学习与神经网络(三)——多层感知机 反向传播 优化实战
介绍一个完完整整的,与我们实际使用一摸一样的多层感知机的反向传播方式
多层感知机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()))
又换了一个点
深度学习与神经网络(三)——多层感知机 反向传播 优化实战相关推荐
- 【深度学习】基于Pytorch多层感知机的高级API实现和注意力机制(三)
[深度学习]基于Pytorch多层感知机的高级API实现和注意力机制(三) 文章目录 [深度学习]基于Pytorch多层感知机的高级API实现和注意力机制(三) 1 权重衰减 1.1 范数 1.2 L ...
- 深度学习笔记其三:多层感知机和PYTORCH
深度学习笔记其三:多层感知机和PYTORCH 1. 多层感知机 1.1 隐藏层 1.1.1 线性模型可能会出错 1.1.2 在网络中加入隐藏层 1.1.3 从线性到非线性 1.1.4 通用近似定理 1 ...
- 【深度学习】基于Pytorch多层感知机的高级API实现和注意力机制(二)
[深度学习]基于Pytorch多层感知机的高级API实现和注意力机制(二) 文章目录1 代码实现 2 训练误差和泛化误差 3 模型复杂性 4 多项式回归4.1 生成数据集4.2 对模型进行训练和测试4 ...
- 【深度学习】基于Pytorch多层感知机的高级API实现和注意力机制(一)
[深度学习]基于Pytorch多层感知机的高级API实现和注意力机制(一) 文章目录 1 概述 2 从线性到非线性-激活函数2.1 ReLU函数2.2 sigmoid函数2.3 tanh函数 3 注意 ...
- 动手学深度学习(PyTorch实现)(五)--多层感知机
多层感知机 1. 基本知识 2. 激活函数 2.1 ReLU函数 2.2 Sigmoid函数 2.3 tanh函数 2.4 关于激活函数的选择 3. PyTorch实现 3.1 导入相应的包 3.2 ...
- 深度学习:神经网络中的前向传播和反向传播算法推导
1. 神经网络 这是一个常见的神经网络的图: 这是一个常见的三层神经网络的基本构成,Layer L1是输入层,Layer L2是隐含层,Layer L3是隐含层,当我们输入x1,x2,x3等数据时,通 ...
- 深度学习入门(6)误差反向传播基础---计算图与链式法则
在我的第三篇博文<深度学习入门(3)神经网络参数梯度的计算方式>中详细介绍了通过微分方式计算神经网络权重参数的梯度.但是数值微分的方式计算梯度效率较低.后续博文会介绍另外一种更加高效的梯度 ...
- 深度学习入门|第5章 误差反向传播法(二)
误差反向传播法 前言 此为本人学习<深度学习入门>的学习笔记 四.简单层的实现 本节将用 Python 实现前面的购买苹果的例子.这里,我们把要实现的计算图的乘法节点称为"乘法层 ...
- 深度学习与神经网络-吴恩达-第二周优化算法
一.Mini-batch梯度下降法 前面介绍的向量化方法能够让我们高效的处理m个样本数据,模型输入的也就是m个样本按列堆叠而成的矩阵X,同样地,输入数据的标签也是m个样本标签按列堆叠而成的矩阵Y.但是 ...
最新文章
- html5 漏洞,HTML 5漏洞可致硬盘遭垃圾数据填满
- 看见到洞见之引子(一)机器学习算法
- 文本界面安装linux 7,安装 CentOS7 后必做的事 [最小化、文本界面]
- python如何使用字典_Python-如何使用点“。” 访问字典成员?
- 监听浏览器是否被缩放 - 案例篇
- UNIX不带缓存的IO函数
- NIO系列六:流行 NIO Framework netty 和 mina 性能测评与分析
- Centos6.5 x86_64系统安装kvm虚拟机—基础篇
- atitit. js 跨界面 页面 web cs 传值方法总结
- WMware Mac 一些优化
- 产品经理/技术总监的能力模型
- 【LINUX】自己整理的干货,拿去看吧,不谢!!!。。。。。。。。。。。。
- 史上最纯净的Win7专业版系统
- 若依代码生成使用教程
- 列表推导式+生成器+面向对象一(对象的结构+类的定义)2020-22-23
- matlab练习程序(渲染三原色)
- error LNK2001: 无法解析的外部符号 __imp____iob_func
- 微信打不开链接怎么办,微信跳转外部浏览器打开
- 使用security和jwt进行安全登录
- Leetcode- 岛屿数量