深度學習:PyTorch人工神經網絡優化方法分享(1)

本文目錄:

  • 一、從梯度角度入手
    • (一)梯度下降算法回顧
    • (二)常用優化算法
      • 1.SGD(Stochastic Gradient Descent)- 隨機梯度下降
      • 2.BGD (Batch Gradient Descent) - 批量梯度下降
      • 3.MBGD (Mini-Batch Gradient Descent) - 小批量梯度下降
    • (三)梯度優化算法的不足與革新
      • 1.指數加權平均
      • 2.動量算法(Momentum)
      • 3.動量法(Momentum)有效克服 “平緩”、”鞍點”、”峽谷” 的問題
  • 二、從自適應學習率角度入手
    • (一)自適應梯度算法(AdaGrad)
      • 1.概念
      • 2.更新過程
    • (二)RMSProp優化算法
      • 1.概念
      • 2.更新過程
  • 三、自適應矩估計(Adam)
    • (一)概念
    • (二)Adam的更新過程
  • 附贈:
    • 1.BGD/SGD/MBGD三種梯度優化方法對比
    • 2.普通SGD與動量法(Momentum)的對比
    • 3.AdaGrad、RMSProp、Adam 優缺點對比

前言:前面講述了PyTorch人工神經網絡的激活函數、損失函數等內容,今天講解優化方法。

簡單來說,優化方法主要是從兩個角度來入手,一個是梯度,一個是學習率

一、從梯度角度入手

(一)梯度下降算法回顧

梯度下降法簡單來說就是一種尋找使損失函數最小化的方法**。

從數學角度來看,梯度的方向是函數增長速度最快的方向,那么梯度的反方向就是函數減少最快的方向,所以有:

在這里插入圖片描述
其中,η是學習率,如果學習率太小,那么每次訓練之后得到的效果都太小,增大訓練的時間成本。如果,學習率太大,那就有可能直接跳過最優解,進入無限的訓練中。解決的方法就是,學習率也需要隨著訓練的進行而變化。

(二)常用優化算法

在梯度角度優化算法中,SGD(隨機梯度下降)、BGD(批量梯度下降) 和 SBGD(小批量梯度下降) 是三種基礎但核心的優化方法,而它們的區別主要在于 每次參數更新時使用的數據量。

1.SGD(Stochastic Gradient Descent)- 隨機梯度下降

在這里插入圖片描述
PyTorch代碼實現:將batch_size設為1:

train_loader = DataLoader(dataset, batch_size=1, shuffle=True)  # 逐樣本加載

2.BGD (Batch Gradient Descent) - 批量梯度下降

在這里插入圖片描述
PyTorch代碼實現:直接對整個數據集計算平均梯度

for epoch in range(epochs):optimizer.zero_grad()outputs = model(train_inputs)  # 全量數據loss = criterion(outputs, train_labels)loss.backward()  # 計算全量梯度optimizer.step()

3.MBGD (Mini-Batch Gradient Descent) - 小批量梯度下降

在這里插入圖片描述
PyTorch代碼實現:設置合適的batch_size

train_loader = DataLoader(dataset, batch_size=64, shuffle=True)  # 小批量加載

(三)梯度優化算法的不足與革新

梯度下降優化算法中,可能會碰到以下情況:
在這里插入圖片描述

  • 碰到平緩區域,梯度值較小,參數優化變慢;
  • 碰到 “鞍點” ,梯度為0,參數無法優化;
  • 碰到局部最小值,參數不是最優。

對于這些問題, 出現了一些對梯度下降算法的優化方法,例如:動量法

動量法(Momentum)詳解:

簡單來說,動量法是對SGD算法的改進,它運用了指數加權平均思想,最后起到減少震蕩,加速收斂的效果。動量法尤其適用于高曲率、小但一致的梯度或帶噪聲的梯度場景。

1.指數加權平均

一種用于處理序列數據(如時間序列、梯度下降中的參數更新)的平滑方法,廣泛應用于深度學習優化算法(如動量法(Momentum)、Adam、RMSprop等)。其核心思想是對歷史數據賦予指數衰減的權重,從而平衡當前值與歷史值的貢獻。

在這里插入圖片描述
在這里插入圖片描述

注意·:通過調整 β,可以靈活平衡近期數據與歷史數據的權重。

指數加權思想代碼實現

例:
from matplotlib import pyplot  as plt
import torchx=torch.arange(1,31)
torch.manual_seed(1)
y=torch.randn(30)*10
y_ewa=[]
beta=0.9
for idx,t in enumerate(y,1):if idx==1:y_ewa.append(t)else:y_ewa.append(beta*y_ewa[idx-2]+(1-beta)*t)plt.scatter(x,y_ewa)
plt.show()

2.動量算法(Momentum)

首先,梯度計算公式(指數加權平均) s t = β s t ? 1 + ( 1 ? β ) g t s_t=βs_{t?1}+(1?β)g_t st?=βst?1?+(1?β)gt?
參數更新公式 w t = w t ? 1 ? η s t w_t=w_{t?1}?ηs_t wt?=wt?1??ηst?
公式參數說明:

s t s_t st?是當前時刻指數加權平均梯度值

s t ? 1 s_{t-1} st?1?是歷史指數加權平均梯度值

g t g_t gt?是當前時刻的梯度值

β 是調節權重系數,通常取 0.9 或 0.99

η是學習率

w t w_t wt?是當前時刻模型權重參數

PyTroch中編程實踐如下:

例:
def test01():# 1 初始化權重參數w = torch.tensor([1.0], requires_grad=True, dtype=torch.float32)loss = ((w ** 2) / 2.0).sum()# 2 實例化優化方法:SGD 指定參數beta=0.9optimizer = torch.optim.SGD([w], lr=0.01, momentum=0.9)# 31次更新 計算梯度,并對參數進行更新optimizer.zero_grad()loss.backward()optimizer.step()print('第1次: 梯度w.grad: %f, 更新后的權重:%f' % (w.grad.numpy(), w.detach().numpy()))# 42次更新 計算梯度,并對參數進行更新# 使用更新后的參數機選輸出結果loss = ((w ** 2) / 2.0).sum()optimizer.zero_grad()loss.backward()optimizer.step()print('第2次: 梯度w.grad: %f, 更新后的權重:%f' % (w.grad.numpy(), w.detach().numpy()))

3.動量法(Momentum)有效克服 “平緩”、”鞍點”、”峽谷” 的問題

在這里插入圖片描述

  • 當處于鞍點位置時,由于當前的梯度為 0,參數無法更新。但是 Momentum 動量梯度下降算法已經在先前積累了一些梯度值,很有可能使得跨過鞍點;
  • mini-batch 每次選取少數的樣本梯度確定前進方向,可能會出現震蕩,使得訓練時間變長,而Momentum 使用指數加權平均,平滑了梯度的變化,使得前進方向更加平緩,有利于加快訓練過程,一定程度上也降低了 “峽谷” 問題的影響。
    在這里插入圖片描述

二、從自適應學習率角度入手

(一)自適應梯度算法(AdaGrad)

1.概念

一種梯度下降算法,通過自適應調整每個參數的學習率。

核心思想是:對頻繁更新的參數降低學習率,對不頻繁更新的參數保持較大的學習率。

AdaGrad主要用于稀疏矩陣:對于稀疏特征(如NLP中的one-hot編碼),其對應的參數更新頻率低,梯度多為零或極小值,因此 G t,ii增長緩慢,使得自適應學習率 保持較大。而密集特征的參數因頻繁更新導致 G t,ii快速增大,學習率顯著下降。

在這里插入圖片描述

2.更新過程

在這里插入圖片描述
在這里插入圖片描述

PyTroch中編程實踐如下:

例:
def test02():# 1 初始化權重參數w = torch.tensor([1.0], requires_grad=True, dtype=torch.float32)loss = ((w ** 2) / 2.0).sum()# 2 實例化優化方法:adagrad優化方法optimizer = torch.optim.Adagrad([w], lr=0.01)# 31次更新 計算梯度,并對參數進行更新optimizer.zero_grad()loss.backward()optimizer.step()print('第1次: 梯度w.grad: %f, 更新后的權重:%f' % (w.grad.numpy(), w.detach().numpy()))# 42次更新 計算梯度,并對參數進行更新# 使用更新后的參數機選輸出結果loss = ((w ** 2) / 2.0).sum()optimizer.zero_grad()loss.backward()optimizer.step()print('第2次: 梯度w.grad: %f, 更新后的權重:%f' % (w.grad.numpy(), w.detach().numpy()))

結果顯示:

1: 梯度w.grad: 1.000000, 更新后的權重:0.9900002: 梯度w.grad: 0.990000, 更新后的權重:0.982965

(二)RMSProp優化算法

1.概念

**RMSProp 優化算法由Geoffrey Hinton提出,是對 AdaGrad 的優化:緩解AdaGrad的平方算法可能會使得學習率過早、過量的降低,導致模型訓練后期學習率太小,較難找到最優解的情況

其使用指數加權平均梯度替換歷史梯度的平方和。

相比AdaGrad有如下優勢:1.因使得梯度平方和不再無限增長,從而避免了學習率持續下降;2.因近期梯度對學習率的影響更大,避免了快速適應最新梯度。

2.更新過程

在這里插入圖片描述
在這里插入圖片描述
RMSProp特點:
在這里插入圖片描述
PyTroch中編程實踐如下:

例:
def test03():# 1 初始化權重參數w = torch.tensor([1.0], requires_grad=True, dtype=torch.float32)loss = ((w ** 2) / 2.0).sum()# 2 實例化優化方法:RMSprop算法,其中alpha對應betaoptimizer = torch.optim.RMSprop([w], lr=0.01, alpha=0.9)# 31次更新 計算梯度,并對參數進行更新optimizer.zero_grad()loss.backward()optimizer.step()print('第1次: 梯度w.grad: %f, 更新后的權重:%f' % (w.grad.numpy(), w.detach().numpy()))# 42次更新 計算梯度,并對參數進行更新# 使用更新后的參數機選輸出結果loss = ((w ** 2) / 2.0).sum()optimizer.zero_grad()loss.backward()optimizer.step()print('第2次: 梯度w.grad: %f, 更新后的權重:%f' % (w.grad.numpy(), w.detach().numpy()))

結果顯示:

1: 梯度w.grad: 1.000000, 更新后的權重:0.9683772: 梯度w.grad: 0.968377, 更新后的權重:0.945788

三、自適應矩估計(Adam)

(一)概念

深度學習中最常用的優化算法之一,它結合了動量法(Momentum)和RMSProp的優點,通過自適應調整每個參數的學習率,并利用梯度的一階矩(均值)和二階矩(方差)估計,實現了高效、穩定的參數更新。

主要有以下特點:
在這里插入圖片描述

(二)Adam的更新過程

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
PyTroch中編程實踐如下:

def test04():# 1 初始化權重參數w = torch.tensor([1.0], requires_grad=True)loss = ((w ** 2) / 2.0).sum()# 2 實例化優化方法:Adam算法,其中betas是指數加權的系數optimizer = torch.optim.Adam([w], lr=0.01, betas=[0.9, 0.99])# 3 第1次更新 計算梯度,并對參數進行更新optimizer.zero_grad()loss.backward()optimizer.step()print('第1次: 梯度w.grad: %f, 更新后的權重:%f' % (w.grad.numpy(), w.detach().numpy()))# 4 第2次更新 計算梯度,并對參數進行更新# 使用更新后的參數機選輸出結果loss = ((w ** 2) / 2.0).sum()optimizer.zero_grad()loss.backward()optimizer.step()print('第2次: 梯度w.grad: %f, 更新后的權重:%f' % (w.grad.numpy(), w.detach().numpy()))

結果顯示:

1: 梯度w.grad: 1.000000, 更新后的權重:0.9900002: 梯度w.grad: 0.990000, 更新后的權重:0.980003

附贈:

1.BGD/SGD/MBGD三種梯度優化方法對比

在這里插入圖片描述

2.普通SGD與動量法(Momentum)的對比

在這里插入圖片描述

3.AdaGrad、RMSProp、Adam 優缺點對比

在這里插入圖片描述

今日的分享到此結束,下篇文章繼續分享優化方法,敬請期待。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/88166.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/88166.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/88166.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

(三)yolov5——模型訓練

一、準備數據 先準備一個MP4的視頻 1.測試一幀 使用opencv來提取每一個視頻的幀 先使用以下代碼查看一幀的內容,是否符合預期 import cv2 import matplotlib.pyplot as plt# 打開視頻文件 video cv2.VideoCapture("111.mp4") # 讀取一幀 ret, frame…

008 Linux 開發工具(下) —— make、Makefile、git和gdb

🦄 個人主頁: 小米里的大麥-CSDN博客 🎏 所屬專欄: Linux_小米里的大麥的博客-CSDN博客 🎁 GitHub主頁: 小米里的大麥的 GitHub ?? 操作環境: Visual Studio 2022 文章目錄 Linux 開發工具(下)Linux 項目自動化構建工…

前綴和題目:連續的子數組和

文章目錄 題目標題和出處難度題目描述要求示例數據范圍 解法思路和算法代碼復雜度分析 題目 標題和出處 標題:連續的子數組和 出處:523. 連續的子數組和 難度 5 級 題目描述 要求 給定一個整數數組 nums \texttt{nums} nums 和一個整數 k \tex…

隊的簡單介紹

隊列:只允許在一端進行插入數據操作,在另一端進行刪除數據操作的特殊線性表,隊列具有先進先出 FIFO(First In First Out)的特點。 入隊列:進行插入操作的一端稱為隊尾。 出隊列:進行刪除操作的一端稱為隊頭。 入隊列…

AI-Sphere-Butler之如何將豆包桌面版對接到AI全能管家~新玩法(一)

環境: AI-Sphere-Butler VBCABLE2.1.58 Win10專業版 豆包桌面版1.47.4 ubuntu22.04 英偉達4070ti 12G python3.10 問題描述: AI-Sphere-Butler之如何將豆包桌面版對接到AI全能管家~新玩法(一) 聊天視頻: AI真…

【STM32】啟動流程

1、.s啟動文件解析 STM32的啟動文件(一般是.s匯編文件,如startup_stm32f407xx.s)是STM32上電后執行的第一段代碼,承擔著“系統初始化化引導員”的角色。 它的主要作用是設置初始化棧指針(SP)、程序計數器&…

【vim】通過vim編輯器打開、修改、退出配置文件

通過vim編輯器打開任一配置文件 vim /etc/profile 英文輸入下,按i鍵進入INSERT模式,修改配置文件 完成修改后,按esc鍵退出INSERT模式 英文輸入下,輸入":wq!",即可保存并退出 :q #不保存并退出 :q! …

Effective Modern C++ 條款6:當 auto 推導類型不符合預期時,使用顯式類型初始化慣用法

在C開發中,auto關鍵字以其簡潔性和高效性被廣泛使用。然而,“自動推導”并非萬能,尤其在某些特殊場景下,auto的推導結果可能與開發者預期不符,甚至導致未定義行為。今天,我們以《Effective Modern C》條款6…

學習Linux進程凍結技術

原文:蝸窩科技Linux進程凍結技術 功耗中經常需要用到,但是linux這塊了解甚少,看到這個文章還蠻適合我閱讀的 1 什么是進程凍結 進程凍結技術(freezing of tasks)是指在系統hibernate或者suspend的時候,將…

GitHub 趨勢日報 (2025年06月22日)

📊 由 TrendForge 系統生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日報中的項目描述已自動翻譯為中文 📈 今日獲星趨勢圖 今日獲星趨勢圖 624 LLMs-from-scratch 523 ai-engineering-hub 501 n8n 320 data-engineer-handb…

kotlin中為什么新增擴展函數功能?

在 Kotlin 中,擴展函數的本質是「不修改原有類代碼,為其新增功能」,這源自編程中「開閉原則」(對擴展開放,對修改關閉)的第一性原理。 核心需求:當需要給第三方庫的類(如 Android 的…

excel 數據透視表介紹

Excel 數據透視表(PivotTable)就是你的數據分析神器!它能幫你快速匯總、分類、比較和分析 大量數據,從看似雜亂無章的表格中一鍵提取關鍵信息 ,生成交互式的匯總報告。無需復雜公式,只需拖拽幾下,就能讓數據“開口說話”&#xff…

半導體行業中的專用標準產品ASSP是什么?

半導體行業中的專用標準產品ASSP是什么? “專用標準產品”(ASSP - Application Specific Standard Product)是半導體集成電路中的一個重要分類。 你可以把它理解為介于通用標準產品和全定制ASIC之間的一種芯片。以下是它的核心定義和特點&a…

秋招Day14 - MySQL - 鎖

MySQL中有幾種類型的鎖? 鎖粒度來分,有表鎖、頁鎖和行鎖。 加鎖機制劃分,有樂觀鎖和悲觀鎖。 按兼容性劃分,有共享鎖和排他鎖。 按鎖模式劃分,有記錄鎖,間隙鎖,next-key鎖,意向鎖…

/var/lib/docker/overlay2目錄過大怎么辦

/var/lib/docker/overlay2 是 Docker 默認用于存儲 容器鏡像和容器運行時數據 的核心目錄,基于 overlay2 存儲驅動實現。以下是其具體作用和內容的詳細解析: 1. overlay2 目錄的作用 存儲鏡像分層結構: Docker 鏡像采用分層設計,o…

JimuReport:一款免費的數據可視化報表工具

JimuReport(積木報表)是一款免費的企業級數據可視化報表軟件,提供拖拽的方式像搭建積木一樣完成在線設計,功能涵蓋數據報表、打印設計、圖表報表、門戶設計、大屏設計等。 數據源 JimuReport 支持 30 多種數據源,包括…

Neo4j.5.X社區版創建數據庫和切換數據庫

在使用Neo4j數據庫(版本:neo4j-community-5.22.0)時,系統自帶的“neo4j”和“system”數據庫適用于日常的簡單學習和練習,但對于新的項目,將項目數據與練習數據混用會帶來諸多不便,例如查詢效率…

DAY33神經網絡

浙大疏錦行 定義了一個簡單的神經網絡,主要是掌握pytorch框架

拼團系統多層限流架構詳解

拼團系統多層限流架構詳解 一、整體架構設計理念 多層限流采用"層層設防"思想,通過網關層全局流量控制→服務層接口粒度限流→本地資源隔離→熱點參數精準防護的四級防御體系,實現從粗到細的流量治理,確保大促期間系統穩定性。 …

[ctfshow web入門] web92 `==`特性與intval特性

信息收集 和之前的題差不多,這次是使用了不嚴格相等的,詳情看這篇博客: 和 在 PHP 中有何區別?一共包含哪些部分? 首先,不能使$num 4476,然后需要使intval($num,0)4476 include("flag…