為什麼我們需要知道這些?
坡度下降的簡要概述:如果你在山坡上,你想盡快到達谷底,你不遵循等高線,這會保持你的高度不變。叠代的過程是去到下一個較低的等高線,取最短和最陡的步驟,或者相等地,走到盡可能低的等高線,保持你的步長不變。現在你可以把輪廓想象成(局部)平行的曲線集合,見下圖。但是一步是一個方向和長度。直觀上,我們想要“垂直”的步驟到輪廓:到最近的點在較低的輪廓。我們如何展示這個,如何從一組幾乎平行的曲線中“數學地”得出函數的方向?
在很多關于機器學習的介紹性講座中,為了使一個變量的函數極端化,建議将學習率設置為二階導數的倒數。将其推廣到多個維度涉及“... Hessian ...”。
如果你對微分學很熟悉,你可以直接跳到最後。一般論點如下:
為了了解二階導數和Hessians,理解以下内容對我很有幫助。
(real)函數是空間到實數的映射。如果它是二維的函數,那麼在二維的任意點(x,y)函數會給你一個實數。這可以通過多種方式實現:
函數是什麼樣子的?你可以在三維空間中把它表示為z = f(x,y)的曲面,或者在二維空間中表示為地形圖:
用2D表示一個函數
它的梯度是什麼?函數的梯度是等高線圖!在這種情況下,它不是一個常數,就像流體流動可能在不同點上指向不同方向的矢量一樣。但梯度不是矢量,它是一個co-vector。
那麼什麼是covector?給定一個函數,它的梯度可以自然地構造出來,我們剛剛做到了!co-vector是梯度的總和(但它本身可能不是梯度)。
我們知道矢量v ^ a是什麼樣的:它是一個有方向和大小的箭頭。我們甚至知道如何添加矢量:将它們頭尾連接并将第一個尾部加入最後一個頭部:
矢量添加
矢量場在每個點都是箭頭,如果你有flow lines,那麼它就是線上每一點的切線矢量。
我們已經可視化上面的梯度場,等高線圖。什麼是 co-vector w _ a(在某一點上)的樣子?它看起來像兩個平行平面:在給定點上,該點處的切平面和下一個輪廓上的切平面。在2D中,它看起來像
為什麼叫co-vector和它是什麼?co-vector是一個從向量線性映射(在本例中)實數。這張地圖在R中寫成w _ a v ^ a = w(v)= < w,v >。我們如何計算它?它被定義為跨越矢量所需的w的數量:
Action of a co-vector on a vector
在這種情況下,w(v)= 2,因為你必須放置兩個w的“head-to-toe”來跨度v。這裡有兩點:首先,兩個w的“head-to-toe”不是2 * w,其次,w(v)取決于v和w的大小以及它們的相對方向。
加入Covector:
加入Covector
當covector變大時,線(或平面)就會越來越近!請注意,在等高線圖中,這也很直觀:最陡的部分是等高線之間的緊密間隔。
到目前為止,用梯度下降法最小化函數的要點如下:
在矩陣代數中,單位矩陣是一種類型的張量(1,1),一列或一行。允許我們從列向量到行向量的“轉置”操作隐式地假設并使用歐幾裡德類型(2,0)張量((1,0,0),(0,1,0),(0,0,1)),這是一排“行”。這不是單位矩陣,它是(1,1)張量。
讓我們先求出理想的步驟,或者說,學習率,在一維情況下。
1維二次方的理想學習率考慮一個二次方程作為要在一維空間{ x }中被最小化的損失函數(在一個特定的谷中)的近似,并且假設我們已經知道它的函數形式。
要最小化的損失或函數是(注意,我們現在使用y作為目标函數而不是變量)
y = f(x)= a * x ** 2 b * x c
其在任何點x的梯度或導數都是
d y(x)= f '(x)= 2 * a * x b
其二階導數是
dd y = f ''(x)= 2 * a
這個函數的最小值是
X = arg(min(y))= argmin(y)
通過設置y的一階導數找到,d y(X)= 0。
所以我們得到X = - b /(2 * a)
現在想象一下,我們已經開始在一些任意的初始點X 0,我們希望得到X。梯度下降:
我們如何優化α,讓我們以最少的步數達到最低點?你可以說,我們從x 0 開始,我們想要到達X,如果我們選擇x 1 = X,我們可以一步完成
δx = x1 — x0 = X — x0 = -(x0 b/(2*a)).
問題是,當我們在某個任意點x 0 開始時,我們隻有一種計算任何點的損失函數值的方法,我們不知道什麼是a,b,c,甚至不是X = - b /(2 * a)。這類似于在山坡上漫步,在濃霧中,隻有一個高度計,并面臨到達谷底的問題。
我們所知道的是如何為任何x計算y(x)。所以我們可以計算y(x 0)。我們也可以計算它的導數。怎麼樣?我們可以計算y(x 0 ε)并選擇ε“足夠小”:
dy(x0) ~= (y(x0 ε) — y(x0))/ ε
這足以讓我們弄清楚如何到達底部?不,因為如果我們隻知道一階導數,我們将損失近似為一條直線,而切線沒有關于最小值位置的信息:
兩個二次曲線在一點相切
藍色和紅色曲線在x = 1時具有相同的導數,但它們分别在-0.5和 0.25處具有最小值。顯然,為了得到最小值,我們需要知道曲線是怎樣的。
所以回到損失函數的二次近似。我們知道這一步與梯度有關:
δx = — α * dy(x0)
我們也知道梯度:
dy(x0) = f’(x) = 2*a*x0 b
我們已經想出了理想的一步
δx = x1 — x0 = X — x0 = -(x0 b/(2*a))
把它們放在一起,我們發現學習率
α = — δx/dy(x0) = 1/(2*a) = 1/ddy(x0) =二階導數的逆。
所以理想的一步是由
δx = — dy(x0) / ddy(x0)
1維近似理想步驟在前面的章節中,我們表明如果我們想使用“機器學習”在一維中找到二次最小值,特别是使用梯度下降,理想學習率是當前點的二階導數的倒數。在這篇文章中,讓我們嘗試并将其推廣到找出一維中幾乎任何曲線y = y(x)的局部最小值。
在初始點x 0 附近以泰勒級數展開y(x):
y(x) ~= y(x0) (x — x0) * dy(x0) (x — x0)**2 * ddy(x0) / 2 …
X = argmin(y(x)) 由一階導數= 0給出:
dy(x0) (X — x0)*ddy(x0) ~= 0
=> δx = — dy(x0) / ddy(x0).
該步驟與梯度(一階導數)的方向相反,并且學習率 - 或梯度乘以找到理想步長的因數 - 是二階導數的倒數。
該結果與坐标無關,但非線性坐标變換将導緻不同的步驟,因為y(x)中“谷”的二次近似在不同的坐标中将有所不同。
推廣到多個維度在前面的章節中,我們展示了二階導數的倒數是對使用梯度下降找到幾乎任何一維函數的最小值的理想學習率的近似值。在這篇文章中,我們将這個結果推廣到多維,并展示如何通過類型(0,2)的神秘和缺失張量從梯度co-vector 到矢量步進。
我們有多個權重,我們試圖使用最小化某些損失函數。所以權重空間{ x }是多維的,一個點由向量x 或x ^ a給出。損失函數y(x)可以用泰勒級數展開:
y(x) ~= y(x0) δx dy(x0) δx δx ddy(x0) / 2 …
其中dy = (∂y/∂x^i) d x^i,梯度,是co-vector,δ X 是在權重的增量變化。就組件或指數而言:
y(x) ~= y(x0) δx^i d_i y(x0) δx^i δx^j H_{ij}(x0) / 2 …
其中 H_{ij} = (∂/∂x^i) (∂/∂x^j) y
是Hessian矩陣或y的混合偏導數矩陣。
為了找到極值,我們設置= 0 梯度 y(x) w.r.t. x,并牢記 δx = x — x0:
0 = d_i y(x) = d_i y(x0) δx^j H_{ij}(x0)
這可以解決在x 0 點的增量:
δx^i = — H^{ij}(x0) d_j y(x0)
其中具有較高索引的H ^ { ij }是 (a (0,2) tensor) Hessian的逆:
H^{ik} H_{kj} = I^i_j
換句話說,理想的增量是Hessian乘以(負的)梯度的倒數。
“學習率”實際上是一個張量。
當然,在每一步中計算O(D 2)Hessian和O(D 3)的倒數在計算上是一種痛苦,但一種方法可能是每隔幾個epochs做一次,并假定相同的二次近似在該持續時間内保持良好。
有沒有可以簡化的情況?是否有某種意義上的變量可以被認為是相互“正交”和“normalized”的?是的,但唯一的衡量标準來自Hessian本身!如果我們知道Hessian至少近似對角線并且其特征值近似相等,那麼我們可以計算其行列式的D- th根,并且我們得到Hessian
H^{ij} = (detH)^{-D} diag(1,1,1 …)
這是使用Hessian行列式的逆D- th根作為标量學習率的理由。
然而,計算行列式仍然幾乎是O(D 3),所以我們沒有獲得任何計算簡單性。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!