3.1 線性回歸
線性回歸輸出是一個連續值,因此適用于回歸問題。回歸問題在實際中很常見,如預測房屋價格、氣溫、銷售額等連續值的問題。與回歸問題不同,分類問題中模型的最終輸出是一個離散值。我們所說的圖像分類、垃圾郵件識別、疾病檢測等輸出為離散值的問題都屬于分類問題的范疇。softmax回歸則適用于分類問題。
由于線性回歸和softmax回歸都是單層神經網絡,它們涉及的概念和技術同樣適用于大多數的深度學習模型。我們首先以線性回歸為例,介紹大多數深度學習模型的基本要素和表示方法。
3.1.1 線性回歸的基本要素
我們以一個簡單的房屋價格預測作為例子來解釋線性回歸的基本要素。這個應用的目標是預測一棟房子的售出價格(元)。我們知道這個價格取決于很多因素,如房屋狀況、地段、市場行情等。為了簡單起見,這里我們假設價格只取決于房屋狀況的兩個因素,即面積(平方米)和房齡(年)。接下來我們希望探索價格與這兩個因素的具體關系。
3.1.1.1 模型定義
3.1.1.2 模型訓練
接下來我們需要通過數據來尋找特定的模型參數值,使模型在數據上的誤差盡可能小。這個過程叫作模型訓練(model training)。下面我們介紹模型訓練所涉及的3個要素。
(1) 訓練數據
我們通常收集一系列的真實數據,例如多棟房屋的真實售出價格和它們對應的面積和房齡。我們希望在這個數據上面尋找模型參數來使模型的預測價格與真實價格的誤差最小。在機器學習術語里,該數據集被稱為訓練數據集(training data set)或訓練集(training set),一棟房屋被稱為一個樣本(sample),其真實售出價格叫作標簽(label),用來預測標簽的兩個因素叫作特征(feature)。特征用來表征樣本的特點。
(2) 損失函數
在模型訓練中,我們需要衡量價格預測值與真實值之間的誤差。通常我們會選取一個非負數作為誤差,且數值越小表示誤差越小。一個常用的選擇是平方函數。它在評估索引為i
的樣本誤差的表達式為
其中常數
1/2
使對平方項求導后的常數系數為1,這樣在形式上稍微簡單一些。顯然,誤差越小表示預測價格與真實價格越相近,且當二者相等時誤差為0。給定訓練數據集,這個誤差只與模型參數相關,因此我們將它記為以模型參數為參數的函數。在機器學習里,將衡量誤差的函數稱為損失函數(loss function)。這里使用的平方誤差函數也稱為平方損失(square loss)。
通常,我們用訓練數據集中所有樣本誤差的平均來衡量模型預測的質量,即
(3) 優化算法
當模型和損失函數形式較為簡單時,上面的誤差最小化問題的解可以直接用公式表達出來。這類解叫作解析解(analytical solution)。本節使用的線性回歸和平方誤差剛好屬于這個范疇。然而,大多數深度學習模型并沒有解析解,只能通過優化算法有限次迭代模型參數來盡可能降低損失函數的值。這類解叫作數值解(numerical solution)。
在求數值解的優化算法中,小批量隨機梯度下降(mini-batch stochastic gradient descent)在深度學習中被廣泛使用。它的算法很簡單:先選取一組模型參數的初始值,如隨機選取;接下來對參數進行多次迭代,使每次迭代都可能降低損失函數的值。在每次迭代中,先隨機均勻采樣一個由固定數目訓練數據樣本所組成的小批量(mini-batch)<math><semantics><annotation encoding="application/x-tex">\mathcal{B}</annotation></semantics></math>B,然后求小批量中數據樣本的平均損失有關模型參數的導數(梯度),最后用此結果與預先設定的一個正數的乘積作為模型參數在本次迭代的減小量。
在訓練本節討論的線性回歸模型的過程中,模型的每個參數將作如下迭代:
3.1.1.3 模型預測
3.1.2 線性回歸的表示方法
我們已經闡述了線性回歸的模型表達式、訓練和預測。下面我們解釋線性回歸與神經網絡的聯系,以及線性回歸的矢量計算表達式。
3.1.2.1 神經網絡圖
在深度學習中,我們可以使用神經網絡圖直觀地表現模型結構。為了更清晰地展示線性回歸作為神經網絡的結構,圖3.1使用神經網絡圖表示本節中介紹的線性回歸模型。神經網絡圖隱去了模型參數權重和偏差。
3.1.2.2 矢量計算表達式
在模型訓練或預測時,我們常常會同時處理多個數據樣本并用到矢量計算。在介紹線性回歸的矢量計算表達式之前,讓我們先考慮對兩個向量相加的兩種方法。a
下面先定義兩個1000維的向量。
import torch
from time import time
a = torch.ones(1000)
b = torch.ones(1000)
向量相加的一種方法是,將這兩個向量按元素逐一做標量加法。
start = time()
c = torch.zeros(1000)
for i in range(1000):
c[i] = a[i] + b[i]
print(time() - start)
輸出:
0.02039504051208496
向量相加的另一種方法是,將這兩個向量直接做矢量加法。
start = time()
d = a + b
print(time() - start)
輸出:
0.0008330345153808594
結果很明顯,后者比前者更省時。因此,我們應該盡可能采用矢量計算,以提升計算效率。
a = torch.ones(3)
b = 10
print(a + b)
Copy to clipboardErrorCopied
輸出:
tensor([11., 11., 11.])
小結
- 和大多數深度學習模型一樣,對于線性回歸這樣一種單層神經網絡,它的基本要素包括模型、訓練數據、損失函數和優化算法。
- 既可以用神經網絡圖表示線性回歸,又可以用矢量計算表示該模型。
- 應該盡可能采用矢量計算,以提升計算效率。
注:本節除了代碼之外與原書基本相同,原書傳送門