# 3.1 線性回歸
線性回歸輸出是一個連續值,因此適用于回歸問題。回歸問題在實際中很常見,如預測房屋價格、氣溫、銷售額等連續值的問題。與回歸問題不同,分類問題中模型的最終輸出是一個離散值。我們所說的圖像分類、垃圾郵件識別、疾病檢測等輸出為離散值的問題都屬于分類問題的范疇。softmax回歸則適用于分類問題。
由于線性回歸和softmax回歸都是單層神經網絡,它們涉及的概念和技術同樣適用于大多數的深度學習模型。我們首先以線性回歸為例,介紹大多數深度學習模型的基本要素和表示方法。
## 3.1.1 線性回歸的基本要素
我們以一個簡單的房屋價格預測作為例子來解釋線性回歸的基本要素。這個應用的目標是預測一棟房子的售出價格(元)。我們知道這個價格取決于很多因素,如房屋狀況、地段、市場行情等。為了簡單起見,這里我們假設價格只取決于房屋狀況的兩個因素,即面積(平方米)和房齡(年)。接下來我們希望探索價格與這兩個因素的具體關系。
### 3.1.1.1 模型定義
設房屋的面積`$ x_1 $` ,房齡為 `$ x_2 $`,售出價格為 `$ y $`。我們需要建立基于輸入 `$ x_1 $` 和 `$ x_2 $` 來計算輸出 `$ y $` 的表達式,也就是模型(model)。顧名思義,線性回歸假設輸出與各個輸入之間是線性關系:
```[tex]
\hat{y} = x_1 w_1 + x_2 w_2 + b
```
其中 `$ w_1 $` 和 `$ w_2 $` 是權重(weight),`$ b $` 是偏差(bias),且均為標量。它們是線性回歸模型的參數(parameter)。模型輸出 $\hat{y}$ 是線性回歸對真實價格 `$ y $` 的預測或估計。我們通常允許它們之間有一定誤差。
### 3.1.1.2 模型訓練
接下來我們需要通過數據來尋找特定的模型參數值,使模型在數據上的誤差盡可能小。這個過程叫作模型訓練(model training)。下面我們介紹模型訓練所涉及的3個要素。
#### (1) 訓練數據
我們通常收集一系列的真實數據,例如多棟房屋的真實售出價格和它們對應的面積和房齡。我們希望在這個數據上面尋找模型參數來使模型的預測價格與真實價格的誤差最小。在機器學習術語里,該數據集被稱為訓練數據集(training data set)或訓練集(training set),一棟房屋被稱為一個樣本(sample),其真實售出價格叫作標簽(label),用來預測標簽的兩個因素叫作特征(feature)。特征用來表征樣本的特點。
假設我們采集的樣本數為 `$ n $`,索引為 `$ i $` 的樣本的特征為`$ x_1^{(i)} $`和 `$ x_2^{(i)} $`,標簽為 `$ y^{(i)} $`。對于索引為 `$ i $` 的房屋,線性回歸模型的房屋價格預測表達式為
```[tex]
\hat{y}^{(i)} = x_1^{(i)} w_1 + x_2^{(i)} w_2 + b
```
#### (2) 損失函數
在模型訓練中,我們需要衡量價格預測值與真實值之間的誤差。通常我們會選取一個非負數作為誤差,且數值越小表示誤差越小。一個常用的選擇是平方函數。它在評估索引為 `$ i $` 的樣本誤差的表達式為
```[tex]
\ell^{(i)}(w_1, w_2, b) = \frac{1}{2} \left(\hat{y}^{(i)} - y^{(i)}\right)^2
```
其中常數 $\frac 1 2$ 使對平方項求導后的常數系數為1,這樣在形式上稍微簡單一些。顯然,誤差越小表示預測價格與真實價格越相近,且當二者相等時誤差為0。給定訓練數據集,這個誤差只與模型參數相關,因此我們將它記為以模型參數為參數的函數。在機器學習里,將衡量誤差的函數稱為損失函數(loss function)。這里使用的平方誤差函數也稱為平方損失(square loss)。
通常,我們用訓練數據集中所有樣本誤差的平均來衡量模型預測的質量,即
```[tex]
\ell(w_1, w_2, b) =\frac{1}{n} \sum_{i=1}^n \ell^{(i)}(w_1, w_2, b) =\frac{1}{n} \sum_{i=1}^n \frac{1}{2}\left(x_1^{(i)} w_1 + x_2^{(i)} w_2 + b - y^{(i)}\right)^2
```
在模型訓練中,我們希望找出一組模型參數,記為 `$ w_1^*, w_2^*, b^* $`,來使訓練樣本平均損失最小:
```[tex]
w_1^*, w_2^*, b^* = \underset{w_1, w_2, b}{\arg\min} \ell(w_1, w_2, b)
```
#### (3) 優化算法
當模型和損失函數形式較為簡單時,上面的誤差最小化問題的解可以直接用公式表達出來。這類解叫作解析解(analytical solution)。本節使用的線性回歸和平方誤差剛好屬于這個范疇。然而,大多數深度學習模型并沒有解析解,只能通過優化算法有限次迭代模型參數來盡可能降低損失函數的值。這類解叫作數值解(numerical solution)。
在求數值解的優化算法中,小批量隨機梯度下降(mini-batch stochastic gradient descent)在深度學習中被廣泛使用。它的算法很簡單:先選取一組模型參數的初始值,如隨機選取;接下來對參數進行多次迭代,使每次迭代都可能降低損失函數的值。在每次迭代中,先隨機均勻采樣一個由固定數目訓練數據樣本所組成的小批量(mini-batch)$\mathcal{B}$,然后求小批量中數據樣本的平均損失有關模型參數的導數(梯度),最后用此結果與預先設定的一個正數的乘積作為模型參數在本次迭代的減小量。
在訓練本節討論的線性回歸模型的過程中,模型的每個參數將作如下迭代:
```[tex]
\begin{aligned}
w_1 &\leftarrow w_1 - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \frac{ \partial \ell^{(i)}(w_1, w_2, b) }{\partial w_1}\\
w_2 &\leftarrow w_2 - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \frac{ \partial \ell^{(i)}(w_1, w_2, b) }{\partial w_2}\\
b &\leftarrow b - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \frac{ \partial \ell^{(i)}(w_1, w_2, b) }{\partial b}
\end{aligned}
```
在上式中,`$ |\mathcal{B}| $` 代表每個小批量中的樣本個數(批量大小,batch size),`$ \eta $` 稱作學習率(learning rate)并取正數。需要強調的是,這里的批量大小和學習率的值是人為設定的,并不是通過模型訓練學出的,因此叫作超參數(hyperparameter)。我們通常所說的“調參”指的正是調節超參數,例如通過反復試錯來找到超參數合適的值。在少數情況下,超參數也可以通過模型訓練學出。本書對此類情況不做討論。
### 3.1.1.3 模型預測
模型訓練完成后,我們將模型參數 `$ w_1, w_2, b $` 在優化算法停止時的值分別記作 `$ \hat{w}_1, \hat{w}_2, \hat{b} $`。注意,這里我們得到的并不一定是最小化損失函數的最優解 `$ w_1^*, w_2^*, b^* $`,而是對最優解的一個近似。然后,我們就可以使用學出的線性回歸模型 `$ x_1 \hat{w}_1 + x_2 \hat{w}_2 + \hat{b} $` 來估算訓練數據集以外任意一棟面積(平方米)為`$ x_1 $`、房齡(年)為`$ x_2 $`的房屋的價格了。這里的估算也叫作模型預測、模型推斷或模型測試。
## 3.1.2 線性回歸的表示方法
我們已經闡述了線性回歸的模型表達式、訓練和預測。下面我們解釋線性回歸與神經網絡的聯系,以及線性回歸的矢量計算表達式。
### 3.1.2.1 神經網絡圖
在深度學習中,我們可以使用神經網絡圖直觀地表現模型結構。為了更清晰地展示線性回歸作為神經網絡的結構,圖3.1使用神經網絡圖表示本節中介紹的線性回歸模型。神經網絡圖隱去了模型參數權重和偏差。
:-: 
<div align=center>
圖3.1 線性回歸是一個單層神經網絡
</div>
在圖3.1所示的神經網絡中,輸入分別為 `$ x_1 $` 和 `$ x_2 $`,因此輸入層的輸入個數為2。輸入個數也叫特征數或特征向量維度。圖3.1中網絡的輸出為 `$ o $`,輸出層的輸出個數為1。需要注意的是,我們直接將圖3.1中神經網絡的輸出 $o$ 作為線性回歸的輸出,即 `$ \hat{y} = o $`。由于輸入層并不涉及計算,按照慣例,圖3.1所示的神經網絡的層數為1。所以,線性回歸是一個單層神經網絡。輸出層中負責計算 $o$ 的單元又叫神經元。在線性回歸中,`$ o $` 的計算依賴于 `$ x_1 $` 和 `$ x_2 $`。也就是說,輸出層中的神經元和輸入層中各個輸入完全連接。因此,這里的輸出層又叫全連接層(fully-connected layer)或稠密層(dense layer)。
### 3.1.2.2 矢量計算表達式
在模型訓練或預測時,我們常常會同時處理多個數據樣本并用到矢量計算。在介紹線性回歸的矢量計算表達式之前,讓我們先考慮對兩個向量相加的兩種方法。a
下面先定義兩個1000維的向量。
``` python
import torch
from time import time
a = torch.ones(1000)
b = torch.ones(1000)
```
向量相加的一種方法是,將這兩個向量按元素逐一做標量加法。
``` python
start = time()
c = torch.zeros(1000)
for i in range(1000):
c[i] = a[i] + b[i]
print(time() - start)
```
輸出:
```
0.02039504051208496
```
向量相加的另一種方法是,將這兩個向量直接做矢量加法。
``` python
start = time()
d = a + b
print(time() - start)
```
輸出:
```
0.0008330345153808594
```
結果很明顯,后者比前者更省時。因此,我們應該盡可能采用矢量計算,以提升計算效率。
讓我們再次回到本節的房價預測問題。如果我們對訓練數據集里的3個房屋樣本(索引分別為1、2和3)逐一預測價格,將得到
```[tex]
\begin{aligned}
\hat{y}^{(1)} &= x_1^{(1)} w_1 + x_2^{(1)} w_2 + b,\\
\hat{y}^{(2)} &= x_1^{(2)} w_1 + x_2^{(2)} w_2 + b,\\
\hat{y}^{(3)} &= x_1^{(3)} w_1 + x_2^{(3)} w_2 + b.
\end{aligned}
```
現在,我們將上面3個等式轉化成矢量計算。設
```[tex]
\boldsymbol{\hat{y}} =
\begin{bmatrix}
\hat{y}^{(1)} \\
\hat{y}^{(2)} \\
\hat{y}^{(3)}
\end{bmatrix},\quad
\boldsymbol{X} =
\begin{bmatrix}
x_1^{(1)} & x_2^{(1)} \\
x_1^{(2)} & x_2^{(2)} \\
x_1^{(3)} & x_2^{(3)}
\end{bmatrix},\quad
\boldsymbol{w} =
\begin{bmatrix}
w_1 \\
w_2
\end{bmatrix}
```
對3個房屋樣本預測價格的矢量計算表達式為$\boldsymbol{\hat{y}} = \boldsymbol{X} \boldsymbol{w} + b,$ 其中的加法運算使用了廣播機制(參見2.2節)。例如:
``` python
a = torch.ones(3)
b = 10
print(a + b)
```
輸出:
```
tensor([11., 11., 11.])
```
廣義上講,當數據樣本數為 $n$,特征數為 $d$ 時,線性回歸的矢量計算表達式為
```[tex]
\boldsymbol{\hat{y}} = \boldsymbol{X} \boldsymbol{w} + b
```
其中模型輸出 `$ \boldsymbol{\hat{y}} \in \mathbb{R}^{n \times 1} $` 批量數據樣本特征 `$ \boldsymbol{X} \in \mathbb{R}^{n \times d} $`,權重 `$ \boldsymbol{w} \in \mathbb{R}^{d \times 1} $`, 偏差 `$ b \in \mathbb{R} $`。相應地,批量數據樣本標簽 `$ \boldsymbol{y} \in \mathbb{R}^{n \times 1} $`。設模型參數 `$ \boldsymbol{\theta} = [w_1, w_2, b]^\top $`,我們可以重寫損失函數為
```[tex]
\ell(\boldsymbol{\theta})=\frac{1}{2n}(\boldsymbol{\hat{y}}-\boldsymbol{y})^\top(\boldsymbol{\hat{y}}-\boldsymbol{y})
```
小批量隨機梯度下降的迭代步驟將相應地改寫為
```[tex]
\boldsymbol{\theta} \leftarrow \boldsymbol{\theta} - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \nabla_{\boldsymbol{\theta}} \ell^{(i)}(\boldsymbol{\theta}),
```
其中梯度是損失有關3個為標量的模型參數的偏導數組成的向量:
```[tex]
\nabla_{\boldsymbol{\theta}} \ell^{(i)}(\boldsymbol{\theta})=
\begin{bmatrix}
\frac{ \partial \ell^{(i)}(w_1, w_2, b) }{\partial w_1} \\
\frac{ \partial \ell^{(i)}(w_1, w_2, b) }{\partial w_2} \\
\frac{ \partial \ell^{(i)}(w_1, w_2, b) }{\partial b}
\end{bmatrix} =
\begin{bmatrix}
x_1^{(i)} (x_1^{(i)} w_1 + x_2^{(i)} w_2 + b - y^{(i)}) \\
x_2^{(i)} (x_1^{(i)} w_1 + x_2^{(i)} w_2 + b - y^{(i)}) \\
x_1^{(i)} w_1 + x_2^{(i)} w_2 + b - y^{(i)}
\end{bmatrix}=
\begin{bmatrix}
x_1^{(i)} \\
x_2^{(i)} \\
1
\end{bmatrix}
(\hat{y}^{(i)} - y^{(i)})
```
## 小結
* 和大多數深度學習模型一樣,對于線性回歸這樣一種單層神經網絡,它的基本要素包括模型、訓練數據、損失函數和優化算法。
* 既可以用神經網絡圖表示線性回歸,又可以用矢量計算表示該模型。
* 應該盡可能采用矢量計算,以提升計算效率。
-----------
> 注:本節除了代碼之外與原書基本相同,[原書傳送門](https://zh.d2l.ai/chapter_deep-learning-basics/linear-regression.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 機器翻譯