第四章 梯度下降反向传播

2024-08-27 05:20

本文主要是介绍第四章 梯度下降反向传播,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


第一章 深度学习和神经网络

第二章 Pytorch安装

第三章 PyTorch的使用


第四章 梯度下降

  • 什么是梯度下降?
  • 偏导的计算
  • 反向传播算法
    • 计算图和反向传播
    • 神经网络中的反向传播
      • 神经网络的示意图
      • 神经网络的计算图


什么是梯度下降?

梯度是一个向量,学习的前进方向(变化最快的方向),简单理解就是一个导数,只不过这个导数对于二维的、一元的情况来讲它就是导数,对于多元的这样一个函数来讲的话,我们对其中一个自变量x进行求导之后,我们把它称之为偏导导数和偏导梯度的一部分,除了这个数值之外呢它还有一个方向在里面。

回顾机器学习

收集数据 x x x ,构建机器学习模型 f f f,得到 f ( x , w ) = Y p r e d i c t f(x,w) = Y_{predict} f(x,w)=Ypredict

判断模型好坏的方法:
l o s s = ( Y p r e d i c t − Y t r u e ) 2 ( 回归损失 ) l o s s = Y t r u e ⋅ l o g ( Y p r e d i c t ) ( 分类损失 ) \begin{align*} loss & = (Y_{predict}-Y_{true})^2 &(回归损失) \\ loss & = Y_{true} \cdot log(Y_{predict}) &(分类损失) \end{align*} lossloss=(YpredictYtrue)2=Ytruelog(Ypredict)(回归损失)(分类损失)

目标:通过调整(学习)参数 w w w,尽可能的降低 l o s s loss loss,那么我们该如何调整 w w w呢?
在这里插入图片描述

随机选择一个起始点 w 0 w_0 w0,通过调整 w 0 w_0 w0,让loss函数(损失函数)取到最小值
在这里插入图片描述

w w w的更新方法:

  1. 计算 w w w的梯度(导数)

∇ w = f ( w + 0.000001 ) − f ( w − 0.000001 ) 2 ∗ 0.000001 \nabla w = \frac{f(w+0.000001)-f(w-0.000001)}{2*0.000001} w=20.000001f(w+0.000001)f(w0.000001)

  1. 更新 w w w
    w = w − α ∇ w w = w - \alpha \nabla w w=wαw

其中:

∇ w < 0 \nabla w <0 w<0 ,意味着w将增大
∇ w > 0 \nabla w >0 w>0 ,意味着w将减小


总结:梯度就是多元函数参数的变化趋势(参数学习的方向),只有一个自变量时称为导数

偏导的计算

已知 J ( a , b , c ) = 3 ( a + b c ) , 令 u = a + v , v = b c J(a,b,c) = 3(a+bc),令u=a+v,v = bc J(a,b,c)=3(a+bc),u=a+v,v=bc,求a,b,c各自的偏导数。

公式

在这里插入图片描述

令 : J ( a , b , c ) = 3 u d J d a = d J d u × d u d a = 3 × 1 d J d b = d J d u × d u d v × d v d b = 3 × 1 × c d J d c = d J d u × d u d v × d v d c = 3 × 1 × b \begin{align*} 令:& J(a,b,c) = 3u\\ \frac{dJ}{da} &=\frac{dJ}{du} \times \frac{du}{da} = 3\times1 \\ \frac{dJ}{db} &=\frac{dJ}{du} \times \frac{du}{dv} \times \frac{dv}{db} = 3\times1\times c \\ \frac{dJ}{dc} &=\frac{dJ}{du} \times \frac{du}{dv} \times \frac{dv}{dc} = 3\times1\times b \\\end{align*} :dadJdbdJdcdJJ(a,b,c)=3u=dudJ×dadu=3×1=dudJ×dvdu×dbdv=3×1×c=dudJ×dvdu×dcdv=3×1×b

反向传播算法

计算图和反向传播

计算图:通过图的方式来描述函数的图形

在上面的练习中, J ( a , b , c ) = 3 ( a + b c ) , 令 u = a + v , v = b c J(a,b,c) = 3(a+bc),令u=a+v,v = bc J(a,b,c)=3(a+bc),u=a+v,v=bc,把它绘制成计算图可以表示为:

在这里插入图片描述
绘制成为计算图之后,可以清楚的看到向前计算的过程

之后,对每个节点求偏导可有:

在这里插入图片描述
那么反向传播的过程就是一个上图的从右往左的过程,自变量 a , b , c a,b,c a,b,c各自的偏导就是连线上的梯度的乘积:
d J d a = 3 × 1 d J d b = 3 × 1 × c d J d c = 3 × 1 × b \begin{align*} \frac{dJ}{da} &= 3 \times 1 \\ \frac{dJ}{db} &= 3 \times 1 \times c \\ \frac{dJ}{dc} &= 3 \times 1 \times b \end{align*} dadJdbdJdcdJ=3×1=3×1×c=3×1×b

神经网络中的反向传播

神经网络的示意图

w 1 , w 2 , . . . . w n w1,w2,....wn w1,w2,....wn表示网络第n层权重

w n [ i , j ] w_n[i,j] wn[i,j]表示第n层第i个神经元,连接到第n+1层第j个神经元的权重。

在这里插入图片描述

神经网络的计算图

在这里插入图片描述

其中:

  1. ∇ o u t \nabla out out是根据损失函数对预测值进行求导得到的结果
  2. f函数可以理解为激活函数

为了我们能够快速的计算出从out,假设我们已经有了这样一个损失函数f之后,为了这个损失函数,这个out就是我们损失函数的某一次传入一个数据之后的一个结果,这个结果我妈想通过它这个函数求出来这个 w 1 [ 1 , 1 ] w_1[1,1] w1[1,1] 它的这个梯度,那这个时候呢我妈可以跟之前一样,我们可以把这条线上面的所有的梯度都给它计算出来,计算出来之后连线相乘就够了。

问题: 那么此时 w 1 [ 1 , 2 ] w_1[1,2] w1[1,2]的偏导该如何求解呢?

通过观察,发现从 o u t out out w 1 [ 1 , 2 ] w_1[1,2] w1[1,2]的来连接线有两条

在这里插入图片描述

结果如下:
d o u t d W 1 [ 1 , 2 ] = x 1 ∗ f ′ ( a 2 ) ∗ ( W 2 [ 2 , 1 ] ∗ f ′ ( b 1 ) ∗ W 3 [ 1 , 1 ] ∗ ∇ o u t + W 2 [ 2 , 2 ] ∗ f ′ ( b 2 ) ∗ W 3 [ 2 , 1 ] ∗ ∇ o u t ) \frac{dout}{dW_1[1,2]} = x1*f^{'}(a2)*(W_2[2,1]*f^{'}(b1)*W_3[1,1]*\nabla out +W_2[2,2]*f^{'}(b2)*W_3[2,1]*\nabla out) dW1[1,2]dout=x1f(a2)(W2[2,1]f(b1)W3[1,1]out+W2[2,2]f(b2)W3[2,1]out)
公式分为两部分:

  1. 括号外:左边红线部分
  2. 括号内
    1. 加号左边:右边红线部分
    2. 加号右边:蓝线部分

但是这样做,当模型很大的时候,计算量非常大

所以反向传播的思想就是对其中的某一个参数单独求梯度(一层一层计算),之后更新,如下图所示:
在这里插入图片描述

计算过程如下

W 3 [ 1 , 1 ] 的偏导: ∇ W 3 [ 1 , 1 ] = f ( b 1 ) ∗ ∇ o u t (计算 W 3 [ 1 , 1 ] 梯度) ∇ W 3 [ 2 , 1 ] = f ( b 2 ) ∗ ∇ o u t (计算 W 3 [ 2 , 1 ] 梯度) ∇ b 1 = f ′ ( b 1 ) ∗ W 3 [ 1 , 1 ] ∗ ∇ o u t (计算 W 3 [ 2 , 1 ] 梯度) ∇ b 2 = f ′ ( b 2 ) ∗ W 3 [ 2 , 1 ] ∗ ∇ o u t (计算 W 3 [ 2 , 1 ] 梯度) \begin{align*} W_3[1,1]的偏导:&\nabla W_3[1,1] = f(b_1)*\nabla out & (计算W_3[1,1]梯度)\\ &\nabla W_3[2,1] = f(b_2)*\nabla out & (计算W_3[2,1]梯度)\\ \\ &\nabla b_1= f^{'}(b_1)*W_3[1,1]*\nabla out & (计算W_3[2,1]梯度)\\ &\nabla b_2= f^{'}(b_2)*W_3[2,1]*\nabla out & (计算W_3[2,1]梯度)\\ \end{align*} W3[1,1]的偏导:W3[1,1]=f(b1)outW3[2,1]=f(b2)outb1=f(b1)W3[1,1]outb2=f(b2)W3[2,1]out(计算W3[1,1]梯度)(计算W3[2,1]梯度)(计算W3[2,1]梯度)(计算W3[2,1]梯度)

更新参数之后,继续反向传播

在这里插入图片描述

计算过程如下:
∇ W 2 [ 1 , 2 ] = f ( a 1 ) ∗ ∇ b 2 ∇ a 2 = f ′ ( a 2 ) ∗ ( w 2 [ 2 , 1 ] ∇ b 1 + W 2 [ 2 , 2 ] ∇ b 2 ) \begin{align*} &\nabla W_2[1,2] = f(a_1)* \nabla b_2 \\ &\nabla a_2 = f^{'}(a_2)*(w_2[2,1]\nabla b_1 +W_2[2,2] \nabla b_2) \end{align*} W2[1,2]=f(a1)b2a2=f(a2)(w2[2,1]b1+W2[2,2]b2)
继续反向传播

它是一层一层往后计算的,它不会从根就开始一样一次性全部都算出来, 一次性算会有很多很多计算你要保存在一个位置,保存很多变量去保存, 你这个时候你要占用很多内存空间, 去保存那些不停的一串的加一串的乘, 或者说有很多很多串加上乘都要保存下来, 这样的话你需要占用额外的很多的空间,但是你这样一层一层算的时候,你就不需要这样很多的空间, 你只是当前这次的这些变量更新完就完事, 把这一层的结果才能拿到下一层去,最后进行计算。

在这里插入图片描述

计算过程如下:
▽ W 1 [ 1 , 2 ] = x 1 ∗ ▽ a 2 ▽ x 1 = ( W 1 [ 1 , 1 ] ∗ ▽ a 1 + w 1 [ 1 , 2 ] ∗ ▽ a 2 ) ∗ x 1 ’ \begin{align*} &▽W_1[1,2]= x_1*▽a_2\\ &▽x_1= (W_1[1,1]*▽a_1+w_1[1,2]*▽a_2)*x_1’ \end{align*} W1[1,2]=x1a2x1=(W1[1,1]a1+w1[1,2]a2)x1

通用的描述如下
∇ w i , j l = f ( a i l ) ∗ ∇ a j i + 1 ∇ a i l = f ′ ( a i l ) ∗ ( ∑ j = 1 m w i , j ∗ ∇ a j l + 1 ) \nabla w^{l}_{i,j} = f(a^l_i)* \nabla a^{i+1}_{j}\\ \nabla a^{l}_i = f'(a^l_i)*(\sum_{j=1}^{m}w_{i,j}*\nabla a_j^{l+1}) wi,jl=f(ail)aji+1ail=f(ail)(j=1mwi,jajl+1)

这篇关于第四章 梯度下降反向传播的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1110744

相关文章

✨机器学习笔记(二)—— 线性回归、代价函数、梯度下降

1️⃣线性回归(linear regression) f w , b ( x ) = w x + b f_{w,b}(x) = wx + b fw,b​(x)=wx+b 🎈A linear regression model predicting house prices: 如图是机器学习通过监督学习运用线性回归模型来预测房价的例子,当房屋大小为1250 f e e t 2 feet^

用einsum实现MultiHeadAttention前向传播

einsum教程网站Einstein Summation in Numpy | Olexa Bilaniuk's IFT6266H16 Course Blog 编写训练模型 import tensorflow as tfclass Model(tf.keras.Model):def __init__(self, num_heads, model_dim):super().__init__

【CSS in Depth 2 精译_023】第四章概述 + 4.1 Flexbox 布局的基本原理

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一章 层叠、优先级与继承(已完结) 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位(已完结) 2.1 相对单位的威力2.2 em 与 rem2.3 告别像素思维2.4 视口的相对单位2.5 无单位的数值与行高2.6 自定义属性2.7 本章小结 第三章 文档流与盒模型(已

AI学习指南深度学习篇-带动量的随机梯度下降法的基本原理

AI学习指南深度学习篇——带动量的随机梯度下降法的基本原理 引言 在深度学习中,优化算法被广泛应用于训练神经网络模型。随机梯度下降法(SGD)是最常用的优化算法之一,但单独使用SGD在收敛速度和稳定性方面存在一些问题。为了应对这些挑战,动量法应运而生。本文将详细介绍动量法的原理,包括动量的概念、指数加权移动平均、参数更新等内容,最后通过实际示例展示动量如何帮助SGD在参数更新过程中平稳地前进。

AI学习指南深度学习篇-带动量的随机梯度下降法简介

AI学习指南深度学习篇 - 带动量的随机梯度下降法简介 引言 在深度学习的广阔领域中,优化算法扮演着至关重要的角色。它们不仅决定了模型训练的效率,还直接影响到模型的最终表现之一。随着神经网络模型的不断深化和复杂化,传统的优化算法在许多领域逐渐暴露出其不足之处。带动量的随机梯度下降法(Momentum SGD)应运而生,并被广泛应用于各类深度学习模型中。 在本篇文章中,我们将深入探讨带动量的随

Linux如何做ssh反向代理

SSH反向代理是一种通过SSH协议实现的安全远程访问方式,它允许客户端通过SSH连接到一台具有公网IP的代理服务器,然后这台代理服务器再将请求转发给内部网络中的目标主机。以下是实现SSH反向代理的步骤: 一、准备工作 确保服务器配置: 内网服务器(目标主机)和外网服务器(代理服务器)都安装了SSH服务,并且能够通过SSH进行互相访问。内网服务器上的服务(如Web服务、数据库服务等)需要在本地

Nginx反向代理功能及动静分离实现

一:Nginx支持正向代理和反向代理 1.正向代理 正向代理,指的是通过代理服务器 代理浏览器/客户端去重定向请求访问到目标服务器 的一种代理服务。 正向代理服务的特点是代理服务器 代理的对象是浏览器/客户端,也就是对于目标服务器 来说浏览器/客户端是隐藏的。 正向代理是客户端指定让代理去访问哪个服务,代表客户端的利益。 2.反向代理 反向代理,指的是浏览器/客户端并不知道自己要

第四章 类和对象(2)

4.2 类         类是封装对象的属性和行为的载体,Java中定义类使用class关键字,其语法如下: class 类名称{// 成员变量// 成员方法()}         在Java语言中对象的属性以成员变量的形式存在,对象的方法以成员方法的形式存在。本节将对类与对象进行详细讲解。          4.2.1 成员变量         在Java中对象的属性也称为成员变量,

第四章 类和对象(1)

4.1面向对象概述         在程序开发初期,人们使用结构化开发语言,但随着软件的规模越来越庞大,结构化语言的弊端也逐渐暴露出来,开发周期被无休止地拖延,产品的质量也不尽如人意,结构化语言已经不再适合当前的软件开发。这时,人们开始将另一种开发思想引入程序中,即面向对象的开发思想。面向对象思想是人类最自然的一种思考方式,它将所有预处理的问题抽象为对象,同时了解这些对象具有哪些相应的属性以及行

什么是GPT-3的自回归架构?为什么GPT-3无需梯度更新和微调

文章目录 知识回顾GPT-3的自回归架构何为自回归架构为什么架构会影响任务表现自回归架构的局限性与双向模型的对比小结 为何无需梯度更新和微调为什么不需要怎么做到不需要 🍃作者介绍:双非本科大四网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发,目前开始人工智能领域相关知识的学习 🦅个人主页:@逐梦苍穹 📕所属专栏:人工智能 🌻gitee地址:x