深度学习--链式法则

可以链接一个多元函数所有变量偏导数方式计算梯度

偏导计算示例

函数z = f(x,y) = 3x^2y + 2xy^2

zxy偏导数

x偏导数

y常熟x导数

= 3x2xy + 2y^2

y偏导数

3x^2 + 2x x 3y^2

2.4.4 链式法则

用上吗方法可能很难找到梯度因为深度学习中多元函数通常是复合, 所以难以应用上述任何规则这些函数微分幸运链式法则可以用来复合函数微分

我们考虑变量函数假设函数y = f(u) u = g(x) 都是根据链式法则

dy/dx = dy/du

现在考虑一个更一般场景函数具有任意数量变量情况假设可微函数y变量u1, u2,.. un 其中每个可微函数u都有变量x1,x2,...xn 注意yx1,x2..xn函数对于任意i = 1,2,...n 链式法则给出

2.5 自动微分

正如2.4所述求导几乎所有深度学习优化算法关键步骤虽然求导计算简单只需要一些基本微积分知识但是对于复杂模型手动进行更新一件痛苦事情

深度学习框架通过自动计算导数自动微分加快求导实践中根据设计好的模型系统构建一个计算跟踪计算哪些数据通过哪些操作组合起来产生输出自动微分使系统能够随后传播梯度这里反向传播意味着跟踪整个计算图填充关于每个参数偏导数

2.5.1 一个简单例子

作为一个演示例子假设我们函数y = 2x^Tx关于向量x求导我们创建变量x分配一个初始值

import torch

x = torch.arange(4.0)

tensor([0,1,2,3])

在我们计算y关于x梯度之前需要一个区域存储梯度重要我们不会每次一个参数求导分配新的内存因为我们经常成千上万更新相同参数如果每次分配新的内存可能很快就回内存耗尽注意一个标量函数关于向量x梯度向量并且x具有相同形状

x.requires_grad_(True)

x.grad

现在计算y

y = 2 * torch.dot(x,y)

tensor(28,grad_fn)

x一个长度4向量计算xx得到了我们赋值y标量输出接下来通过调用反向传播函数自动计算y关于x每个分量梯度打印这些梯度

y.backward()

x.grad

函数y=2x^Tx 关于x梯度4x我们快速验证这个梯度是否计算正确

x.grad == 4 * x

现在计算x另一个函数

默认情况下PyTorch累积梯度我们需要清除之前

x.grad.zero()

y = x.sum()

y.backward()

x.grad

2.5.2 标量传播

y不是标量向量y关于向量x导数自然解释是一个矩阵对于高阶高纬yx求导结果可以一个高阶张量

然而虽然这些更奇特对象确实出现高级机器学习调用向量反向传播函数计算时我们通常试图计算第一批训练样本每个组成部分损失函数导数这里我们目的不是计算微分矩阵而是单独计算批量每个样本偏导数之和

非标量调用backward函数需要传入一个gradient参数参数指定微分函数关于self梯度本例只想偏导数所以传递一个1梯度合适

x.grad.zero()

y = x*x

等价于y.backward(torch.ones(len(x)))

y.sum().backward()

x.grad()

2.5.3 分离计算

有时我们希望某些计算移到记录计算之外例如假设y作为x函数计算z则是作为yx函数计算想象一下我们计算z关于x梯度但是由于某种原因希望y视为一个常数并且考虑xy计算后发挥作用

这里可以分离y来返回一个新变量u变量y具有相同但是丢弃计算图中如何计算y任何信息换句话说梯度不会向后ux因此下面方向传播函数计算z = u*x关于x偏导数同时u作为常数处理而不是计算z=x*x*x关于x偏导数

x.grad.zero()

y=x*x

u = y.detach()

z=u*x

由于记录y计算结果因此我们可以随后y调用反向传播函数得到y=x*x关于x导数2*x

x.grad.zero()

y.sum().backward()

x.grad = 2*x

2.5.4 Python控制流梯度计算

使用自动微分一个好处即使构造函数计算需要通过Python控制我们可以计算得到变量梯度下面代码While 循环迭代次数if语句结果都取决于输入a

def f(a)

b = a *2

while b.norm() < 1000;

b = b * 2;

if b.sum() > 0

c = b;

else

c = 100 * b;

return c

我们计算梯度

a = torch.randn(size=(), requires_grad=True)

d = f(a)

d.backward()

我们现在可以分析上面定义f函数注意它在输入a分段线性换言之对于任何a存在某个常量标量k使得f(a) = k*a, 其中k取决于输入a因此可以d/a验证梯度是否正确

### 链式求导法则在深度学习中的解释 链式求导法则是指在一个复合函数中,计算其相对于某个自变量的导数的方法。具体来说,在多层神经网络中,每一层可以看作是一个函数,该函数接受来自前一层的数据并将其传递给下一层。为了更新权重参数,需要知道损失函数关于各层权重的梯度。 #### 反向传播算法利用了这一原则: 当执行反向传播时,从最后一层开始逐步向前推进,每次迭代都会依据当前层误差对本层权重做调整,并将此误差沿网络传播回更早的层次[^1]。这种机制允许有效计算复杂模型结构下的梯度信息而不必显式展开整个表达式树形图。 #### 数学表示形式如下所示: 假设有一个简单的两层感知器作为例子,则第\(l\)层输出\(\mathbf{z}^{(l)}=\sigma (\mathbf{W}^{(l)} \cdot \mathbf{x})+\mathbf{b}\),其中\(\sigma ()\)是非线性激活函数;如果定义最终预测结果为\(\hat{\mathbf{y}}=f_{L}(... f_2(f_1(\mathbf{x}; W); ... ; W))\) ,那么对于任意中间层\(i<L\)处的一个特定单元\(j\)而言,其对应的局部梯度可以通过下面的方式获得: \[ \frac {\partial L}{\partial w_j}= \sum_k \left[\frac {\partial z_k }{\partial a_j }\right]\times \left [\prod _m ^k \frac {da_m }{dz_m }\right ]\times \frac {\partial L}{\partial z_K }, \] 这里 \(K>L, k>m>j,\) 并且 \(a,b,z,W,L\)分别代表激活值、偏差项、带权输入、权重矩阵以及损失函数[^2]。 ```python import numpy as np def sigmoid(x): return 1 / (1 + np.exp(-x)) def derivative_sigmoid(x): fx = sigmoid(x) return fx * (1 - fx) # 假设这是我们的简单三层网络(不考虑bias) weights_input_hidden = np.random.randn(3, 4) weights_hidden_output = np.random.randn(4, 2) input_data = np.array([0.5, 0.7, 0.9]) target_output = np.array([0.1, 0.8]) hidden_layer_activation = sigmoid(np.dot(input_data, weights_input_hidden)) predicted_output = sigmoid(np.dot(hidden_layer_activation, weights_hidden_output)) error = target_output - predicted_output d_predicted_output = error * derivative_sigmoid(predicted_output) # 应用链式法则来计算隐藏层的误差贡献 error_hidden_layer = d_predicted_output.dot(weights_hidden_output.T) d_hidden_layer = error_hidden_layer * derivative_sigmoid(hidden_layer_activation) learning_rate = 0.05 # 更新权重 weights_hidden_output += hidden_layer_activation.T.dot(d_predicted_output) * learning_rate weights_input_hidden += input_data.reshape((3,1)).dot(d_hidden_layer.reshape((1,4))) * learning_rate ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值