神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí)-第二周-吳恩達(dá) Deep Learning Specialization 學(xué)習(xí)筆記

二元分類(lèi)(Binary Classification)

二元分類(lèi)是經(jīng)典的分類(lèi)問(wèn)題,在程序?qū)崿F(xiàn)中希望算法可以決定某件事物的結(jié)果或者不是某兩種狀態(tài)中的一種。為了計(jì)算的方便通常將1 來(lái)表示,而不是0 來(lái)表示,例如:

  • 明天天氣是晴還是陰
  • 某張圖片里包含還是不包含貓
  • 攝像頭所捕獲的臉是還是不是某個(gè)要追蹤的對(duì)象

Logistic Regression

Logistic 回歸是經(jīng)典的二元分類(lèi)方法,它的實(shí)現(xiàn)過(guò)程可以比較全面的展示神經(jīng)網(wǎng)絡(luò)的構(gòu)建過(guò)程,因此基本上是所有神經(jīng)網(wǎng)絡(luò)課程的第一講,其可以解決的經(jīng)典問(wèn)題類(lèi)似于:

  1. 體重每增加一公斤以及吸煙數(shù)量的增加是否提高了患者罹患肺癌的風(fēng)險(xiǎn)?

  2. 日常飲食的能量攝入、脂肪攝入、性別、年齡是否影響心臟病的發(fā)病率?

課程中用到的相關(guān)參數(shù)說(shuō)明如下:

  • x 代表一個(gè)特征向量,本課程中默認(rèn)為列向量,每一個(gè)特征向量中有 nx 個(gè)特征

  • y 代表一個(gè)訓(xùn)練樣本的已知取值,在二元分類(lèi)問(wèn)題中只有0,1兩個(gè)選擇

  • 輸入的權(quán)重(weights)w 也是一個(gè) nx 維列向量

  • b 為一個(gè)實(shí)數(shù),m 為訓(xùn)練樣本集中的樣本數(shù)量,i 為第 i 個(gè)訓(xùn)練樣本

Logistic 回歸的實(shí)現(xiàn)過(guò)程是先將輸入特征進(jìn)行線性求和 z = wTx + b,由于這一求和的結(jié)果的值域?qū)儆?[?∞, +∞] ,為了使得最終的輸出結(jié)果的值域處于 [0,1] 之間,并依據(jù)此判斷輸出為 1 還是 0,需要將線性求和的結(jié)果傳遞給一個(gè)激活函數(shù)(Activation Function)。本節(jié)課中使用的是 Sigmoid 函數(shù),其數(shù)學(xué)描述為:σ(z) = 1 / (1 + e-z) 。進(jìn)而對(duì)應(yīng)每一個(gè)特征向量 x,函數(shù)的輸出結(jié)果為:

  • ? = σ(z) = σ(wTx + b),為了表示方便,后文常用 a 代替 ? , 其中 a 取自 activation

激活函數(shù)和 Sigmoid 函數(shù)

神經(jīng)網(wǎng)絡(luò)中常用的激活函數(shù)有很多種,需要根據(jù)實(shí)際情況進(jìn)行選取。之所以需要引入激活函數(shù),是因?yàn)檫@一類(lèi)函數(shù)可以為神經(jīng)網(wǎng)絡(luò)提供非線性的建模能力。因?yàn)榧幢阍谝粋€(gè)多層的神經(jīng)網(wǎng)絡(luò)中,如果各層之間的結(jié)果都是靠線性關(guān)系傳播,那么可以通過(guò)合并同類(lèi)項(xiàng)將其整理為單層的線性模型,而這樣的神經(jīng)網(wǎng)絡(luò)明顯不能對(duì)復(fù)雜的函數(shù)關(guān)系進(jìn)行描述,具體證明可以參見(jiàn) Shuaib Ahmed 的回答。

Sigmoid 函數(shù)的圖像如下,它非常適合 Logistic Regression 的一個(gè)重要原因是其可以將前面所說(shuō)的由線性求和得到的結(jié)果完美的映射到 (0,1) 之間。

sigmoid(z)

損失函數(shù)(Loss function)、誤差函數(shù)(Error function)和成本函數(shù)(Cost Function)

在神經(jīng)網(wǎng)絡(luò)的訓(xùn)練中,我們需要定義一個(gè)損失函數(shù),也稱(chēng)誤差函數(shù),用于衡量針對(duì)每一個(gè)訓(xùn)練樣本得到的預(yù)期輸出和實(shí)際輸出間的誤差(error)。對(duì)于整體訓(xùn)練樣本集而言,則可以定義一個(gè)成本函數(shù)。由于在神經(jīng)網(wǎng)絡(luò)構(gòu)建過(guò)程中會(huì)先將已有的特征信息作為網(wǎng)絡(luò)的輸入,此時(shí)決定誤差唯一影響因素就是分布在網(wǎng)絡(luò)各個(gè)層中的權(quán)重參數(shù)。對(duì)應(yīng)不同的參數(shù)選擇,預(yù)測(cè)結(jié)果和實(shí)際標(biāo)簽值之間的差異不同,而對(duì)神經(jīng)網(wǎng)絡(luò)訓(xùn)練的目的就是要找到合適的 wb 使得這個(gè)成本函數(shù)取得最小值。與激活函數(shù)類(lèi)似,損失函數(shù)和成本函數(shù)也可以有多種定義方式,本課中 Andrew 使用的是下面這兩個(gè)函數(shù),原因請(qǐng)見(jiàn)交叉熵和最大似然估計(jì)。

  • 損失函數(shù): L(?, y) = L(a, y) = - (ylog(a) + (1 - y) log(1 - a)),注意這里的 log 的底數(shù)為自然基底 e,但由于在很多計(jì)算工具中都將 ln 的實(shí)現(xiàn)方法定義為 log,所以公式和課堂上采用的是 log

  • 成本函數(shù):樣本集中全部 m 個(gè)樣本的損失函數(shù)的均值
    J = (1 / m)ΣL(?(i), y(i)) = (1 / m)Σ(-y(i)log?(i) - (1 - y(i))log(1 - ?(i))),其中 i = 1, 2, 3, ... , m,m 為樣本的數(shù)量

之所以稱(chēng)之為誤差函數(shù)和成本函數(shù)在我看來(lái)因?yàn)樵趯?shí)際計(jì)算中,我們都是采用一個(gè)近似的模型來(lái)模擬世界,因此不可能完全準(zhǔn)確,因此合理定義的誤差函數(shù)和成本函數(shù)對(duì)這個(gè)誤差提供了一個(gè)有效的定量描述,我們所能接受的最大的錯(cuò)誤成本就是我們希望算法找到的成本函數(shù)的最小值。

梯度下降(Gradient Descent)

這一部分需要用到較多的導(dǎo)數(shù)的知識(shí),Andrew 在后面課堂里專(zhuān)門(mén)進(jìn)行了講解,這里僅做一個(gè)簡(jiǎn)單的鋪墊。如果實(shí)在不明白的話可以先試著跟著課堂的節(jié)奏走下去,或者以盡量少的時(shí)間將相應(yīng)的知識(shí)了解到一個(gè)自己覺(jué)得有信心繼續(xù)學(xué)習(xí)的程度,不要過(guò)分?jǐn)U大學(xué)習(xí)范圍,比如去讀整本的微積分教材。如果想快速的理解微積分,可以閱讀這個(gè)我個(gè)人最喜歡的博客 BetterExplained ,或者 Khan Academy 關(guān)于偏導(dǎo)數(shù)和梯度的講解 可以給你提供更多關(guān)于微積分的直觀解釋。

一個(gè)簡(jiǎn)單的例子:針對(duì)一元函數(shù)(只有一個(gè)自變量 x ) 如 y = x2,由于 y 作為因變量會(huì)隨著 x 的值的變化而變化,并且對(duì)于不同的 x 的取值,y 值的變化速率不同,體現(xiàn)在圖形上也就是曲線不同點(diǎn)的“陡峭”程度不同,對(duì)應(yīng)數(shù)學(xué)上的描述則是不同 x 點(diǎn)的導(dǎo)數(shù)不同,或者說(shuō)切線的“斜率”不同。

例如在 x = 3 這一點(diǎn) y = 9,而如果對(duì) x 做一個(gè)小小的增加或減少,如變?yōu)?3.001y 值會(huì)變?yōu)?9.006,對(duì)應(yīng) y 的值的變動(dòng)為 0.006。如果將 y 的變動(dòng)值和 x 的變動(dòng)做一個(gè)除法,即用 0.006 / 0.001 則可以得到 x = 3 這一點(diǎn)取值變動(dòng)而造成的 y 值變動(dòng)的變化率為 6,正好為 3 的兩倍,而這不是一個(gè)巧合,即如果經(jīng)過(guò)嚴(yán)肅的數(shù)學(xué)證明可以得到 y = x2 在任意一點(diǎn)的導(dǎo)數(shù)均為 2x,對(duì)應(yīng) x = 3 這一點(diǎn)的導(dǎo)數(shù)為 6

而對(duì)于如我們前面所定義的 J(w, b) 這個(gè)成本函數(shù),由于其有多個(gè)自變量,且自變量的變化可以沿著不同的方向來(lái)進(jìn)行。注意這里面 w 可以有多個(gè)維度,但由于普通人只能直觀的理解三維的圖像,因此假定 w 是一維的,則可以將 J 表示成兩個(gè)變量 wb 的函數(shù),對(duì)應(yīng)的圖形如下:

Illustration of J as a function of single dimension w and b

從圖中可以看出 J 不僅可以通過(guò)單獨(dú)改變 wb 的值而取得不同的值,也可以沿著和兩個(gè)坐標(biāo)軸成一定夾角的方向取得不同的值(wb 同時(shí)變動(dòng)),對(duì)應(yīng)單個(gè)和多個(gè)自變量變化而造成的 J 的取值變化速度的數(shù)學(xué)描述就是“偏導(dǎo)數(shù)”和“方向?qū)?shù)”。由于我們需要尋找的是使得 J 能夠盡快取得最小值所對(duì)應(yīng)的 wb,而為了盡快找到這一點(diǎn),我們不會(huì)漫無(wú)目的的讓計(jì)算機(jī)隨機(jī)遍歷無(wú)數(shù)個(gè) wb,而是要通過(guò)尋求一種算法來(lái)快速實(shí)現(xiàn)這一目的。

想象我們自己站在一座山上,我們能夠看到的達(dá)到山底的最短的路徑就是希望算法所走的路徑(圖中紅色箭頭的路徑)。對(duì)應(yīng)的實(shí)現(xiàn)過(guò)程如下:在算法初始的時(shí)候我們會(huì)賦予 wb 一個(gè)初始值,并使得算法從初始位置朝著在該點(diǎn)看來(lái)“最陡”的下坡方向走一小步,對(duì)應(yīng)這個(gè)“最陡”的方向的數(shù)學(xué)描述就是“梯度”,梯度的方向是方向?qū)?shù)取得最大值的方向,梯度的值是方向?qū)?shù)的最大值。相應(yīng)的利用梯度來(lái)更新權(quán)重參數(shù)進(jìn)而找到函數(shù)最小值點(diǎn)的算法實(shí)現(xiàn)過(guò)程就是“梯度下降”過(guò)程,其核心就在于求取誤差函數(shù)的偏導(dǎo)數(shù)。從初始點(diǎn)開(kāi)始,每沿梯度方向前進(jìn)一步就會(huì)在此基礎(chǔ)上更新 wb 的值,再朝著新的 wb 的梯度的方向前進(jìn)一個(gè)梯度的距離。

這里需要注意的是,在梯度的基礎(chǔ)上,每前進(jìn)一步的過(guò)程里還可以加一個(gè)控制前進(jìn)速度的參數(shù) α ,稱(chēng)為學(xué)習(xí)速率(learning rate)。 對(duì)于如何選擇這個(gè)參數(shù),后續(xù)會(huì)專(zhuān)門(mén)做介紹。還有一點(diǎn)就是由于成本函數(shù)可以有多種選擇,為了在梯度下降過(guò)程中函數(shù)可以達(dá)到總體的最小值,所以最好選擇凸函數(shù)(convex function)做為目標(biāo)函數(shù),而不是有多個(gè)局部極值點(diǎn)的函數(shù),后者容易在計(jì)算中取得局部最小值而非整體的最小值。

計(jì)算圖(Computational Graph)

對(duì)神經(jīng)網(wǎng)絡(luò)中各個(gè)節(jié)點(diǎn)的 wb 的計(jì)算更新過(guò)程中體現(xiàn)了神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過(guò)程:先通過(guò)賦予參數(shù) wb 一個(gè)初始值,并計(jì)算總體樣本集的成本函數(shù)(前向傳播,forward propagation),再借助成本函數(shù)來(lái)計(jì)算相關(guān)參數(shù)的梯度,并用這個(gè)梯度來(lái)指導(dǎo)參數(shù)更新(后向傳播,backward propagation),再循環(huán)往復(fù)。為了更清楚的展現(xiàn)這個(gè)過(guò)程,聰明的計(jì)算機(jī)科學(xué)家們使用計(jì)算圖來(lái)可視化這個(gè)過(guò)程。

Logistic Regression中的梯度下降 - 單個(gè)樣本

為方便計(jì)算,假設(shè) nx = 2 , 則經(jīng)計(jì)算圖輔助計(jì)算可知模型中所需要的導(dǎo)數(shù)值及其計(jì)算公式如下:

Computation chart
  • dz = a - y
  • dw1 = x1dz
  • dw2 = x2dz
  • db = dz

在上述導(dǎo)數(shù)計(jì)算中,由于是單個(gè)訓(xùn)練樣本,因此最后一個(gè)函數(shù)為損失函數(shù),而非成本函數(shù)。同時(shí),之所以要將公式整理成 ay 的函數(shù)是因?yàn)樵谇跋騻鞑ビ?jì)算中這些值都已經(jīng)得到,因此可以直接代入而最終求得相關(guān)的導(dǎo)數(shù)值。在此基礎(chǔ)上,考慮學(xué)習(xí)速率 α 后,程序?qū)崿F(xiàn)中參數(shù)的更新過(guò)程則為:

  • w1 = w1 - αdw1
  • w2 = w2 - αdw2
  • b = b - αdb

Logistic Regression中的梯度下降 - m 個(gè)樣本

當(dāng)訓(xùn)練樣本集中有 m 個(gè)樣本時(shí),需要在初始值 J = 0,dw1 = 0, dw2 = 0, db = 0 的基礎(chǔ)上對(duì)于每個(gè)樣本計(jì)算 dw1 , dw2 , db 并最終取均值,將均值的結(jié)果代入前述的參數(shù)更新過(guò)程:

  • w1 = w1 - αdw1
  • w2 = w2 - αdw2
  • b = b - αdb
Logistic regression with m samples

以上的步驟實(shí)際上只完成了梯度下降的一次參數(shù)更新,實(shí)際計(jì)算中這一參數(shù)更新過(guò)程需要重復(fù)多次,直到最終 J 的計(jì)算滿足條件,所以幸好我們有計(jì)算機(jī)來(lái)完成這一重復(fù)任務(wù),否則就只能望洋興嘆了。

向量化(Vectorization)

當(dāng)訓(xùn)練特征和訓(xùn)練樣本集非常多的時(shí)候,采用顯示的 for 循環(huán)遍歷就顯得過(guò)于復(fù)雜,算法的性能也因此下降,因此如 Andrew 所言在“大數(shù)據(jù)”的背景下,數(shù)據(jù)的向量化就不再是一個(gè)可有可無(wú)的操作,而是整個(gè)算法實(shí)現(xiàn)中重要的一環(huán)。

盡管這又是一個(gè)新的術(shù)語(yǔ),但無(wú)需緊張,在具體的算法實(shí)現(xiàn)中,可以通過(guò) Numpy 這個(gè)庫(kù),借助其中的 n 維數(shù)組這個(gè)數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)向量化。在數(shù)據(jù)科學(xué)領(lǐng)域慣常的做法是用 np 來(lái)重新命名 Numpy 庫(kù),即 import numpy as np ,后續(xù)就可以通過(guò)np.some_method()的形式使用 Numpy 中的方法。假定原有的輸入為一個(gè)包含 1,000,000 個(gè)元素的列表 long_list,通過(guò) Numpy 來(lái)實(shí)現(xiàn)向量化只需要將其傳遞給 np.array() 這個(gè)函數(shù)即可:vectorized_list = np.array(long_list)

在神經(jīng)網(wǎng)絡(luò)的訓(xùn)練中最重要的一個(gè)處理就是將輸入樣本集 X,樣本集標(biāo)簽 y,wdw 向量化,對(duì)于樣本集和標(biāo)簽的向量化只需要將對(duì)應(yīng)的數(shù)據(jù)傳遞給 np.array() 即可,而 wdw 的維數(shù)則需要根據(jù)輸入特征的數(shù)量 nx 來(lái)確定,即 w = np.zeros((nx, 1)),dw = np.zeros((nx, 1)) ,相應(yīng)的對(duì)于單一的訓(xùn)練樣本 z = wTx + b 在代碼中則為 z = np.dot(w.T, x) + b ,而整個(gè)訓(xùn)練樣本集則為 Z = np.dot(w.T, X) + b ,注意 ZX 為大寫(xiě)時(shí)表示相應(yīng)向量構(gòu)成的矩陣,在這里 b 作為一個(gè)實(shí)數(shù)可以參與矩陣計(jì)算是因?yàn)?Numpy 默認(rèn)內(nèi)置了 Broadcasting 功能。

Vectorized computation

這一部分如果只看視頻的話過(guò)于抽象,需要通過(guò)編程練習(xí)才能真正理解,如果沒(méi)有時(shí)間做練習(xí),只需要記住一句話:

Whenever possible, avoid using explicit for-loops in neural network programming.

Jupyter Notebook

在講課中 Andrew 用到了 Jupyter Notebook,為了可以更方便的使用這個(gè)工具,這里推薦安裝 Anaconda ——這是一個(gè)集成了眾多數(shù)據(jù)科學(xué)計(jì)算工具的Python開(kāi)發(fā)環(huán)境,具體的搭建及操作可以參考 Anaconda入門(mén)指南 以及 Jupyter入門(mén)指南。

參考閱讀

  1. 深度學(xué)習(xí)筆記(一):logistic 分類(lèi)
  2. Role of Activation Function
  3. 微積分 Better Explained
  4. 馬同學(xué)高等數(shù)學(xué)-直觀的理解梯度
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容