三、神經網絡——網絡優化方法

三、網絡優化方法

1.梯度下降算法

  • 梯段下降算法是一種尋找使損失函數最小化的方法,從數學上的角度來看,梯度的方向是函數增長速度最快的方向,那么梯度的反方向就是函數減少最快的方向,所以有Wijnew=Wijold?η?E?WijW_{ij}^{new} = W_{ij}^{old}-\eta\frac{\partial E}{\partial W_{ij}}Wijnew?=Wijold??η?Wij??E?

    • 其中,η\etaη是學習率,如果學習率太小,那么每次訓練之后得到的效果都太小,增大訓練的時間成本;如果學習率太大,那就有可能直接跳過最優解,進入無限的訓練中。解決的方法就是,學習率也需要隨著訓練的進行而變化
  • 在進行模型訓練的時候,有三個基礎的概念

    • EpochEpochEpoch:使用全部數據對模型進行一次完整訓練,訓練輪次
    • Batch_sizeBatch\_sizeBatch_size:使用訓練集中的小部分樣本對模型權重進行以此反向傳播的參數更新,每次訓練每批次樣本的數量(越大越好)
    • IteraionIteraionIteraion:使用一個Batch數據對模型進行一次參數更新的過程
    • eg.eg.eg.:假設數據集有500005000050000個訓練樣本,現在選擇BatchSize=256Batch Size= 256BatchSize=256對模型進行訓練,每個EpochEpochEpoch要訓練的圖片數量為500005000050000,訓練集具有BatchBatchBatch個數為50000/256+1=19650000/256 + 1 = 19650000/256+1=196;每個EpochEpochEpoch具有的IterationIterationIteration個數為196196196101010EpochEpochEpoch具有的IterationIterationIteration個數為196019601960
  • 在深度學習中,梯度下降的幾種方式的根本區別就在于Batch Size不同

    梯度下降方式Training Set SizeBatch SizeNumber of Batch
    BGDNN1
    SGDN1N
    Mini-BatchNBN / B + 1
    • 注:N/ B+ 1是針對未整除的情況。整除則是 N/ B
    • 在工作的時候通常使用的是 Mini-Batch

2.反向傳播算法過程

(1)反向傳播(BP算法)

  • 前向傳播:指的是數據輸入的神經網絡中,逐層向前傳輸,一直運算到輸出層為止
  • 反向傳播(BackPropagation):利用損失函數ERROR,從后往前,結合梯度下降算法,依次求各個參數的偏導并進行參數更新
  • 解釋:
    1. 前向傳播:獲取預測結果
    2. 計算損失:交叉熵/MSE(先計算W3W_3W3?,再計算W2W_2W2?,最后計算W1W_1W1?)
    3. 反向傳播:利用梯度下降算法對參數進行更新
for _ in range(epochs):for train_x, train_y in dataloader:# 將一個batch的訓練數據送入模型y_pred = model(train_x.type(torch.float32))# 計算損失值loss = criterion(y_pred, train_y, reshape(-1,1).type(torch.float32))total_loss += loss.item()train_sample += len(train_y)# 梯度清零optimizer.zero_grad()# 自動微分loss.backward()# 更新參數optimizer.step()

3.梯度下降的優化方法

  • 梯度下降優化算法中,可能會碰到以下情況:

    • 碰到平緩區域,梯度值較小,參數優化變慢
    • 碰到鞍點,梯度為0,參數無法優化
    • 碰到局部最小值,參數不是最優
  • 對于這些問題,出現了一些對梯度下降算法的優化方法,例如:Momentum, AgaGrad,PMSprop,Adam等

(1)指數加權平均

  • 指數移動加權平均:參考各數值,并且各數值的權重都不同,距離越遠的數字對平均數計算的貢獻就越小(權重較小),距離越近則對平均數的計算貢獻就越大(權重越大)
  • 計算公式:st={Y1,t=0β?st?1+(1?β)?Yt,t>0{s}_t = \begin{cases} \displaystyle Y_1, & t = 0 \\ \displaystyle \beta \cdot {s}_{t-1} + (1 - \beta) \cdot Y_t, & t > 0 \end{cases}st?={Y1?,β?st?1?+(1?β)?Yt?,?t=0t>0?
    • StS_tSt?表示指數加權平均值
    • YtY_tYt?表示ttt時刻的值
    • β\betaβ調整權重參數,該值越大平均數越平緩

(2)動量算法Momentum

  • 梯度計算公式:Dt=β?St?1+(1?β)?WtD_t = \beta \cdot S_{t - 1} + (1-\beta) \cdot W_tDt?=β?St?1?+(1?β)?Wt?
    • St?1S_{t - 1}St?1?表示;表示梯度移動加權平均值
    • WtW_tWt?表示當前時刻的梯度值
    • DtD_tDt?為當前時刻的梯度值
    • β\betaβ為權重系數
    • 示例:權重β\betaβ為0.9, 則第一次梯度值S1=D1=W1S_1 = D_1 = W_1S1?=D1?=W1?;第二次梯度值D2=S2=0.9×S1+W2×0.1D_2 = S_2 = 0.9 \times S_1 + W_2 \times0.1D2?=S2?=0.9×S1?+W2?×0.1;第三次梯度值D3=S3=0.9×S2+W3×0.1D_3 = S_3 = 0.9 \times S_2 + W_3 \times 0.1D3?=S3?=0.9×S2?+W3?×0.1;第四次梯度值D4=S4=0.9×S3+W4×0.1D_4 = S_4 = 0.9 \times S_3 + W_4 \times 0.1D4?=S4?=0.9×S3?+W4?×0.1
  • 梯度下降公式中梯度的計算,就不再是當前時刻t的梯度值,而是歷史梯度值的指數移動加權平均值,公式修改為:Wt+1=Wt?α?DtW_{t + 1} = W_t - \alpha \cdot D_tWt+1?=Wt??α?Dt?

拓展:Monmentum優化方法是如何一定程度上克服“平緩”,“鞍點”的問題呢?

  • 當處于鞍點位置時,由于當前的梯度為0,參數無法更新。但是Momentum動量梯度下降算法已經在先前累計了一些梯度值,很有可能使得跨過鞍點
  • 由于mini-batch普通的梯度下降算法,每次選取少數的樣本梯度確定前進方向,可能會出現震蕩,使得訓練時間變長。Momentum使用移動加權平均,平滑了梯度的變化,使得前進方向更加平緩,有利于加快訓練過程
"""加了動量之后的結果"""import torchw = torch.tensor([1.0], requires_grad=True, dtype=torch.float32)loss = ((w ** 2)*0.5).sum()optimizer = torch.optim.SGD([w], lr = 0.01, momentum=0.9)optimizer.zero_grad()
loss.backward()
optimizer.step()print("第一次更新(加了動量之后)梯度:",w.grad)
print("第一次更新(加了動量之后)w:",w.detach())loss = ((w ** 2)*0.5).sum()
optimizer.zero_grad()
loss.backward()
optimizer.step()print("第二次更新(加了動量之后)梯度:",w.grad)
print("第二次更新(加了動量之后)w:",w.detach()) # tensor([0.9711])改變了,沒加動量時 tensor([0.9801])"""tensor([0.9900])--->tensor([0.9711])   減少得更多,更新得更加快一點"""

輸出結果:

第一次更新(加了動量之后)梯度: tensor([1.])
第一次更新(加了動量之后)w: tensor([0.9900])
第二次更新(加了動量之后)梯度: tensor([0.9900])
第二次更新(加了動量之后)w: tensor([0.9711])

(3)AdaGrad

  • AdaGrad通過對不同的參數分量使用不同的學習率,AdaGrad的學習率總體會逐漸減小,計算步驟如下

    1. 初始化學習率α\alphaα,初始化參數θ\thetaθ(weight&bias)小常數σ=1e?6\sigma = 1e - 6σ=1e?6(放在分母上,防止分母為0)

    2. 初始化梯度累計變量s=0s = 0s=0

    3. 從訓練集中采樣mmm個樣本的小批量,計算梯度ggg

    4. 累積平方梯度s=s+g⊙g{s} = {s} + {g} \odot {g}s=s+gg⊙\odot表示各個分量相乘

    • 學習率α\alphaα的計算公式如下:α=αs+σ\alpha = \frac{\alpha}{\sqrt s + \sigma}α=s?+σα?

    • 參數更新公式如下:θ=θ?αs+σ?g\theta = \theta - \frac{\alpha}{\sqrt s + \sigma} \cdot gθ=θ?s?+σα??g

重復2-4步驟,即可完成網絡訓練

  • AdaGrad缺點:可能會使得學習率過早,過量的降低(學習率太小了,則更新速度變慢了,迭代相同次數就不能夠到最優解),導致訓練后期學習率大小較難找到最優解
import torchw = torch.tensor([1.0], requires_grad=True, dtype=torch.float32)
loss = ((w ** 2)*0.5).sum()optimizer = torch.optim.Adagrad([w], lr = 0.01)optimizer.zero_grad()
loss.backward()print("第一次更新  梯度:",w.grad) # 獲取梯度的值
print("第一次更新  w:",w.detach()) # 獲取w的值# 再次更新參數
loss = ((w ** 2)*0.5).sum()
optimizer.zero_grad()
loss.backward()
optimizer.step()print("第二次更新  梯度:",w.grad) # 獲取梯度的值
print("第二次更新  w:",w.detach()) # 獲取w的值

輸出結果:

第一次更新  梯度: tensor([1.])
第一次更新  w: tensor([1.])
第二次更新  梯度: tensor([1.])
第二次更新  w: tensor([0.9900])

(4)RMSProp

  • RMSProp優化算法是對AdaGrad的優化,最主要的不同是,其使用指數移動加權平均梯度替換歷史梯度的平方和。計算過程如下:

    1. 初始化學習率α\alphaα,初始化參數θ\thetaθ,小常數σ=1e?6\sigma = 1e-6σ=1e?6
    2. 初始化參數θ\thetaθ
    3. 初始化梯度累計變量sss
    4. 從訓練集中采樣mmm個樣本的小批量,計算梯度ggg
    5. 使用指數移動平均累積歷史梯度,公式如下:s=β?s+(1?β)g⊙gs = \beta \cdot s + (1 - \beta)g \odot gs=β?s+(1?β)gg
    • 學習率α\alphaα的計算公式如下:α=αs+σ\alpha = \frac{\alpha}{\sqrt s + \sigma}α=s?+σα?
    • 參數更新公式如下:θ=θ?αs+σ?g\theta = \theta - \frac{\alpha}{\sqrt s + \sigma} \cdot gθ=θ?s?+σα??g
import torchw = torch.tensor([0.1], requires_grad=True, dtype = torch.float32)
loss = ((w ** 2)*0.5).sum()optimizer = torch.optim.RMSprop([w], lr = 0.01, alpha = 0.9)optimizer.zero_grad()
loss.backward()print("第一次更新 梯度:", w.grad)
print("第一次更新 w:", w.detach())# 再次更新參數
loss = ((w ** 2)*0.5).sum()
optimizer.zero_grad()
loss.backward()
optimizer.step()print("第二次更新  梯度:",w.grad) # 獲取梯度的值
print("第二次更新  w:",w.detach()) # 獲取w的值

輸出結果:

第一次更新 梯度: tensor([0.1000])
第一次更新 w: tensor([0.1000])
第二次更新  梯度: tensor([0.1000])
第二次更新  w: tensor([0.0684])

4.學習率衰減方法

  • 通常是和 動量算法Momentum 組合在一起
  • 后面學習中,通常使用指定間隔學習率衰減

(1)等間隔學習率衰減

import torch
import matplotlib.pyplot as plot# 參數初始化
LR = 0.1
iteration = 100
epochs = 200
# 網絡數據初始化
x = torch.tensor([1.0])
w = torch.tensor([1.0], requires_grad = True)
y = torch.tensor([1.0])
# 優化器
optimizer = torch.optim.SGD([w], lr = LR, momentum=0.9)
# 學習率策略
scheduler_lr = torch.optim.lr_scheduler.StepLR(optimizer, step_size=20, gamma = 0.8)
# 遍歷輪次
epoch_list = []
lr_list = []
for epoch in range(epochs):lr_list.append(scheduler_lr.get_last_lr())epoch_list.append(epoch)# 遍歷batchfor i in range(iteration):# 計算損失loss = ((w*x-y)**2)*0.5# 更新參數optimizer.zero_grad()loss.backward()optimizer.step()# 更新lrscheduler_lr.step()
# 繪制結果
plt.plot(epoch_list, lr_list)
plt.grid()
plt.show()

(2)指定間隔學習率衰減

import torch
import matplotlib.pyplot as plot# 參數初始化
LR = 0.1
iteration = 100
epochs = 200
# 網絡數據初始化
x = torch.tensor([1.0])
w = torch.tensor([1.0], requires_grad = True)
y = torch.tensor([1.0])
# 優化器
optimizer = torch.optim.SGD([w], lr = LR, momentum=0.9)
# 學習率策略
scheduler_lr = torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones = [20, 60, 90, 135, 180], gamma = 0.8)
# 遍歷輪次
epoch_list = []
lr_list = []
for epoch in range(epochs):lr_list.append(scheduler_lr.get_last_lr())epoch_list.append(epoch)# 遍歷batchfor i in range(iteration):# 計算損失loss = ((w*x-y)**2)*0.5# 更新參數optimizer.zero_grad()loss.backward()optimizer.step()# 更新lrscheduler_lr.step()
# 繪制結果
plt.plot(epoch_list, lr_list)
plt.grid()
plt.show()

(3)按指數學習率衰減

  • 這種策略用得很少,一般不會選擇
  • gamma值通常是小于1,它是指 指數的底
  • 調整方式:lr=lr?gammaepochlr = lr \cdot gamma^{epoch}lr=lr?gammaepoch
import torch
import matplotlib.pyplot as plot# 參數初始化
LR = 0.1
iteration = 100
epochs = 200
# 網絡數據初始化
x = torch.tensor([1.0])
w = torch.tensor([1.0], requires_grad = True)
y = torch.tensor([1.0])
# 優化器
optimizer = torch.optim.SGD([w], lr = LR, momentum=0.9)
# 學習率策略
scheduler_lr = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma = 0.8)
# 遍歷輪次
epoch_list = []
lr_list = []
for epoch in range(epochs):lr_list.append(scheduler_lr.get_last_lr())epoch_list.append(epoch)# 遍歷batchfor i in range(iteration):# 計算損失loss = ((w*x-y)**2)*0.5# 更新參數optimizer.zero_grad()loss.backward()optimizer.step()# 更新lrscheduler_lr.step()
# 繪制結果
plt.plot(epoch_list, lr_list)
plt.grid()
plt.show()

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

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

相關文章

HTML/JOSN復習總結

HTML 基礎 什么是 HTML? 1.HTML是一門語言,所有的網頁都是用HTML這門語言編寫出來的 2.HTML(HyperText Markup Language):超文本標記語言。 >超文本:超越了文本的限制,比普通文本更強大。除了文字信息,還可以定義圖片、音頻、視頻等內…

Golang中的內置類型

A. int B. string C. struct D. array 首先,內置類型是指不需要引入任何關于這些數據類型的包,就可以引用的數據類型。那么,內置類型主要包括基本類型,復合類型,控制并發,高級抽象,特殊類型。…

通過命名空間引用了 Application 類,php不會自動包含路徑文件嗎?

示例代碼:報錯提示找不到Application類 use mvc\core\Application;$app new Application(); // 定義路由 $app->get(/, HomeControllerindex); $app->get(/user, UserControllershow); $app->post(/user, UserControllercreate);// 運行應用 $app->run…

PlantUML 基礎使用技術文檔

目錄 摘要 1. 什么是 PlantUML 2. 安裝與環境配置 2.1 本地使用 2.2 在線使用 3. 基本語法 3.1 示例:系統架構圖 3.2 常用元素 4. 渲染方式 4.1 VSCode 4.2 在線渲染 4.3 生成圖片 5. 推薦實踐 6. 常見圖類型 7. 進階功能 8. 典型應用場景 摘要 Pl…

Android Notification 通過增加addAction 跳轉回Service重新執行邏輯

1.場景描述在App內升級過程中,apk下載過程中網絡波動導致連接超時,下載失敗后Service生命周期結束。前臺通知也被清除。2.解決思路在通知欄中增加重試按鈕重啟下載服務。3.代碼NotificationManager mNotificationManager (NotificationManager) getSy…

帶貨視頻評論的用戶洞察 科大訊飛AI算法賽 Datawhale AI夏令營

賽題 2025 iFLYTEK AI開發者大賽https://challenge.xfyun.cn/topic/info?typevideo-comment-insight 一、賽事背景 在電商直播爆發式增長的數字化浪潮下,短視頻平臺積累了海量帶貨視頻及用戶互動數據。這些數據不僅是消費者對商品體驗的直接反饋,更蘊…

JAVA生成PDF(itextpdf)

java生成PDF有多種方式&#xff0c;比如itextpdf、 Apache PDFBox、Flying Saucer (XHTMLRenderer)、 OpenPDF等。今天要介紹的是itextpdf&#xff0c;及在開發過程中處理的問題。1. 引入POM<!--PDF導出POM--><dependency><groupId>com.itextpdf</groupId…

[爬蟲知識] 深入理解多進程/多線程/協程的異步邏輯

相關爬蟲實戰案例&#xff1a;[爬蟲實戰] 多進程/多線程/協程-異步爬取豆瓣Top250 相關爬蟲專欄&#xff1a;JS逆向爬蟲實戰 爬蟲知識點合集 爬蟲實戰案例 逆向知識點合集 前言&#xff1a; 面對海量的目標數據&#xff0c;傳統單線程、同步的爬取方式往往效率低下&#x…

Oracle RAC 11.2.0.4 更新SYSASM和SYS密碼

前言 從技術角度看&#xff0c;SYSASM是Oracle 10g R2引入的ASM管理員角色&#xff0c;而SYS是數據庫實例的超級用戶&#xff0c;SYS賬戶無法管理ASM磁盤組。SYSASM權限是集群級別的&#xff0c;比如在添加磁盤組時&#xff0c;這個操作會影響所有節點&#xff1b;而SYS用戶的權…

Vue》》總結

官網 vue路由的query參數、mixin 混入 vue cli 腳手架之配置代理 VUE SAP、 MPA&#xff0c;&#xff0c;組件開發、VDOM、雙向數據綁定 Vue Props 、Mixin 、路由守衛 vue router query參數 Vue props以及其他通信方式, vue響應式 原理 追加響應式數據&#xff0c;數組響應式 …

Nginx 中的負載均衡策略

Nginx 是一個高性能的 HTTP 和反向代理服務器&#xff0c;廣泛用于負載均衡場景。它支持多種負載均衡策略&#xff0c;可以幫助你優化資源利用、提高響應速度和增加系統的可用性。以下是 Nginx 中幾種常見的負載均衡策略及其配置方法&#xff1a; 1. 輪詢&#xff08;Round Rob…

用 Python 將分組文本轉為 Excel:以四級詞匯為例的實戰解析

一、背景引入&#xff1a;從“人工整理”到“自動化處理”的轉變 在英語學習過程中&#xff0c;我們經常會接觸各種分組整理的詞匯表&#xff0c;比如“Group1”對應一組單詞及釋義&#xff0c;隨后是“Group2”、“Group3”等等。如果你下載了一個 .txt 格式的四級詞匯表&…

Ffmpeg濾鏡

打開設備 添加濾鏡 循環錄制文件 #include "libavdevice/avdevice.h" #include "libavformat/avformat.h" #include "libavcodec/avcodec.h" #include "libavfilter/avfilter.h" #include "libavfilter/buffersink.h" #incl…

HarmonyOS AI輔助編程工具(CodeGenie)UI生成

UI Generator基于BitFun Platform AI能力平臺&#xff0c;用于快速生成可編譯、可運行的HarmonyOS UI工程&#xff0c;支持基于已有UI布局文件&#xff08;XML&#xff09;&#xff0c;快速生成對應的HarmonyOS UI代碼&#xff0c;其中包含HarmonyOS基礎工程、頁面布局、組件及…

【第三節】ubuntu server配置遠程連接

首先在ubuntu server中查看ip&#xff0c;打開虛擬機&#xff0c;輸入ip addr show ,這個命令很好記&#xff0c;幾乎就是英文自然語言 下面我們準備遠程連接工具&#xff0c;我選擇的開源的ET&#xff0c;全稱是electerm,圈起來的是必須輸入的內容&#xff0c;輸入完成后點擊保…

CCS-MSPM0G3507-7-模塊篇-MPU6050的基本使用

前言本篇我們接收對MPU6050的基本使用&#xff0c;獲取ID&#xff0c;通過IIC協議獲取寄存器的值&#xff0c;至于高級濾波算法&#xff0c;比如卡爾曼濾波&#xff0c;或者上面的&#xff0c;后面再更新基本配置最好選擇PA0和PA1&#xff0c;5V開漏然后給上代碼MPU6050.c#incl…

spring-ai agent概念

目錄agent 概念理解記憶能力工具計劃agent 概念理解 agent 智能體&#xff0c;突出智能 大模型的感覺 告訴你怎么做&#xff08;也不一定正確&#xff09;不會幫你做 Agent的感覺 直接準確的幫你做完&#xff08;比如&#xff0c;告訴 AI Agent 幫忙下單一份外賣&#xff0c…

NO.4數據結構數組和矩陣|一維數組|二維數組|對稱矩陣|三角矩陣|三對角矩陣|稀疏矩陣

數組的儲存 【定義】 數組&#xff1a; 由 n&#xff08;≥1&#xff09; 個相同類型的數據元素構成的有限序列&#xff0c; 是線性表的推廣。 一旦被定義&#xff0c; 維數和長度就不可再改變&#xff0c; 一般對其只有元素的存取和修改操作。 一維數組 Arr[a0,…,an?1] Arr[…

如何把Arduino IDE中ESP32程序bin文件通過樂鑫flsah_download_tool工具軟件下載到ESP32中

目錄前言獲取Arduino IDE中ESP32程序bin文件flsah_download_tool工具軟件下載程序bin文件到ESP32中總結前言 Arduino IDE豐富的驅動庫給ESP32的開發帶來了很多便利&#xff0c;當我們下載程序的時候&#xff0c;直選選擇好ESP32開發板型號和端口號即可下載程序到開發板中&…