動(dòng)手學(xué)深度學(xué)習(xí)-第3章線性神經(jīng)網(wǎng)絡(luò)
## 3.1線性回歸
回歸(regression)是能為一個(gè)或多個(gè)自變量與因變量之間關(guān)系建模的一類方法。
線性回歸基于幾個(gè)簡(jiǎn)單的假設(shè):
1.自變量和因變量之間的關(guān)系是線性的
2.任何噪聲都比較正常,如噪聲遵循正態(tài)分布
仿射變換的特點(diǎn)是通過(guò)加權(quán)和對(duì)特征進(jìn)行線性變換(linear transformation), 并通過(guò)偏置項(xiàng)來(lái)進(jìn)行平移(translation)。
3.1.1基本元素
1.線性模型
\(\hat{y} = \mathbf{w}^\top \mathbf{x} + b\)
2.損失函數(shù)
回歸問(wèn)題中最常用的損失函數(shù)是平方誤差函數(shù)。 當(dāng)樣本i的預(yù)測(cè)值為\(\hat{y}^{(i)}\),
,其相應(yīng)的真實(shí)標(biāo)簽為\(y^{(i)}\)時(shí), 平方誤差可以定義為以下公式
\(l^{(i)}(\mathbf{w}, b) = \frac{1}{2} \left(\hat{y}^{(i)} - y^{(i)}\right)^2.\)

需計(jì)算在訓(xùn)練集個(gè)樣本上的損失均值(也等價(jià)于求和)
\(L(\mathbf{w}, b) =\frac{1}{n}\sum_{i=1}^n l^{(i)}(\mathbf{w}, b) =\frac{1}{n} \sum_{i=1}^n \frac{1}{2}\left(\mathbf{w}^\top \mathbf{x}^{(i)} + b - y^{(i)}\right)^2.\)
3.解析解
線性回歸的解可以用一個(gè)公式簡(jiǎn)單地表達(dá)出來(lái), 這類解叫作解析解(analytical solution)
\(\mathbf{w}^* = (\mathbf X^\top \mathbf X)^{-1}\mathbf X^\top \mathbf{y}.\)
4. 隨機(jī)梯度下降
梯度下降最簡(jiǎn)單的用法是計(jì)算損失函數(shù)(數(shù)據(jù)集中所有樣本的損失均值) 關(guān)于模型參數(shù)的導(dǎo)數(shù)(在這里也可以稱為梯度)。 但實(shí)際中的執(zhí)行可能會(huì)非常慢:因?yàn)樵诿恳淮胃聟?shù)之前,我們必須遍歷整個(gè)數(shù)據(jù)集。 因此,我們通常會(huì)在每次需要計(jì)算更新的時(shí)候隨機(jī)抽取一小批樣本, 這種變體叫做小批量隨機(jī)梯度下降(minibatch stochastic gradient descent)。
更新過(guò)程:
\((\mathbf{w},b) \leftarrow (\mathbf{w},b) - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \partial_{(\mathbf{w},b)} l^{(i)}(\mathbf{w},b).\)
算法的步驟如下:
(1)初始化模型參數(shù)的值,如隨機(jī)初始化;
(2)從數(shù)據(jù)集中隨機(jī)抽取小批量樣本且在負(fù)梯度的方向上更新參數(shù),并不斷迭代這一步驟。
對(duì)于平方損失和仿射變換,我們可以明確地寫成如下形式:
\(\begin{split}\begin{aligned} \mathbf{w} &\leftarrow \mathbf{w} - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \partial_{\mathbf{w}} l^{(i)}(\mathbf{w}, b) = \mathbf{w} - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \mathbf{x}^{(i)} \left(\mathbf{w}^\top \mathbf{x}^{(i)} + b - y^{(i)}\right),\\ b &\leftarrow b - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \partial_b l^{(i)}(\mathbf{w}, b) = b - \frac{\eta}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} \left(\mathbf{w}^\top \mathbf{x}^{(i)} + b - y^{(i)}\right). \end{aligned}\end{split}\)
5. 用模型進(jìn)行預(yù)測(cè)
給定特征估計(jì)目標(biāo)的過(guò)程通常稱為預(yù)測(cè)(prediction)或推斷(inference)。
3.1.2矢量化加速
通過(guò)矩陣運(yùn)算節(jié)省時(shí)間
3.1.3. 正態(tài)分布與平方損失
正態(tài)分布概率密度函數(shù)如下:
\(p(x)= \frac{1}{\sqrt{2 \pi \sigma^2}} \exp\left(-\frac{1}{2 \sigma^2}(x- \mu)^2\right).\)
寫出通過(guò)給定的觀測(cè)到特定的似然(likelihood):
\(P(y \mid \mathbf{x}) = \frac{1}{\sqrt{2 \pi \sigma^2}} \exp\left(-\frac{1}{2 \sigma^2} (y - \mathbf{w}^\top \mathbf{x} - b)^2\right).\)
根據(jù)極大似然估計(jì)法,參數(shù)w和b的最優(yōu)值是使整個(gè)數(shù)據(jù)集的似然最大的值:
\(P(\mathbf y \mid \mathbf X) = \prod_{i=1}^{n} p(y^{(i)}|\mathbf{x}^{(i)}).\)
通過(guò)最大化似然對(duì)數(shù)來(lái)簡(jiǎn)化。 優(yōu)化通常是說(shuō)最小化而不是最大化。 可以改為最小化負(fù)對(duì)數(shù)似然\(-\log P(\mathbf y \mid \mathbf X)\)。 由此可以得到的數(shù)學(xué)公式是:
\(-\log P(\mathbf y \mid \mathbf X) = \sum_{i=1}^n \frac{1}{2} \log(2 \pi \sigma^2) + \frac{1}{2 \sigma^2} \left(y^{(i)} - \mathbf{w}^\top \mathbf{x}^{(i)} - b\right)^2.\)
在高斯噪聲的假設(shè)下,最小化均方誤差等價(jià)于對(duì)線性模型的極大似然估計(jì)。
3. 1.4. 從線性回歸到深度網(wǎng)絡(luò)
可以將線性回歸模型視為僅由單個(gè)人工神經(jīng)元組成的神經(jīng)網(wǎng)絡(luò),或稱為單層神經(jīng)網(wǎng)絡(luò)。

每個(gè)輸入都與每個(gè)輸出(在本例中只有一個(gè)輸出)相連, 我們將這種變換 稱為全連接層(fully-connected layer)或稱為稠密層(dense layer)
3.2線性回歸的實(shí)現(xiàn)
在啟智AI開(kāi)臺(tái)上,編程實(shí)現(xiàn)。
執(zhí)行以下循環(huán):
初始化參數(shù)
重復(fù)以下訓(xùn)練,直到完成
計(jì)算梯度 \(\mathbf{g} \leftarrow \partial_{(\mathbf{w},b)} \frac{1}{|\mathcal{B}|} \sum_{i \in \mathcal{B}} l(\mathbf{x}^{(i)}, y^{(i)}, \mathbf{w}, b)\)
更新參數(shù) \((\mathbf{w}, b) \leftarrow (\mathbf{w}, b) - \eta \mathbf{g}\)
在每個(gè)迭代周期(epoch)中,我們使用data_iter函數(shù)遍歷整個(gè)數(shù)據(jù)集, 并將訓(xùn)練數(shù)據(jù)集中所有樣本都使用一次(假設(shè)樣本數(shù)能夠被批量大小整除)。 這里的迭代周期個(gè)數(shù)num_epochs和學(xué)習(xí)率lr都是超參數(shù),分別設(shè)為3和0.03。 設(shè)置超參數(shù)很棘手,需要通過(guò)反復(fù)試驗(yàn)進(jìn)行調(diào)整。
在機(jī)器學(xué)習(xí)中,我們通常不太關(guān)心恢復(fù)真正的參數(shù),而更關(guān)心如何高度準(zhǔn)確預(yù)測(cè)參數(shù)。
是在復(fù)雜的優(yōu)化問(wèn)題上,隨機(jī)梯度下降通常也能找到非常好的解
3.3 線性回歸的簡(jiǎn)潔實(shí)現(xiàn)
通過(guò)深度學(xué)習(xí)框架的高級(jí)API來(lái)實(shí)現(xiàn)我們的模型只需要相對(duì)較少的代碼。 我們不必單獨(dú)分配參數(shù)、不必定義我們的損失函數(shù),也不必手動(dòng)實(shí)現(xiàn)小批量隨機(jī)梯度下降。
-
通過(guò)調(diào)用net(X)生成預(yù)測(cè)并計(jì)算損失l(前向傳播)。
-
通過(guò)進(jìn)行反向傳播來(lái)計(jì)算梯度。
-
通過(guò)調(diào)用優(yōu)化器來(lái)更新模型參數(shù)。
點(diǎn)擊查看代碼
import numpy as np
import numpy as np
import torch
from torch.utils import data
from d2l import torch as d2l
from torch import nn
true_w1=torch.tensor([2,8.])
true_b1=4.2
features,labels =d2l.synthetic_data(true_w1,true_b1,1000)
def load_array(data_arrays,batch_size,is_train=True):
dataset=data.TensorDataset(*data_arrays)
return data.DataLoader(dataset,batch_size,shuffle=is_train)
batch_size =10
data_iter=load_array((features,labels),batch_size)
net = nn.Sequential(nn.Linear(2,1))
net[0].weight.data.normal_(0,0.01)
net[0].bias.data.fill_(0)
loss=nn.MSELoss()
trainer=torch.optim.SGD(net.parameters(),lr=0.03)
num_epochs=3
for epoch in range(num_epochs):
for X,y in data_iter:
l=loss(net(X),y)
trainer.zero_grad()
l.backward()
trainer.step()
l=loss(net(features),labels)
# w = net[0].weight.data
# print('w的估計(jì)誤差:', true_w - w.reshape(true_w.shape))
# b = net[0].bias.data
# print('b的估計(jì)誤差:', true_b - b)
print(f'epoch{epoch+1}, loss {l:f}')
3.4 softmax回歸
使用深度學(xué)習(xí)框架的高級(jí)API簡(jiǎn)潔實(shí)現(xiàn)線性回歸。
3.4.1分類問(wèn)題
分類問(wèn)題不與類別之間的自然順序有關(guān),標(biāo)簽的表達(dá)采用獨(dú)熱編碼。獨(dú)熱編碼是一個(gè)向量,它的分量和類別一樣多。類別對(duì)應(yīng)的分量設(shè)置為1,其他 所有分量設(shè)置為0。
3.4.2網(wǎng)絡(luò)架構(gòu)
為了估計(jì)所有可能類別的條件概率,我們需要一個(gè)有多個(gè)輸出的模型,每個(gè)類別對(duì)應(yīng)一個(gè)輸出。
\(\begin{split}\begin{aligned}
o_1 &= x_1 w_{11} + x_2 w_{12} + x_3 w_{13} + x_4 w_{14} + b_1,\\
o_2 &= x_1 w_{21} + x_2 w_{22} + x_3 w_{23} + x_4 w_{24} + b_2,\\
o_3 &= x_1 w_{31} + x_2 w_{32} + x_3 w_{33} + x_4 w_{34} + b_3.
\end{aligned}\end{split}\)

3.4.3. 全連接層的參數(shù)開(kāi)銷
對(duì)于任何具有個(gè)輸入d和個(gè)輸出q的全連接層, 參數(shù)開(kāi)銷為O(dq),
可以將d個(gè)輸入轉(zhuǎn)換為q個(gè)輸出的成本可以減少到O(dq/n)
3.4.4. softmax運(yùn)算
優(yōu)化參數(shù)以最大化觀測(cè)數(shù)據(jù)的概率
softmax函數(shù)能夠?qū)⑽匆?guī)范化的預(yù)測(cè)變換為非負(fù)數(shù)并且總和為1,同時(shí)讓模型保持 可導(dǎo)的性質(zhì)。
\(\hat{\mathbf{y}} = \mathrm{softmax}(\mathbf{o})\quad \text{其中}\quad \hat{y}_j = \frac{\exp(o_j)}{\sum_k \exp(o_k)}\)
盡管softmax是一個(gè)非線性函數(shù),但softmax回歸的輸出仍然由輸入特征的仿射變換決定。 因此,softmax回歸是一個(gè)線性模型(linear model)。
3.4.5. 小批量樣本的矢量化
為了提高計(jì)算效率并且充分利用GPU,我們通常會(huì)對(duì)小批量樣本的數(shù)據(jù)執(zhí)行矢量計(jì)算。
由于中的每一行代表一個(gè)數(shù)據(jù)樣本, 那么softmax運(yùn)算可以按行(rowwise)執(zhí)行: 對(duì)于的每一行,我們先對(duì)所有項(xiàng)進(jìn)行冪運(yùn)算,然后通過(guò)求和對(duì)它們進(jìn)行標(biāo)準(zhǔn)化。
3.4.6. 損失函數(shù)
使用最大似然估計(jì)
估計(jì)值與實(shí)際值進(jìn)行比較:
$ P(Y|X))= \prod_{i=1}^n P(\mathbf{y}^{(i)} \mid \mathbf{x}^{(i)}) . $
最大化P(Y|X),相當(dāng)于最小化負(fù)對(duì)數(shù)似然:
$ -logP(\mathbf{Y} \mid \mathbf{X})= \sum_{i=1}^n -\log P( \mathbf{y}^{(i)}\mid \mathbf{x}^{(i)} )
= \sum_{i=1}^n l(\mathbf{y}^{(i)}, \hat{\mathbf{y}}^{(i)}), $
其中,對(duì)于任何標(biāo)簽y和模型預(yù)測(cè)\(\hat{y}\),損失函數(shù)為:
\(l(y,\hat{y})=-\sum_{(j=1)}^q{y}_jlog\hat{y}_j.\)
由于y是一個(gè)長(zhǎng)度為的獨(dú)熱編碼向量, 所以除了一個(gè)項(xiàng)以外的所有項(xiàng)j都消失了
\(\begin{split}\begin{aligned}
l(\mathbf{y}, \hat{\mathbf{y}}) &= - \sum_{j=1}^q y_j \log \frac{\exp(o_j)}{\sum_{k=1}^q \exp(o_k)} \\
&= \sum_{j=1}^q y_j \log \sum_{k=1}^q \exp(o_k) - \sum_{j=1}^q y_j o_j\\
&= \log \sum_{k=1}^q \exp(o_k) - \sum_{j=1}^q y_j o_j.
\end{aligned}\end{split}\)
考慮相對(duì)于任何未規(guī)范化的預(yù)測(cè)的導(dǎo)數(shù),我們得到:
\(\partial_{o_j} l(\mathbf{y}, \hat{\mathbf{y}}) = \frac{\exp(o_j)}{\sum_{k=1}^q \exp(o_k)} - y_j = \mathrm{softmax}(\mathbf{o})_j - y_j.\)
3.4.7. 信息論基礎(chǔ)
信息論(information theory)涉及編碼、解碼、發(fā)送以及盡可能簡(jiǎn)潔地處理信息或數(shù)據(jù)。
$ H[P]=\sum_j -P(j)\log P(j).$
根據(jù)信息論的基本定理,對(duì)于一個(gè)從分布 \(P\) 中獨(dú)立抽取的符號(hào)序列,其平均編碼長(zhǎng)度 \(L\) 不能小于熵 \(H(P)\)。如果采用一種比熵更緊湊的編碼方法,那么編碼后的序列長(zhǎng)度將小于熵,而這意味著存在一些抽取的符號(hào)無(wú)法被完全識(shí)別和恢復(fù)。因此,為了保證數(shù)據(jù)能夠被正確編碼和解碼,至少需要 \(H(P)\) 個(gè)納特的編碼長(zhǎng)度來(lái)保證信息無(wú)損地傳輸。
更具體地說(shuō),熵是衡量隨機(jī)變量不確定性的度量,用來(lái)衡量在某一確定分布 \(P\) 中選擇一個(gè)符號(hào)時(shí)所包含的平均信息量。假設(shè) \(X\) 是從分布 \(P\) 中選擇的一個(gè)符號(hào),則熵 \(H(P)\) 定義為:
其中,\(P(x)\) 表示該符號(hào)出現(xiàn)的概率,\(\log_2 P(x)\) 表示以2為底,\(P(x)\)的對(duì)數(shù)。熵表示在給定分布 \(P\) 的情況下,需要多少二進(jìn)制數(shù)來(lái)表示每個(gè)符號(hào),從而確保每個(gè)符號(hào)都能被正確編碼和解碼。
因此,至少需要 \(H(P)\) 個(gè)納特的編碼長(zhǎng)度來(lái)對(duì)從分布 \(P\) 中隨機(jī)抽取的數(shù)據(jù)進(jìn)行編碼。這是為了確保編碼的可靠性,避免信息丟失或解碼錯(cuò)誤,并同時(shí)保持編碼長(zhǎng)度的最小化。
3.4.8. 模型預(yù)測(cè)和評(píng)估
posted on 2023-03-23 07:34 學(xué)到老必須的 閱讀(115) 評(píng)論(0) 收藏 舉報(bào)
浙公網(wǎng)安備 33010602011771號(hào)