深度学习入门笔记(二):神经网络基础
歡迎關注WX公眾號:【程序員管小亮】
專欄——深度學習入門筆記
聲明
1)該文章整理自網上的大牛和機器學習專家無私奉獻的資料,具體引用的資料請看參考文獻。
2)本文僅供學術交流,非商用。所以每一部分具體的參考資料并沒有詳細對應。如果某部分不小心侵犯了大家的利益,還望海涵,并聯系博主刪除。
3)博主才疏學淺,文中如有不當之處,請各位指出,共同進步,謝謝。
4)此屬于第一版本,若有錯誤,還需繼續修正與增刪。還望大家多多指點。大家都共享一點點,一起為祖國科研的推進添磚加瓦。
文章目錄
- 歡迎關注WX公眾號:【程序員管小亮】
- 專欄——深度學習入門筆記
- 聲明
- 深度學習入門筆記(二):神經網絡基礎
- 1、二分類
- 2、邏輯回歸
- 3、邏輯回歸的代價函數
- 4、梯度下降法
- 梯度下降法可以做什么?
- 梯度下降法的形象化說明
- 梯度下降法的細節化說明
- 梯度下降法的具體化說明
- 5、邏輯回歸的梯度下降
- 6、m 個樣本的梯度下降
- 推薦閱讀
- 參考文章
深度學習入門筆記(二):神經網絡基礎
1、二分類
下面要學習的是神經網絡的基礎知識,其中需要注意的是,當實現一個神經網絡的時候,需要知道一些非常重要的技術和技巧,閑言少敘,直接開搞。
邏輯回歸(logistic regression) 是一個用于 二分類(binary classification) 的算法。首先從一個問題——貓咪識別開始說起,如果識別這張圖片為貓,則輸出標簽1作為結果;如果識別出不是貓,那么輸出標簽0作為結果。用字母 yyy 來表示輸出的結果標簽,如下圖所示:
如上圖所示,一張圖片在計算機中對應三個矩陣,分別對應圖片中的紅、綠、藍三種顏色通道,且圖片大小與三個矩陣相同,分別對應圖片中紅、綠、藍三種像素的強度值。
為了把這些像素值轉換為 特征向量 xxx,需要定義特征向量表示圖片,把像素都取出來,也就是矩陣中的數據,例如255、231等等,取完紅色像素接著是綠色像素,最后是藍色像素,直到得到特征向量,也就是圖片中紅、綠、藍像素排列的值。如果圖片的大小為64x64像素,那么 xxx 的總維度,是64 * 64 * 3,也即是三個像素矩陣中的像素總量(12288)。
現在用 nx=12288n_x=12288nx?=12288 來表示輸入特征向量的維度,有時為了簡潔,直接用小寫的 nnn 來表示。所以二分類問題中,最終的目標就是習得一個分類器,以圖片特征向量作輸入,預測輸出結果 yyy 是1還是0,即預測圖片中是否有貓。
符號定義 :
xxx:表示一個 nxn_xnx? 維數據,為輸入數據,維度為 (nx,1)(n_x,1)(nx?,1);
yyy:表示輸出結果,取值為 (0,1)(0,1)(0,1);
(x(i),y(i))(x^{(i)},y^{(i)})(x(i),y(i)):表示第 iii 組數據,可能是訓練數據,也可能是測試數據,此處默認為訓練數據;
X=[x(1),x(2),...,x(m)]X=[x^{(1)},x^{(2)},...,x^{(m)}]X=[x(1),x(2),...,x(m)]:表示所有的訓練數據集的輸入值,放在一個 nx×mn_x×mnx?×m 的矩陣中,其中 mmm 表示樣本數目;
Y=[y(1),y(2),...,y(m)]Y=[y^{(1)},y^{(2)},...,y^{(m)}]Y=[y(1),y(2),...,y(m)]:對應表示所有訓練數據集的輸出值,維度為 1×m1×m1×m。
2、邏輯回歸
對于二元分類問題,給定輸入特征向量 XXX,它可能對應一張圖片,如果想識別這張圖片是否是貓的圖片,怎么做?
定義算法的輸出預測為 y^\hat{y}y^?,也就是對實際值 yyy 的估計。更正式地來說,y^\hat{y}y^? 表示 yyy 等于1的一種可能性或者是幾率,當然,前提條件是給定了輸入特征 XXX。
上面說過 XXX 是一個 nxn_xnx? 維的向量,相當于有 nxn_xnx? 個特征的特征向量。www 表示邏輯回歸的參數,也是一個 nxn_xnx? 維向量,因為 www 實際上是 特征權重,維度與特征向量相同。參數里面還有 bbb,是一個實數,表示偏差。所以給出輸入以及參數后,一個可以嘗試卻不可行的結果是 y^=wTx+b\hat{y}={{w}^{T}}x+by^?=wTx+b。
為什么說可以嘗試,卻不可行呢?注意,這時得到的實際上是線性回歸時用到的一個關于輸入 xxx 的線性函數,但這對二元分類問題來講,卻不是一個非常好的算法。因為 y^\hat{y}y^? 表示實際值 yyy 等于1的幾率,也就是說 y^\hat{y}y^? 應該在0到1之間。
這是一個需要解決的問題,因為 wTx+b{{w}^{T}}x+bwTx+b 可能比1要大得多,更有甚者,可能是一個負值,但是我們想要的是一個概率。因此,在邏輯回歸中,輸出是 y^\hat{y}y^? 作為自變量的 sigmoid 函數的輸出值。有點繞,其實簡單來說, y^=sigmoid(y)\hat{y} = sigmoid(y)y^?=sigmoid(y)。
如上圖所示,就是 sigmoid 函數的圖像,它平滑地從0走向1,這里的作用其實還是把線性函數轉換為非線性函數。
關于 sigmoid 函數的公式是這樣的
σ(z)=11+e?z\sigma \left( z \right)=\frac{1}{1+{{e}^{-z}}}σ(z)=1+e?z1?
這里要注意的是,從圖像可以看出兩點:
- 如果 zzz 非常大,那么 e?z{{e}^{-z}}e?z 將會接近于0,σ(z)\sigma \left( z \right)σ(z) 會非常接近1。
- 相反地,如果zzz 非常小或者一個絕對值很大的負數,那么 e?z{{e}^{-z}}e?z 會變得很大,σ(z)\sigma \left( z \right)σ(z) 就接近于0。
因此當實現邏輯回歸時,y^\hat{y}y^? 在0到1之間,成為對 y=1y=1y=1 概率的一個很好的估計。
3、邏輯回歸的代價函數
為什么需要代價函數(也翻譯作成本函數)?
為了訓練邏輯回歸模型,得到參數 www和參數 bbb。
看到這里你可能有點蒙逼,先來看一下損失函數吧,你可能會問那 什么是損失函數? 損失函數又叫做 誤差函數,用來衡量算法的運行情況,Loss function:L(y^,y)L\left( \hat{y},y \right)L(y^?,y).。通過這個 LLL,也就是損失函數,來衡量預測輸出值和實際值有多接近。
一般的損失函數有預測值和實際值的平方差或者它們平方差的一半,但是通常在邏輯回歸中不這么做,為什么?因為在學習邏輯回歸參數時,會發現優化目標不是 凸優化(在凸優化中局部最優值必定是全局最優值),只能找到多個局部最優值,很可能找不到全局最優值。所以雖然平方差是一個不錯的損失函數,但在邏輯回歸模型中定義的是另外一個損失函數,即
L(y^,y)=?ylog?(y^)?(1?y)log?(1?y^)L\left( \hat{y},y \right)=-y\log(\hat{y})-(1-y)\log (1-\hat{y})L(y^?,y)=?ylog(y^?)?(1?y)log(1?y^?)
為什么要用這個函數作為邏輯損失函數?來舉兩個例子你就懂了,首先確定一件事,無論解決什么問題,你肯定想要誤差盡可能地小。好了,現在來看例子吧:
-
當 y=1y=1y=1 時損失函數 L=?log?(y^)L=-\log (\hat{y})L=?log(y^?),如果想要損失函數 LLL 盡可能得小,那么 y^\hat{y}y^? 就要盡可能大,因為 sigmoid 函數取值 [0,1][0,1][0,1],所以 y^\hat{y}y^? 會無限接近于1。
-
當 y=0y=0y=0 時損失函數 L=?log?(1?y^)L=-\log (1-\hat{y})L=?log(1?y^?),如果想要損失函數 LLL 盡可能得小,那么 y^\hat{y}y^? 就要盡可能小,因為 sigmoid 函數取值 [0,1][0,1][0,1],所以 y^\hat{y}y^? 會無限接近于0。
而在邏輯回歸中,我們期待的輸出就是1或者0,是不是這個損失函數更好呢? 😃
可以看出來,損失函數是在單個訓練樣本中定義的,它衡量的是算法在單個訓練樣本中表現如何。那么怎么衡量算法在全部訓練樣本上的表現如何?
需要定義一個算法的 代價函數,算法的代價函數,是對 mmm 個樣本的損失函數求和,然后除以 mmm:
J(w,b)=1m∑i=1mL(y^(i),y(i))=1m∑i=1m(?y(i)log?y^(i)?(1?y(i))log?(1?y^(i)))J\left( w,b \right)=\frac{1}{m}\sum\limits_{i=1}^{m}{L\left( {{{\hat{y}}}^{(i)}},{{y}^{(i)}} \right)}=\frac{1}{m}\sum\limits_{i=1}^{m}{\left( -{{y}^{(i)}}\log {{{\hat{y}}}^{(i)}}-(1-{{y}^{(i)}})\log (1-{{{\hat{y}}}^{(i)}}) \right)}J(w,b)=m1?i=1∑m?L(y^?(i),y(i))=m1?i=1∑m?(?y(i)logy^?(i)?(1?y(i))log(1?y^?(i)))
在訓練邏輯回歸模型時,找到合適的 www 和 bbb,來讓代價函數 JJJ 的總代價降到最低即為所求。
4、梯度下降法
梯度下降法可以做什么?
在測試集上,通過最小化 代價函數(成本函數) J(w,b)J(w,b)J(w,b) 來訓練的參數 www 和 bbb。
梯度下降法的形象化說明
在這個圖中,橫軸表示空間參數 www 和 bbb,代價函數(成本函數)J(w,b)J(w,b)J(w,b) 是曲面,因此曲面高度就是 J(w,b)J(w,b)J(w,b) 在某一點的函數值。
而深度學習的最終目標就是找到代價函數(成本函數)J(w,b)J(w,b)J(w,b) 函數值為最小值時對應的參數 www 和 bbb。梯度下降 可以分為三個步驟:
1. 隨機初始化兩個參數
以如圖小紅點的坐標來初始化參數 www 和 bbb。
開始尋找代價函數(成本函數)J(w,b)J(w,b)J(w,b) 函數值的最小值。
2. 朝最陡的下坡方向走一步,不斷地迭代
朝最陡的下坡方向走一步,如圖,走到了如圖中第二個小紅點處。
可能停在這里,也有可能繼續朝最陡的下坡方向再走一步,如圖,經過兩次迭代走到第三個小紅點處。
3.直到走到全局最優解或者接近全局最優解的地方
通過重復以上的步驟,可以找到全局最優解,也就是代價函數(成本函數)J(w,b)J(w,b)J(w,b) 這個凸函數的最小值點。
梯度下降法的細節化說明
邏輯回歸的代價函數(成本函數)J(w,b)J(w,b)J(w,b) 是含有兩個參數的。
簡要說明一下式子中的符號,?\partial? 表示求偏導符號,可以讀作 round;?J(w,b)?w\frac{\partial J(w,b)}{\partial w}?w?J(w,b)? 就是函數 J(w,b)J(w,b)J(w,b) 對www 求偏導,在代碼中為 dwdwdw;?J(w,b)?b\frac{\partial J(w,b)}{\partial b}?b?J(w,b)? 就是函數 J(w,b)J(w,b)J(w,b)對bbb 求偏導,在代碼中為 dbdbdb。
其實無論是 ddd 還是 ?\partial? 都是求導數的意思,那么二者的區別是什么呢?
- ddd 用在 求導數(derivative),即函數只有一個參數
- ?\partial? 用在 求偏導(partial derivative),即函數含有兩個以上的參數
梯度下降法的具體化說明
梯度下降是如何進行的呢?這里任選一參數 www 進行舉例:假定代價函數(成本函數)J(w)J(w)J(w) 只有一個參數www,即用一維曲線代替多維曲線,這樣可以更好畫出如下圖像。
迭代就是不斷重復做如圖的公式:
其中,:= 表示更新參數;aaa 表示 學習率(learning rate),用來控制 步長(step);dJ(w)dw\frac{dJ(w)}{dw}dwdJ(w)? 就是函數 J(w)J(w)J(w) 對 www 求導(derivative),在代碼中為 dwdwdw。對于導數更加形象化的理解就是 斜率(slope)。
如圖該點的導數就是這個點相切于 J(w)J(w)J(w) 的小三角形的高除寬(這是高中數學學過的,不會的去百度——導數)。假設初始化如圖點為起始點,該點處的斜率的符號是正,即 dJ(w)dw>0\frac{dJ(w)}{dw}>0dwdJ(w)?>0,所以接下來會向左走一步(假設該點處的斜率的符號是負的,則會向右走一步),如圖:
不斷地向左走,直至逼近最小值點,這就是梯度下降法的迭代過程。
5、邏輯回歸的梯度下降
邏輯回歸的梯度下降算法,關鍵點是幾個重要公式,雖然使用計算圖來計算邏輯回歸的梯度下降算法有點大材小用了,具體什么是導數,什么是計算圖,可以看這個博客——深度學習入門筆記(三):數學基礎之求導數。
下面來完完整整地進行這個梯度下降算法的過程演示,相信我,跟著你就能全懂了。
假設,單個樣本樣本只有兩個特征 x1{{x}_{1}}x1? 和 x2{{x}_{2}}x2?,為了計算 zzz,需要輸入參數 w1{{w}_{1}}w1?、w2{{w}_{2}}w2? 和 bbb。
因此 z=w1x1+w2x2+bz={{w}_{1}}{{x}_{1}}+{{w}_{2}}{{x}_{2}}+bz=w1?x1?+w2?x2?+b。
回想一下邏輯回歸的公式定義如下:y^=a=σ(z)\hat{y}=a=\sigma (z)y^?=a=σ(z),其中z=wTx+bz={{w}^{T}}x+bz=wTx+b、σ(z)=11+e?z\sigma \left( z \right)=\frac{1}{1+{{e}^{-z}}}σ(z)=1+e?z1?。
損失函數 L(y^(i),y(i))=?y(i)log?y^(i)?(1?y(i))log?(1?y^(i))L( {{{\hat{y}}}^{(i)}},{{y}^{(i)}})=-{{y}^{(i)}}\log {{\hat{y}}^{(i)}}-(1-{{y}^{(i)}})\log (1-{{\hat{y}}^{(i)}})L(y^?(i),y(i))=?y(i)logy^?(i)?(1?y(i))log(1?y^?(i))。
代價函數 J(w,b)=1m∑imL(y^(i),y(i))J\left( w,b \right)=\frac{1}{m}\sum\nolimits_{i}^{m}{L( {{{\hat{y}}}^{(i)}},{{y}^{(i)}})}J(w,b)=m1?∑im?L(y^?(i),y(i))。
若只考慮單個樣本,代價函數變為 L(a,y)=?(ylog?(a)+(1?y)log?(1?a))L(a,y)=-(y\log (a)+(1-y)\log (1-a))L(a,y)=?(ylog(a)+(1?y)log(1?a))。
梯度下降法中 www 和 bbb 的修正表達為 w:=w?a?J(w,b)?ww:=w-a \frac{\partial J(w,b)}{\partial w}w:=w?a?w?J(w,b)?,b:=b?a?J(w,b)?bb:=b-a\frac{\partial J(w,b)}{\partial b}b:=b?a?b?J(w,b)?。
現在畫出表示這個計算過程的計算圖,如下:
有了計算圖,就不需要再寫出公式了,只需修改參數 www 和 bbb。前面已經講解了前向傳播,現在來說一下反向傳播。
想要計算出代價函數 L(a,y)L(a,y)L(a,y) 的導數,可以使用鏈式法則。
首先計算出 L(a,y)L(a,y)L(a,y) 關于 aaa 的導數。通過計算可以得出
dL(a,y)da=?y/a+(1?y)/(1?a)\frac{dL(a,y)}{da}=-y/a+(1-y)/(1-a)dadL(a,y)?=?y/a+(1?y)/(1?a)
而
dadz=a?(1?a)\frac{da}{dz}=a\cdot (1-a)dzda?=a?(1?a)
因此將這兩項相乘,得到:
dz=dL(a,y)dz=dLdz=(dLda)?(dadz)=(?ya+(1?y)(1?a))?a(1?a)=a?y{dz} = \frac{{dL}(a,y)}{{dz}} = \frac{{dL}}{{dz}} = \left( \frac{{dL}}{{da}} \right) \cdot \left(\frac{{da}}{{dz}} \right) = ( - \frac{y}{a} + \frac{(1 - y)}{(1 - a)})\cdot a(1 - a) = a - ydz=dzdL(a,y)?=dzdL?=(dadL?)?(dzda?)=(?ay?+(1?a)(1?y)?)?a(1?a)=a?y
肯定會有小伙伴說自己不太會微積分,不知道鏈式法則。Don‘t worry!!!只需知道 dz=(a?y)dz=(a-y)dz=(a?y) 已經計算好了,拿來主義,直接拿過來用就可以了。
最后一步反向推導,也就是計算 www 和 bbb 變化對代價函數 LLL 的影響
dw1=x1?dzd{{w}_{1}}={{x}_{1}}\cdot dzdw1?=x1??dz
dw2=x2?dzd{{w}_{\text{2}}}={{x}_{2}}\cdot dzdw2?=x2??dz
db=dzdb=dzdb=dz
然后更新
w1=w1?adw1{{w}_{1}}={{w}_{1}}-a d{{w}_{1}}w1?=w1??adw1?
w2=w2?adw2{{w}_{2}}={{w}_{2}}-a d{{w}_{2}}w2?=w2??adw2?
b=b?αdbb=b-\alpha dbb=b?αdb
這就是單個樣本實例的梯度下降算法中參數更新一次的步驟,深度學習的過程可以簡單理解為重復迭代優化的過程(肯定不準確,就是為了先理解一下而已)。吳恩達老師畫的圖,直觀的體現了整個過程:
6、m 個樣本的梯度下降
我們想要的,肯定不是單個樣本,而是在 mmm 個訓練樣本上,也就是訓練集上。
首先,關于算法的帶求和的全局代價函數 J(w,b)J(w,b)J(w,b) 的定義如下:
J(w,b)=1m∑i=1mL(a(i),y(i))J(w,b)=\frac{1}{m}\sum\limits_{i=1}^{m}{L({{a}^{(i)}},{{y}^{(i)}})}J(w,b)=m1?i=1∑m?L(a(i),y(i))
實際上是1到 mmm 項各個損失的平均,所以對 w1{{w}_{1}}w1? 的微分,對 w1{{w}_{1}}w1? 的微分,也同樣是各項損失對 w1{{w}_{1}}w1? 微分的平均。
吳恩達老師手寫稿如下:
而代價函數對權重向量 θθθ 求導過程如下,損失函數為交叉熵損失函數,整個過程如下:
通過 向量化 就可以得到
因此更新公式為:
推薦閱讀
- 深度學習入門筆記(一):深度學習引言
- 深度學習入門筆記(二):神經網絡基礎
- 深度學習入門筆記(三):求導和計算圖
- 深度學習入門筆記(四):向量化
- 深度學習入門筆記(五):神經網絡的編程基礎
- 深度學習入門筆記(六):淺層神經網絡
- 深度學習入門筆記(七):深層神經網絡
- 深度學習入門筆記(八):深層網絡的原理
- 深度學習入門筆記(九):深度學習數據處理
- 深度學習入門筆記(十):正則化
- 深度學習入門筆記(十一):權重初始化
- 深度學習入門筆記(十二):深度學習數據讀取
- 深度學習入門筆記(十三):批歸一化(Batch Normalization)
- 深度學習入門筆記(十四):Softmax
- 深度學習入門筆記(十五):深度學習框架(TensorFlow和Pytorch之爭)
- 深度學習入門筆記(十六):計算機視覺之邊緣檢測
- 深度學習入門筆記(十七):深度學習的極限在哪?
- 深度學習入門筆記(十八):卷積神經網絡(一)
- 深度學習入門筆記(十九):卷積神經網絡(二)
- 深度學習入門筆記(二十):經典神經網絡(LeNet-5、AlexNet和VGGNet)
參考文章
- 吳恩達——《神經網絡和深度學習》視頻課程
總結
以上是生活随笔為你收集整理的深度学习入门笔记(二):神经网络基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ES6-Promise实时获取地址和天气
- 下一篇: 算法推荐书籍