動手學深度學習day1

Task01:線性迴歸;Softmax與分類模型、多層感知機

參加datawhale組隊學習博客記錄,嚴格意義上第一次寫博客,希望以後養成好習慣。

線性迴歸

線性迴歸(Linear regression)是利用迴歸方程(函數)對一個或多個自變量(特徵值)和因變量(目標值)之間關係進行建模的一種分析方式。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
梯度下降的基本過程就和下山的場景很類似。
首先,我們有一個可微分的函數。這個函數就代表着一座山。
我們的目標就是找到這個函數的最小值,也就是山底。
最快的下山的方式就是找到當前位置最陡峭的方向,然後沿着此方向向下走,對應到函數中,就是找到給定點的梯度 ,然後朝着梯度相反的方向,就能讓函數值下降的最快!因爲梯度的方向就是函數之變化最快的方向。 所以,我們重複利用這個方法,反覆求取梯度,最後就能到達局部的最小值,這就類似於我們下山的過程。而求取梯度就確定了最陡峭的方向,也就是場景中測量方向的手段。

Softmax與分類模型

softmax的基本概念

分類問題

一個簡單的圖像分類問題,輸入圖像的高和寬均爲2像素,色彩爲灰度。
圖像中的4像素分別記爲 x1,x2,x3,x4 。
假設真實標籤爲狗、貓或者雞,這些標籤對應的離散值爲 y1,y2,y3 。
我們通常使用離散的數值來表示類別,例如 y1=1,y2=2,y3=3 。
在這裏插入圖片描述

交叉熵損失函數

對於樣本i ,我們構造向量y(i)∈Rq ,使其第y(i) (樣本i 類別的離散數值)個元素爲1,其餘爲0。這樣我們的訓練目標可以設爲使預測概率分佈y^(i) 儘可能接近真實的標籤概率分佈y(i) 。

平方損失估計

然而,想要預測分類結果正確,我們其實並不需要預測概率完全等於標籤概率。例如,在圖像分類的例子裏,如果y(i)=3 ,那麼我們只需要y^3(i) 比其他兩個預測值y^1(i) 和y^2(i) 大就行了。即使y^3(i) 值爲0.6,不管其他兩個預測值爲多少,類別預測均正確。而平方損失則過於嚴格,例如y1(i)=y2(i)=0.2 比y1(i)=0,y2(i)=0.4 的損失要小很多,雖然兩者都有同樣正確的分類預測結果。

改善上述問題的一個方法是使用更適合衡量兩個概率分佈差異的測量函數。其中,交叉熵(cross entropy)是一個常用的衡量方法:

其中帶下標的yj(i) 是向量y(i) 中非0即1的元素,需要注意將它與樣本i 類別的離散數值,即不帶下標的y(i) 區分。在上式中,我們知道向量y(i) 中只有第y(i) 個元素y(i)y(i) 爲1,其餘全爲0,於是H(y(i),y(i))=−log⁡yy(i)(i) 。也就是說,交叉熵只關心對正確類別的預測概率,因爲只要其值足夠大,就可以確保分類結果正確。當然,遇到一個樣本有多個標籤時,例如圖像裏含有不止一個物體時,我們並不能做這一步簡化。但即便對於這種情況,交叉熵同樣只關心對圖像中出現的物體類別的預測概率。

假設訓練數據集的樣本數爲n ,交叉熵損失函數定義爲

其中Θ 代表模型參數。同樣地,如果每個樣本只有一個標籤,那麼交叉熵損失可以簡寫成ℓ(Θ)=−(1/n)∑i=1nlog⁡y^y(i)(i) 。從另一個角度來看,我們知道最小化ℓ(Θ) 等價於最大化exp⁡(−nℓ(Θ))=∏i=1ny^y(i)(i) ,即最小化交叉熵損失函數等價於最大化訓練數據集所有標籤類別的聯合預測概率。

模型訓練和預測

在訓練好softmax迴歸模型後,給定任一樣本特徵,就可以預測每個輸出類別的概率。通常,我們把預測概率最大的類別作爲輸出類別。如果它與真實類別(標籤)一致,說明這次預測是正確的。在3.6節的實驗中,我們將使用準確率(accuracy)來評價模型的表現。它等於正確預測數量與總預測數量之比。

獲取Fashion-MNIST訓練集和讀取數據

在介紹softmax迴歸的實現前我們先引入一個多類圖像分類數據集。它將在後面的章節中被多次使用,以方便我們觀察比較算法之間在模型精度和計算效率上的區別。圖像分類數據集中最常用的是手寫數字識別數據集MNIST[1]。但大部分模型在MNIST上的分類精度都超過了95%。爲了更直觀地觀察算法之間的差異,我們將使用一個圖像內容更加複雜的數據集Fashion-MNIST[2]。

我這裏我們會使用torchvision包,它是服務於PyTorch深度學習框架的,主要用來構建計算機視覺模型。torchvision主要由以下幾部分構成:

torchvision.datasets: 一些加載數據的函數及常用的數據集接口;
torchvision.models: 包含常用的模型結構(含預訓練模型),例如AlexNet、VGG、ResNet等;
torchvision.transforms: 常用的圖片變換,例如裁剪、旋轉等;
torchvision.utils: 其他的一些有用的方法。

多層感知機

多層感知機的基本知識

隱藏層

下圖展示了一個多層感知機的神經網絡圖,它含有一個隱藏層,該層中有5個隱藏單元。
在這裏插入圖片描述

表達公式

具體來說,給定一個小批量樣本 X∈Rn×d ,其批量大小爲 n ,輸入個數爲 d 。假設多層感知機只有一個隱藏層,其中隱藏單元個數爲 h 。記隱藏層的輸出(也稱爲隱藏層變量或隱藏變量)爲 H ,有 H∈Rn×h 。因爲隱藏層和輸出層均是全連接層,可以設隱藏層的權重參數和偏差參數分別爲 Wh∈Rd×h 和 bh∈R1×h ,輸出層的權重和偏差參數分別爲 Wo∈Rh×q 和 bo∈R1×q 。

我們先來看一種含單隱藏層的多層感知機的設計。其輸出 O∈Rn×q 的計算爲

HO=XWh+bh,=HWo+bo,

也就是將隱藏層的輸出直接作爲輸出層的輸入。如果將以上兩個式子聯立起來,可以得到

O=(XWh+bh)Wo+bo=XWhWo+bhWo+bo.

從聯立後的式子可以看出,雖然神經網絡引入了隱藏層,卻依然等價於一個單層神經網絡:其中輸出層權重參數爲 WhWo ,偏差參數爲 bhWo+bo 。不難發現,即便再添加更多的隱藏層,以上設計依然只能與僅含輸出層的單層神經網絡等價。

激活函數

上述問題的根源在於全連接層只是對數據做仿射變換(affine transformation),而多個仿射變換的疊加仍然是一個仿射變換。解決問題的一個方法是引入非線性變換,例如對隱藏變量使用按元素運算的非線性函數進行變換,然後再作爲下一個全連接層的輸入。這個非線性函數被稱爲激活函數(activation function)。
如:ReLu函數、Sigmoid函數、tanh函數
在這裏插入圖片描述

關於激活函數的選擇

ReLu函數是一個通用的激活函數,目前在大多數情況下使用。但是,ReLU函數只能在隱藏層中使用。

用於分類器時,sigmoid函數及其組合通常效果更好。由於梯度消失問題,有時要避免使用sigmoid和tanh函數。

在神經網絡層數較多的時候,最好使用ReLu函數,ReLu函數比較簡單計算量少,而sigmoid和tanh函數計算量大很多。

在選擇激活函數的時候可以先選用ReLu函數如果效果不理想可以嘗試其他激活函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章