深入浅出梯度下降与反向传播

从零开始大模型开发与微调:反向传播神经网络两个基础算法详解 从零开始大模型开发与微调:反向传播神经网络两个基础算法详解 作者:禅与计算机程序设计艺术 1. 背景介绍 1.1 大模型的兴起与应用 1.1.1 大模型的定 阅读详情

1. 前言

  在深度学习中,梯度下降和反向传播是两个至关重要的概念。它们共同作用于优化神经网络,使其能够从数据中学习到有用的模式。尽管它们是深度学习的核心,但很多人对这两个概念仍然感到困惑。本博客将深入讲解梯度下降和反向传播的基本原理,并通过一个简单的示例来加以说明。

2. 基本概念

2.1 一元函数的导数

  如果有一个函数 f ( x ) f(x) f(x),它的导数 f ′ ( x ) f^′(x) f′(x) 给出了函数在点 x 0 x_0 x0​ 处沿着 x x x 轴的变化速率,即:
f ′ ( x 0 ) = lim ⁡ Δ x → 0 f ( x 0 + Δ x ) − f ( x 0 ) Δ x f ^\prime (x_0) = \lim_{\Delta x \to 0} \frac {f(x_0 + \Delta x) - f(x_0)} {{\Delta x}} f′(x0​)=Δx→0lim​Δxf(x0​+Δx)−f(x0​)​  这个导数告诉我们,沿着 x x x轴方向,函数的变化快慢情况。

2.2 偏导数

  对于多变量函数 f ( x 1 , x 2 , … , x n ) f(x_1, x_2, \dots, x_n) f(x1​,x2​,…,xn​),偏导数描述了函数在某一维度(即某个变量)上变化的速率。例如,函数 f ( x , y ) = x 2 + y 2 f(x, y) = x^2 + y^2 f(x,y)=x2+y2 的偏导数为:
∂ f ∂ x = 2 x , ∂ f ∂ y = 2 y \frac{\partial f}{\partial x} = 2x, \quad \frac{\partial f}{\partial y} = 2y ∂x∂f​=2x,∂y∂f​=2y  这些偏导数分别表示函数在 x x x轴方向和 y y y轴方向的变化速率。

2.3 方向导数

  描述了一个多变量函数在某一点沿任意给定方向的变化率。对于一个函数 f ( x 1 , x 2 , … , x n ) f(x_1, x_2, \dots, x_n) f(x1​,x2​,…,xn​),在点 x 0 \mathbf{x_0} x0​ 处沿着单位向量 v \mathbf{v} v 方向的方向导数表示为:
D v f ( x 0 ) = ∇ f ( x 0 ) ⋅ v D_{\mathbf{v}} f(\mathbf{x_0}) = \nabla f(\mathbf{x_0}) \cdot \mathbf{v} Dv​f(x0​)=∇f(x0​)⋅v其中, ∇ f ( x 0 ) \nabla f(\mathbf{x_0}) ∇f(x0​) 是函数在点 x 0 \mathbf{x_0} x0​ 的梯度。
  方向导数的几何意义:方向导数给出了函数在某一点沿某个方向的变化速率。它可以看作是沿着某个方向的切线变化率,而不仅仅是沿坐标轴的变化率。
  即在某一点 x 0 \mathbf{x_0} x0​,如果我们沿着某个方向 v \mathbf{v} v 走,方向导数告诉我们,沿着这个方向走时,函数值变化的快慢。如果方向导数为正,说明函数值在增加;如果为负,说明函数值在减少;如果为零,说明函数值在这个方向上没有变化。

2.4 梯度

  在一个多变量的标量函数 f ( x 1 , x 2 , … , x n ) f(x_1, x_2, \dots, x_n) f(x1​,x2​,…,xn​) 中,梯度是一个向量,表示函数在某一点的最速上升方向。梯度不仅告诉我们函数的变化率,还告诉我们该变化率最大的方向。具体来说,梯度是函数的所有偏导数组成的向量:
∇ f ( x 1 , x 2 , … , x n ) = ( ∂ f ∂ x 1 , ∂ f ∂ x 2 , … , ∂ f ∂ x n ) \nabla f(x_1, x_2, \dots, x_n) = \left( \frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, \dots, \frac{\partial f}{\partial x_n} \right) ∇f(x1​,x2​,…,xn​)=(∂x1​∂f​,∂x2​∂f​,…,∂xn​∂f​)  梯度的方向:梯度的方向指向函数值增加最快的方向。
  梯度的大小:梯度的模长(即向量的长度)表示沿着这个方向,函数变化的速率。

  可以把梯度看作是一个“指示器”,它告诉我们在某一点,函数增长最快的方向。换句话说,梯度指向了“上坡”的方向。

2.5 均方误差

  均方误差(Mean Squared Error, MSE),是一种常用的衡量模型预测值与实际值之间差异的指标,尤其是回归任务中,MSE的计算公式如下:
M S E = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 MSE = \frac {1} {n} \sum _{i=1} ^ n (y_i - \hat y_i) ^ 2 MSE=n1​i=1∑n​(yi​−y^​i​)2其中, n n n是样本数量, y i y_i yi​是第 i i i个样本的真实值, y ^ i \hat y_i y^​i​是模型对第 i i i个样本的预测值。

  均方误差也叫做最小二乘法。

3. 梯度下降

  梯度下降(Gradient Descent, GD)是一种优化算法,用于最小化(或最大化)一个函数,通常用来训练机器学习模型。在神经网络中,我们的目标是通过调整模型的参数(例如权重和偏置)来最小化损失函数。损失函数衡量了模型的预测与实际标签之间的差异,目标是让这个损失函数的值尽可能小。
  梯度下降的核心思想是,沿着损失函数的梯度(偏导数)下降,不断更新参数,直到达到最小值。

3.1 梯度下降的公式

  梯度下降的更新规则如下:
θ = θ − η ⋅ ∇ θ L ( θ ) \theta = \theta - \eta \cdot \nabla_\theta L(\theta) θ=θ−η⋅∇θ​L(θ)其中:
   θ \theta θ 是模型的参数(例如权重和偏置)。
   η \eta η 是学习率(learning rate),控制每次更新的步长。
   ∇ θ L ( θ ) \nabla_\theta L(\theta) ∇θ​L(θ) 是损失函数 L L L 关于参数 θ \theta θ 的梯度。
  梯度 ∇ θ L ( θ ) \nabla_\theta L(\theta) ∇θ​L(θ) 告诉我们,沿着哪个方向更新参数能使损失函数下降得更快。

3.2 梯度下降的类型(优化器)

  1. 批量梯度下降(Batch Gradient Descent):每次使用整个数据集来计算梯度和更新参数。虽然准确性高,但计算开销大,尤其是在数据量很大的时候。
  2. 随机梯度下降(Stochastic Gradient Descent, SGD):每次只用一个样本来计算梯度和更新参数。虽然更新速度快,但可能会导致参数更新不稳定。
  3. 小批量梯度下降(Mini-Batch Gradient Descent):每次使用数据集中的一个小批量样本来计算梯度和更新参数。这种方法结合了批量和随机梯度下降的优点。
  当然,还有很多类型的优化,比如Adam、RMSprop、AdaW等,这里不再细述。

4. 反向传播

  反向传播(Back Propagation, BP)是用于计算神经网络中每一层的梯度的算法。它是梯度下降的一部分,特别用于计算和传播每个参数对损失函数的贡献。
  反向传播算法依赖于链式法则(Chain Rule),通过链式法则可以将损失函数对模型参数的梯度逐层传播回去,从而更新每一层的参数。

  即从输出层一步步传播到输入层。

4.1 反向传播的基本步骤

假设我们有一个包含多个层的神经网络,每一层都有权重 W W W 和偏置 b b b。反向传播的步骤如下:
  1. 前向传播:从输入层开始,将输入数据传递到输出层,并计算出预测值。
  2. 计算损失:根据模型的输出与真实标签计算损失函数。
  3. 反向传播:
    (1)计算输出层的梯度,即损失函数关于输出的偏导数。
    (2)逐层计算隐藏层的梯度,即损失函数关于每一层的输入、权重和偏置的偏导数。
  4. 更新权重和偏置:根据梯度下降规则更新每一层的权重和偏置。

4.2 反向传播的数学推导

  假设神经网络有两层,每层的输出分别为 a 1 a_1 a1​ 和 a 2 a_2 a2​,损失函数为 L L L。反向传播的目标是计算 ∂ L ∂ W 1 \frac{\partial L}{\partial W_1} ∂W1​∂L​ 和 ∂ L ∂ W 2 \frac{\partial L}{\partial W_2} ∂W2​∂L​,即每一层权重的梯度。
  1. 输出层梯度计算:
∂ L ∂ a 2 = ∂ L ∂ y ⋅ ∂ y ∂ a 2 \frac{\partial L}{\partial a_2} = \frac{\partial L}{\partial y} \cdot \frac{\partial y}{\partial a_2} ∂a2​∂L​=∂y∂L​⋅∂a2​∂y​其中 y y y是输出层的预测值。
  2. 隐藏层梯度计算:
∂ L ∂ a 1 = ∂ L ∂ a 2 ⋅ ∂ a 2 ∂ a 1 \frac{\partial L}{\partial a_1} = \frac{\partial L}{\partial a_2} \cdot \frac{\partial a_2}{\partial a_1} ∂a1​∂L​=∂a2​∂L​⋅∂a1​∂a2​​然后,我们使用链式法则计算每一层的权重梯度。
  3. 参数更新:根据计算出来的梯度使用梯度下降更新权重和偏置。

5. 实战

5.1 手动求导

  我们来构建一个简单的神经网络,做一个线性回归:

在这里插入图片描述

  模型的输入为2维数据,输出为1维数据,该模型的函数表达式可以表示为:
y ∗ = w 5 ⋅ ( w 1 ⋅ x 1 + w 3 ⋅ x 2 ) + w 6 ⋅ ( w 2 ⋅ x 1 + w 4 ⋅ x 2 ) y^* = w_5 \cdot (w_1 \cdot x_1 + w_3 \cdot x_2) + w_6 \cdot (w_2 \cdot x_1 + w_4 \cdot x_2) y∗=w5​⋅(w1​⋅x1​+w3​⋅x2​)+w6​⋅(w2​⋅x1​+w4​⋅x2​)  我们使用MSE来作为损失函数,来优化我们的网络,即
L o s s = 1 n ∑ i = 1 n ( y i − y i ∗ ) 2 Loss = \frac {1} {n} \sum _{i=1} ^ n (y_i - y^*_i) ^ 2 Loss=n1​i=1∑n​(yi​−yi∗​)2
  假设初始时模型的权重为:
w 1 = 1.0 , w 2 = 0.5 , w 3 = 0.5 , w 4 = 0.7 w_1=1.0,w_2=0.5,w_3=0.5,w_4=0.7 w1​=1.0,w2​=0.5,w3​=0.5,w4​=0.7 w 5 = 1.0 , w 6 = 2.0 w_5=1.0,w_6=2.0 w5​=1.0,w6​=2.0  已知一个样本数据:
x 1 = 0.5 , x 2 = 1.0 , y = 0.8 x_1=0.5,x_2=1.0,y=0.8 x1​=0.5,x2​=1.0,y=0.8  按照上述公式,计算一次前向传播,得到 y ∗ = 2.9 y^*=2.9 y∗=2.9,与真实值 y y y 的偏差可以通过 l o s s loss loss 计算得到, l o s s = ( y − y ∗ ) 2 = 4.41 loss = (y - y^*) ^ 2 = 4.41 loss=(y−y∗)2=4.41。然后我们通过梯度下降的方式来更新 w 5 w_5 w5​,需要先计算出在点 ( x 1 , x 2 ) (x_1,x_2) (x1​,x2​)的梯度:
∇ = ∂ L ∂ w 1 = ∂ L ∂ y ∗ ⋅ ∂ y ∗ ∂ w 5 \nabla = \frac {\partial L} {\partial w_1} = \frac {\partial L} {\partial y^*} \cdot \frac {\partial y^*} {\partial w_5} ∇=∂w1​∂L​=∂y∗∂L​⋅∂w5​∂y∗​ ∂ L ∂ y ∗ = − 2 ( y − y ∗ ) = 4.2 \frac {\partial L} {\partial y^*} = -2 (y- y^*) = 4.2 ∂y∗∂L​=−2(y−y∗)=4.2 ∂ y ∗ ∂ w 5 = w 1 ⋅ x 1 + w 3 ⋅ x 2 = 1.0 \frac {\partial y^*} {\partial w_5} = w_1 \cdot x_1 + w_3 \cdot x_2 = 1.0 ∂w5​∂y∗​=w1​⋅x1​+w3​⋅x2​=1.0
  所以梯度为:
∂ L ∂ w 1 = 4.2 \frac {\partial L} {\partial w_1} = 4.2 ∂w1​∂L​=4.2  假设,学习率为 0.01 0.01 0.01,根据梯度下降算法 θ = θ − η ⋅ ∇ θ L ( θ ) \theta = \theta - \eta \cdot \nabla_{\theta} L(\theta) θ=θ−η⋅∇θ​L(θ) 更新 w 5 w5 w5:
w 5 = w 5 − η ∂ L ∂ w 5 = 0.958 w_5 = w_5 - \eta \frac {\partial L} {\partial w_5} = 0.958 w5​=w5​−η∂w5​∂L​=0.958  同理,可以更新 w 1 w_1 w1​:
∂ y ∗ ∂ w 1 = w 5 x 1 = 0.5 \frac {\partial y^*} {\partial w_1} = w_5x_1 = 0.5 ∂w1​∂y∗​=w5​x1​=0.5 ∂ L ∂ w 1 = ∂ L ∂ y ∗ ⋅ ∂ y ∗ ∂ w 1 = 2.1 \frac {\partial L} {\partial w_1} = \frac {\partial L} {\partial y^*} \cdot \frac {\partial y^*} {\partial w_1} = 2.1 ∂w1​∂L​=∂y∗∂L​⋅∂w1​∂y∗​=2.1 w 1 = w 1 − η ∂ L ∂ w 1 = 0.979 w_1 = w_1 - \eta \frac {\partial L} {\partial w_1} = 0.979 w1​=w1​−η∂w1​∂L​=0.979

5.2 自动求导

  将上面模型的表达式形式化,即
y ∗ = ( x T ⋅ W h ) ⋅ W o y* = (x^T \cdot W_h) \cdot W_o y∗=(xT⋅Wh​)⋅Wo​其中,
x = [ x 1 x 2 ] , W h = [ w 1 w 2 w 3 w 4 ] , W o = [ w 5 w 6 ] x = \begin{bmatrix} x_1 \\ x_2\end{bmatrix},W_h = \begin{bmatrix} w_{1} & w_{2} \\ w_{3} & w_{4} \end{bmatrix},W_o = \begin{bmatrix} w_{5} & w_{6} \end{bmatrix} x=[x1​x2​​],Wh​=[w1​w3​​w2​w4​​],Wo​=[w5​​w6​​]  这样,我们就可以使用pytorch来构建上述神经网络了,具体如下:

# -*- coding: utf-8 -*-
# Author  : liyanpeng
# Email   : yanpeng.li@cumt.edu.cn
# Datetime: 2024/11/29 17:38
# Filename: chain_rule.py
import torch
import torch.nn as nn
import torch.optim as optim


def func_y():
    x1 = torch.tensor(0.5, dtype=torch.float32)
    x2 = torch.tensor(1.0, dtype=torch.float32)

    w1 = torch.tensor(1.0, dtype=torch.float32)
    w2 = torch.tensor(0.5, dtype=torch.float32)
    w3 = torch.tensor(0.5, dtype=torch.float32)
    w4 = torch.tensor(0.7, dtype=torch.float32)
    w5 = torch.tensor(1.0, dtype=torch.float32)
    w6 = torch.tensor(2.0, dtype=torch.float32)

    y = w5 * (w1 * x1 + w2 * x2) + w6 * (w3 * x1 + w4 * x2)
    print(y)


class SimpleNeuralNetwork(nn.Module):
    def __init__(self):
        super().__init__()
        self.linear1 = nn.Linear(in_features=2, out_features=2, bias=False)
        self.linear2 = nn.Linear(in_features=2, out_features=1, bias=False)

        self.linear1.weight.data = torch.tensor([[1.0, 0.5], [0.5, 0.7]], dtype=torch.float32)
        self.linear2.weight.data = torch.tensor([[1.0, 2.0]], dtype=torch.float32)

    def forward(self, x):
        x = self.linear1(x)
        y = self.linear2(x)

        return y


def grad_hook(grad):
    print('grad:', grad[0][0])


if __name__ == '__main__':
    x = torch.tensor([0.5, 1.0], dtype=torch.float32)
    y = torch.tensor(0.8, dtype=torch.float32)

    model = SimpleNeuralNetwork()
    criterion = nn.MSELoss()
    optimizer = optim.SGD(model.parameters(), lr=0.01)

    hook_list = []
    for name, param in model.named_parameters():
        if param.requires_grad:
            hook = param.register_hook(grad_hook)
            hook_list.append(hook)

    y_pred = model(x)
    loss = criterion(y_pred, y)

    optimizer.zero_grad()   # 清空梯度
    loss.backward()         # 反向传播
    optimizer.step()        # 更新权重

    for hook in hook_list:
        hook.remove()

    print('更新后的w1:', model.linear1.weight.data[0, 0])
    print('更新后的w5:', model.linear2.weight.data[0, 0])

  打印结果如下,与手动计算的结果一致:

grad: tensor(4.2000)
grad: tensor(2.1000)
更新后的w1: tensor(0.9790)
更新后的w5: tensor(0.9580)

5.3 过程可视化

  再加入一些可视化代码,看一下权重更新的轨迹:

# -*- coding: utf-8 -*-
# Author  : liyanpeng
# Email   : yanpeng.li@cumt.edu.cn
# Datetime: 2024/11/29 17:38
# Filename: chain_rule.py
import torch
import torch.nn as nn
import torch.optim as optim
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np


if __name__ == '__main__':
    x = torch.tensor([0.5, 1.0], dtype=torch.float32)
    y = torch.tensor(0.8, dtype=torch.float32)

    model = SimpleNeuralNetwork()
    criterion = nn.MSELoss()
    optimizer = optim.SGD(model.parameters(), lr=0.01)

    loss_list = []
    w1_list = []
    w2_list = []
    for epoch in range(5):
        y_pred = model(x)
        loss = criterion(y_pred, y)

        optimizer.zero_grad()   # 清空梯度
        loss.backward()         # 反向传播
        optimizer.step()        # 更新权重

        loss_list.append(loss.item())
        w1_list.append(model.linear1.weight.data[0, 0].item())
        w2_list.append(model.linear2.weight.data[0, 0].item())

    fig = plt.figure(figsize=(8, 6))

    # 3D曲面图和等高线图
    ax1 = fig.add_subplot(111, projection='3d')
    ax1.set_title("3D Loss Surface with Contours and Trajectory")

    # 将损失值、权重映射到X, Y, Z轴
    ax1.plot_trisurf(w1_list, w2_list, loss_list, cmap='viridis', alpha=0.7)

    # 生成网格数据,用于绘制等高线图
    w1_range = np.linspace(min(w1_list), max(w1_list), 100)
    w2_range = np.linspace(min(w2_list), max(w2_list), 100)

    W1, W2 = np.meshgrid(w1_range, w2_range)

    np.random.seed(42)
    x_train = np.random.rand(100, 2)
    noise = np.random.randn(100, 1)
    # f(x, y) = 2x^2 + y^2 - 0.7 + noise
    y_train = 2 * x_train[:, 0] * x_train[:, 0] + x_train[:, 1] * x_train[:, 1] - 0.7 + noise

    # 计算每个网格点的损失值
    loss_grid = np.zeros(W1.shape)
    for i in range(W1.shape[0]):
        for j in range(W1.shape[1]):
            model.linear1.weight.data[0, 0] = W1[i, j]
            model.linear2.weight.data[0, 0] = W2[i, j]
            y_pred = model(torch.tensor(x_train, dtype=torch.float32))
            loss_grid[i, j] = criterion(y_pred, torch.tensor(y_train, dtype=torch.float32)).item()

    # 绘制等高线图
    ax1.contour(W1, W2, loss_grid, levels=20, cmap='viridis', offset=min(loss_list))

    # 绘制权重更新轨迹
    ax1.plot(w1_list, w2_list, loss_list, 'k-', marker='o', markersize=5, label="Weight Update Trajectory")
    ax1.plot(w1_list, w2_list, [min(loss_list)] * len(w1_list), 'r-', marker='o', markersize=5, label="Trajectory on Contours")

    # 在等高线图上标记权重更新的坐标
    for i in range(len(w1_list)):
        ax1.text(w1_list[i], w2_list[i], min(loss_list),
                 f'({w1_list[i]:.4f}, {w2_list[i]:.4f})',
                 color='red', fontsize=8, ha='center', va='center')

    ax1.set_xlabel('Linear1 Weight (First Element)')
    ax1.set_ylabel('Linear2 Weight (First Element)')
    ax1.set_zlabel('Loss')
    ax1.legend()

    plt.tight_layout()
    plt.show()

  绘制的效果图如下:

在这里插入图片描述
  损失函数从右侧至左侧逐渐收敛,最右侧的点是我们第一次更新时 w 1 w_1 w1​和 w 2 w_2 w2​的权重。

一切皆是映射:深度学习中的反向传播和梯度下降 深度学习作为人工智能领域的一颗新星,近年来取得了令人瞩目的成果。然而,深度学习的核心——反向传播和梯度下降算法,却常常让初学者感到困惑。本文将深入浅出地讲解反向传播和梯度下降的原理,帮助读者理解这一深度学习中的基石。反向传播算法的核心思想是将输出层误差的梯度反向传播到隐藏层,从而计算每个神经元的梯度,并更新权重和偏置。本文深入浅出地讲解了反向传播和梯度下降的原理,并通过实例展示了如何使用PyTorch实现这些算法。同时,本文还介绍了反向传播和梯度下降在图像识别、语音识别、自然语言处理等领域的应用。 阅读详情

相关推荐

ECU-TEST笔记&使用技巧01

说明 1)所述均基于如下环境:ECU-TEST 8.0、Win10系统、NI Veristand 2018(HIL测试)。不排除因为版本及软件环境问题,所述方法不奏效或有更好的方法,欢迎交流,一起提高。 2)本博客以问答形式进行,所述问题均来自于实际测试(包括MIL、HIL测试)遇到的问题及需求,目的是提高测试效率和自动化测试序列的可维护性。 3)本博客尽量从测试方法及ECU-TEST原...

Eigrl的博客 1万+

人工智能基础部分4-梯度下降和反向传播

梯度下降(Gradient Descent)是一种最优化算法,用于求解最小化损失函数的参数值。梯度下降的基本思想是:根据当前参数的梯度,沿着梯度的反方向移动参数,从而找到损失函数的最小值。梯度下降在机器学习和深度学习中被广泛应用,用于优化模型参数。 反向传播(Backpropagation)是一种形式化的梯度下降算法,用于训练神经网络。反向传播的基本思想是:用输出层的梯度反向传播到隐藏层,以计算每一层的梯度,并将梯度更新到参数,以期望找到损失函数的最小值。反向传播结合了梯度下降算法和负梯度方向的求解。

微学AI的博客 4634

腾讯混元3D世界模型2.0实战:从AI生成到Unity/UE引擎集成全指南

生成式AI正在重塑3D内容创作流程,其核心原理是通过大语言模型理解自然语言描述,并驱动多阶段生成流水线自动创建3D资产与场景。这项技术为游戏开发、虚拟仿真和数字孪生领域带来了革命性的效率提升,能够将传统需要数周的美术协作流程压缩至几分钟。在实际应用中,开发者需要掌握本地环境部署、模型推理优化以及生成资产与主流游戏引擎的集成工作流。本文以腾讯开源的混元3D世界模型为例,详细解析如何将AI生成的场景通过插件高效导入Unity和Unreal Engine,并针对光照烘焙、材质调整、性能优化等工程实践问题提供解决方

cnracht8153的博客 752

【深度学习】梯度下降与反向传播

学习记录#梯度下降和反向传播是机器学习和深度学习中非常重要的两个概念,尤其是在训练神经网络时。今天我们来总结一下。

CXY819394的博客 2627

反向传播与梯度下降

之前对反向传播和梯度下降一直不太通透,感觉理解的很模糊,理解层次仅仅局限在概念上。因此为了能够对反向传播和梯度下降的具体的原理和计算过程有一个清晰的认识,本人又去重温一遍李宏毅老师的课,在此将学习过程和自己的见解记录在此。反向传播是为了计算每个参数对loss的导数的;反向传播中的forward pass是为了保留计算图中的任意一次计算的w对z 的导数的,这样在backward pass计算的时候就可以根据forward pass计算的导数计算出来loss对w的导数。

weixin_48192256的博客 2909

Java电商秒杀系统性能优化(一)——电商秒杀系统框架回顾

电商秒杀系统框架回顾项目简介外部依赖框架回顾项目要点项目中存在的问题小结 课程是免费的,课程地址如下:SpringBoot搭建电商秒杀项目,课程真的很棒,作者的思路很清晰,建议各位读者可以跟着视频练习一下这个项目; 项目简介 通过SpringBoot快速搭建的前后端分离的电商基础秒杀项目。项目通过应用领域驱动型的分层模型设计方式去完成:用户otp注册、登陆、查看、商品列表、进入商品详情以及倒计时秒...

ghw15221836342的博客 2919

梯度下降、反向传播

首先举个例子是,当前你拥有一个神经网络模型用于预测某一个值,此时输出层包括很多个神经元都给出了自己的预测值,我们要计算预测值(模型输出)与实际标签之间的差异,那么此时损失函数可以设置为均方误差。前向传播用于计算模型的输出,而反向传播用于沿着网络反向传播损失,并计算每个参数的梯度。这样,我们就可以得到每个参数的梯度,然后使用梯度下降来更新参数,从而最小化损失函数。在使用梯度下降进行优化模型,以使损失函数最小化过程中,我们需要知道每个参数对损失函数的影响程度,也就是梯度。是学习率,它决定了参数更新的步长。

A18164648的博客 2486

文件上传漏洞攻击与防范方法

文件上传漏洞攻击与防范方法 文件上传漏洞简介: 文件上传漏洞是web安全中经常用到的一种漏洞形式。是对数据与代码分离原则的一种攻击。上传漏洞顾名思义,就是攻击者上传了一个可执行文件如木马,病毒,恶意脚本,WebShell等到服务器执行,并最终获得网站控制权限的高危漏洞。 文件上传漏洞危害: 上传漏洞与SQL注入或 XSS相比 , 其风险更大 , 如果 Web应用程序存在上传漏洞 , 攻击者上传...

m0_38103658的博客 4万+

独家 | 数据科学家指南:梯度下降与反向传播算法

作者:Richmond Alake 翻译:陈之炎 校对:zrx 本文约3300字,建议阅读5分钟 本文旨在为数据科学家提供一些基础知识,以理解在训练神经网络时所需调用的底层函数和方法。标签:神经网络,梯度下降,反向传播人工神经网络[ANN)是人工智能技术的基础,同时也是机器学习模型的基础。它们模拟人类大脑的学习过程,赋予机器完成特定类人任务的能力。数据科学家的目标是...

数据派THU 1677

【王木头学科学|深度学习】6. 如何理解“梯度下降法?”“什么反向传播”?

笔记来源于B站UP主@王木头学科学 笔记来源https://www.bilibili.com/video/BV1Zg411T71b 正向传播:把数据输入到神经网络,这些数据会沿着神经网络正向的传递,传递过程中会一层一层一个一个的感知机(也就是感知机上的参数W和b对结果产生的影响,有的对输出的结果影响大,有的对输出的结果产生的影响小)进行操作之后,最后得出结果 反向传播:当一个神经网络还没有训练好的时候,它的判断结果是有偏差的,这个偏差也是依赖于W和b,如果某个w或者某个b,它对判断的结果产生重大的影响,那么

阿飞的博客 1254

VS中的C#项目怎样引入另一个项目

场景 在C#项目A中需要引用项目B。 实现 将项目B手动复制到A所在的项目目录下的同一个解决方案中,即与项目A同级的目录下。 在VS中打开项目B,打开解决方案资源管理器--右击解决方案--添加--现有项目 然后找到项目B的.csproj文件打开。 然后看到资源管理器中已经将B添加进来了 点击项目A的引用-右键-添加 将项目下的解决方...

BADAO_LIUMANG_QIZHI的博客 8831

对于深度学习中梯度下降和反向传播的理解

对于深度学习任务的理解,梯度下降和反向传播的理解。

番茄炒蛋三分糖 2949

《MySQL 入门教程》第 03 篇 管理数据库

本篇主要介绍 MySQL 数据库的创建、查看、选择和删除操作,包括使用 mysql 命令行和 MySQL Workbench 图形工具两种方式。

Tony.Dong的专栏 3049

2. 神经网络系列--反向传播与梯度下降

系列博客,原文在笔者所维护的github上:https://aka.ms/beginnerAI, 点击star加星不要吝啬,星越多笔者越努力。 第2章 神经网络中的三个基本概念 2.0 通俗地理解三大概念 这三大概念是:反向传播,梯度下降,损失函数。 神经网络训练的最基本的思想就是:先“猜”一个结果,我们叫预测结果a,看看这个预测结果和事先标记好的训练集中的真实结果y之间的差距,然后调整策略,再...

weixin_43216229的博客 956

AI应用开发基础傻瓜书系列2-神经网络中反向传播与梯度下降的基本概念

AI应用开发基础傻瓜书系列2-神经网络中反向传播与梯度下降的基本概念 全套教程请点击:微软 AI 开发教程 第二篇:神经网络中反向传播与梯度下降的基本概念 预警:本篇博客中会涉及到偏导数的概念,但是非常初级,很容易理解,建议硬着头皮看,跟着算一遍,看完之后保证会觉得人生美好了很多。 反向传播和梯度下降这两个词,第一眼看上去似懂非懂,不明觉厉。这两个概念是整个神经网络中的重要组成部分,是和误差函数/...

SoftwareTeacher的专栏 1762

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

深入浅出--梯度下降法及其实现(经典)

深入浅出--梯度下降法及其实现 是介绍梯度下降算法和反向传播最经典的一片文章,没有之一。 转载于:https://www.cnblogs.com/liuys635/p/11257150.html

weixin_30753873的博客 172

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

反向传播算法的直观理解

一、反向传播的由来在我们开始DL的研究之前,需要把ANN—人工神经元网络以及bp算法做一个简单解释。关于ANN的结构,我不再多说,网上有大量的学习资料,主要就是搞清一些名词:输入层/输入神经元,输出层/输出神经元,隐层/隐层神经元,权值,偏置,激活函数接下来我们需要知道ANN是怎么训练的,假设ANN网络已经搭建好了,在所有应用问题中(不管是网络结构,训练手段如何变化...

qq_44929388的博客 487

翻译: 可视化深度学习反向传播原理二

顺便一提 这有一点点像描述生物中 神经元的网络如何学习的一个理论 “赫布理论” 总结起来就是“一同激活的神经元关联在一起”这里 权重的最大增长 即连接变得更强的部分 就会发生在已经最活跃的神经元 和想要更多激发的神经元之间 可以说 看见一个“2”时激发的神经元 会和“想到一个2”时激发的神经元联系地更紧密这里解释一下 我个人对人工神经网络是否真的在 模仿生物学上大脑的工作 没有什么发言权 “一同激活的神经元关联在一起”这句话是要打星号注释的 但作为一个粗略的对照 我觉得还是挺有意思的。

AI架构师易筋 812

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

如何理解神经网络的前向传播与反向传播机制?

梯度消失和梯度爆炸1. 信息前向传播2. 误差反向传播 \qquad神经网络的训练过程通常分为两个阶段:前向传播和反向传播。“前向传播”求损失,“反向传播”回传误差。 1. 信息前向传播 \qquad所谓的前向传播算法就是从输入层开始,依次经过隐藏层(如果有)最终到达输出层的过程。将上一层的输出作为下一层的输入,并计算下一层的输出。数据每经过一层传播,其节点输出的值所代表的信息层次就越高阶和概括。 \qquad三层神经网络的前向传播如下图: \qquad如图所示,hidden layerhi

m0_52650517的博客 828

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【机器学习】一题看懂反向传播与梯度下降

这里写自定义目录标题一题看懂反向传播与梯度下降从PayPal的一道填空题说起梯度下降反向传播算法 一题看懂反向传播与梯度下降 接下来一段时间可能会好好看一下机器学习了,加油鸭(ง •_•)ง 从PayPal的一道填空题说起 今天刷牛客,看到了如下一道题: 以神经网络使用了如下结构:输入层有三个节点,隐藏层有一层且有两个节点,输出层有一个节点。隐藏层使用relu作为输出函数,输出层的损失函数为12(...

weixin_42948291的博客 536

深度学习之反向传播算法

直观理解反向传播 反向传播算法是用来求那个复杂到爆的梯度的。 上一集中提到一点,13000维的梯度向量是难以想象的。换个思路,梯度向量每一项的大小,是在说代价函数对每个参数有多敏感。 如上图,我们可以这样里理解,第一个权重对代价函数的影响是是第二个的32倍。 我们来考虑一个还没有被训练好的网络。我们并不能直接改动这些激活值,只能改变权重和偏置值。但记住,我们想要输出层出...

dianshu1593的博客 386

深度学习笔记(4):由浅入深,计算图与神经网络,前向传播与反向传播的剖析

前言 本文所列举的简单的例子可能用神经网络解释显得有点大材小用(overkill),不过,这样讲解是很简单的,也是更加易于消化理解的。所以既然只是为了体会思想,请尽量跟着思路就好。 简单的神经网络的图解作为引入(Introduction) 比如这个简单的式子J=3×(a+bc)J=3×(a+bc)J=3×(a+bc) 通过拆解成三层结构u=bc,v=a+u,J=3vu=bc,v=a+u,J=3vu...

weixin_43197820的博客 585

神经网络背后的数学原理:反向传播过程及公式推导

清华大数据软件团队官方微信公众号来源:Deephub Imba 本文约3500字,建议阅读5分钟 如何计算隐藏层中的误差?微积分和这些有什么关系?反向传播是神经网络通过调整神经元的权重和...

数据派THU 571

【零基础】看懂神经网络中的反向传播

一、序言   反向传播在神经网络中用于优化权重w和阈值b,是神经网络优化的核心算法。经过数日的学习终于看明白了一点反向传播的原理,这里作文记录心得。   本文先介绍一下基本的数学计算方法,然后根据“损失计算公式”推导出优化参数的反向传播方法。 二、基本数学原理   神经网络中优化参数w、b的方法称为反向传播,反向传播的具体实施方法称为“梯度下降”,梯度下降涉及两个基本的数学知识:求导、链式...

布兰姥爷的博客 974
上一篇: DSPy:不需要手写prompt啦,You Only Code Once!
下一篇: 从Manus到OpenManus:多智能体协作框架如何重构AI生产力?
夏小悠
夏小悠 优质创作者: python技术领域 优质创作者: python技术领域 领域专家: 数据科学与机器学习技术领域 领域专家: 数据科学与机器学习技术领域
博客等级 码龄8年 1万+粉丝 126原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏小悠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值