反向传播&梯度下降 的直观理解程序(numpy)

本文介绍了一种使用梯度下降法优化多项式拟合的技术,通过随机初始化权重,然后通过迭代过程调整权重以最小化损失函数,最终得到最佳的多项式拟合模型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

import numpy as np
import math
import matplotlib.pyplot as plt

# Create random input and output data
x = np.linspace(-math.pi, math.pi, 2000)
y = np.sin(x)
plt.scatter(x,y)
plt.show()

# Randomly initialize weights
a = np.random.randn()
b = np.random.randn()
c = np.random.randn()
d = np.random.randn()
learning_rate = 1e-6

for t in range(4000):
    # Forward pass: compute predicted y
    # y = a + b x + c x^2 + d x^3
    y_pred = a + b * x + c * x**2 + d * x**3

    # Compute and print loss
    loss = np.square(y_pred - y).sum()

    if t % 100 == 99:
        print(t, loss)

    # Backprop to compute gradients of a, b, c, d with respect to loss
    grad_y_pred = 2.0 * (y_pred - y)
    grad_a = grad_y_pred.sum()
    grad_b = (grad_y_pred * x).sum()
    grad_c = (grad_y_pred * x**2).sum()
    grad_d = (grad_y_pred * x**3).sum()

    # Update weights
    a -= learning_rate * grad_a
    b -= learning_rate * grad_b
    c -= learning_rate * grad_c
    d -= learning_rate * grad_d

print(f'Result: y = {a} + {b} x + {c} x^2 + {d} x^3')

 

首先记住,权重w更新是 减去 损失函数L 对权重w的求导,即αL/αw

这里a,b,c,d都是权重

 

### 深度学习中梯度下降反向传播的概念及实现 #### 梯度下降原理 梯度下降是一种优化算法,用于最小化给定的目标函数,在深度学习中通常是指损失函数。从数学角度分析,梯度的方向代表了函数增加最迅速的方向;因此,沿着负梯度方向更新权重能够有效地降低损失函数的值[^2]。 为了更直观理解这一过程,假设有一个单变量二次方程作为目标函数$f(x)$, 则其对应的梯度$\nabla f(x)=\frac{df}{dx}$表示$x$处的变化率。通过不断调整$使得每次迭代后的$f(x_{new})<f(x_{old})$, 即可逐步逼近全局最优解的位置。 ```python import numpy as np def gradient_descent(starting_point, learning_rate=0.01, num_iterations=100): current_x = starting_point for _ in range(num_iterations): grad_f_at_current_x = 2 * (current_x - 3) # Example function derivative next_x = current_x - learning_rate * grad_f_at_current_x yield {'iteration': _, 'value_of_x': current_x} current_x = next_x ``` 此代码片段展示了如何利用Python编写一个简单的梯度下降程序来找到特定形式的一维函数极小值点[^1]。 #### 反向传播机制 在神经网络训练过程中,前馈操作会将输入数据传递至每一层直至输出端得到预测结果;随后基于实际标签与预测之间的差异计算出总误差(即损失)。接着便是至关重要的一步—反向传播:它依据链式法则自动微分整个计算图谱从而高效获取各参数相对于最终损失的影响程度,并据此指导后续权值修正工作以期达到更好的拟合效果[^4]。 具体而言,对于一个多层感知器结构下的全连接层$L_i$, 若已知第$i+1$层节点关于整体loss贡献了多少,则可通过如下方式递归回溯求得当前层相应位置上所需承担的责任: $$ \delta^{(i)}_j=\sum_k w^{(i,i+1)}_{jk}\cdot\delta^{(i+1)}_k\odot g'(z_j), j∈L_i $$ 其中,$w^{(i,i+1)}_{jk}$ 表示由$ 层到$(i+1)-th$ 层之间连接$j-k$ 的权重系数; $\delta^{(*)}_*$ 是指局部敏感度项用来衡量某一层内部单元对总体错误所作贡献大小;最后$g'(*)$则对应激活函数导数值[^3]. 上述公式描述了一个典型BP流程里核心部分之一 — 权重更新规则背后的理论基础. #### 实现细节 实践中应用PyTorch框架可以极大简化构建复杂模型并执行SGD的过程: ```python import torch from torch import nn, optim class SimpleNN(nn.Module): def __init__(self): super().__init__() self.fc1 = nn.Linear(in_features=784, out_features=256) self.relu = nn.ReLU() self.fc2 = nn.Linear(in_features=256, out_features=10) def forward(self, x): x = self.fc1(x) x = self.relu(x) output = self.fc2(x) return output model = SimpleNN() criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=0.01) for epoch in range(EPOCHS): running_loss = 0. for images, labels in train_loader: optimizer.zero_grad() outputs = model(images.view(-1, 784)) loss = criterion(outputs, labels) loss.backward() optimizer.step() print(f"Training complete after {epoch} epochs.") ``` 这段脚本定义了一种简易版多分类任务解决方案,其中包括创建自定义类继承`nn.Module`, 设置线性变换层以及ReLU非线性映射组件等基本要素之外,更重要的是实现了完整的正向传播(`forward`) 和借助`.backward()` 方法完成自动化逆向传导误差信号的任务,进而触发内置Adam/Sgd优化器调用 `.step()` 函数来进行一轮有效的参数空间探索活动.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值