【深度學習】深度學習基礎

李宏毅深度學習筆記

局部極小值與鞍點

鞍點其實就是梯度是零且區別于局部極小值和局部極大值的點。
鞍點的叫法是因為其形狀像馬鞍。鞍點的梯度為零,但它不是局部極小值。我們把梯度為零的點統稱為臨界點(critical point)。損失沒有辦法再下降,也許是因為收斂在了臨界點,但不一定收斂在局部極小值,因為鞍點也是梯度為零的點。
在這里插入圖片描述

判斷臨界值種類的方法
走到臨界點的時候,這個臨界點到底是局部極小值還是鞍點,是一個值得去探討的問題。因為如果損失收斂在局部極小值,我們所在的位置已經是損失最低的點了,往四周走損失都會比較高,就沒有路可以走了。但鞍點沒有這個問題,旁邊還是有路可以讓損失更低的。只要逃離鞍點,就有可能讓損失更低。

主要是通過計算海森矩陣來判斷是哪種臨界點(太復雜了看不懂)

但實際上,我們幾乎不會真的把海森矩陣算出來,因為海森矩陣需要算二次微分,計算這個矩陣的運算量非常大,還要把它的特征值跟特征向量找出來,所以幾乎沒有人用這個方法來逃離鞍點。還有一些其他逃離鞍點的方法的運算量都比要算海森矩陣小很多。

從經驗上看起來,局部極小值并沒有那么常見。多數的時候,我們訓練到一個梯度很小的地方,參數不再更新,往往只是遇到了鞍點。

批量(批量梯度下降法和隨機梯度下降法)

實際上在計算梯度的時候,并不是對所有數據的損失 L 計算梯度,而是把所有的數據分成一個一個的批量(batch),每個批量的大小是 B ,即帶有 B 筆數據。每次在更新參數的時候,會去取出 B 筆數據用來計算出損失和梯度更新參數。遍歷所有批量的過程稱為一個回合(epoch)。
在這里插入圖片描述
在把數據分為批量的時候,我們還會進行隨機打亂。隨機打亂有很多不同的做法,一個常見的做法是在每一個回合開始之前重新劃分批量,也就是說,每個回合的批量的數據都不一樣。

不同批量大小之間對比

  • 批量大小為訓練數據的大小,這種使用全批量(full batch)的數據來更新參數的方法即批量梯度下降法(Batch Gradient Descent,BGD)。此時模型必須把 20 筆訓練數據都看完,才能夠計算損失和梯度,參數才能夠更新一次。
  • 批量大小等于 1,此時使用的方法即隨機梯度下降法(Stochastic Gradient Descent,SGD),也稱為增量梯度下降法。批量大小等于 1 意味著只要取出一筆數據即可計算損失、更新一次參數。如果總共有 20 筆數據,那么在每一個回合里面,參數會更新 20 次。用一筆數據算出來的損失相對帶有更多噪聲,因此其更新的方向是曲曲折折的 。

批量梯度下降并沒有“劃分批量”:要把所有的數據都看過一遍,才能夠更新一次
參數,因此其每次迭代的計算量大。但相比隨機梯度下降,批量梯度下降每次更新更穩定、更準確。
隨機梯度下降的梯度上引入了隨機噪聲,因此在非凸優化問題中,其相比批量梯度下降更容易逃離局部最小值。

考慮并行運算,批量梯度下降花費的時間不一定更長;對于比較大的批量,計算
損失和梯度花費的時間不一定比使用小批量的計算時間長 。批量大小從 1 到 1000,需要耗費的時間幾乎是一樣的,因為在實際上 GPU 可以做并行運算,這 1000 筆數據是并行處理的,所以 1000筆數據所花的時間并不是一筆數據的 1000 倍。當然 GPU 并行計算的能力還是存在極限的,當批量大小很大的時候,時間還是會增加的。
因為有并行計算的能力,因此實際上當批量大小小的時候,要“跑”完一個回合,花的時間是比較大的
大的批量更新比較穩定,小的批量的梯度的方向是比較有噪聲的。但實際上有噪聲的的梯度反而可以幫助訓練

批量梯度下降在更新參數的時候,沿著一個損失函數來更新參數,走到一個局部最小值或鞍點顯然就停下來了。梯度是零,如果不看海森矩陣,梯度降就無法再更新參數了 。但小批量梯度下降法(mini-batch gradient descent)每次是挑一
個批量計算損失,所以每一次更新參數的時候所使用的損失函數是有差異的。選到第一個批量的時候,用 L1 計算梯度;選到第二個批量的時候,用 L2 計算梯度。假設用 L1 算梯度的時候,梯度是零,就會卡住。但 L2 的函數跟 L1 又不一樣,L2 不一定會卡住,可以換下個批量的損失 L2 計算梯度,模型還是可以訓練,還是有辦法讓損失變小,所以這種有噪聲的更新方式反而對訓練其實是有幫助的。
在這里插入圖片描述

總結:
在有并行計算的情況下,小的批量跟大的批量運算的時間并沒有太大的差距。除非大的批量非常大,才會顯示出差距。但是一個回合需要的時間,小的批量比較長,大的批量反而是比較快的,所以從一個回合需要的時間來看,大的批量是較有優勢的。 而小的批量更新的方向比較有噪聲的,大的批量更新的方向比較穩定。但是有噪聲的更新方向反而在優化的時候有優勢,而且在測試的時候也會有優勢。所以大的批量跟小的批量各有優缺點,批量大小是需要去調整的超參數。
在這里插入圖片描述

動量

動量法(momentum method)是另外一個可以對抗鞍點或局部最小值的方法

引入動量后,每次在移動參數的時候,不是只往梯度的反方向來移動參數,而是根據梯度的反方向加上前一步移動的方向決定移動方向。
在這里插入圖片描述
η 是學習率,λ 是前一個方向的權重參數,也是需要調的

自適應學習率

要走到一個臨界點其實是比較困難的,多數時候訓練在還沒有走到臨界點的時候就已經停止了。

情景:梯度并沒有真的變得很小,但是損失不再下降了,如下圖的情況
在這里插入圖片描述
學習率決定了更新參數的時候的步伐,學習率設太大,步伐太大就無法慢慢地滑到山谷里面,可以試著把學習率設小一點。

在梯度下降里面,所有的參數都是設同樣的學習率,這顯然是不夠的,應該要為每一個參數定制化學習率,即引入自適應學習率(adaptive learning rate)的方法,給每一個參數不同的學習率。如果在某一個方向上,梯度的值很小,非常平坦,我們會希望學習率調大一點;如果在某一個方向上非常陡峭,坡度很大,我們會希望學習率可以設得小一點。

AdaGrad(Adaptive Gradient)是典型的自適應學習率方法,其能夠根據梯度大小自動調整學習率。AdaGrad 可以做到梯度比較大的時候,學習率就減小,梯度比較小的時候,學習率就放大

RMSprop(Root Mean Squared propagation),同一個參數的同個方向,學習率也是需要動態調整的

Adam (Adaptive moment estimation),是最常用的優化的策略或者優化器(optimizer)。Adam 可以看作 RMSprop 加上動量,其使用動量作為參數更新方向,并且能夠自適應調整學習率。PyTorch 里面已經寫好了 Adam 優化器,這個優化器里面有一些超參數需要人為決定,但是往往用 PyTorch 預設的參數就足夠好了

學習率調度

加上自適應學習率以后,使用AdaGrad 方法優化的結果如圖所示。一開始優化的時候很順利,在左轉的時候,有 AdaGrad 以后,可以再繼續走下去,走到非常接近終點的位置。走到 BC 段時,因為橫軸方向的梯度很小,所以學習率會自動變大,步伐就可以變大,從而不斷前進。接下來的問題走到圖 中紅圈的地方,快走到終點的時候突然“爆炸”了
在這里插入圖片描述

在這里插入圖片描述

通過學習率調度(learning rate scheduling)可以解決這個問題。之前的學習率調整方法中 η 是一個固定的值,而在學習率調度中 η 跟時間有關。
學習率調度中最常見的策略是學習率衰減(learning rate decay),也稱為學習率退火(learning rate annealing)。隨著參數的不斷更新,讓 η 越來越小。

預熱,是讓學習率先變大后變小,至于變到多大、變大的速度、變小的速度是超參數。殘差網絡里面是有預熱的,在殘差網絡里面,學習率先設置成 0.01,再設置成 0.1,并且其論文還特別說明,一開始用 0.1 反而訓練不好。除了殘差網絡,BERT 和 Transformer 的訓練也都使用了預熱。

分類問題

引入獨熱向量來表示類

如果有三個類,標簽 y 就是一個三維的向量,比如類 1 是 [1, 0, 0]T,類 2 是 [0, 1, 0]T,類3 是 [0, 0, 1]T。如果每個類都用一個獨熱向量來表示,就沒有類 1 跟類 2 比較接近,類 1 跟類 3 比較遠的問題。如果用獨熱向量計算距離的話,類兩兩之間的距離都是一樣的

帶有 softmax 的分類
y 是獨熱向量,所以其里面的值只有 0 跟 1,但是 ?y 里面有任何值。既然目標只有 0 跟 1,但 ?y 有任何值,可以先把它歸一化到 0 到 1 之間,這樣才能跟標簽的計算相似度。

一般有兩個類的時候,我們不套 softmax,而是直接取 sigmoid。當只有兩個類的時候,sigmoid 和 softmax 是等價的。

分類問題損失函數
常用交叉熵,相較于均方誤差,交叉熵是被更常用在分類上
在這里插入圖片描述
做分類時,選均方誤差的時候,如果沒有好的優化器,有非常大的可能性會訓練不起來。改變損失函數可以改變優化的難度

批量歸一化

https://blog.csdn.net/grizzly_whisper/article/details/134250154

批量歸一化(Batch Normalization,通常簡稱為BatchNorm或BN)是一種用于深度神經網絡的正則化技術,旨在加速訓練并提高模型的穩定性和性能。它的主要思想是對每個批量的輸入進行歸一化,以使神經網絡的每一層保持穩定的統計分布。

批量歸一化的主要步驟包括:
1、對每個批量輸入進行均值和方差的計算:對于每個批量中的數據,計算其均值和方差,通常是在每個通道上進行的。
2、對輸入數據進行標準化:將輸入數據減去均值,并除以標準差,以使數據的分布接近標準正態分布。
3、縮放和平移:對標準化后的數據進行線性變換,將其縮放(乘以一個尺度參數)并平移(加上一個偏移參數),以允許模型學習適當的平移和縮放。
4、反向傳播:在訓練過程中,通過反向傳播來更新批量歸一化層的參數,以便網絡適應數據的分布。

批量歸一化的主要優點包括:
1、提高訓練速度:通過標準化輸入數據,批量歸一化有助于加速訓練,因為它減少了梯度下降的收斂時間,允許使用更大的學習率。
2、增強模型穩定性:批量歸一化可以減少訓練過程中的內部協變量偏移,從而提高模型的穩定性和魯棒性。
3、減少過擬合:批量歸一化作為正則化技術之一,可以減少模型的過擬合風險,因為它降低了網絡對訓練數據中微小變化的敏感性。
4、可以使模型更深:批量歸一化使得更深的神經網絡更容易訓練,因為它減少了梯度消失和梯度爆炸問題。

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

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

相關文章

使用Flink CDC實現 Oracle數據庫數據同步(非SQL)

文章目錄 前言一、開啟歸檔日志二、創建flinkcdc專屬用戶2.1 對于Oracle 非CDB數據庫,執行如下sql2.2 對于Oracle CDB數據庫,執行如下sql 三、指定oracle表、庫級啟用四、使用flink-connector-oracle-cdc實現數據庫同步4.1 引入pom依賴4.1 Java主代碼4.1…

Docker Desktop 簡易操作指南 (Windows, macOS, Linux)

1. 下載最新版本 Docker Desktop https://www.docker.com/products/docker-desktop/ 2.啟動 Docker Desktop 3.常用命令(在 cmd 或 Terminal 中執行) #列出所有鏡像(Images) docker images #列出所有容器(Containers&…

OpenSSL/3.3.0: error:0A00018A:SSL routines::dh key too small

php curl解決辦法: curl_setopt($ch, CURLOPT_SSL_CIPHER_LIST, ‘DEFAULTSECLEVEL1’); python 解決辦法: from twisted.internet.ssl import AcceptableCiphers from scrapy.core.downloader import contextfactory contextfactory.DEFAULT_CIPHERS AcceptableCiphers.from…

CSS 核心知識點 - grid

思維導圖 參考網址: https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_grid_layout 一、什么是 grid? CSS Grid布局是在CSS3規范中引入的一種新的布局方式,旨在解決傳統布局方法(如浮動、定位、表格布局)存在的許多問題。C…

Spring Boot 集成 MyBatis-Plus 總結

Spring Boot 集成 MyBatis-Plus 總結 大家好,我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿! 在Java開發中,Spring Boot以其簡潔和高效的特點,…

Oh My Zsh Git 插件

以下是一些常見的別名和它們對應的 Git 命令: g: gitga: git addgaa: git add --allgapa: git add --patchgau: git add --updategb: git branchgba: git branch -agbd: git branch -dgbda: git branch --no-color --merged | command grep -vE “^(||*|\s*(main|m…

第十九站:Java鈦藍——區塊鏈技術的新探索

在區塊鏈技術的新探索中,Java作為一門成熟的編程語言,正在通過Hyperledger Fabric和Web3j等技術實現其在區塊鏈領域的應用。以下是對這些技術的簡要介紹和如何使用Java源代碼與它們進行交互的講解。 Hyperledger Fabric Hyperledger Fabric是一個由Lin…

React.js 全面解析:從基礎到實戰案例

引言: React.js,由Facebook推出并維護的開源JavaScript庫,以其組件化思想、虛擬DOM技術和聲明式編程風格,成為構建用戶界面的首選工具之一。本文將系統性地介紹React的基礎概念、核心特性,并通過實際案例展示基礎屬性…

DataWhale-吃瓜教程學習筆記(四)

學習視頻:第3章-二分類線性判別分析_嗶哩嗶哩_bilibili 西瓜書對應章節: 3.4 文章目錄 - 算法原理- 損失函數推導-- 異類樣本中心盡可能遠-- 同類樣本方差盡可能小-- 綜合 知識點補充 - 二范數二范數(2-norm)詳解定義幾何意義性質…

vue3中省市區聯動在同一個el-form-item中咋么設置rules驗證都不為空的效果

在開發中出現如下情況&#xff0c;在同一個el-form-item設置了省市區三級聯動的效果 <el-form-item label"地區" prop"extraProperties.Province"><el-row :gutter"20"><el-col :span"12"><el-select v-model&qu…

OpenHarmony開發實戰:HDF驅動開發流程

概述 HDF&#xff08;Hardware Driver Foundation&#xff09;驅動框架&#xff0c;為驅動開發者提供驅動框架能力&#xff0c;包括驅動加載、驅動服務管理、驅動消息機制和配置管理。并以組件化驅動模型作為核心設計思路&#xff0c;讓驅動開發和部署更加規范&#xff0c;旨在…

Unity3D Excel表格數據處理模塊詳解

一、引言 在Unity3D開發中&#xff0c;我們經常需要處理大量的數據&#xff0c;這些數據可能是游戲配置、角色屬性、道具信息等。Excel表格作為一種常見的數據存儲方式&#xff0c;具有結構清晰、易于編輯的特點&#xff0c;因此被廣泛應用于游戲開發中。本文將詳細介紹如何在…

四川赤橙宏海商務信息咨詢有限公司抖音開店靠譜嗎?

在數字化浪潮席卷全球的今天&#xff0c;電商行業正以前所未有的速度發展。而在這個大潮中&#xff0c;四川赤橙宏海商務信息咨詢有限公司憑借其專業的團隊和前瞻性的戰略眼光&#xff0c;專注于抖音電商服務&#xff0c;為廣大商家提供了一站式解決方案&#xff0c;成為了行業…

面經-常用框架

1.Spring 1.1什么是Spring框架&#xff1f; Spring 是?種輕量級開發框架&#xff0c;旨在提?開發?員的開發效率以及系統的可維護性。 Spring 的 6 個特征:核?技術&#xff0c;測試&#xff0c;數據訪問&#xff0c;Web?持&#xff0c;集成&#xff0c;語? 1.2列舉?些重…

Ubuntu20.04安裝LibTorch并完成高斯濺射環境搭建

0. 簡介 最近受到優刻得的使用邀請&#xff0c;正好解決了我在大模型和自動駕駛行業對GPU的使用需求。UCloud云計算旗下的Compshare的GPU算力云平臺。他們提供高性價比的4090 GPU&#xff0c;按時收費每卡2.6元&#xff0c;月卡只需要1.7元每小時&#xff0c;并附帶200G的免費…

接口自動化測試-項目實戰

什么是接口自動化測試&#xff1a;使用工具或代碼代替人對接口進行測試 測試項目結構&#xff08;python包&#xff09; 1、接口api包 2、script:業務腳本 3、data:數據 4、config.py :配置文件 5、reporter:報告 錯誤問題&#xff1a; 1、未打印任何東西。添加pip ins…

走馬燈封裝

走馬燈功能需求&#xff1a; 支持定時切換&#xff1b;支持左右按鈕切換&#xff08;根據鼠標是否在切換組件內展示和隱藏左右切換按鈕&#xff09;&#xff1b;支持底部標識切換&#xff1b; 走馬燈 完整代碼如下&#xff1a; /*** class 走馬燈*/import react, { Compone…

C語言 指針——緩沖區溢出與緩沖區溢出攻擊

目錄 緩沖區溢出攻擊 緩沖區溢出攻擊實例 字符串的安全輸入方法?編輯 防止緩沖區溢出的兩個要點 緩沖區溢出攻擊 網絡黑客常針對系統和程序自身存在的漏洞&#xff0c;編寫相應的攻擊程序 ? 對緩沖區溢出漏洞的攻擊 —— 最常見 ? 幾乎占到了網絡攻擊次數的一半以上…

Android (已解決)Gradle 編譯失敗 Unsupported class file major version 61

文章目錄 一、報錯原因二、解決方法 一、報錯原因 新版本的 Android Studio 默認使用的是 Java 17 LTS&#xff0c;而這個歷史項目的 Gradle 版本很低&#xff0c;不支持高版本的 Java。 具體原因&#xff1a;Java 17 (major version 61) 編譯的 class 文件&#xff0c;如果在…

逆向學習匯編篇:指令的操作

本節課在線學習視頻&#xff08;網盤地址&#xff0c;保存后即可免費觀看&#xff09;&#xff1a; ??https://pan.quark.cn/s/660c759dea95?? 在逆向工程中&#xff0c;深入理解匯編語言的指令操作是至關重要的。匯編指令是計算機硬件與軟件之間的橋梁&#xff0c;它們直…