文章目錄
前言
1 優化的目標
2 深度學習中的優化挑戰
2.1 鞍積分
2.2 消失漸變
3 凸性
3.1 convex set
3.2 凸函數
4 局部極小值是全局極小值
5 約束
6 總結
參考
前言優化器或者優化算法,是通過訓練優化參數,來最小化(最大化)損失函數。損失函數是用來計算測試集中目標值Y的真實值和預測值的偏差程度。
為了使模型輸出逼近或達到最優值,我們需要用各種優化策略和算法,來更新和計算影響模型訓練和模型輸出的網絡參數。這種算法使用各參數的梯度值來最小化或最大化損失函數E(x)。最常用的一階優化算法是梯度下降。函數梯度:導數dy/dx的多變量表達式,用來表示y相對於x的瞬時變化率。往往為了計算多變量函數的導數時,會用梯度取代導數,並使用偏導數來計算梯度。梯度和導數之間的一個主要區別是函數的梯度形成了一個多維變量。因此,對單變量函數,使用導數來分析;而梯度是基於多變量函數而產生的。二階優化算法使用了二階導數(也叫做Hessian方法)來最小化或最大化損失函數。這種方法是二階收斂,收斂速度快,但是由於二階導數的計算成本很高,所以這種方法並沒有廣泛使用。主要算法:牛頓法和擬牛頓法(Newton's method & Quasi-Newton Methods)
1 優化的目標
優化提供了一種最大限度地減少深度學習損失功能的方法,但實質上,優化和深度學習的目標是根本不同的。前者主要關注的是儘量減少一個目標,而鑑於數據量有限,後者則關注尋找合適的模型。例如,訓練錯誤和泛化錯誤通常不同:由於優化算法的客觀函數通常是基於訓練數據集的損失函數,因此優化的目標是減少訓練錯誤。但是,深度學習(或更廣義地說,統計推斷)的目標是減少概括錯誤。為了完成後者,除了使用優化算法來減少訓練錯誤之外,我們還需要注意過度擬合。
def f(x):
return x * torch.cos(np.pi * x)
def g(x):
return f(x) + 0.2 * torch.cos(5 * np.pi * x)
下圖說明,訓練數據集的最低經驗風險可能與最低風險(概括錯誤)不同。
def annotate(text, xy, xytext): #@save
d2l.plt.gca().annotate(text, xy=xy, xytext=xytext,
arrowprops=dict(arrowstyle='->'))
x = torch.arange(0.5, 1.5, 0.01)
d2l.set_figsize((4.5, 2.5))
d2l.plot(x, [f(x), g(x)], 'x', 'risk')
annotate('min of\nempirical risk', (1.0, -1.2), (0.5, -1.1))
annotate('min of risk', (1.1, -1.05), (0.95, -0.5))
2 深度學習中的優化挑戰
深度學習優化存在許多挑戰。其中一些最令人惱人的是局部最小值、鞍點和消失的漸變。讓我們來看看它們。
對於任何客觀函數 ,如果 的值 在 附近的任何其他點小於 的值,那麼 在 附近的任何其他點的值小於 ,那麼 可能是局部最低值。如果 的值為 ,為整個域的目標函數的最小值,那麼 是全局最小值。
x = torch.arange(-1.0, 2.0, 0.01)
d2l.plot(x, [f(x), ], 'x', 'f(x)')
annotate('local minimum', (-0.3, -0.25), (-0.77, -1.0))
annotate('global minimum', (1.1, -0.95), (0.6, 0.8))
2.1 鞍積分除了局部最小值之外,鞍點也是梯度消失的另一個原因。* 鞍點 * 是指函數的所有漸變都消失但既不是全局也不是局部最小值的任何位置。考慮這個函數 。它的第一個和第二個衍生品消失了 。這時優化可能會停頓,儘管它不是最低限度。在這裡插入圖片描述
較高維度的鞍點甚至更加陰險。考慮這個函數 。它的鞍點為 。這是相對於 y的最高值,最低為x 。此外,它 * 看起來像馬鞍,這就是這個數學屬性的名字的地方。
2.2 消失漸變沒有必要找到最佳解決方案。本地最佳甚至其近似的解決方案仍然非常有用。3 凸性凸性 (convexity)在優化算法的設計中起到至關重要的作用,
這主要是由於在這種情況下對算法進行分析和測試要容易得多。
換言之,
如果該算法甚至在凸性條件設定下的效果很差,通常我們很難在其他條件下看到好的結果。此外,即使深度學習中的優化問題通常是非凸的,它們也經常在局部極小值附近表現出一些凸性。3.1 convex set第一組存在不包含在集合內部的線段,所以該集合是非凸的,而另外兩組則沒有這樣的問題。
在這裡插入圖片描述3.2 凸函數現在我們有了凸集,我們可以引入凸函數(convex function)。
給定一個凸集 ,如果對於所有 和所有 ,一個函數 是凸的,我們可以得到為了說明這一點,讓我們繪製一些函數並檢查哪些函數滿足要求。
下面我們定義一些函數,包括凸函數和非凸函數。
f = lambda x: 0.5 * x**2 # 凸函數
g = lambda x: torch.cos(np.pi * x) # 非凸函數
h = lambda x: torch.exp(0.5 * x) # 凸函數
x, segment = torch.arange(-2, 2, 0.01), torch.tensor([-1.5, 1])
d2l.use_svg_display()
_, axes = d2l.plt.subplots(1, 3, figsize=(9, 3))
for ax, func in zip(axes, [f, g, h]):
d2l.plot([x, segment], [func(x), func(segment)], axes=ax)
4 局部極小值是全局極小值首先凸函數的局部極小值也是全局極小值。
我們用反證法證明它是錯誤的:假設 是一個局部最小值,使得有一個很小的正值 ,使得 滿足 有 。
假設存在 ,其中 。
根據凸性的性質,這與 是局部最小值相矛盾。
因此,對於 不存在 。
綜上所述,局部最小值 也是全局最小值。例如,對於凸函數 ,有一個局部最小值 , 它也是全局最小值。在這裡插入圖片描述5 約束凸優化的一個很好的特性是能夠讓我們有效地處理約束(constraints)。
即它使我們能夠解決以下形式的 約束優化(constrained optimization)問題:這裡 是目標函數, 是約束函數。
例如第一個約束 ,則參數 被限制為單位球。
如果第二個約束 ,那麼這對應於半空間上所有的 。
同時滿足這兩個約束等於選擇一個球的切片作為約束集。6 總結在深度學習的背景下,凸函數的主要目的是幫助我們詳細了解優化算法。
我們由此得出梯度下降法和隨機梯度下降法是如何相應推導出來的。根據詹森不等式,「一個多變量凸函數的總期望值」大於或等於「用每個變量的期望值計算這個函數的總值「。一個二次可微函數是凸函數,若且唯若其Hessian(二階導數矩陣)是半正定的。凸約束可以通過拉格朗日函數來添加。在實踐中,只需在目標函數中加上一個懲罰就可以了。參考
[1].https://zh-v2.d2l.ai/index.html
個人簡介:李響Superb,CSDN百萬訪問量博主,普普通通男大學生,深度學習算法、醫學圖像處理專攻,偶爾也搞全棧開發,沒事就寫文章。
博客地址:lixiang.blog.csdn.net
點擊下方閱讀原文加入社區會員