首页 > 其他分享 >《Pytorch深度学习实践》P3梯度下降法 笔记+代码+图像:梯度下降、随机梯度下降、小批量随机梯度下降

《Pytorch深度学习实践》P3梯度下降法 笔记+代码+图像:梯度下降、随机梯度下降、小批量随机梯度下降

时间:2024-10-11 21:51:03浏览次数:9  
标签:plt 梯度 batch 下降 epoch cost 随机 data

目录

梯度下降(Batch Gradient Descent)

随机梯度下降(Stochastic Gradien Descent,SGD)

小批量随机梯度下降(Mini-batch Gradient Descent)


梯度下降(Batch Gradient Descent)

介绍:使用所有的训练样本计算梯度,并且在每次迭代中更新权重。

原理:假设有一个损失函数J(\omega ),它依赖于参数\omega。通过最小化损失函数来找到最优参数\omega,即:

w^* = \arg\min \limits_w J(w)

损失函数J(\omega )梯度\nabla J(w)表示在某个点\omega处损失函数的变化率。梯度是一个向量,指向损失函数上升最快的方向。梯度的计算公式为:

\nabla J(w) = \left[ \frac{\partial J}{\partial w_1}, \frac{\partial J}{\partial w_2}, \ldots, \frac{\partial J}{\partial w_n} \right]

其中\omega_1,\omega_2,...,\omega_n是参数向量的各个分量。

梯度下降的核心思想是沿着梯度的反方向更新参数,更新规则如下:

w := w - \alpha \nabla J(w)

其中,\alpha是学习率,控制每次更新的步长。\omega是当前的参数值。

迭代过程:

  1. 初始化参数 \omega(随机或为零)。
  2. 计算当前参数下的损失函数J(\omega )
  3. 计算梯度 \nabla J(w)
  4. 根据更新规则更新参数 \omega
  5. 重复步骤 2-4,直到损失函数收敛到一个可接受的值或者达到预设的迭代次数。

优点:

  • 收敛稳定,因为使用全数据集计算梯度。
  • 适用于小规模数据集。

缺点:

  • 计算成本高,特别是数据集较大时。
  • 更新频率低,可能导致收敛速度慢。
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]

w = 1.0

def forward(x):
    return x*w

def cost(xs,ys):
    cost = 0
    for x, y in zip(xs, ys):
        y_pred = forward(x)
        cost += (y_pred -y) **2
    return cost / len(xs)

def gradient(xs, ys):
    grad = 0
    for x, y in zip(xs, ys):
        grad += 2 * x * (x * w - y)
    return grad / len(xs)

print('Predict (before training)', 4, forward(4))
cost_all = []
for epoch in range(100):
    cost_val = cost(x_data, y_data)
    cost_all.append(cost_val)
    grad_val = gradient(x_data, y_data)
    w -= 0.01 * grad_val
    # w = round(w,2)
    print(f'Epoch:{epoch}, w={round(w,2)}, loss={cost_val}')
print('Predict (after training)', 4, forward)

import matplotlib.pyplot as plt
import numpy as np
epoch = np.arange(1,101,1)
plt.plot(epoch, cost_all)
plt.ylabel('Loss')
plt.xlabel('epoch')
plt.show()


随机梯度下降(Stochastic Gradien Descent,SGD)

介绍:每次只使用一个训练样本计算梯度,并立即更新权重。

优点:

  • 更新频率高,能够更快地开始收敛。
  • 更好的泛化能力,减少过拟合的风险。
  • 对大数据集友好,能够逐步处理数据。

缺点:

  • 收敛过程可能不稳定,损失函数曲线会有较大的波动。
  • 最终可能会在最优解附近振荡,而不是收敛到最优点。
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]

w = 1.0

def forward(x):
    return x*w

def loss(x,y):
    y_pred = forward(x)
    return (y_pred - y) ** 2

def gradient(x, y):
    return 2 * x * (x * w - y)

print('Predict (before training)', 4, forward(4))
cost_all = []
for epoch in range(100):
    l = 0
    for x, y in zip(x_data, y_data):
        grad = gradient(x, y)
        w = w - 0.01 * grad
        print(f'x = {x}, y = {y}, grad = {grad}')
        l += loss(x,y)
    print(f'Epoch:{epoch}, w={round(w,2)}, loss={l}')
    cost_all.append(l/len(x_data))

print('Predict (after training)', 4, forward)

import matplotlib.pyplot as plt
import numpy as np
epoch = np.arange(1,101,1)
plt.plot(epoch, cost_all)
plt.ylabel('Loss')
plt.xlabel('epoch')
plt.show()


小批量随机梯度下降(Mini-batch Gradient Descent)

介绍:每次只使用一小部分(批量)训练样本计算梯度,并更新权重

优点:

  • 结合了批量和随机梯度下降的优点,提供了较好的收敛性和稳定性。
  • 更新频率比批量梯度下降高,收敛速度快。
  • 批量大小可以调节以获得最佳性能(例如,计算效率与收敛速度)。

缺点:

  • 选择批量大小可能需要经验,可能会影响模型性能。
  • 仍然可能存在较小的波动,但通常比 SGD 更稳定。
import numpy as np
import matplotlib.pyplot as plt

x_data = np.arange(1,11,1)
y_data = np.arange(2,22,2)

w = 1.0
batch_size = 4  

def forward(x):
    return x * w

def cost(xs, ys):
    total_cost = 0
    for x, y in zip(xs, ys):
        y_pred = forward(x)
        total_cost += (y_pred - y) ** 2
    return total_cost / len(xs)

def gradient(xs, ys):
    grad = 0
    for x, y in zip(xs, ys):
        grad += 2 * x * (x * w - y)
    return grad / len(xs)

print('Predict (before training)', 4, forward(4))

cost_all = []
for epoch in range(100):
    # 随机打乱数据
    indices = np.random.permutation(len(x_data))
    
    l = 0
    for i in range(0, len(x_data), batch_size):
        
        batch_indices = indices[i:i + batch_size]
        batch_x = x_data[batch_indices]
        batch_y = y_data[batch_indices]
        cost_val = cost(batch_x, batch_y)
        l += cost_val
        grad_val = gradient(batch_x, batch_y)
        w -= 0.002 * grad_val

    average_loss = l / (len(x_data) / batch_size)
    cost_all.append(average_loss)
    print(f'Epoch:{epoch}, w={round(w, 2)}, loss={average_loss}')

print('Predict (after training)', 4, forward(4))

# 绘制损失曲线
epoch = np.arange(1, 101, 1)
plt.plot(epoch, cost_all)
plt.ylabel('Loss')
plt.xlabel('epoch')
plt.show()

朋友们有什么建议或疑问可以在评论区给出,或者是私信我!

标签:plt,梯度,batch,下降,epoch,cost,随机,data
From: https://blog.csdn.net/weixin_46046293/article/details/142862629

相关文章

  • 动态规划-路径问题——931.下降路径最小和
    1.题目解析题目来源:931.下降路径最小和——力扣测试用例2.算法原理1.状态表示我们可以开辟一个dp表,多开辟一行两列用来存储虚拟位置,dp[i][j]表示从第一行到该位置的最小路径和2.状态转移方程由于要找到最小路径和,并且由题目可以知道每一个位置的只能向......
  • 【时间序列分析】时间序列的预处理——平稳性检验和纯随机性检验
    目录(一)平稳性检验平稳性的时序图检验平稳性的自相关图检验(二)纯随机性检验纯随机序列的定义白噪声序列的性质 纯随机性检验 原理:Barlett定理检验统计量(一)平稳性检验 平稳性检验是时间序列分析中的一个重要步骤,主要用于判断时间序列数据的统计特性(如均值和方差)是......
  • 递归特征消除(RFE)与随机森林回归模型的 MATLAB 实现
    在机器学习中,特征选择是提高模型性能的重要步骤。本文将详细探讨使用递归特征消除(RFE)结合随机森林回归模型的实现,以研究对股票收盘价影响的特征。我们将逐步分析代码并介绍相关的数学原理。1.数据准备首先,我们清空工作区并加载数据,假设最后一列是股票的收盘价,前面的列是特征......
  • STM32中实现下降沿捕获(HAL库)
    配置步骤:1、配置时基工作参数HAL_TIM_IC_Init();主要配置其中的instanceinitautorelaodpreloadcountermodeperiodprescaler2、msp初始化HAL_TIM_IC_MspInit(TIM_HandleTypeDef*htim) __HAL_RCC_TIM2_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE();  HAL_NV......
  • 机器学习之梯度消失和梯度爆炸
    第一部分:梯度消失问题描述我们以多层单神经元为例,同时,为了简化问题描述,我们省略偏置b:假设我们现在想要更新参数w1:那么通过链式法则求导就是:假设我们使用的是sigmoid函数:那么sigmoid的求导函数图像为:倒数的范围为0~1/4,而不是0~1之间,如果是0~1之间,那么上面的这四个......
  • 递归下降--自顶向下的解析方法
    递归下降(RecursiveDescentParsing)是一种自顶向下的解析方法,用于解析编程语言的语法或表达式。它通过使用一组递归的函数来处理文法规则(通常是上下文无关文法),从而将输入字符串解析为语法树或抽象语法树(AST)。递归下降解析器是手工编写的,因此可以根据具体需要灵活地控制解析行为......
  • 创建一个类实现一个打字小游戏(利用time.time()计算参赛者的打字时间,进而利用时间计算
    #打字小游戏面向过程,面向对象#游戏类==》属性、行为##1.外部传入一些数据,数据单词列表[movies,add,open]#2.随机的抽取这个单词列表中的一个单词,作为本局游戏的单词!#3.游戏开始,游戏的展示,游戏的结束,游戏时间,游戏的正确率等importrandom#随机给出列表......
  • 随机算法
    算法导论这个文档是学习“算法设计与分析”课程时做的笔记,文档中包含的内容包括课堂上的一些比较重要的知识、例题以及课后作业的题解。主要的参考资料是Introductiontoalgorithms-3rd(ThomasH.)(对应的中文版《算法导论第三版》),除了这本书,还有的参考资料就是Algorithmsdesi......
  • 0x01 解决梯度消失和梯度爆炸的常用方法
    一、输入层初始化权重对于较深的网络,Xavier初始化和Kaiming初始化是常用的方法。Xavier假设输入和输出的方差相等,它特别适用于sigmoid和tanh激活函数,因为它能帮助保持信号在这些激活函数中传播时的方差不变,防止梯度消失或爆炸。Kaiming特别设计用于ReLU及其变体......
  • 随机组句小游戏-V1.13版本
    玩法:随机抽取地点人物事件,来组句2024/10/03进行微调.\(代码/Code:\)#include<bits/stdc++.h>#include<windows.h>#defineSM_printf("%c%c%c%c%c%c",-64,-18,-278,-59,-319,-40);usingnamespacestd;ints1,s2,s3,xz1,bool01;stringcopy_;stringplace[105]......