反向传播gradient python
时间: 2024-12-29 09:27:11 浏览: 14
### 实现反向传播算法以计算梯度
#### 加法节点的反向传播
对于加法节点 \( z = x + y \),其正向传播过程简单明了。在反向传播过程中,由于偏导数性质,\( dz/dx=1, dz/dy=1 \)[^1]。因此,在实现时只需将上游传递下来的梯度值分别传给输入变量。
```python
class AddGate:
@staticmethod
def forward(x, y):
return x + y
@staticmethod
def backward(dz):
dx = dz * 1
dy = dz * 1
return dx, dy
```
#### 乘法节点的反向传播
针对乘法节点 \( z = xy \),依据链式法则可得:\[dz/dx=y\],\[dz/dy=x\][^3]。这意味着当执行反向传播时,应将来自上一层的梯度与另一输入相乘作为当前层输出的梯度。
```python
class MultiplyGate:
@staticmethod
def forward(x, y):
return x * y
@staticmethod
def backward(x, y, dz):
dx = dz * y
dy = dz * x
return dx, dy
```
#### 组合使用加法和乘法节点
为了展示如何组合这些基本运算符来构建更复杂的表达式,并对其进行求导,考虑如下例子:
设目标函数为 \( f(a,b,c)=a*(b+c) \)
此时可以通过先创建一个`AddGate`实例处理\( b+c \),再利用`MultiplyGate`完成最终计算。相应地,在反向传播阶段也需按照相同顺序依次调用各门电路的backward方法。
```python
def compute_gradients(a_val, b_val, c_val):
add_gate = AddGate()
mul_gate = MultiplyGate()
# Forward pass
bc_sum = add_gate.forward(b_val, c_val)
output = mul_gate.forward(a_val, bc_sum)
# Backward pass (assuming dL/df as input gradient from loss function)
dout = 1.0 # Gradient of the final output w.r.t itself.
da, dbc_sum = mul_gate.backward(a_val, bc_sum, dout)
db, dc = add_gate.backward(dbc_sum)
gradients = {'da': da, 'db': db, 'dc': dc}
return gradients
```
此代码片段展示了如何基于自定义类结构模拟简单的算术操作以及它们对应的自动微分机制。值得注意的是,这里仅涉及最基础的形式;而在实际应用中可能会遇到更为复杂的情况,比如多维数组间的矩阵乘积等场景,则需要用到NumPy库或其他专门设计的数据科学工具包来进行高效运算[^4]。
阅读全文