李宏毅機器學習筆記:【6.Optimization、Adaptive Learning Rate】

Optimization

  • 1.Adaptive Learning Rate
  • 2.不同的參數需要不同的學習率
  • 3.Root Mean Square
  • 4.RMSProp
  • 5.Adam
  • 6.learning rate scheduling
  • 7.warm up
  • 總結

critical point不一定是你在訓練一個network時候遇到的最大的障礙。

1.Adaptive Learning Rate

也就是我們要給每個參數不同的Learning rate

往往在訓練一個network的時候,你會把他的loss記錄下來,隨著你參數不斷的update,你的loss呢不再下降了,就卡住了。。那多數時候這個時候大家就會猜說誒,那是不是走到了critical point,因為gradient等于零的關系,所以我們沒有辦法再更新參數。

當我們說走到critical point的時候,意味著gradient非常的小,但是你有確認過,當你的loss不再下降的時候,gradient真的很小嗎?其實并不然。

下面這個例子,當我們的loss不再下降的時候,gradient的這個向量并沒有真的變得很小,在最后訓練的最終結的時候,loss幾乎沒有在減少了,但是gradient卻突然還上升了一下。這個是我們的error surface,現在的gradient在error surface的兩個谷壁間不斷的來回的震蕩,這個時候你的loss不會再下降,所以你會覺得看到這樣子的狀況,但是實際上他真的卡到了critical point、卡到了settle point、卡到了local minima嗎?不是的。它的gradient仍然很大,只是loss不見得在減小了。

所以當你今天你訓練個network,后來發現loss不再下降的時候,可能只是單純的loss沒有辦法在下降,而不是卡在了那些點上。
在這里插入圖片描述

我們在訓練的時候其實很少卡到settle point或者是local minima,多數時候training在還沒有走到critical point的時候,就已經停止了,但這并不代表說critical point不是一個問題,我們真正當你用gradient descent來做optimization的時候,你真正應該怪罪的對象往往不是critical point,而是其他的原因。
那為什么如果今天critical point不是問題的話,為什么我們的training會卡住呢,我這邊舉一個非常簡單的例子。

你會發現說就連這種convex的error surface,形狀這么簡單的error surface,你用gradient descent都不見得能把它做好
學習率= 1 0 ? 2 10^-2 10?2,時候,在震蕩沒有辦法慢慢的滑到山谷里面,這時試著去調整了這個learning rate
學習率= 1 0 ? 7 10^-7 10?7終于不再震蕩了,終于從這個地方滑滑滑滑滑滑到山谷底,然后終于左轉了,但是你發現說這個訓練永遠走不到終點,因為我的learning rate已經太小了,在這個很斜的地方,這個坡度很陡gradient的值很大,所以還能夠前進一點,左轉后的這個地方坡度已經非常的平滑了,這么小的learning rate根本沒有辦法再讓我們的訓練前進,,

gradient descent這個工具連這么簡單的error surface都做不好,那如果難的問題,他又怎么有可能做好呢

在這里插入圖片描述
那怎么把gradient descent做得更好呢?在之前我們的gradient descent里面,所有的參數都是設同樣的learning rate,這顯然是不夠的,learning rate應該要為每一個參數特制化。

2.不同的參數需要不同的學習率

大原則:如果在某一個方向上gradient的值很小,在某一個方向上非常的平坦,那我們會希望learning rate調大一點;如果在某一個方向上非常的陡峭,某一個方向上坡度很大,那我learning rate可以設的小一點。
之前在講gradient descent的時候,往往是講所有參數update的式子,為了簡化問題,我們現在只看一個參數,你完全可以把這個方法推廣到所有參數的狀況。
在這里插入圖片描述
不同的參數我們要給它不同的sigma,同時他也是iteration dependent的,不同的iteration我們也會有不同的sigma。
如何計算這個sigma呢?
一個常見的類型是算gradient的Root Mean Square

3.Root Mean Square

在這里插入圖片描述

這樣的話坡度比較大的時候learning rate就減小,坡度比較小的時候learning rate就放大。

坡度比較小的時候如 θ 1 \theta_1 θ1?,g小–> σ \sigma σ小—>learning rate就大(你在update的時候的量啊就比較大)
坡度比較大的時候如 θ 2 \theta_2 θ2?,g大–> σ \sigma σ大—>learning rate就小

所以有了 σ \sigma σ這一項以后,你就可以隨著gradient的不同,每個參數gradient的不同,來自動的調整learning rate的大小
在這里插入圖片描述
上面的這個參數不會隨時間改變,我們剛才的假設是同一個參數,它的gradient的大小就會固定是差不多的值,如果來看這個新月型的error surface,考慮橫軸的話,有的地方地方坡度比較平滑,有的地方地方坡度比較陡峭,所以就算是同個參數,同一個方向,我們也期待說learning rate是可以動態的調整的。
所以就有了RMSProp

在這里插入圖片描述

4.RMSProp

這個方法沒有論文。
這個方法的第一步跟剛才講的算Root Mean Square一模一樣
第二步算 σ 1 \sigma_1 σ1?的方法和算Root Mean Square的時候不一樣,上一個的每一個gradient都有同等的重要性,但在RMSProp你可以自己調整現在的這個gradient的重要性,
如果我 α \alpha α設很小趨近于零,就代表說我覺得g1相較于之前所算出來的gradient而言比較重要;如果我 α \alpha α設很大趨近于1,那就代表說我覺得現在算出來的g1比較不重要。

這個 α \alpha α就會決定現在剛算出來的 g t g_t gt?它有多重要
在這里插入圖片描述
如果你用RMSProp的話,你就可以動態調整 σ 1 \sigma_1 σ1?這一項.
比如下面的黑線,是我們的error surface,開始小球一路平坦,說明G算出來很小,G算出來很小,就代表說這個 σ \sigma σ算出來很小, σ \sigma σ算出來很小,就代表說現在update參數的時候,我們會走比較大的步伐;
當滾到斜坡時候,我們gradient變大了,如果是Adam的話,它反應比較慢;但如果你用RMSProp,把 α \alpha α設小,就是讓新看到的gradient影響比較大,那你就可以很快的讓 σ \sigma σ的值變大,然后很快讓你的步伐呢變小。
又走到平滑的地方時候,調整 α \alpha α,讓他比較看重于最近算出來的gradient,所以你gradient變小,它的這個 σ \sigma σ的值變大值呢就變小了,然后呢你走的步伐呢就變大了。
在這里插入圖片描述

5.Adam

最常用optimization的策略就是Adam:RMSProp+Momentum
在這里插入圖片描述

我們再看開始的例子,用了第二個的方法后做起來是這個樣子的。這個gradient都取平方,再平均再開根號,然后接下來在左轉的時候,剛才我們update了10萬次卡住了,現在可以繼續走下去,因為這個左右的方向的這個gradient很小,所以learning rate會自動調整,左右這個方向learning rate會自動變大,所以這個步伐呢就可以變大。

但走著走著突然爆炸了,為什么走到這邊突然爆炸了呢?因為我們在算這個 σ \sigma σ的時候是把過去所有看到的gradient都拿來做平均,所以這個縱軸的這個方向,這個縱軸的方向雖然在初始的這個地方感覺gradient很大,但是這邊走了很長一段路以后,這個縱軸的方向gradient算出來都很小,所以縱軸的這個方向就累積了小的 σ \sigma σ,累積到一個地步以后,這個step就變很大,然后就暴走就噴出去了,,

不過噴出去后走到gradient比較大的地方以后, σ \sigma σ又慢慢的變大, σ \sigma σ變大以后,這個參數update的距離,update的這個步伐大小又慢慢的變小,所以就發現說誒走著走著突然往左右噴了一下,但是這個噴這個噴了一下,不會永遠就是震蕩,不會做簡諧運動,他這個左這個這個力道會慢慢變小,讓它慢慢的慢慢的又回到中間這個峽谷了。

這樣怎么辦呢?有一個方法也許可以解決這個問題,這個叫做learning rate schedule

在這里插入圖片描述

6.learning rate scheduling

我們這個式子還有個參數 η \eta η,他要是跟時間有關的,我們不要把它當成一個常數。

最常見的策略啊叫做learning rate decay,也就是說隨著時間不斷的進行,隨著參數不斷的update,我們這個 η \eta η讓它越來越小,讓這個learning rate越來越小。
為什么要讓這個learning rate越來越小呢?因為一開始我們距離終點很遠,隨著參數不斷update,我們距離終點越來越近,我們參數的更新要能夠慢慢的慢下來。

所以剛才那個狀況,如果加上learning rate decay的話,我們就可以很平順的走到終點。因為在后面這個 η \eta η已經變得非常的小了,雖然說他本來想要左右亂噴,但是會乘上這個非常小的 η \eta η,那就停下來了,就可以慢慢的走到終點。
在這里插入圖片描述
除了learning rate decay以外,還有另外一個經典非常常用的learning rate schedule的方式叫做warm up。

7.warm up

這個warm up的方法是說我們這個learning rate要先變大后變小

在這里插入圖片描述
Residual Network這邊特別注明它反其道而行,一開始要設0.01,接下來設0.1,還特別加個注解
在這里插入圖片描述
同時warm up在transformer里面也用一個式子提了它好,你實際上把它的把這個方程畫出來,就會發現它就2learning rate會先增加,然后接下來再遞減。

所以發現說warm up這個技術,在很多知名的network里面都有被當做一個黑科技,就論文里面不解釋說為什么要用這個,但就偷偷在一個小地方,你沒有注意到。

在這里插入圖片描述
那為什么需要warm up呢?這個仍然是今天一個可以研究的問題了。

這邊有一個可能的解釋是說,當我們在用Adam、RMSProp時候,我們要計算 σ \sigma σ,這個sigma它是一個統計的結果,告訴我們說某一個方向他到底有多陡或者是多平滑,那這個統計的結果要看了夠多筆數據以后,這個統計才精準,所以我們一開始呢 σ \sigma σ不精準,所以開始不要讓我們的參數走離初始的地方太遠,一開始讓learning rate比較小,是讓他探索搜集一些有關error surface的情報,等sigma統計比較精準以后,再把讓learning ray呢慢慢的爬升,這是一個解釋為什么我們需要warm up的可能性。

如果你想要學更多有關warm up的東西的話,可以看RAdam。

在這里插入圖片描述

總結

有關optimization的部分,我們從最原始的gradient descent進化到下面這個版本
在這里插入圖片描述

這個版本我們有momentum,也就是說我們現在不是完全順著這個時間點算出來gradient的方向來更新參數的,而是把過去所有算出來的規定的方向做一個加總,當做update方向,這個是momentum。
那接下來到底應該要update多大的步伐呢?我們要除掉gradient的root mean square。

疑問:這個momentum是考慮過去所有的gradient,這個 σ \sigma σ也是考慮過去所有的gradient,一個放在分子,一個放在分母,都考慮過去所有的gradient不就是正好抵消了嗎?

其實這個momentum和 σ \sigma σ他們在使用過去所有gradient的方式是不一樣的。
momentum是直接把所有的gradient通通都加起來,他有考慮方向,考慮gradient的正負號,考慮gradient是往左走還是往右走。
但是root mean square,它不考慮gradient的方向了,它只考慮gradient的大小,我們在算 σ \sigma σ時候都要取平方向,把gradient取一個平方向,是把平方的結果加起來,所以我們只考慮gradient的大小,不考慮它的方。
所以momentum跟這個 σ \sigma σ算出來的結果并不會互相抵消掉。

最后我們還會加上一個learning rate的schedule。
這種optimizer除了Adam以外還有各式各樣的變形.
在這里插入圖片描述

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

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

相關文章

Task03:Ollama API 的使用

Ollama API 使用指南 簡介 Ollama 提供了強大的 REST API,使開發者能夠方便地與大語言模型進行交互。通過 Ollama API,用戶可以發送請求并接收模型生成的響應,應用于自然語言處理、文本生成等任務。本文將詳細介紹生成補全、對話生成的基本…

我用AI做數據分析之四種堆疊聚合模型的比較

我用AI做數據分析之四種堆疊聚合模型的比較 這里AI數據分析不僅僅是指AI生成代碼的能力,我想是測試AI數據分析方面的四個能力,理解人類指令的能力、撰寫代碼的能力、執行代碼的能力和解釋結果的能力。如果這四個能力都達到了相當的水準,才可…

DC-6靶機滲透測試全過程

目錄 前期準備 一、滲透測試 1.IP地址查詢 2.端口信息搜尋 3.網頁信息搜集 wappalyzer WPScan 反彈shell graham用戶 反彈出jens的shell nmap提權 二、總結 前期準備 攻擊機: kali windows11 靶機:DC-6靶機(調至NAT模式&#xff0…

[操作系統] 基礎IO:系統文件I/O

在 Linux 操作系統中,文件 I/O(輸入/輸出)是程序與文件系統交互的基礎。理解文件 I/O 的工作原理對于編寫高效、可靠的程序至關重要。本文將深入探討系統文件 I/O 的機制。 一種傳遞標志位的方法 在 Linux 中,文件的打開操作通常…

3.8 AI驅動的市場調研革命:從數據采集到競品策略生成的閉環實踐指南

AI驅動的市場調研革命:從數據采集到競品策略生成的閉環實踐指南 引言:智能時代的高效市場洞察 Forrester研究顯示,使用AI輔助市場調研可使數據采集效率提升8倍,策略生成速度加快4倍。本文以GitHub Sentinel、LanguageMentor為案例,揭示如何構建AI增強型市場分析體系,實現…

AF3 MmcifObject類解讀

AlphaFold3 中 MmcifObject類 是 解析 mmCIF 文件的核心數據結構,用于存儲解析后的蛋白質結構信息,包含PDB 頭部信息、Biopython 解析的結構、鏈序列信息等。 下面代碼包含 Monomer 、AtomSite、ResiduePosition、ResidueAtPosition、 MmcifObject以及ParsingResult數據類的…

網絡安全 “免疫力”:從人體免疫系統看防御策略

在當今數字化時代,網絡安全已變得至關重要。每天,我們的網絡系統都面臨著來自各方的威脅,就像人體時刻暴露在各種病原體中一樣。今天,我們就來聊聊網絡安全與人體免疫系統的奇妙聯系,看看從免疫系統中能汲取哪些構建強…

滾動彈幕案例

滾動彈幕案例 一、需求 1.頁面上漂浮字體大小不一、顏色不一&#xff0c;從左向右滾動的彈幕&#xff1b; 2.底部中間有一個發送功能&#xff0c;可以發送新的彈幕&#xff1b; 3.底部的發送部分可以向下收起和彈出。 二、html <div class"container"><…

【wiki知識庫】08.添加用戶登錄功能--后端SpringBoot部分

目錄 一、今日目標? 二、SpringBoot后端實現 2.1 新增UserLoginParam 2.2 修改UserController 2.3 UserServiceImpl代碼 2.4 創建用戶上下文工具類 2.5?通過token校驗用戶&#xff08;重要&#xff09; 2.6 創建WebMvcConfig 2.7 用戶權限校驗攔截器 一、今日目標 上…

AI大模型的技術突破與傳媒行業變革

性能與成本&#xff1a;AI大模型的“雙輪驅動” 過去幾年&#xff0c;AI大模型的發展經歷了從實驗室到產業化的關鍵轉折。2025年初&#xff0c;以DeepSeek R1為代表的模型在數學推理、代碼生成等任務中表現超越國際頭部產品&#xff0c;而訓練成本僅為傳統模型的幾十分之一。這…

C++字符串處理指南:從基礎操作到性能優化——基于std::string的全面解析

博主將從C標準庫中的 std::string 出發&#xff0c;詳細探討字符串的處理方法&#xff0c;涵蓋常見操作、性能優化和實際應用場景。以下內容將圍繞std::string 的使用展開&#xff0c;結合代碼示例進行說明。 一、std::string 的基本操作 1.1 創建與初始化 std::string 提供了…

3.【線性代數】——矩陣乘法和逆矩陣

三 矩陣乘法和逆矩陣 1. 矩陣乘法1.1 常規方法1.2 列向量組合1.3 行向量組合1.4 單行和單列的乘積和1.5 塊乘法 2. 逆矩陣2.1 逆矩陣的定義2.2 奇異矩陣2.3 Gauss-Jordan 求逆矩陣2.3.1 求逆矩陣 ? \Longleftrightarrow ?解方程組2.3.2 Gauss-Jordan求逆矩陣 1. 矩陣乘法 1.…

深入了解 Oracle 正則表達式

目錄 深入了解 Oracle 正則表達式一、正則表達式基礎概念二、Oracle 正則表達式語法&#xff08;一&#xff09;字符類&#xff08;二&#xff09;重復限定符&#xff08;三&#xff09;邊界匹配符&#xff08;四&#xff09;分組和捕獲 三、Oracle 正則表達式函數&#xff08;…

用python寫一個聊天室程序

下面是一個簡單的基于Socket的Python聊天室程序示例&#xff0c;包括服務器端和客戶端&#xff1a; 服務器端代碼&#xff1a; import socket import threadingdef handle_client(client, address):print(f"New connection from {address}")while True:msg client…

在nodejs中使用RabbitMQ(六)sharding消息分片

RabbitMQ 的分片插件&#xff08;rabbitmq_sharding&#xff09;允許將消息分布到多個隊列中&#xff0c;這在消息量很大或處理速度要求高的情況下非常有用。分片功能通過將消息拆分到多個隊列中來平衡負載&#xff0c;從而提升消息處理的吞吐量和可靠性。它能夠在多個隊列之間…

1.7 AI智能體實戰指南:從單任務自動化到企業級智能體集群架構

AI智能體實戰指南:從單任務自動化到企業級智能體集群架構 一、智能體技術演進:從腳本工具到認知革命的跨越 1.1 三代智能體能力對比 能力維度第一代(規則驅動)第二代(機器學習)第三代(LLM驅動)任務理解固定模式匹配統計模式識別語義推理與邏輯鏈分解環境適應需人工重寫…

Github 2025-02-14 Java開源項目日報 Top10

根據Github Trendings的統計,今日(2025-02-14統計)共有10個項目上榜。根據開發語言中項目的數量,匯總情況如下: 開發語言項目數量Java項目10C#項目1Guava: 谷歌Java核心庫 創建周期:3725 天開發語言:Java協議類型:Apache License 2.0Star數量:49867 個Fork數量:10822 次…

C++17中的clamp函數

一、std::clamp() 其實在前面簡單介紹過這個函數&#xff0c;但當時只是一個集中的說明&#xff0c;為了更好的理解std::clamp的應用&#xff0c;本篇再詳細進行闡述一次。std::clamp在C17中其定義的方式為&#xff1a; template< class T > constexpr const T& cl…

WEB安全--SQL注入--常見的注入手段

一、聯表查詢&#xff1a; 1.1原理&#xff1a; 當payload參數被后端查詢語句接收到時&#xff0c;其中的非法語句通過union關聯顯示出其他的數據 1.2示例&#xff1a; #payload: -1 and union select 1,2,database()--#query: $sqlselect * from users where id-1 and union …

QT筆記——QPlainTextEdit

文章目錄 1、概要2、文本設計2.1、設置文本2.1、字體樣式&#xff08;大小、下劃線、加粗、斜體&#xff09; 1、概要 QPlainTextEdit 是 Qt 框架中用于處理純文本編輯的控件&#xff0c;具有輕量級和高效的特點&#xff0c;以下是它常見的應用場景&#xff1a; 文本編輯器&am…