4 反向传播

news2024/9/23 1:31:44

文章目录

    • 问题提出
    • 计算图中的神经网络
      • 改进(激活函数)
    • 反向传播
      • 前馈计算
      • 反向传播
    • pytorch当中的前馈与反馈
      • Tensor张量
    • 课程代码
      • 课后作业

课程来源: 链接
课程内容部分来源(觉得归纳的非常好的): 链接
以及(强烈推荐)BirandaのBlog!

问题提出

简单模型,直接可以利用损失函数对w的导数,来更新w
在这里插入图片描述
然而,对于复杂模型而言求解过程就复杂很多。在图示的神经网络中,每个结点为一个神经元,结点之间的连线为权重。记各符合表示如表所示:

符号含义
x i x_i xi输入层的第i个结点
h i j h_{ij} hij第i层隐含层的第j个结点
o i o_i oi输出层的第i个结点
ω x 1 m n \omega_{x1}^{mn} ωx1mn输入层的第m个结点与隐含层的第n个结点之间的权重
ω i j m n \omega_{ij}^{mn} ωijmn隐含层第i层的第m个结点与第j层的第n个结点之间的权重
ω k o m n \omega_{ko}^{mn} ωkomn隐含层最后一层(第k层)的第m个结点与输出层第n个结点之间的权重

在这里插入图片描述
由图上可知,输入层与隐含层第一层之间就有 5 ∗ 6 = 30 5*6=30 56=30个权重,隐含层的第一层与第二层之间又有 6 ∗ 7 = 42 6*7=42 67=42个权重,以此类推,上图中共有 30 + 42 + 49 + 42 + 30 = 193 30+42+49+42+30=193 30+42+49+42+30=193个权重需要计算,传统得列表达式的方式是无法完成的。

计算图中的神经网络

在这里插入图片描述

而上图左式中,可以化简得到如下公式
y ^ = W 2 ( W 1 X + b 1 ) + b 2 = W 2 W 1 X + ( W 2 b 1 + b 2 ) = W X + b \widehat y = W_2(W_1X+b_1)+b_2=W_2W_1X+(W_2b_1+b_2)=WX+b y =W2(W1X+b1)+b2=W2W1X+(W2b1+b2)=WX+b
也就是说,在这个结构下单纯的增加层数,并不能增加神经网络的复杂程度,因为最后都可以化简为一个单一的神经网络(线性函数)

改进(激活函数)

在这里插入图片描述
在每层网络结构中,增加一个非线性的变换函数(激活函数)

反向传播

前馈计算

在某一神经元处,输入的 x x x ω \omega ω经过函数 f ( x , ω ) f(x,\omega) f(x,ω)的计算,可以获得输出值 z z z,并继续向前以得到损失值loss.

在向前计算的过程中,在 f ( x , ω ) f(x,\omega) f(x,ω)的计算模块中会计算导数 ∂ z ∂ x \frac{\partial z}{\partial x} xz以及 ∂ z ∂ ω \frac{\partial z}{\partial \omega} ωz,并将其保存下来(在pytorch中,这样的值保存在变量 x x x以及 ω \omega ω中)。

在这里插入图片描述

反向传播

由于求导的链式法则,求得loss以后,前面的神经元会将 ∂ l o s s ∂ z \frac{\partial loss}{\partial z} zloss的值反向传播给原先的神经元,在计算单元 f ( x , ω ) f(x,\omega) f(x,ω)中,将得到的 ∂ l o s s ∂ x \frac{\partial loss}{\partial x} xloss与之前存储的导数相乘,即可得到损失值对于权重以及输入层的导数,即 ∂ l o s s ∂ x \frac{\partial loss}{\partial x} xloss,以及 ∂ l o s s ∂ ω \frac{\partial loss}{\partial \omega} ωloss.基于该梯度才进行权重的调整。

在这里插入图片描述

pytorch当中的前馈与反馈

利用pytorch进行深度学习,最主要的是构建计算图

Tensor张量

Tensor中重要的两个成员,data用于保存权重本身的值 ω \omega ω,grad用于保存损失函数对权重的导数 ∂ l o s s ∂ ω \frac{\partial loss}{\partial \omega} ωloss,grad本身也是个张量。对张量进行的计算操作,都是建立计算图的过程。
在这里插入图片描述

课程代码

import torch

x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]

#赋予tensor中的data
w = torch.Tensor([1.0])
#设定需要计算梯度grad
w.requires_grad = True

#模型y=x*w 建立计算图
def forward(x):
    '''
    w为Tensor类型
    x强制转换为Tensor类型
    通过这样的方式建立计算图
    '''
    return x * w

def loss(x, y):
    y_pred = forward(x)
    return (y_pred - y) ** 2

print ("predict  (before training)", 4, forward(4).item())

for epoch in range(100):
    for x,y in zip(x_data,y_data):
        #创建新的计算图
        l = loss(x,y)
        #进行反馈计算,此时才开始求梯度,此后计算图进行释放
        l.backward()
        #grad.item()取grad中的值变成标量
        print('\tgrad:',x, y, w.grad.item())
        #单纯的数值计算要利用data,而不能用张量,否则会在内部创建新的计算图
        w.data = w.data - 0.01 * w.grad.data
        #把权重梯度里的数据清零
        w.grad.data.zero_()
    print("progress:",epoch, l.item())

print("predict (after training)", 4, forward(4).item())

课后作业

import torch
# 构造数据集
x_data = [1.0,2.0,3.0]
y_data = [2.0,4.0,6.0]
# 初始化变量
w1 = torch.tensor([1.0],requires_grad=True)
w2 = torch.tensor([1.0],requires_grad=True)
b = torch.tensor([1.0],requires_grad=True)
# 构造连接式子
def forward(x):
    return w1*x*x+w2*x+b
# 求取loss值
def loss(x,y):
    y_val = forward(x)
    return (y_val-y)**2

for epoch in range(10000):
    for x,y in zip(x_data,y_data) :
        # 计算loss
        L = loss(x,y)
        # 反向传播
        L.backward()
        # 通过loss修改权重
        w1.data-=0.01*w1.grad.data
        w2.data-=0.01*w2.grad.data
        b.data-=0.01*b.grad.data
        # 修改权重梯度当中的值
        w1.grad.data.zero_()
        w2.grad.data.zero_()
        b.grad.data.zero_()

print(4,forward(4).item())

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/181852.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL中的运算符

目录 一.运算符 简介 算术运算符 比较运算法 逻辑运算符 位运算符 实例演示 一.运算符 简介 数据库中的表结构确立后,表中的数据代表的意义就已经确定。通过MySQL运算符进行运算,就可以获取到表结构以外的另一种数据。 例如,学生表中…

[数据结构笔记]二叉树初阶

基本知识 树 -节点的度:一个节点含有的子树的个数称为该节点的度; -叶节点或终端节点:度为0的节点称为叶节点; -非终端节点或分支节点:度不为0的节点; -父节点:若一个节点含有子节点&#xff…

Mybatis 通过接口实现 sql 执行原理解析

使用过 mybatis 框架的小伙伴们都知道,mybatis 是个半 orm 框架,通过写 mapper 接口就能自动实现数据库的增删改查,但是对其中的原理一知半解,接下来就让我们深入框架的底层一探究竟1、环境搭建首先引入 mybatis 的依赖&#xff0…

Consul服务注册与发现

目录 一、Consul简介 (一)官网 (二)特点 二、安装并运行Consul (一)官网安装说明 (二)下载 (三)使用开发模式启动 三、服务提供者 四、服务消费者 …

怎么压缩pdf文件?选对方法其实很简单!

相信许多人在使用设备的时候都会面对这样一个问题,那就是设备内存不足。仿佛不管我们多么努力的节省空间,总是会到头来遇到储存空间不足得难题,尤其是一些比较大的pdf文件,特别占据我们的设备内存,那么你知道怎么压缩p…

0128 Web API基本认知

作用使用JS去操作html和浏览器分类DOM(文档对象模型)BOM(浏览器对象模型)DOM是什么:Document Object Model-----文档对象模型,用来呈现以及与任意HTML或XML文档交互的API,浏览器提供的一套专门用…

【Linux】一文掌握Linux权限

环境:centos7,腾讯云服务器Linux文章都放在了专栏:【Linux】欢迎支持订阅🌹前言权限 一词相信大家都不陌生,与我们的生活密切相关。小区里的门禁制度、公司里的管理制度、学校里的校规规定、甚至是社交平台上的一些设置…

python 手机相机传感器信息计算

传感器信息计算 输入传感器尺寸以上已红米12pro为例 输入传感器尺寸 1/1.4英寸 0.7142857 输入像素2亿 200000000 得到以下结果 和宣传中的传感器信息一致 附源码 import sympyclass CMosInfo(object):"""传感器信息计算"""def __init__(…

C 程序设计教程(19)—— 数组和指针(二):字符数组与字符串

C 程序设计教程(19)—— 数组和指针(二):字符数组与字符串 该专栏主要介绍 C 语言的基本语法,作为《程序设计语言》课程的课件与参考资料,用于《程序设计语言》课程的教学,供入门级用…

word实用操作:几个关于录入和排版的小妙招

对于职场人来说,工作中使用Word早已成了习惯。而如何提高Word的技术,那简直是职场人一生都需要研究探索的课题。因此,今天小编将为大家分享几个实用的Word小技巧,这些技巧貌似不起眼,但是学会后,可以大大提…

如何查linux服务器的带宽占用?哪些进程占用带宽?

前言操作系统: Linux操作环境: Centos7 / ubuntulinux查看服务器带宽具体方法   一、使用speedtest-cli命令查看下载和上传最大流量值因为命令是python的,所以需要先下载一个python,用pip下载次命令;123yum -y insta…

七个 Vue 项目用得上的 JavaScript 库分享

文章目录前言一、vueuse二、vue-js-modal三、vue-wait四、good-table五、vue-notification六、tree select七、egjs-infinite grid总结前言 借助开源库加速 Vue 项目的开发进度是现代前端开发比较常见的方式,平常收集一些 JavaScript 库介绍,在遇到需要的…

上古神兵,先天至宝,Win11平台安装和配置NeoVim0.8.2编辑器搭建Python3开发环境(2023最新攻略)

毫无疑问,我们生活在编辑器的最好年代,Vim是仅在Vi之下的神级编辑器,而脱胎于Vim的NeoVim则是这个时代最好的编辑器,没有之一。异步支持、更好的内存管理、更快的渲染速度、更多的编辑命令,是大神Thiago de Arruda对开…

第九层(5):STL之stack

文章目录前情回顾stack概念stack容器需要注意的地方stack类内的构造函数stack类内的赋值操作stack类内的插入stack类内的删除stack类内的访问stack类内的大小操作下一座石碑🎉welcome🎉 ✒️博主介绍:一名大一的智能制造专业学生,…

Knowledge-based-BERT(三)

多种预训练任务解决NLP处理SMILES的多种弊端,代码:Knowledge-based-BERT,原文:Knowledge-based BERT: a method to extract molecular features like computational chemists,代码解析继续downstream_task。模型框架如…

HTML中的div和span标签

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>HTML中的div和span标签</title> </head> <body> <!-- 1、div和span是什么&#xff1f;有什么用…

【linux】文件操作(IO)详述

文件操作一、引入二、系统调用接口2.1 open与close2.2 write2.3 read三、文件描述符3.1 分配规则四、重定向4.1 输出重定向4.2 追加重定向4.3 输入重定向4.4 独立性五、缓冲区5.1 缓冲区刷新策略5.2 缓冲区位置5.3 现象解释六、文件系统6.1 文件系统分区6.1.1 分区图6.1.2 介绍…

实时推荐业务介绍 grpc接口对接

5.1 实时推荐业务介绍 学习目标 目标 无应用 无 5.1.1 实时推荐逻辑 逻辑流程 1、后端发送推荐请求&#xff0c;实时推荐系统拿到请求参数 grpc对接2、根据用户进行ABTest分流 ABTest实验中心&#xff0c;用于进行分流任务&#xff0c;方便测试调整不同的模型上线3、推荐中心…

k8s之部署有状态应用

写在前面 本文一起看下k8s对于有状态应用部署提供的解决方案。 1&#xff1a;有状态应用和无状态应用 如果是一个应用每次重启时依赖环境都能和第一次启动时的完全一致&#xff0c;则就可以称这类应用是无状态应用用&#xff0c;反之&#xff0c;就是有状态应用&#xff0c;如…

自动写代码的AI工具,已经支持 VsCode 插件安装使用

自动写代码的AI工具&#xff0c;已经支持 VsCode 插件安装使用&#xff0c;它的功能并不是「代码补全」&#xff0c;而是「代码生成」。 之前有个比较火的 GitHub Copilot&#xff0c;但是这是商业产品&#xff0c;并且没有开源&#xff0c;现在又被告了。 GitHub Copilot 面…