<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 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使用神經網絡圖表示本節中介紹的線性回歸模型。神經網絡圖隱去了模型參數權重和偏差。 :-: ![](https://img.kancloud.cn/2e/b3/2eb342672f8b47ebb1a6a8aa0bdaf906.svg) <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)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看