# 7.1 優化與深度學習
本節將討論優化與深度學習的關系,以及優化在深度學習中的挑戰。在一個深度學習問題中,我們通常會預先定義一個損失函數。有了損失函數以后,我們就可以使用優化算法試圖將其最小化。在優化中,這樣的損失函數通常被稱作優化問題的目標函數(objective function)。依據慣例,優化算法通常只考慮最小化目標函數。其實,任何最大化問題都可以很容易地轉化為最小化問題,只需令目標函數的相反數為新的目標函數即可。
## 7.1.1 優化與深度學習的關系
雖然優化為深度學習提供了最小化損失函數的方法,但本質上,優化與深度學習的目標是有區別的。
在3.11節(模型選擇、欠擬合和過擬合)中,我們區分了訓練誤差和泛化誤差。
由于優化算法的目標函數通常是一個基于訓練數據集的損失函數,優化的目標在于降低訓練誤差。
而深度學習的目標在于降低泛化誤差。為了降低泛化誤差,除了使用優化算法降低訓練誤差以外,還需要注意應對過擬合。
本章中,我們只關注優化算法在最小化目標函數上的表現,而不關注模型的泛化誤差。
## 7.1.2 優化在深度學習中的挑戰
我們在3.1節(線性回歸)中對優化問題的解析解和數值解做了區分。深度學習中絕大多數目標函數都很復雜。因此,很多優化問題并不存在解析解,而需要使用基于數值方法的優化算法找到近似解,即數值解。本書中討論的優化算法都是這類基于數值方法的算法。為了求得最小化目標函數的數值解,我們將通過優化算法有限次迭代模型參數來盡可能降低損失函數的值。
優化在深度學習中有很多挑戰。下面描述了其中的兩個挑戰,即局部最小值和鞍點。為了更好地描述問題,我們先導入本節中實驗需要的包或模塊。
``` python
%matplotlib inline
import sys
sys.path.append("..")
import d2lzh_pytorch as d2l
from mpl_toolkits import mplot3d # 三維畫圖
import numpy as np
```
### 7.1.2.1 局部最小值
對于目標函數`$ f(x) $`,如果`$ f(x) $`在`$ x $`上的值比在`$ x $`鄰近的其他點的值更小,那么`$ f(x) $` 可能是一個局部最小值(local minimum)。如果`$ f(x) $`在`$ x $`上的值是目標函數在整個定義域上的最小值,那么`$ f(x) $` 是全局最小值(global minimum)。
舉個例子,給定函數
```[tex]
f(x) = x \cdot \text{cos}(\pi x), \qquad -1.0 \leq x \leq 2.0,
```
我們可以大致找出該函數的局部最小值和全局最小值的位置。需要注意的是,圖中箭頭所指示的只是大致位置。
``` python
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)');
```
:-: 
深度學習模型的目標函數可能有若干局部最優值。當一個優化問題的數值解在局部最優解附近時,由于目標函數有關解的梯度接近或變成零,最終迭代求得的數值解可能只令目標函數局部最小化而非全局最小化。
### 7.1.2.2 鞍點
剛剛我們提到,梯度接近或變成零可能是由于當前解在局部最優解附近造成的。事實上,另一種可能性是當前解在鞍點(saddle point)附近。
舉個例子,給定函數
```[tex]
f(x) = x^3,
```
我們可以找出該函數的鞍點位置。
``` python
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)');
```
:-: 
再舉個定義在二維空間的函數的例子,例如:
```[tex]
f(x, y) = x^2 - y^2.
```
我們可以找出該函數的鞍點位置。也許你已經發現了,該函數看起來像一個馬鞍,而鞍點恰好是馬鞍上可坐區域的中心。
``` python
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');
```
:-: 
在圖的鞍點位置,目標函數在`$ x $`軸方向上是局部最小值,但在`$ y $`軸方向上是局部最大值。
假設一個函數的輸入為`$ k $`維向量,輸出為標量,那么它的海森矩陣(Hessian matrix)有`$ k $`個特征值。該函數在梯度為0的位置上可能是局部最小值、局部最大值或者鞍點。
* 當函數的海森矩陣在梯度為零的位置上的特征值全為正時,該函數得到局部最小值。
* 當函數的海森矩陣在梯度為零的位置上的特征值全為負時,該函數得到局部最大值。
* 當函數的海森矩陣在梯度為零的位置上的特征值有正有負時,該函數得到鞍點。
隨機矩陣理論告訴我們,對于一個大的高斯隨機矩陣來說,任一特征值是正或者是負的概率都是0.5 [1]。那么,以上第一種情況的概率為 `$ 0.5^k $`。由于深度學習模型參數通常都是高維的(`$ k $`很大),目標函數的鞍點通常比局部最小值更常見。
在深度學習中,雖然找到目標函數的全局最優解很難,但這并非必要。我們將在本章接下來的幾節中逐一介紹深度學習中常用的優化算法,它們在很多實際問題中都能夠訓練出十分有效的深度學習模型。
## 小結
* 由于優化算法的目標函數通常是一個基于訓練數據集的損失函數,優化的目標在于降低訓練誤差。
* 由于深度學習模型參數通常都是高維的,目標函數的鞍點通常比局部最小值更常見。
## 參考文獻
[1] Wigner, E. P. (1958). On the distribution of the roots of certain symmetric matrices. Annals of Mathematics, 325-327.
------------
> 注:本節與原書基本相同,[原書傳送門](https://zh.d2l.ai/chapter_optimization/optimization-intro.html)
- Home
- Introduce
- 1.深度學習簡介
- 深度學習簡介
- 2.預備知識
- 2.1環境配置
- 2.2數據操作
- 2.3自動求梯度
- 3.深度學習基礎
- 3.1 線性回歸
- 3.2 線性回歸的從零開始實現
- 3.3 線性回歸的簡潔實現
- 3.4 softmax回歸
- 3.5 圖像分類數據集(Fashion-MINST)
- 3.6 softmax回歸的從零開始實現
- 3.7 softmax回歸的簡潔實現
- 3.8 多層感知機
- 3.9 多層感知機的從零開始實現
- 3.10 多層感知機的簡潔實現
- 3.11 模型選擇、反向傳播和計算圖
- 3.12 權重衰減
- 3.13 丟棄法
- 3.14 正向傳播、反向傳播和計算圖
- 3.15 數值穩定性和模型初始化
- 3.16 實戰kaggle比賽:房價預測
- 4 深度學習計算
- 4.1 模型構造
- 4.2 模型參數的訪問、初始化和共享
- 4.3 模型參數的延后初始化
- 4.4 自定義層
- 4.5 讀取和存儲
- 4.6 GPU計算
- 5 卷積神經網絡
- 5.1 二維卷積層
- 5.2 填充和步幅
- 5.3 多輸入通道和多輸出通道
- 5.4 池化層
- 5.5 卷積神經網絡(LeNet)
- 5.6 深度卷積神經網絡(AlexNet)
- 5.7 使用重復元素的網絡(VGG)
- 5.8 網絡中的網絡(NiN)
- 5.9 含并行連結的網絡(GoogLeNet)
- 5.10 批量歸一化
- 5.11 殘差網絡(ResNet)
- 5.12 稠密連接網絡(DenseNet)
- 6 循環神經網絡
- 6.1 語言模型
- 6.2 循環神經網絡
- 6.3 語言模型數據集(周杰倫專輯歌詞)
- 6.4 循環神經網絡的從零開始實現
- 6.5 循環神經網絡的簡單實現
- 6.6 通過時間反向傳播
- 6.7 門控循環單元(GRU)
- 6.8 長短期記憶(LSTM)
- 6.9 深度循環神經網絡
- 6.10 雙向循環神經網絡
- 7 優化算法
- 7.1 優化與深度學習
- 7.2 梯度下降和隨機梯度下降
- 7.3 小批量隨機梯度下降
- 7.4 動量法
- 7.5 AdaGrad算法
- 7.6 RMSProp算法
- 7.7 AdaDelta
- 7.8 Adam算法
- 8 計算性能
- 8.1 命令式和符號式混合編程
- 8.2 異步計算
- 8.3 自動并行計算
- 8.4 多GPU計算
- 9 計算機視覺
- 9.1 圖像增廣
- 9.2 微調
- 9.3 目標檢測和邊界框
- 9.4 錨框
- 10 自然語言處理
- 10.1 詞嵌入(word2vec)
- 10.2 近似訓練
- 10.3 word2vec實現
- 10.4 子詞嵌入(fastText)
- 10.5 全局向量的詞嵌入(Glove)
- 10.6 求近義詞和類比詞
- 10.7 文本情感分類:使用循環神經網絡
- 10.8 文本情感分類:使用卷積網絡
- 10.9 編碼器--解碼器(seq2seq)
- 10.10 束搜索
- 10.11 注意力機制
- 10.12 機器翻譯