類神經網路訓練 局部最小值 (local minima) 與鞍點 (saddle point)

更新於 發佈於 閱讀時間約 4 分鐘

之前有提到有時我們在微分之後會得到gradient = 0的值,就以為我們已經找到最小值,但其實它只是local minima。

那這一節主要想跟大家分享我們要怎麼區分是不是Local Minima。

首先,如果在我們取微分之後,得到gradient = 0的情況,我們統稱為critical point

那critical point根據圖形我們可以分成兩種類型:

  1. local minima:圖形最低點。
  2. saddle point:只是某個方向的最低點,在不同方向上其實還有路可以走。
raw-image


那要如何區分?

  1. 如上圖,可以透過圖形區分
  2. 透過Hessian區分

Hessian

計算方式:

  1. 透過泰勒展開式,我們可以將L(θ)近似於:

𝐿(θ)≈ 𝐿(θ)′+(θ−θ′)𝑇 *g+1/2 * (θ−θ′)𝑇 𝐻(θ−θ′)

此時處於critical point -> (θθ′)𝑇 *g的值為0

*g: gradient

*H: Hessian -> Hij =  (∂2/∂θiθj )*L(θ'): 對Loss函數的二次微分

  1. 計算vTHv,以及所有的eigen value λ:

a. λ> 0 -> local minima

b. λ< 0 -> local maxmum

c. λ有正有負 -> saddle point

Q: 如果算出來是saddle point呢?

A: 那我們就能透過eigen value 與vector得出可以更新的方向

假設我們得到的eigen value λ = 2, -2

我們就計算出eigen vector

接著照著eigen vector u的方向更新我們的θ,即能更新我們的參數


推導過程:

H可以替換成eigen value λ,v替換成u=[1 1]T

=> uTHu = uTλu = λ|u|2

再帶回泰勒展開式我們可以得到

𝐿(θ)= 𝐿(θ)′+1/2 * (θ−θ′)𝑇 𝐻(θ−θ′)

(θ−θ′) = u帶入

-> 𝐿(θ)= 𝐿(θ')+1/2 * uTλu

如果λ < 0 我們能得知 𝐿(θ) < 𝐿(θ')

=> θ−θ′ = u -> θ = θ′ + u

=> 推得我們可以透過+u更新θ值


Example:

假設我們設計一個function為 y = w1w2x,目標是找到最接近y= 1的答案:

我們可以得到Loss function:

L = (ŷ - ​w1w2x)2 = (1-w1w2x)2 <- 只有一筆y= 1的訓練資料

接著,我們透過微分得到gradient decent:

∂/∂w1 = 2(1-w2x)(-w2)

∂/∂w2 = 2(1-w1x)(-w1)

而我們事先知道當w1 = 0, w2 = 0時為critical point

(可以各自將w1 = 0的值帶入上述微分後的函數,結果也為0)

我們計算出Hession: 將每個向量都做2次微分

向量H = ∂*L/∂w12 ∂*L/∂w1∂w2 0 -2

∂*L/∂w2∂w1 ∂*L/∂w22 => -2 0

=> 由此得知 eigen value λ = 2,-2 => saddle point ​

如何更新參數?

eigen value λ = -2, eigen vector u = [1 1]T

=> 更新的 θ = θ' - u

*但要注意,這樣的計算量極大,通常不採用這樣的方法


那local minima與saddle point哪一個更常見?

-> 事實上Saddle point 更多。

我們可以透過檢查eigen value的正負決定

-> minimum ratio 代表還有多少路可以走 = 正的eigen value數目 / 所有的eigen value數目


以上是關於如何區分local minima與saddle point的辦法~





avatar-img
1會員
37內容數
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
dab戴伯的沙龍 的其他內容
這篇文章介紹瞭如何使用sigmoid函數來解決函數過於簡單導致的模型偏差問題,並透過尋找函數和參數來逼近precise linear curve。另外,也講述瞭如何尋找讓損失函數最小的參數以及使用batch和反覆進行Sigmoid的方法。
機器學習是什麼? 簡單來說,機器學習就是訓練機器尋找Function的一段過程,而這個Function可以幫助我們解決我們遇到的問題,或是幫助我們
static 關鍵字主要用於管理記憶體,可用在variables, methods, blocks, nested classed。加上static關鍵字的物件,會在啟動程式當下就會賦予記憶體位置給此物件,後續無論實例化多少次,記憶體的位置都相同。 以class舉例,static class 與
在Android 編譯成功後,在out/target/product/generic會產生與系統對應的映像檔,分別是ramdisk.img關於root文件系統, system.img關於主要的包及庫, userdata.img關於用戶數據,分別對應的目錄為root, system, data映像檔簡
主要在使用這兩種類型時常常會忘記,所以簡單整理一下內容 Stack Stack<Character> stack = new stack<>(); 屬於LIFO的特性,也就是先進後出的概念,因此所有動作通常是發生在top,可以想像成放球的瓶子,只有頂端一個開口可以拿最上面的那顆球。 可以使用
物件導向的概念不外乎-> 封裝、繼承、多型、抽象、介面 封裝:在初始化一個class時,將內容物用private的方式包起來,而另外提供接口去給外界使用,可達到保護其資料隱私。 private: 只有自己類別的成員能夠存取 public: 任何人都可以調用 protected: 其父類與子類
這篇文章介紹瞭如何使用sigmoid函數來解決函數過於簡單導致的模型偏差問題,並透過尋找函數和參數來逼近precise linear curve。另外,也講述瞭如何尋找讓損失函數最小的參數以及使用batch和反覆進行Sigmoid的方法。
機器學習是什麼? 簡單來說,機器學習就是訓練機器尋找Function的一段過程,而這個Function可以幫助我們解決我們遇到的問題,或是幫助我們
static 關鍵字主要用於管理記憶體,可用在variables, methods, blocks, nested classed。加上static關鍵字的物件,會在啟動程式當下就會賦予記憶體位置給此物件,後續無論實例化多少次,記憶體的位置都相同。 以class舉例,static class 與
在Android 編譯成功後,在out/target/product/generic會產生與系統對應的映像檔,分別是ramdisk.img關於root文件系統, system.img關於主要的包及庫, userdata.img關於用戶數據,分別對應的目錄為root, system, data映像檔簡
主要在使用這兩種類型時常常會忘記,所以簡單整理一下內容 Stack Stack<Character> stack = new stack<>(); 屬於LIFO的特性,也就是先進後出的概念,因此所有動作通常是發生在top,可以想像成放球的瓶子,只有頂端一個開口可以拿最上面的那顆球。 可以使用
物件導向的概念不外乎-> 封裝、繼承、多型、抽象、介面 封裝:在初始化一個class時,將內容物用private的方式包起來,而另外提供接口去給外界使用,可達到保護其資料隱私。 private: 只有自己類別的成員能夠存取 public: 任何人都可以調用 protected: 其父類與子類
你可能也想看
Google News 追蹤
Thumbnail
在創作的路上真的很多人問我說 到底要怎麼做出符合自己期待 但又可以表現得很有美感的作品?🥹 這個問題真的應該是每個創作者都一直在學習的課題吧!
提問的內容越是清晰,強者、聰明人越能在短時間內做判斷、給出精準的建議,他們會對你產生「好印象」,認定你是「積極」的人,有機會、好人脈會不自覺地想引薦給你
你學習任何數學, 都要問這哪個部分是微積分長出來的, 哪個部分是線性代數長出來的。 當然,你需要先把微積分與線性代數學一次, 知道裡面有哪些內容, 接下來學任何新的東西,其實都是微積分跟線性代數。
Thumbnail
這是「按條件算OO」系列文的第五篇教學!今天會來聊聊 MINIFS。
Thumbnail
在創作的路上真的很多人問我說 到底要怎麼做出符合自己期待 但又可以表現得很有美感的作品?🥹 這個問題真的應該是每個創作者都一直在學習的課題吧!
提問的內容越是清晰,強者、聰明人越能在短時間內做判斷、給出精準的建議,他們會對你產生「好印象」,認定你是「積極」的人,有機會、好人脈會不自覺地想引薦給你
你學習任何數學, 都要問這哪個部分是微積分長出來的, 哪個部分是線性代數長出來的。 當然,你需要先把微積分與線性代數學一次, 知道裡面有哪些內容, 接下來學任何新的東西,其實都是微積分跟線性代數。
Thumbnail
這是「按條件算OO」系列文的第五篇教學!今天會來聊聊 MINIFS。