在本節(jié)中,我們將討論優(yōu)化與深度學(xué)習(xí)之間的關(guān)系以及在深度學(xué)習(xí)中使用優(yōu)化的挑戰(zhàn)。對于一個深度學(xué)習(xí)問題,我們通常會先定義一個 損失函數(shù)。一旦我們有了損失函數(shù),我們就可以使用優(yōu)化算法來嘗試最小化損失。在優(yōu)化中,損失函數(shù)通常被稱為優(yōu)化問題的目標函數(shù)。按照傳統(tǒng)和約定,大多數(shù)優(yōu)化算法都與最小化有關(guān)。如果我們需要最大化目標,有一個簡單的解決方案:只需翻轉(zhuǎn)目標上的標志。
12.1.1。優(yōu)化目標
盡管優(yōu)化為深度學(xué)習(xí)提供了一種最小化損失函數(shù)的方法,但從本質(zhì)上講,優(yōu)化和深度學(xué)習(xí)的目標是根本不同的。前者主要關(guān)注最小化目標,而后者關(guān)注在給定有限數(shù)據(jù)量的情況下找到合適的模型。在 第 3.6 節(jié)中,我們詳細討論了這兩個目標之間的區(qū)別。例如,訓(xùn)練誤差和泛化誤差通常不同:由于優(yōu)化算法的目標函數(shù)通常是基于訓(xùn)練數(shù)據(jù)集的損失函數(shù),因此優(yōu)化的目標是減少訓(xùn)練誤差。然而,深度學(xué)習(xí)(或更廣泛地說,統(tǒng)計推斷)的目標是減少泛化誤差。為了完成后者,除了使用優(yōu)化算法來減少訓(xùn)練誤差外,我們還需要注意過度擬合。
%matplotlib inline import numpy as np import torch from mpl_toolkits import mplot3d from d2l import torch as d2l
%matplotlib inline from mpl_toolkits import mplot3d from mxnet import np, npx from d2l import mxnet as d2l npx.set_np()
%matplotlib inline import numpy as np import tensorflow as tf from mpl_toolkits import mplot3d from d2l import tensorflow as d2l
為了說明上述不同的目標,讓我們考慮經(jīng)驗風險和風險。如第 4.7.3.1 節(jié)所述 ,經(jīng)驗風險是訓(xùn)練數(shù)據(jù)集的平均損失,而風險是整個數(shù)據(jù)群的預(yù)期損失。下面我們定義兩個函數(shù):風險函數(shù)f和經(jīng)驗風險函數(shù)g。假設(shè)我們只有有限數(shù)量的訓(xùn)練數(shù)據(jù)。結(jié)果,這里g 不如 平滑f。
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 f(x): return x * np.cos(np.pi * x) def g(x): return f(x) + 0.2 * np.cos(5 * np.pi * x)
def f(x): return x * tf.cos(np.pi * x) def g(x): return f(x) + 0.2 * tf.cos(5 * np.pi * x)
下圖說明了訓(xùn)練數(shù)據(jù)集上經(jīng)驗風險的最小值可能與風險的最小值(泛化誤差)位于不同的位置。
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 ofnempirical risk', (1.0, -1.2), (0.5, -1.1)) annotate('min of risk', (1.1, -1.05), (0.95, -0.5))
def annotate(text, xy, xytext): #@save d2l.plt.gca().annotate(text, xy=xy, xytext=xytext, arrowprops=dict(arrowstyle='->')) x = np.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 ofnempirical risk', (1.0, -1.2), (0.5, -1.1)) annotate('min of risk', (1.1, -1.05), (0.95, -0.5))
def annotate(text, xy, xytext): #@save d2l.plt.gca().annotate(text, xy=xy, xytext=xytext, arrowprops=dict(arrowstyle='->')) x = tf.range(0.5, 1.5, 0.01) d2l.set_figsize((4.5, 2.5)) d2l.plot(x, [f(x), g(x)], 'x', 'risk') annotate('min ofnempirical risk', (1.0, -1.2), (0.5, -1.1)) annotate('min of risk', (1.1, -1.05), (0.95, -0.5))
12.1.2。深度學(xué)習(xí)中的優(yōu)化挑戰(zhàn)
在本章中,我們將特別關(guān)注優(yōu)化算法在最小化目標函數(shù)方面的性能,而不是模型的泛化誤差。在 3.1 節(jié)中,我們區(qū)分了優(yōu)化問題中的解析解和數(shù)值解。在深度學(xué)習(xí)中,大多數(shù)目標函數(shù)都很復(fù)雜,沒有解析解。相反,我們必須使用數(shù)值優(yōu)化算法。本章的優(yōu)化算法都屬于這一類。
深度學(xué)習(xí)優(yōu)化有很多挑戰(zhàn)。一些最令人煩惱的是局部最小值、鞍點和梯度消失。讓我們來看看它們。
12.1.2.1。局部最小值
對于任何目標函數(shù)f(x), 如果值f(x)在 x小于的值f(x)在附近的任何其他點x, 然后f(x)可能是局部最小值。如果值f(x)在x是整個域內(nèi)目標函數(shù)的最小值,則f(x)是全局最小值。
例如,給定函數(shù)
(12.1.1)f(x)=x?cos(πx)for?1.0≤x≤2.0,
我們可以逼近這個函數(shù)的局部最小值和全局最小值。
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))
x = np.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))
x = tf.range(-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))
深度學(xué)習(xí)模型的目標函數(shù)通常有很多局部最優(yōu)值。當優(yōu)化問題的數(shù)值解接近局部最優(yōu)時,隨著目標函數(shù)解的梯度趨近或變?yōu)榱悖罱K迭代得到的數(shù)值解可能只會局部最小化目標函數(shù),而不是全局最小化。只有某種程度的噪聲可能會使參數(shù)超出局部最小值。事實上,這是小批量隨機梯度下降的有益特性之一,其中小批量梯度的自然變化能夠?qū)?shù)從局部最小值中移除。
12.1.2.2。鞍點
除了局部最小值,鞍點是梯度消失的另一個原因。鞍點是函數(shù)的所有梯度都消失但既不是全局最小值也不是局部最小值的任何位置。考慮函數(shù)f(x)=x3. 它的一階和二階導(dǎo)數(shù)消失為x=0. 優(yōu)化可能會在此時停止,即使它不是最小值。
x = torch.arange(-2.0, 2.0, 0.01) d2l.plot(x, [x**3], 'x', 'f(x)') annotate('saddle point', (0, -0.2), (-0.52, -5.0))
x = np.arange(-2.0, 2.0, 0.01) d2l.plot(x, [x**3], 'x', 'f(x)') annotate('saddle point', (0, -0.2), (-0.52, -5.0))
x = tf.range(-2.0, 2.0, 0.01) d2l.plot(x, [x**3], 'x', 'f(x)') annotate('saddle point', (0, -0.2), (-0.52, -5.0))
更高維度的鞍點更加隱蔽,如下例所示。考慮函數(shù)f(x,y)=x2?y2. 它的鞍點位于(0,0). 這是相對于y和最低限度x. 此外,它看起來像一個馬鞍,這就是這個數(shù)學(xué)性質(zhì)得名的地方。
x, y = torch.meshgrid( torch.linspace(-1.0, 1.0, 101), torch.linspace(-1.0, 1.0, 101)) z = x**2 - y**2 ax = d2l.plt.figure().add_subplot(111, projection='3d') ax.plot_wireframe(x, y, z, **{'rstride': 10, 'cstride': 10}) ax.plot([0], [0], [0], 'rx') ticks = [-1, 0, 1] d2l.plt.xticks(ticks) d2l.plt.yticks(ticks) ax.set_zticks(ticks) d2l.plt.xlabel('x') d2l.plt.ylabel('y');
x, y = np.meshgrid( np.linspace(-1.0, 1.0, 101), np.linspace(-1.0, 1.0, 101)) z = x**2 - y**2 ax = d2l.plt.figure().add_subplot(111, projection='3d') ax.plot_wireframe(x.asnumpy(), y.asnumpy(), z.asnumpy(), **{'rstride': 10, 'cstride': 10}) ax.plot([0], [0], [0], 'rx') ticks = [-1, 0, 1] d2l.plt.xticks(ticks) d2l.plt.yticks(ticks) ax.set_zticks(ticks) d2l.plt.xlabel('x') d2l.plt.ylabel('y');
x, y = tf.meshgrid( tf.linspace(-1.0, 1.0, 101), tf.linspace(-1.0, 1.0, 101)) z = x**2 - y**2 ax = d2l.plt.figure().add_subplot(111, projection='3d') ax.plot_wireframe(x, y, z, **{'rstride': 10, 'cstride': 10}) ax.plot([0], [0], [0], 'rx') ticks = [-1, 0, 1] d2l.plt.xticks(ticks) d2l.plt.yticks(ticks) ax.set_zticks(ticks) d2l.plt.xlabel('x') d2l.plt.ylabel('y');
我們假設(shè)函數(shù)的輸入是k維向量,它的輸出是一個標量,所以它的 Hessian 矩陣有k 特征值。函數(shù)的解可以是局部最小值、局部最大值或函數(shù)梯度為零的位置處的鞍點:
當函數(shù)的 Hessian 矩陣在零梯度位置的特征值都為正時,函數(shù)有一個局部最小值。
當函數(shù)的 Hessian 矩陣在零梯度位置的特征值全部為負時,我們有函數(shù)的局部最大值。
當函數(shù)的 Hessian 矩陣在零梯度位置的特征值分別為負和正時,我們就有了函數(shù)的鞍點。
對于高維問題,至少某些特征值為負的可能性非常高。這使得鞍點比局部最小值更有可能。我們將在下一節(jié)介紹凸性時討論這種情況的一些例外情況。簡而言之,凸函數(shù)是那些 Hessian 矩陣的特征值從不為負的函數(shù)。但遺憾的是,大多數(shù)深度學(xué)習(xí)問題并不屬于這一類。盡管如此,它還是研究優(yōu)化算法的好工具。
12.1.2.3。消失的漸變
可能遇到的最隱蔽的問題是梯度消失。回憶一下我們在5.1.2 節(jié)中常用的激活函數(shù)及其派生函數(shù)。例如,假設(shè)我們要最小化函數(shù)f(x)=tanh?(x)我們碰巧開始于x=4. 正如我們所見,梯度f接近于零。進一步來說, f′(x)=1?tanh2?(x)因此f′(4)=0.0013. 因此,在我們?nèi)〉眠M展之前,優(yōu)化將停滯很長時間。事實證明,這是在引入 ReLU 激活函數(shù)之前訓(xùn)練深度學(xué)習(xí)模型非常棘手的原因之一。
x = torch.arange(-2.0, 5.0, 0.01) d2l.plot(x, [torch.tanh(x)], 'x', 'f(x)') annotate('vanishing gradient', (4, 1), (2, 0.0))
x = np.arange(-2.0, 5.0, 0.01) d2l.plot(x, [np.tanh(x)], 'x', 'f(x)') annotate('vanishing gradient', (4, 1), (2, 0.0))
x = tf.range(-2.0, 5.0, 0.01) d2l.plot(x, [tf.tanh(x)], 'x', 'f(x)') annotate('vanishing gradient', (4, 1), (2, 0.0))
正如我們所見,深度學(xué)習(xí)的優(yōu)化充滿挑戰(zhàn)。幸運的是,存在一系列強大的算法,它們性能良好并且即使對于初學(xué)者也易于使用。此外,并不是真的有必要找到最佳解決方案。其局部最優(yōu)甚至近似解仍然非常有用。
12.1.3。概括
最小化訓(xùn)練誤差并不能保證我們找到最佳參數(shù)集來最小化泛化誤差。
優(yōu)化問題可能有很多局部極小值。
該問題可能有更多的鞍點,因為通常問題不是凸的。
消失的梯度會導(dǎo)致優(yōu)化停止。問題的重新參數(shù)化通常會有所幫助。參數(shù)的良好初始化也可能是有益的。
12.1.4。練習(xí)
考慮一個簡單的 MLP,它有一個隱藏層,比方說,d 隱藏層中的維度和單個輸出。表明對于任何局部最小值,至少有d!行為相同的等效解決方案。
假設(shè)我們有一個對稱隨機矩陣M 條目在哪里Mij=Mji每個都是從一些概率分布中得出的pij. 此外假設(shè) pij(x)=pij(?x),即分布是對稱的(有關(guān)詳細信息,請參見例如Wigner ( 1958 ))。
證明特征值的分布也是對稱的。也就是說,對于任何特征向量v相關(guān)特征值的概率λ滿足 P(λ>0)=P(λ<0).
為什么上面沒有暗示P(λ>0)=0.5?
您還能想到深度學(xué)習(xí)優(yōu)化中涉及的其他哪些挑戰(zhàn)?
假設(shè)您想要在(真實的)鞍座上平衡一個(真實的)球。
為什么這很難?
您能否將這種效應(yīng)也用于優(yōu)化算法?
-
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5557瀏覽量
122685 -
pytorch
+關(guān)注
關(guān)注
2文章
809瀏覽量
13884
發(fā)布評論請先 登錄
Facebook宣布發(fā)布深度學(xué)習(xí)框架 PyTorch 1.0開發(fā)者預(yù)覽版
PyTorch官網(wǎng)教程PyTorch深度學(xué)習(xí):60分鐘快速入門中文翻譯版
蘋果向開發(fā)者用戶推送了iOS 12.1. 3 開發(fā)者預(yù)覽版beta4

為什么學(xué)習(xí)深度學(xué)習(xí)需要使用PyTorch和TensorFlow框架
基于PyTorch的深度學(xué)習(xí)入門教程之PyTorch的安裝和配置
基于PyTorch的深度學(xué)習(xí)入門教程之PyTorch簡單知識
PyTorch開源深度學(xué)習(xí)框架簡介
深度學(xué)習(xí)框架PyTorch和TensorFlow如何選擇
PyTorch教程5.5之深度學(xué)習(xí)中的泛化

PyTorch教程12.1之優(yōu)化和深度學(xué)習(xí)

評論