天天看點

動手學PyTorch | (37) 優化與深度學習

本節将讨論優化與深度學習的關系,以及優化在深度學習中的挑戰。在⼀個深度學習問題中,我們通常會預先定義一個損失函數。有了損失函數以後,我們就可以使用優化算法試圖将其最小化。在優化中, 這樣的損失函數通常被稱作優化問題的目标函數(objective function)。依據慣例,優化算法通常隻考慮最⼩化⽬标函數。其實,任何最大化問題都可以很容易地轉化為最小化問題,隻需令⽬标函數的相反數為新的⽬标函數即可。

目錄

1. 優化與深度學習的關系

2. 優化在深度學習中的挑戰

3. 小結

1. 優化與深度學習的關系

雖然優化為深度學習提供了最小化損失函數的⽅法,但本質上,優化與深度學習的目标是有差別的。 在(模型選擇、欠拟合和過拟合)中,我們區分了訓練誤差和泛化誤差。 由于優化算法的目标函數通常是⼀個基于訓練資料集的損失函數,優化的目标在于降低訓練誤差。而深度學習的目标在于降低泛化誤差。為了降低泛化誤差,除了使用優化算法降低訓練誤差以外,還需要注意應對過拟合。

之後的幾節中,我們隻關注優化算法在最小化⽬标函數(基于訓練集的損失函數)上的表現,⽽不關注模型的泛化誤差。

2. 優化在深度學習中的挑戰

我們在(線性回歸)中對優化問題的解析解和數值解做了區分。深度學習中絕⼤多數⽬标函數都很複雜。是以,很多優化問題并不存在解析解,⽽需要使用基于數值方法的優化算法找到近似解,即數值解。本書中讨論的優化算法都是這類基于數值方法的算法。為了求得最⼩化⽬标函數的數值解,我們将通過優化算法有限次疊代更新模型參數來盡可能降低損失函數的值。

優化在深度學習中有很多挑戰。下⾯描述了其中的兩個挑戰,即局部最⼩值和鞍點。為了更好地描述問題,我們先導入本節中實驗需要的包或子產品。

%matplotlib inline
import sys
sys.path.append(".") 
import d2lzh_pytorch as d2l
from mpl_toolkits import mplot3d # 三維畫圖
import numpy as np
           
  • 局部最小值

對于目标函數f(x),如果f(x)在x上的值⽐在x鄰近的其他點的值更小,那麼f(x)可能是一個局部最⼩值(local minimum)。如果f(x)在x上的值是目标函數在整個定義域上的最小值,那麼f(x)是全局最小值(global minimum)。

例如:

動手學PyTorch | (37) 優化與深度學習

我們可以大緻找出該函數的局部最小值和全局最⼩值的位置。需要注意的是,圖中箭頭所訓示的隻是⼤緻位置。

def f(x):
    return x * np.cos(np.pi * x)

d2l.set_figsize((4.5, 2.5))
x = np.arange(-1.0, 2.0, 0.1)
fig,  = d2l.plt.plot(x, f(x))
fig.axes.annotate('local minimum', xy=(-0.3, -0.25), xytext=(-0.77, -1.0),
                  arrowprops=dict(arrowstyle='->'))
fig.axes.annotate('global minimum', xy=(1.1, -0.95), xytext=(0.6, 0.8),
                  arrowprops=dict(arrowstyle='->'))
d2l.plt.xlabel('x')
d2l.plt.ylabel('f(x)');
           
動手學PyTorch | (37) 優化與深度學習

深度學習模型的⽬标函數可能有若幹局部最優值。當一個優化問題的數值解在局部最優解附近時,由于此時目标函數有關解的梯度接近或變成零,最終疊代求得的數值解可能隻令目标函數局部最⼩化⽽非全局最小化。

  • 鞍點

剛剛我們提到,梯度接近或變成零可能是由于目前解在局部最優解附近造成的。事實上,另一種可能性是目前解在鞍點(saddle point)附近。

舉個例子,給定函數:

動手學PyTorch | (37) 優化與深度學習

我們可以找出該函數的鞍點位置。

x = np.arange(-2.0, 2.0, 0.1)
fig, = d2l.plt.plot(x, x**3)
fig.axes.annotate('saddle point', xy=(0, -0.2), xytext=(-0.52, -5.0),
                  arrowprops=dict(arrowstyle='->'))
d2l.plt.xlabel('x')
d2l.plt.ylabel('f(x)');
           
動手學PyTorch | (37) 優化與深度學習

再舉個定義在二維空間的函數的例子,例如:

動手學PyTorch | (37) 優化與深度學習

我們可以找出該函數的鞍點位置。也許你已經發現了,該函數看起來像⼀個⻢鞍,⽽鞍點恰好是⻢鞍上可坐區域的中心。

x, y = np.mgrid[-1: 1: 31j, -1: 1: 31j]
z = x**2 - y**2

ax = d2l.plt.figure().add_subplot(111, projection='3d')
ax.plot_wireframe(x, y, z, **{'rstride': 2, 'cstride': 2})
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');
           
動手學PyTorch | (37) 優化與深度學習

在圖的鞍點位置,⽬标函數在x軸⽅向上是局部最⼩值,但在y軸⽅向上是局部最大值。

假設⼀個函數的輸⼊為k維向量,輸出為标量,那麼它的海森矩陣(Hessian matrix)有k個特征值。該函數在梯度為0的位置上可能是局部最小值、局部最大值或者鞍點。

1) 當函數的海森矩陣在梯度為零的位置上的特征值全為正時,該函數得到局部最小值。

2)當函數的海森矩陣在梯度為零的位置上的特征值全為負時,該函數得到局部最大值。

3)當函數的海森矩陣在梯度為零的位置上的特征值有正有負時,該函數得到鞍點。

随機矩陣理論告訴我們,對于一個大的⾼斯随機矩陣來說,任⼀特征值是正或者是負的機率都是0.5。那麼,以上第一種情況的機率為

動手學PyTorch | (37) 優化與深度學習

.由于深度學習模型參數通常都是高維的( k很大),⽬标函數的鞍點通常⽐局部最小值更常見。

在深度學習中,雖然找到⽬标函數的全局最優解很難,但這并⾮必要。我們将在接下來的幾節中逐一介紹深度學習中常用的優化算法,它們在很多實際問題中都能夠訓練出⼗分有效的深度學習模型。

3. 小結

1)由于優化算法的目标函數通常是一個基于訓練資料集的損失函數,優化的⽬标在于降低訓練誤差。

2)由于深度學習模型參數通常都是高維的,目标函數的鞍點通常比局部最小值更常見。