《动手学深度学习(Pytorch版)》Task02:预备知识——4.25打卡

2024-04-26 02:36

本文主要是介绍《动手学深度学习(Pytorch版)》Task02:预备知识——4.25打卡,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《动手学深度学习(Pytorch版)》Task02:预备知识——4.25打卡

  • 数据操作
    • N维数组——张量
    • 创建数组
    • 访问元素
    • 入门
      • 初始化矩阵
    • 运算符
    • 广播机制
    • 索引和切片
    • 节省内存
    • 转换为其他Python对象
      • 转换为NumPy张量`ndarray`
      • 张量转换为Python标量
  • 数据预处理
    • 安装pandas
    • 读取数据集
    • 处理缺失值
    • 转换为张量格式
    • 删除缺失值最多的列
  • 线性代数
    • 标量
    • 向量
    • 长度、维度和形状
    • 矩阵
      • 范数
      • 特殊矩阵
      • 特征向量和特征值
    • 张量
    • 降维
      • 非降维求和
    • 点积(Dot Product)——标量
    • 矩阵-向量积
    • 矩阵-矩阵乘法
    • 范数
  • 微积分
    • 导数和微分
      • 亚倒数
    • 偏导数
    • 梯度
      • y是标量x是向量
      • y是向量x是标量
      • y是向量x是向量
    • 链式法则
  • 自动求导
    • 两种模式
    • 复杂度
    • 分离计算
    • Python控制流的梯度计算

数据操作

对应代码文件image-20240424132546363

N维数组——张量

N维数组是机器学习和神经网络的主要数据结构

image-20240424131444964

image-20240424131520566

创建数组

  • 形状:例如 3x4矩阵
  • 每个元素的数据类型:例如32位浮点数
  • 每个元素的值:例如全是0,或者随机数

访问元素

image-20240424131710489

:访问一行全部

::3间隔为3跳着访问

入门

导入torch

import torch

创建行向量

x = torch.arange(12)

访问张量(沿每个轴的长度)的形状

x.shape

求张量中元素的总数

# 元素总数,标量
x.numel() 

改变一个张量的形状而不改变元素数量和元素值

X = x.reshape(3, 4)

通过-1来调用此自动计算出维度的功能

x.reshape(-1,4)

初始化矩阵

张量所有元素都设置为0

# 全0
torch.zeros((2, 3, 4))

张量所有元素都设置为1

# 全1
torch.ones((2, 3, 4))

随机初始化参数

torch.randn(2,3,4)

用Python列表为每个元素赋予确定值

torch.tensor([[2, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])

运算符

标准算术运算符(+-\*/\**)都可以被升级为按元素运算

x = torch.tensor([1.0, 2, 4, 8])
y = torch.tensor([2, 2, 2, 2])
x + y, x - y, x * y, x / y, x ** y  # **运算符是求幂运算

指数运算:计算e的x次幂, e x e^x ex

torch.exp(x)

多个张量连结(concatenate)在一起

X = torch.arange(12, dtype=torch.float32).reshape((3,4))
Y = torch.tensor([[2.0, 1, 4, 3], [1, 2, 3, 4], [4, 3, 2, 1]])
torch.cat((X, Y), dim=0), torch.cat((X, Y), dim=1)

dim=0表示在行上进行连接

(tensor([[ 0.,  1.,  2.,  3.],[ 4.,  5.,  6.,  7.],[ 8.,  9., 10., 11.],[ 2.,  1.,  4.,  3.],[ 1.,  2.,  3.,  4.],[ 4.,  3.,  2.,  1.]]),

dim=1表示在列上进行连接

 tensor([[ 0.,  1.,  2.,  3.,  2.,  1.,  4.,  3.],[ 4.,  5.,  6.,  7.,  1.,  2.,  3.,  4.],[ 8.,  9., 10., 11.,  4.,  3.,  2.,  1.]]))

通过逻辑运算符构建二元张量

X == Y

求和,产生一个单元素张量

X.sum()
out: tensor(66.)

广播机制

a = torch.arange(3).reshape((3, 1))
b = torch.arange(2).reshape((1, 2))

ab分别是3×1和1×2矩阵,如果让它们相加,它们的形状不匹配。

方法:两个矩阵广播为一个更大的3×2矩阵,矩阵a将复制列, 矩阵b将复制行,然后再按元素相加。

索引和切片

元素可以通过索引访问。

第一个元素的索引是0,最后一个元素索引是-1

可以指定范围以包含第一个元素和最后一个之前的元素。

X[-1], X[1:3]

通过指定索引来将元素写入矩阵,给固定位置的索引赋值

X[1, 2] = 9

给多个位置索引赋值

X[0:2, :] = 12

节省内存

id()函数:提供内存中引用对象的确切地址

before = id(Y)
Y = Y + X
id(Y) == before
out: False

Python为结果分配新的内存

我们希望原地执行这些更新

Z = torch.zeros_like(Y) # 和Y的shape数据类型一致,但元素是0
print('id(Z):', id(Z))
Z[:] = X + Y
print('id(Z):', id(Z))

没有重复使用X时,可以使用X[:] = X + YX += Y来减少操作的内存开销。

before = id(X)
X += Y
id(X) == before

转换为其他Python对象

转换为NumPy张量ndarray

torch张量和numpy数组将共享它们的底层内存

A = X.numpy()
B = torch.tensor(A)

张量转换为Python标量

item函数或Python的内置函数。

a = torch.tensor([3.5])
a.item(), float(a), int(a)

数据预处理

学习pandas预处理原始数据,并将原始数据转换为张量格式的步骤。

安装pandas

pip install pandas

读取数据集

创建一个人工数据集,并存储在CSV

import osos.makedirs(os.path.join('..', 'data'), exist_ok=True)
data_file = os.path.join('..', 'data', 'house_tiny.csv')
with open(data_file, 'w') as f:f.write('NumRooms,Alley,Price\n')  # 列名f.write('NA,Pave,127500\n')  # 每行表示一个数据样本f.write('2,NA,106000\n')f.write('4,NA,178100\n')f.write('NA,NA,140000\n')

NA:未知

属性:

  • 房间数量(“NumRooms”)
  • 巷子类型(“Alley”)
  • 房屋价格(“Price”)
import pandas as pddata = pd.read_csv(data_file)
print(data)

处理缺失值

NaN项代表缺失值。

  • 插值法:用一个替代值弥补缺失值
  • 删除法:直接忽略缺失值

iloc:index location

#将data分成inputs和outputs,其中前者为data的前两列,而后者为data的最后一列
inputs, outputs = data.iloc[:, 0:2], data.iloc[:, 2]#对于inputs中缺少的数值,我们用同一列的均值替换“NaN”项
inputs = inputs.fillna(inputs.mean()) 

对于inputs中的类别值或离散值,我们将NaN视为一个类别

pd.get_dummies: 对离散型特征进行one-hot编码,将每个取值转换成一个独立的状态。

dummy_na=True: NaN值设为True

inputs = pd.get_dummies(inputs, dummy_na=True)
   NumRooms  Alley_Pave  Alley_nan
0       3.0           1          0
1       2.0           0          1
2       4.0           0          1
3       3.0           0          1

转换为张量格式

import torchX, y = torch.tensor(inputs.values), torch.tensor(outputs.values)
X, y
(tensor([[3., 1., 0.],[2., 0., 1.],[4., 0., 1.],[3., 0., 1.]], dtype=torch.float64),tensor([127500, 106000, 178100, 140000]))

删除缺失值最多的列

data.drop(data.isnull().sum().idxmax(),axis=1)

axis=0: 删除行; axis=1: 删除列

data.drop(data.count(axis='index').idxmin(),axis=1,inplace=True)

data.count(axis='index'): 直接按列得到非缺失值的个数

inplace=True参数用于直接修改原始数据

线性代数

标量

标量(scalar): 仅包含一个数值的量

变量(variable):未知的标量值

标量由只有一个元素的张量表示

image-20240424161602631

加法、乘法、除法和指数运算

x = torch.tensor(3.0)
y = torch.tensor(2.0)
x + y, x * y, x / y, x**y

向量

向量:可以被视为标量值组成的列表

元素(element)/分量(component):组成向量的标量值

x = torch.arange(4)

image-20240424162745263

向量的长度

image-20240424183249512

image-20240424183325336

长度、维度和形状

维度(dimension):向量的长度,len()函数来访问张量的长度

当用张量表示一个向量(只有一个轴)时,我们也可以通过.shape属性访问向量的长度。

维度(dimension)的不同含义:

  • 向量的维度被用来表示向量的长度,即向量或轴的元素数量
  • 张量的维度用来表示张量具有的轴数。张量的某个轴的维数就是这个轴的长度。

矩阵

方阵(square matrix):具有相同数量的行和列的矩阵

转置(transpose):交换矩阵行和列的结果通,常用 a ⊤ \mathbf{a}^\top a来表示,代码A.T

A = torch.arange(20).reshape(5, 4)

image-20240424183616933

image-20240424183650166

每一行 × 一列向量

直观上:空间的扭曲

image-20240424183753280

image-20240424183815268

范数

image-20240424202803813

特殊矩阵

对称矩阵(symmetric matrix): A \mathbf{A} A等于其转置: A = A ⊤ \mathbf{A} = \mathbf{A}^\top A=A

正定:正定矩阵乘任何一个列/行向量都 >= 0

  1. 矩阵是对称的。
  2. 所有的特征值都是正的。
  3. 矩阵的所有顶点子矩阵的行列式都是正的。

image-20240424220004383

image-20240424221715961

特征向量和特征值

特征向量:被矩阵改变方向的向量

image-20240424221815433

张量

向量是标量的推广,矩阵是向量的推广

张量(本小节中的“张量”指代数对象)是描述具有任意数量轴的𝑛维数组的通用方法。 例如,向量是一阶张量,矩阵是二阶张量。

图像张量:图像以𝑛维数组形式出现, 其中3个轴对应于高度、宽度,以及一个通道(channel)轴, 用于表示颜色通道(红色、绿色和蓝色)。

X = torch.arange(24).reshape(2, 3, 4)

给定具有相同形状的任意两个张量,任何按元素二元运算的结果都将是相同形状的张量

两个矩阵的按元素乘法称为Hadamard积(Hadamard product)(数学符号⊙)
A ⊙ B = [ a 11 b 11 a 12 b 12 … a 1 n b 1 n a 21 b 21 a 22 b 22 … a 2 n b 2 n ⋮ ⋮ ⋱ ⋮ a m 1 b m 1 a m 2 b m 2 … a m n b m n ] . \mathbf{A} \odot \mathbf{B} = \begin{bmatrix} a_{11} b_{11} & a_{12} b_{12} & \dots & a_{1n} b_{1n} \\ a_{21} b_{21} & a_{22} b_{22} & \dots & a_{2n} b_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{m1} b_{m1} & a_{m2} b_{m2} & \dots & a_{mn} b_{mn} \end{bmatrix}. AB= a11b11a21b21am1bm1a12b12a22b22am2bm2a1nb1na2nb2namnbmn .

A * B

降维

计算张量元素的和

数学表示法使用 ∑ \sum 符号表示求和。
为了表示长度为 d d d的向量中元素的总和,可以记为 ∑ i = 1 d x i \sum_{i=1}^dx_i i=1dxi

torch.arange(4, dtype=torch.float32).sum()

调用求和函数会沿所有的轴降低张量的维度,使它变为一个标量。

矩阵 A \mathbf{A} A中元素的和可以记为 ∑ i = 1 m ∑ j = 1 n a i j \sum_{i=1}^{m} \sum_{j=1}^{n} a_{ij} i=1mj=1naij

矩阵为例,为了通过求和所有行的元素来降维(轴0),可以在调用函数时指定axis=0

A.sum(axis=0)

沿着行和列对矩阵求和,等价于对矩阵的所有元素进行求和。

A.sum(axis=[0, 1])  # 结果和A.sum()相同

平均值(mean或average)

A.mean(), A.sum() / A.numel()

平均值的函数沿指定轴降低张量的维度

A.mean(axis=0), A.sum(axis=0) / A.shape[0]

非降维求和

keepdims=True作用:保持原数组的维度,方便后续广播

A.sum(axis=1, keepdims=True)计算总和或均值时保持轴数不变

A / sum_A

cumsum函数:沿某个轴计算A元素的累积总和,此函数不会沿任何轴降低输入张量的维度。

点积(Dot Product)——标量

给定两个向量 x , y ∈ R d \mathbf{x},\mathbf{y}\in\mathbb{R}^d x,yRd
点积(dot product) x ⊤ y \mathbf{x}^\top\mathbf{y} xy(或 ⟨ x , y ⟩ \langle\mathbf{x},\mathbf{y}\rangle x,y

相同位置的按元素乘积的和: x ⊤ y = ∑ i = 1 d x i y i \mathbf{x}^\top \mathbf{y} = \sum_{i=1}^{d} x_i y_i xy=i=1dxiyi

torch.dot(x, y)

可以通过执行按元素乘法,然后进行求和来表示两个向量的点积

torch.sum(x * y)

矩阵-向量积

A x = [ a 1 ⊤ a 2 ⊤ ⋮ a m ⊤ ] x = [ a 1 ⊤ x a 2 ⊤ x ⋮ a m ⊤ x ] . \mathbf{A}\mathbf{x} = \begin{bmatrix} \mathbf{a}^\top_{1} \\ \mathbf{a}^\top_{2} \\ \vdots \\ \mathbf{a}^\top_m \\ \end{bmatrix}\mathbf{x} = \begin{bmatrix} \mathbf{a}^\top_{1} \mathbf{x} \\ \mathbf{a}^\top_{2} \mathbf{x} \\ \vdots\\ \mathbf{a}^\top_{m} \mathbf{x}\\ \end{bmatrix}. Ax= a1a2am x= a1xa2xamx .

torch.mv(A, x)

矩阵-矩阵乘法

C = A B = [ a 1 ⊤ a 2 ⊤ ⋮ a n ⊤ ] [ b 1 b 2 ⋯ b m ] = [ a 1 ⊤ b 1 a 1 ⊤ b 2 ⋯ a 1 ⊤ b m a 2 ⊤ b 1 a 2 ⊤ b 2 ⋯ a 2 ⊤ b m ⋮ ⋮ ⋱ ⋮ a n ⊤ b 1 a n ⊤ b 2 ⋯ a n ⊤ b m ] \mathbf{C} = \mathbf{AB} = \begin{bmatrix} \mathbf{a}^\top_{1} \\ \mathbf{a}^\top_{2} \\ \vdots \\ \mathbf{a}^\top_n \\ \end{bmatrix} \begin{bmatrix} \mathbf{b}_{1} & \mathbf{b}_{2} & \cdots & \mathbf{b}_{m} \\ \end{bmatrix} = \begin{bmatrix} \mathbf{a}^\top_{1} \mathbf{b}_1 & \mathbf{a}^\top_{1}\mathbf{b}_2& \cdots & \mathbf{a}^\top_{1} \mathbf{b}_m \\ \mathbf{a}^\top_{2}\mathbf{b}_1 & \mathbf{a}^\top_{2} \mathbf{b}_2 & \cdots & \mathbf{a}^\top_{2} \mathbf{b}_m \\ \vdots & \vdots & \ddots &\vdots\\ \mathbf{a}^\top_{n} \mathbf{b}_1 & \mathbf{a}^\top_{n}\mathbf{b}_2& \cdots& \mathbf{a}^\top_{n} \mathbf{b}_m \end{bmatrix} C=AB= a1a2an [b1b2bm]= a1b1a2b1anb1a1b2a2b2anb2a1bma2bmanbm

torch.mm(A, B)

范数

向量的范数是表示一个向量的长度。

L 2 L_2 L2范数(常用):
∥ x ∥ 2 = ∑ i = 1 n x i 2 \|\mathbf{x}\|_2 = \sqrt{\sum_{i=1}^n x_i^2} x2=i=1nxi2
常常省略下标 2 2 2,也就是说 ∥ x ∥ \|\mathbf{x}\| x等同于 ∥ x ∥ 2 \|\mathbf{x}\|_2 x2

torch.norm(u)

L 1 L_1 L1范数:向量元素的绝对值之和
∥ x ∥ 1 = ∑ i = 1 n ∣ x i ∣ \|\mathbf{x}\|_1 = \sum_{i=1}^n \left|x_i \right| x1=i=1nxi

torch.abs(u).sum()

L p L_p Lp范数
∥ x ∥ p = ( ∑ i = 1 n ∣ x i ∣ p ) 1 / p \|\mathbf{x}\|_p = \left(\sum_{i=1}^n \left|x_i \right|^p \right)^{1/p} xp=(i=1nxip)1/p
Frobenius范数(Frobenius norm):是矩阵元素平方和的平方根
∥ X ∥ F = ∑ i = 1 m ∑ j = 1 n x i j 2 \|\mathbf{X}\|_F = \sqrt{\sum_{i=1}^m \sum_{j=1}^n x_{ij}^2} XF=i=1mj=1nxij2

torch.norm(A)

目标通常被表达为范数

PS:torch.norm() 函数期望接收一个浮点型或复数型的张量作为输入

微积分

积分(integral calculus)

微分(differential calculus)

拟合模型:

  • 优化(optimization):用模型拟合观测数据的过程;
  • 泛化(generalization):数学原理和实践者的智慧,能够指导我们生成出有效性超出用于训练的数据集本身的模型。

导数和微分

如果 f f f导数存在,这个极限被定义为

f ′ ( x ) = lim ⁡ h → 0 f ( x + h ) − f ( x ) h f'(x) = \lim_{h \rightarrow 0} \frac{f(x+h) - f(x)}{h} f(x)=h0limhf(x+h)f(x)
如果 f ′ ( a ) f'(a) f(a)存在,则称 f f f a a a处是可微(differentiable)的。
如果 f f f在一个区间内的每个数上都是可微的,则此函数在此区间中是可微的。

f ′ ( x ) f'(x) f(x) f ( x ) f(x) f(x)相对于 x x x瞬时(instantaneous)变化率。
f ′ ( x ) = y ′ = d y d x = d f d x = d d x f ( x ) = D f ( x ) = D x f ( x ) f'(x) = y' = \frac{dy}{dx} = \frac{df}{dx} = \frac{d}{dx} f(x) = Df(x) = D_x f(x) f(x)=y=dxdy=dxdf=dxdf(x)=Df(x)=Dxf(x)
符号 d d x \frac{d}{dx} dxd D D D微分运算符,表示微分操作。

  • D C = 0 DC = 0 DC=0 C C C是一个常数)
  • D x n = n x n − 1 Dx^n = nx^{n-1} Dxn=nxn1幂律(power rule), n n n是任意实数)
  • D e x = e x De^x = e^x Dex=ex
  • D ln ⁡ ( x ) = 1 / x D\ln(x) = 1/x Dln(x)=1/x

常数相乘法则
d d x [ C f ( x ) ] = C d d x f ( x ) , \frac{d}{dx} [Cf(x)] = C \frac{d}{dx} f(x), dxd[Cf(x)]=Cdxdf(x),

加法法则

d d x [ f ( x ) + g ( x ) ] = d d x f ( x ) + d d x g ( x ) , \frac{d}{dx} [f(x) + g(x)] = \frac{d}{dx} f(x) + \frac{d}{dx} g(x), dxd[f(x)+g(x)]=dxdf(x)+dxdg(x),

乘法法则

d d x [ f ( x ) g ( x ) ] = f ( x ) d d x [ g ( x ) ] + g ( x ) d d x [ f ( x ) ] , \frac{d}{dx} [f(x)g(x)] = f(x) \frac{d}{dx} [g(x)] + g(x) \frac{d}{dx} [f(x)], dxd[f(x)g(x)]=f(x)dxd[g(x)]+g(x)dxd[f(x)],

除法法则

d d x [ f ( x ) g ( x ) ] = g ( x ) d d x [ f ( x ) ] − f ( x ) d d x [ g ( x ) ] [ g ( x ) ] 2 . \frac{d}{dx} \left[\frac{f(x)}{g(x)}\right] = \frac{g(x) \frac{d}{dx} [f(x)] - f(x) \frac{d}{dx} [g(x)]}{[g(x)]^2}. dxd[g(x)f(x)]=[g(x)]2g(x)dxd[f(x)]f(x)dxd[g(x)].

注释#@save是一个特殊的标记,会将对应的函数、类或语句保存在d2l包中。

image-20240425200545086

image-20240425200608907

亚倒数

image-20240425200647772

偏导数

y = f ( x 1 , x 2 , … , x n ) y = f(x_1, x_2, \ldots, x_n) y=f(x1,x2,,xn)是一个具有 n n n个变量的函数。
y y y关于第 i i i个参数 x i x_i xi偏导数(partial derivative)为:
∂ y ∂ x i = lim ⁡ h → 0 f ( x 1 , … , x i − 1 , x i + h , x i + 1 , … , x n ) − f ( x 1 , … , x i , … , x n ) h \frac{\partial y}{\partial x_i} = \lim_{h \rightarrow 0} \frac{f(x_1, \ldots, x_{i-1}, x_i+h, x_{i+1}, \ldots, x_n) - f(x_1, \ldots, x_i, \ldots, x_n)}{h} xiy=h0limhf(x1,,xi1,xi+h,xi+1,,xn)f(x1,,xi,,xn)
x 1 , … , x i − 1 , x i + 1 , … , x n x_1, \ldots, x_{i-1}, x_{i+1}, \ldots, x_n x1,,xi1,xi+1,,xn看作常数,计算 y y y关于 x i x_i xi的导数。
∂ y ∂ x i = ∂ f ∂ x i = f x i = f i = D i f = D x i f \frac{\partial y}{\partial x_i} = \frac{\partial f}{\partial x_i} = f_{x_i} = f_i = D_i f = D_{x_i} f xiy=xif=fxi=fi=Dif=Dxif

梯度

将导数拓展为向量

连结一个多元函数对其所有变量的偏导数,以得到该函数的梯度(gradient)向量。
∇ x f ( x ) = [ ∂ f ( x ) ∂ x 1 , ∂ f ( x ) ∂ x 2 , … , ∂ f ( x ) ∂ x n ] ⊤ \nabla_{\mathbf{x}} f(\mathbf{x}) = \bigg[\frac{\partial f(\mathbf{x})}{\partial x_1}, \frac{\partial f(\mathbf{x})}{\partial x_2}, \ldots, \frac{\partial f(\mathbf{x})}{\partial x_n}\bigg]^\top xf(x)=[x1f(x),x2f(x),,xnf(x)]
∇ x f ( x ) \nabla_{\mathbf{x}} f(\mathbf{x}) xf(x)通常在没有歧义时被 ∇ f ( x ) \nabla f(\mathbf{x}) f(x)取代。

  • 对于所有 A ∈ R m × n \mathbf{A} \in \mathbb{R}^{m \times n} ARm×n,都有 ∇ x A x = A ⊤ \nabla_{\mathbf{x}} \mathbf{A} \mathbf{x} = \mathbf{A}^\top xAx=A
  • 对于所有 A ∈ R n × m \mathbf{A} \in \mathbb{R}^{n \times m} ARn×m,都有 ∇ x x ⊤ A = A \nabla_{\mathbf{x}} \mathbf{x}^\top \mathbf{A} = \mathbf{A} xxA=A
  • 对于所有 A ∈ R n × n \mathbf{A} \in \mathbb{R}^{n \times n} ARn×n,都有 ∇ x x ⊤ A x = ( A + A ⊤ ) x \nabla_{\mathbf{x}} \mathbf{x}^\top \mathbf{A} \mathbf{x} = (\mathbf{A} + \mathbf{A}^\top)\mathbf{x} xxAx=(A+A)x
  • ∇ x ∥ x ∥ 2 = ∇ x x ⊤ x = 2 x \nabla_{\mathbf{x}} \|\mathbf{x} \|^2 = \nabla_{\mathbf{x}} \mathbf{x}^\top \mathbf{x} = 2\mathbf{x} xx2=xxx=2x

对于任何矩阵 X \mathbf{X} X,都有 ∇ X ∥ X ∥ F 2 = 2 X \nabla_{\mathbf{X}} \|\mathbf{X} \|_F^2 = 2\mathbf{X} XXF2=2X

image-20240425200728899

y是标量x是向量

标量关于列向量的导数是行向量

梯度指向值变化最大的方向

image-20240425200902700

a 不是关于 x 的函数
0 and 1 are vectors,全为0/1的向量

image-20240425201137370

image-20240425201232283

y是向量x是标量

image-20240425201543271

这个被称之为分子布局符号,反过来的版本叫分母布局符号

y是向量x是向量

向量对向量最后是一个矩阵

image-20240425201654718
image-20240425201850109

链式法则

∂ y ∂ x i = ∂ y ∂ u 1 ∂ u 1 ∂ x i + ∂ y ∂ u 2 ∂ u 2 ∂ x i + ⋯ + ∂ y ∂ u m ∂ u m ∂ x i \frac{\partial y}{\partial x_i} = \frac{\partial y}{\partial u_1} \frac{\partial u_1}{\partial x_i} + \frac{\partial y}{\partial u_2} \frac{\partial u_2}{\partial x_i} + \cdots + \frac{\partial y}{\partial u_m} \frac{\partial u_m}{\partial x_i} xiy=u1yxiu1+u2yxiu2++umyxium

image-20240425202419688

自动求导

深度学习框架可以自动求导:

  • 将梯度附加到想要对其计算偏导数的变量
  • 记录目标值的计算
  • 执行它的反向传播函数
  • 访问得到的梯度

自动微分(automatic differentiation):计算一个函数在指定值上的导数

计算图(computational graph):跟踪计算是哪些数据通过哪些操作组合起来产生输出

  • 将代码分解成操作子
  • 将计算表示成一个无环图
  • 显式构造:Tensorflow/Theano/MXNet
  • 隐式构造:PyTorch/MXNet

image-20240425202916938

两种模式

image-20240425203046166

反向传播(backpropagate):跟踪整个计算图,填充关于每个参数的偏导数。自动微分使系统能够随后反向传播梯度。

image-20240425203132150

image-20240425203132150

复杂度

image-20240425203327042

一个标量函数关于向量𝐱的梯度是向量,并且与𝐱具有相同的形状。

x.requires_grad_(True)

PyTorch将会开始跟踪在 x 上进行的所有操作,为自动求导(自动微分)建立计算图。

计算反向传播

y.backward()

在默认情况下,PyTorch会累积梯度,我们需要清除之前的值

x.grad.zero_()

分离计算

将某些计算移动到记录的计算图之外

y.detach()

Python控制流的梯度计算

即使构建函数的计算图需要通过Python控制流(例如,条件、循环或任意函数调用),我们仍然可以计算得到的变量的梯度

隐式控制

Q:为什么pytorch会默认累计梯度?

A:

  1. 梯度累积:在某些情况下,你可能希望在多个迷你批次(mini-batches)上累积梯度,然后一起更新权重。这对于处理那些因为内存限制而无法一次性处理的大批次数据很有用。在每个迷你批次上计算梯度并累积可以近似这个大批次的效果。
  2. 更精细的梯度控制:某些高级训练技巧,如梯度裁剪或者使用不同的梯度更新策略,可能需要在执行实际的参数更新之前访问和修改梯度。累积梯度提供了在更新之前手动检查和修改梯度的机会。
  3. 节省计算资源:对于某些复杂的模型结构,比如使用了多任务学习的网络,可能需要将梯度从多个任务中累积起来再更新。累积梯度使得只需进行一次权重更新,而不是在每个任务完成后都更新。
  4. 提高稳定性:在某些情况下,累积梯度可以帮助提高训练过程的稳定性,因为它允许梯度从多个样本中得出,可能会导致更平滑的梯度估计和更新。

这篇关于《动手学深度学习(Pytorch版)》Task02:预备知识——4.25打卡的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

PyTorch使用教程之Tensor包详解

《PyTorch使用教程之Tensor包详解》这篇文章介绍了PyTorch中的张量(Tensor)数据结构,包括张量的数据类型、初始化、常用操作、属性等,张量是PyTorch框架中的核心数据结构,支持... 目录1、张量Tensor2、数据类型3、初始化(构造张量)4、常用操作5、常用属性5.1 存储(st

五大特性引领创新! 深度操作系统 deepin 25 Preview预览版发布

《五大特性引领创新!深度操作系统deepin25Preview预览版发布》今日,深度操作系统正式推出deepin25Preview版本,该版本集成了五大核心特性:磐石系统、全新DDE、Tr... 深度操作系统今日发布了 deepin 25 Preview,新版本囊括五大特性:磐石系统、全新 DDE、Tree

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

sqlite3 相关知识

WAL 模式 VS 回滚模式 特性WAL 模式回滚模式(Rollback Journal)定义使用写前日志来记录变更。使用回滚日志来记录事务的所有修改。特点更高的并发性和性能;支持多读者和单写者。支持安全的事务回滚,但并发性较低。性能写入性能更好,尤其是读多写少的场景。写操作会造成较大的性能开销,尤其是在事务开始时。写入流程数据首先写入 WAL 文件,然后才从 WAL 刷新到主数据库。数据在开始

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]