深度学习笔记第一门课第二周:神经网络的编程基础(上)
本文是吳恩達(dá)老師的深度學(xué)習(xí)課程[1]筆記部分。
作者:黃海廣[2]
主要編寫人員:黃海廣、林興木(第四所有底稿,第五課第一二周,第三周前三節(jié))、祝彥森:(第三課所有底稿)、賀志堯(第五課第三周底稿)、王翔、胡瀚文、 余笑、 鄭浩、李懷松、 朱越鵬、陳偉賀、 曹越、 路皓翔、邱牧宸、 唐天澤、 張浩、 陳志豪、 游忍、 澤霖、沈偉臣、 賈紅順、 時(shí)超、 陳哲、趙一帆、 胡瀟楊、段希、于沖、張?chǎng)钨?/p>
參與編輯人員:黃海廣、陳康凱、石晴路、鐘博彥、向偉、嚴(yán)鳳龍、劉成 、賀志堯、段希、陳瑤、林家泳、王翔、 謝士晨、蔣鵬
備注:筆記和作業(yè)(含數(shù)據(jù)、原始作業(yè)文件)、視頻都在?github[3]中下載。
我將陸續(xù)將課程筆記發(fā)布在公眾號(hào)“機(jī)器學(xué)習(xí)初學(xué)者”,敬請(qǐng)關(guān)注。
第二周:神經(jīng)網(wǎng)絡(luò)的編程基礎(chǔ)(Basics of Neural Network programming)
2.1 二分類(Binary Classification)
這周我們將學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)的基礎(chǔ)知識(shí),其中需要注意的是,當(dāng)實(shí)現(xiàn)一個(gè)神經(jīng)網(wǎng)絡(luò)的時(shí)候,我們需要知道一些非常重要的技術(shù)和技巧。例如有一個(gè)包含個(gè)樣本的訓(xùn)練集,你很可能習(xí)慣于用一個(gè)for循環(huán)來遍歷訓(xùn)練集中的每個(gè)樣本,但是當(dāng)實(shí)現(xiàn)一個(gè)神經(jīng)網(wǎng)絡(luò)的時(shí)候,我們通常不直接使用for循環(huán)來遍歷整個(gè)訓(xùn)練集,所以在這周的課程中你將學(xué)會(huì)如何處理訓(xùn)練集。
另外在神經(jīng)網(wǎng)絡(luò)的計(jì)算中,通常先有一個(gè)叫做前向暫停(forward pause)或叫做前向傳播(foward propagation)的步驟,接著有一個(gè)叫做反向暫停(backward pause) 或叫做反向傳播(backward propagation)的步驟。所以這周我也會(huì)向你介紹為什么神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過程可以分為前向傳播和反向傳播兩個(gè)獨(dú)立的部分。
在課程中我將使用邏輯回歸(logistic regression)來傳達(dá)這些想法,以使大家能夠更加容易地理解這些概念。即使你之前了解過邏輯回歸,我認(rèn)為這里還是有些新的、有趣的東西等著你去發(fā)現(xiàn)和了解,所以現(xiàn)在開始進(jìn)入正題。
邏輯回歸是一個(gè)用于二分類(binary classification)的算法。首先我們從一個(gè)問題開始說起,這里有一個(gè)二分類問題的例子,假如你有一張圖片作為輸入,比如這只貓,如果識(shí)別這張圖片為貓,則輸出標(biāo)簽 1 作為結(jié)果;如果識(shí)別出不是貓,那么輸出標(biāo)簽 0 作為結(jié)果?,F(xiàn)在我們可以用字母?來 表示輸出的結(jié)果標(biāo)簽,如下圖所示:
我們來看看一張圖片在計(jì)算機(jī)中是如何表示的,為了保存一張圖片,需要保存三個(gè)矩陣,它們分別對(duì)應(yīng)圖片中的紅、綠、藍(lán)三種顏色通道,如果你的圖片大小為 64x64 像素,那么你就有三個(gè)規(guī)模為 64x64 的矩陣,分別對(duì)應(yīng)圖片中紅、綠、藍(lán)三種像素的強(qiáng)度值。為了便于表示,這里我畫了三個(gè)很小的矩陣,注意它們的規(guī)模為 5x4 而不是 64x64,如下圖所示:
為了把這些像素值放到一個(gè)特征向量中,我們需要把這些像素值提取出來,然后放入一個(gè)特征向量。為了把這些像素值轉(zhuǎn)換為特征向量?,我們需要像下面這樣定義一個(gè)特征向量??來表示這張圖片,我們把所有的像素都取出來,例如 255、231 等等,直到取完所有的紅色像素,接著最后是 255、134、…、255、134 等等,直到得到一個(gè)特征向量,把圖片中所有的紅、綠、藍(lán)像素值都列出來。如果圖片的大小為 64x64 像素,那么向量??的總維度,將是 64 乘以 64 乘以 3,這是三個(gè)像素矩陣中像素的總量。在這個(gè)例子中結(jié)果為 12,288。現(xiàn)在我們用,來表示輸入特征向量的維度,有時(shí)候?yàn)榱撕?jiǎn)潔,我會(huì)直接用小寫的來表示輸入特征向量的維度。所以在二分類問題中,我們的目標(biāo)就是習(xí)得一個(gè)分類器,它以圖片的特征向量作為輸入,然后預(yù)測(cè)輸出結(jié)果為 1 還是 0,也就是預(yù)測(cè)圖片中是否有貓:
接下來我們說明一些在余下課程中,需要用到的一些符號(hào)。
符號(hào)定義?:
:表示一個(gè)維數(shù)據(jù),為輸入數(shù)據(jù),維度為;
:表示輸出結(jié)果,取值為;
:表示第組數(shù)據(jù),可能是訓(xùn)練數(shù)據(jù),也可能是測(cè)試數(shù)據(jù),此處默認(rèn)為訓(xùn)練數(shù)據(jù);
:表示所有的訓(xùn)練數(shù)據(jù)集的輸入值,放在一個(gè)?的矩陣中,其中表示樣本數(shù)目;
:對(duì)應(yīng)表示所有訓(xùn)練數(shù)據(jù)集的輸出值,維度為。
用一對(duì)來表示一個(gè)單獨(dú)的樣本,代表維的特征向量,?表示標(biāo)簽(輸出結(jié)果)只能為 0 或 1。?而訓(xùn)練集將由個(gè)訓(xùn)練樣本組成,其中表示第一個(gè)樣本的輸入和輸出,表示第二個(gè)樣本的輸入和輸出,直到最后一個(gè)樣本,然后所有的這些一起表示整個(gè)訓(xùn)練集。有時(shí)候?yàn)榱藦?qiáng)調(diào)這是訓(xùn)練樣本的個(gè)數(shù),會(huì)寫作,當(dāng)涉及到測(cè)試集的時(shí)候,我們會(huì)使用來表示測(cè)試集的樣本數(shù),所以這是測(cè)試集的樣本數(shù):
最后為了能把訓(xùn)練集表示得更緊湊一點(diǎn),我們會(huì)定義一個(gè)矩陣用大寫的表示,它由輸入向量、等組成,如下圖放在矩陣的列中,所以現(xiàn)在我們把作為第一列放在矩陣中,作為第二列,放到第列,然后我們就得到了訓(xùn)練集矩陣。所以這個(gè)矩陣有列,是訓(xùn)練集的樣本數(shù)量,然后這個(gè)矩陣的高度記為,注意有時(shí)候可能因?yàn)槠渌承┰?#xff0c;矩陣會(huì)由訓(xùn)練樣本按照行堆疊起來而不是列,如下圖所示:的轉(zhuǎn)置直到的轉(zhuǎn)置,但是在實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)的時(shí)候,使用左邊的這種形式,會(huì)讓整個(gè)實(shí)現(xiàn)的過程變得更加簡(jiǎn)單:
現(xiàn)在來簡(jiǎn)單溫習(xí)一下:是一個(gè)規(guī)模為乘以的矩陣,當(dāng)你用Python實(shí)現(xiàn)的時(shí)候,你會(huì)看到X.shape,這是一條Python命令,用于顯示矩陣的規(guī)模,即X.shape等于,是一個(gè)規(guī)模為乘以的矩陣。所以綜上所述,這就是如何將訓(xùn)練樣本(輸入向量的集合)表示為一個(gè)矩陣。
那么輸出標(biāo)簽?zāi)?#xff1f;同樣的道理,為了能更加容易地實(shí)現(xiàn)一個(gè)神經(jīng)網(wǎng)絡(luò),將標(biāo)簽放在列中將會(huì)使得后續(xù)計(jì)算非常方便,所以我們定義大寫的等于,所以在這里是一個(gè)規(guī)模為 1 乘以的矩陣,同樣地使用Python將表示為Y.shape等于,表示這是一個(gè)規(guī)模為 1 乘以的矩陣。
當(dāng)你在后面的課程中實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)的時(shí)候,你會(huì)發(fā)現(xiàn),一個(gè)好的符號(hào)約定能夠?qū)⒉煌?xùn)練樣本的數(shù)據(jù)很好地組織起來。而我所說的數(shù)據(jù)不僅包括??或者??還包括之后你會(huì)看到的其他的量。將不同的訓(xùn)練樣本的數(shù)據(jù)提取出來,然后就像剛剛我們對(duì)??或者??所做的那樣,將他們堆疊在矩陣的列中,形成我們之后會(huì)在邏輯回歸和神經(jīng)網(wǎng)絡(luò)上要用到的符號(hào)表示。如果有時(shí)候你忘了這些符號(hào)的意思,比如什么是?,或者什么是?,或者忘了其他一些東西,我們也會(huì)在課程的網(wǎng)站上放上符號(hào)說明,然后你可以快速地查閱每個(gè)具體的符號(hào)代表什么意思,好了,我們接著到下一個(gè)視頻,在下個(gè)視頻中,我們將以邏輯回歸作為開始。?備注:附錄里也寫了符號(hào)說明。
2.2 邏輯回歸(Logistic Regression)
在這個(gè)視頻中,我們會(huì)重溫邏輯回歸學(xué)習(xí)算法,該算法適用于二分類問題,本節(jié)將主要介紹邏輯回歸的Hypothesis Function(假設(shè)函數(shù))。
對(duì)于二元分類問題來講,給定一個(gè)輸入特征向量,它可能對(duì)應(yīng)一張圖片,你想識(shí)別這張圖片識(shí)別看它是否是一只貓或者不是一只貓的圖片,你想要一個(gè)算法能夠輸出預(yù)測(cè),你只能稱之為,也就是你對(duì)實(shí)際值??的估計(jì)。更正式地來說,你想讓??表示??等于 1 的一種可能性或者是機(jī)會(huì),前提條件是給定了輸入特征。換句話來說,如果是我們?cè)谏蟼€(gè)視頻看到的圖片,你想讓??來告訴你這是一只貓的圖片的機(jī)率有多大。在之前的視頻中所說的,是一個(gè)維的向量(相當(dāng)于有個(gè)特征的特征向量)。我們用來表示邏輯回歸的參數(shù),這也是一個(gè)維向量(因?yàn)閷?shí)際上是特征權(quán)重,維度與特征向量相同),參數(shù)里面還有,這是一個(gè)實(shí)數(shù)(表示偏差)。所以給出輸入以及參數(shù)和之后,我們?cè)鯓赢a(chǎn)生輸出預(yù)測(cè)值,一件你可以嘗試卻不可行的事是讓。
這時(shí)候我們得到的是一個(gè)關(guān)于輸入的線性函數(shù),實(shí)際上這是你在做線性回歸時(shí)所用到的,但是這對(duì)于二元分類問題來講不是一個(gè)非常好的算法,因?yàn)槟阆胱尡硎緦?shí)際值等于 1 的機(jī)率的話,?應(yīng)該在 0 到 1 之間。這是一個(gè)需要解決的問題,因?yàn)榭赡鼙?1 要大得多,或者甚至為一個(gè)負(fù)值。對(duì)于你想要的在 0 和 1 之間的概率來說它是沒有意義的,因此在邏輯回歸中,我們的輸出應(yīng)該是等于由上面得到的線性函數(shù)式子作為自變量的sigmoid函數(shù)中,公式如上圖最下面所示,將線性函數(shù)轉(zhuǎn)換為非線性函數(shù)。
下圖是sigmoid函數(shù)的圖像,如果我把水平軸作為軸,那么關(guān)于的sigmoid函數(shù)是這樣的,它是平滑地從 0 走向 1,讓我在這里標(biāo)記縱軸,這是 0,曲線與縱軸相交的截距是 0.5,這就是關(guān)于的sigmoid函數(shù)的圖像。我們通常都使用來表示的值。
關(guān)于sigmoid函數(shù)的公式是這樣的,,在這里是一個(gè)實(shí)數(shù),這里要說明一些要注意的事情,如果非常大那么將會(huì)接近于 0,關(guān)于的sigmoid函數(shù)將會(huì)近似等于 1 除以 1 加上某個(gè)非常接近于 0 的項(xiàng),因?yàn)?的指數(shù)如果是個(gè)絕對(duì)值很大的負(fù)數(shù)的話,這項(xiàng)將會(huì)接近于 0,所以如果很大的話那么關(guān)于的sigmoid函數(shù)會(huì)非常接近 1。相反地,如果非常小或者說是一個(gè)絕對(duì)值很大的負(fù)數(shù),那么關(guān)于這項(xiàng)會(huì)變成一個(gè)很大的數(shù),你可以認(rèn)為這是 1 除以 1 加上一個(gè)非常非常大的數(shù),所以這個(gè)就接近于 0。實(shí)際上你看到當(dāng)變成一個(gè)絕對(duì)值很大的負(fù)數(shù),關(guān)于的sigmoid函數(shù)就會(huì)非常接近于 0,因此當(dāng)你實(shí)現(xiàn)邏輯回歸時(shí),你的工作就是去讓機(jī)器學(xué)習(xí)參數(shù)以及這樣才使得成為對(duì)這一情況的概率的一個(gè)很好的估計(jì)。
在繼續(xù)進(jìn)行下一步之前,介紹一種符號(hào)慣例,可以讓參數(shù)和參數(shù)分開。在符號(hào)上要注意的一點(diǎn)是當(dāng)我們對(duì)神經(jīng)網(wǎng)絡(luò)進(jìn)行編程時(shí)經(jīng)常會(huì)讓參數(shù)和參數(shù)分開,在這里參數(shù)對(duì)應(yīng)的是一種偏置。在之前的機(jī)器學(xué)習(xí)課程里,你可能已經(jīng)見過處理這個(gè)問題時(shí)的其他符號(hào)表示。比如在某些例子里,你定義一個(gè)額外的特征稱之為,并且使它等于 1,那么現(xiàn)在就是一個(gè)加 1 維的變量,然后你定義的sigmoid函數(shù)。在這個(gè)備選的符號(hào)慣例里,你有一個(gè)參數(shù)向量,這樣就充當(dāng)了,這是一個(gè)實(shí)數(shù),而剩下的?直到充當(dāng)了,結(jié)果就是當(dāng)你實(shí)現(xiàn)你的神經(jīng)網(wǎng)絡(luò)時(shí),有一個(gè)比較簡(jiǎn)單的方法是保持和分開。但是在這節(jié)課里我們不會(huì)使用任何這類符號(hào)慣例,所以不用去擔(dān)心。?現(xiàn)在你已經(jīng)知道邏輯回歸模型是什么樣子了,下一步要做的是訓(xùn)練參數(shù)和參數(shù),你需要定義一個(gè)代價(jià)函數(shù),讓我們?cè)谙鹿?jié)課里對(duì)其進(jìn)行解釋。
2.3 邏輯回歸的代價(jià)函數(shù)(Logistic Regression Cost Function)
在上個(gè)視頻中,我們講了邏輯回歸模型,這個(gè)視頻里,我們講邏輯回歸的代價(jià)函數(shù)(也翻譯作成本函數(shù))。
為什么需要代價(jià)函數(shù):
為了訓(xùn)練邏輯回歸模型的參數(shù)參數(shù)和參數(shù)我們,需要一個(gè)代價(jià)函數(shù),通過訓(xùn)練代價(jià)函數(shù)來得到參數(shù)和參數(shù)。先看一下邏輯回歸的輸出函數(shù):
為了讓模型通過學(xué)習(xí)調(diào)整參數(shù),你需要給予一個(gè)樣本的訓(xùn)練集,這會(huì)讓你在訓(xùn)練集上找到參數(shù)和參數(shù),,來得到你的輸出。
對(duì)訓(xùn)練集的預(yù)測(cè)值,我們將它寫成,我們更希望它會(huì)接近于訓(xùn)練集中的值,為了對(duì)上面的公式更詳細(xì)的介紹,我們需要說明上面的定義是對(duì)一個(gè)訓(xùn)練樣本來說的,這種形式也使用于每個(gè)訓(xùn)練樣本,我們使用這些帶有圓括號(hào)的上標(biāo)來區(qū)分索引和樣本,訓(xùn)練樣本所對(duì)應(yīng)的預(yù)測(cè)值是,是用訓(xùn)練樣本的然后通過sigmoid函數(shù)來得到,也可以把定義為,我們將使用這個(gè)符號(hào)注解,上標(biāo)來指明數(shù)據(jù)表示或者或者或者其他數(shù)據(jù)的第個(gè)訓(xùn)練樣本,這就是上標(biāo)的含義。
損失函數(shù):
損失函數(shù)又叫做誤差函數(shù),用來衡量算法的運(yùn)行情況,Loss function:.
我們通過這個(gè)稱為的損失函數(shù),來衡量預(yù)測(cè)輸出值和實(shí)際值有多接近。一般我們用預(yù)測(cè)值和實(shí)際值的平方差或者它們平方差的一半,但是通常在邏輯回歸中我們不這么做,因?yàn)楫?dāng)我們?cè)趯W(xué)習(xí)邏輯回歸參數(shù)的時(shí)候,會(huì)發(fā)現(xiàn)我們的優(yōu)化目標(biāo)不是凸優(yōu)化,只能找到多個(gè)局部最優(yōu)值,梯度下降法很可能找不到全局最優(yōu)值,雖然平方差是一個(gè)不錯(cuò)的損失函數(shù),但是我們?cè)谶壿嫽貧w模型中會(huì)定義另外一個(gè)損失函數(shù)。
我們?cè)谶壿嫽貧w中用到的損失函數(shù)是:
為什么要用這個(gè)函數(shù)作為邏輯損失函數(shù)?當(dāng)我們使用平方誤差作為損失函數(shù)的時(shí)候,你會(huì)想要讓這個(gè)誤差盡可能地小,對(duì)于這個(gè)邏輯回歸損失函數(shù),我們也想讓它盡可能地小,為了更好地理解這個(gè)損失函數(shù)怎么起作用,我們舉兩個(gè)例子:
當(dāng)時(shí)損失函數(shù),如果想要損失函數(shù)盡可能得小,那么就要盡可能大,因?yàn)?strong>sigmoid函數(shù)取值,所以會(huì)無限接近于 1。
當(dāng)時(shí)損失函數(shù),如果想要損失函數(shù)盡可能得小,那么就要盡可能小,因?yàn)?strong>sigmoid函數(shù)取值,所以會(huì)無限接近于 0。
在這門課中有很多的函數(shù)效果和現(xiàn)在這個(gè)類似,就是如果等于 1,我們就盡可能讓變大,如果等于 0,我們就盡可能讓??變小。損失函數(shù)是在單個(gè)訓(xùn)練樣本中定義的,它衡量的是算法在單個(gè)訓(xùn)練樣本中表現(xiàn)如何,為了衡量算法在全部訓(xùn)練樣本上的表現(xiàn)如何,我們需要定義一個(gè)算法的代價(jià)函數(shù),算法的代價(jià)函數(shù)是對(duì)個(gè)樣本的損失函數(shù)求和然后除以:??損失函數(shù)只適用于像這樣的單個(gè)訓(xùn)練樣本,而代價(jià)函數(shù)是參數(shù)的總代價(jià),所以在訓(xùn)練邏輯回歸模型時(shí)候,我們需要找到合適的和,來讓代價(jià)函數(shù)??的總代價(jià)降到最低。 根據(jù)我們對(duì)邏輯回歸算法的推導(dǎo)及對(duì)單個(gè)樣本的損失函數(shù)的推導(dǎo)和針對(duì)算法所選用參數(shù)的總代價(jià)函數(shù)的推導(dǎo),結(jié)果表明邏輯回歸可以看做是一個(gè)非常小的神經(jīng)網(wǎng)絡(luò),在下一個(gè)視頻中,我們會(huì)看到神經(jīng)網(wǎng)絡(luò)會(huì)做什么。
2.4 梯度下降法(Gradient Descent)
梯度下降法可以做什么?
在你測(cè)試集上,通過最小化代價(jià)函數(shù)(成本函數(shù))來訓(xùn)練的參數(shù)和,
如圖,在第二行給出和之前一樣的邏輯回歸算法的代價(jià)函數(shù)(成本函數(shù))
梯度下降法的形象化說明
這個(gè)圖中,橫軸表示你的空間參數(shù)和,在實(shí)踐中,可以是更高的維度,但是為了更好地繪圖,我們定義和,都是單一實(shí)數(shù),代價(jià)函數(shù)(成本函數(shù))是在水平軸和上的曲面,因此曲面的高度就是在某一點(diǎn)的函數(shù)值。我們所做的就是找到使得代價(jià)函數(shù)(成本函數(shù))函數(shù)值是最小值,對(duì)應(yīng)的參數(shù)和。
如圖,代價(jià)函數(shù)(成本函數(shù))是一個(gè)凸函數(shù)(convex function),像一個(gè)大碗一樣。
如圖,這就與剛才的圖有些相反,因?yàn)樗欠峭沟牟⑶矣泻芏嗖煌木植孔钚≈?。由于邏輯回歸的代價(jià)函數(shù)(成本函數(shù))特性,我們必須定義代價(jià)函數(shù)(成本函數(shù))為凸函數(shù)。初始化和,
以用如圖那個(gè)小紅點(diǎn)來初始化參數(shù)和,也可以采用隨機(jī)初始化的方法,對(duì)于邏輯回歸幾乎所有的初始化方法都有效,因?yàn)楹瘮?shù)是凸函數(shù),無論在哪里初始化,應(yīng)該達(dá)到同一點(diǎn)或大致相同的點(diǎn)。
我們以如圖的小紅點(diǎn)的坐標(biāo)來初始化參數(shù)和。
2. 朝最陡的下坡方向走一步,不斷地迭代
我們朝最陡的下坡方向走一步,如圖,走到了如圖中第二個(gè)小紅點(diǎn)處。
我們可能停在這里也有可能繼續(xù)朝最陡的下坡方向再走一步,如圖,經(jīng)過兩次迭代走到第三個(gè)小紅點(diǎn)處。
3.直到走到全局最優(yōu)解或者接近全局最優(yōu)解的地方
通過以上的三個(gè)步驟我們可以找到全局最優(yōu)解,也就是代價(jià)函數(shù)(成本函數(shù))這個(gè)凸函數(shù)的最小值點(diǎn)。
梯度下降法的細(xì)節(jié)化說明(僅有一個(gè)參數(shù))
假定代價(jià)函數(shù)(成本函數(shù))?只有一個(gè)參數(shù),即用一維曲線代替多維曲線,這樣可以更好畫出圖像。
迭代就是不斷重復(fù)做如圖的公式:
表示更新參數(shù),
?表示學(xué)習(xí)率(learning rate),用來控制步長(zhǎng)(step),即向下走一步的長(zhǎng)度?就是函數(shù)對(duì)?求導(dǎo)(derivative),在代碼中我們會(huì)使用表示這個(gè)結(jié)果
對(duì)于導(dǎo)數(shù)更加形象化的理解就是斜率(slope),如圖該點(diǎn)的導(dǎo)數(shù)就是這個(gè)點(diǎn)相切于?的小三角形的高除寬。假設(shè)我們以如圖點(diǎn)為初始化點(diǎn),該點(diǎn)處的斜率的符號(hào)是正的,即,所以接下來會(huì)向左走一步。
整個(gè)梯度下降法的迭代過程就是不斷地向左走,直至逼近最小值點(diǎn)。
假設(shè)我們以如圖點(diǎn)為初始化點(diǎn),該點(diǎn)處的斜率的符號(hào)是負(fù)的,即,所以接下來會(huì)向右走一步。
整個(gè)梯度下降法的迭代過程就是不斷地向右走,即朝著最小值點(diǎn)方向走。
梯度下降法的細(xì)節(jié)化說明(兩個(gè)參數(shù))
邏輯回歸的代價(jià)函數(shù)(成本函數(shù))是含有兩個(gè)參數(shù)的。
??表示求偏導(dǎo)符號(hào),可以讀作round,??就是函數(shù)?對(duì)?求偏導(dǎo),在代碼中我們會(huì)使用?表示這個(gè)結(jié)果,??就是函數(shù)對(duì)?求偏導(dǎo),在代碼中我們會(huì)使用?表示這個(gè)結(jié)果, 小寫字母?用在求導(dǎo)數(shù)(derivative),即函數(shù)只有一個(gè)參數(shù), 偏導(dǎo)數(shù)符號(hào)?用在求偏導(dǎo)(partial derivative),即函數(shù)含有兩個(gè)以上的參數(shù)。
2.5 導(dǎo)數(shù)(Derivatives)
這個(gè)視頻我主要是想幫你獲得對(duì)微積分和導(dǎo)數(shù)直觀的理解。或許你認(rèn)為自從大學(xué)畢以后你再也沒有接觸微積分。這取決于你什么時(shí)候畢業(yè),也許有一段時(shí)間了,如果你顧慮這點(diǎn),請(qǐng)不要擔(dān)心。為了高效應(yīng)用神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí),你并不需要非常深入理解微積分。因此如果你觀看這個(gè)視頻或者以后的視頻時(shí)心想:“哇哦,這些知識(shí)、這些運(yùn)算對(duì)我來說很復(fù)雜。”我給你的建議是:堅(jiān)持學(xué)習(xí)視頻,最好下課后做作業(yè),成功的完成編程作業(yè),然后你就可以使用深度學(xué)習(xí)了。在第四周之后的學(xué)習(xí)中,你會(huì)看到定義的很多種類的函數(shù),通過微積分他們能夠幫助你把所有的知識(shí)結(jié)合起來,其中有的叫做前向函數(shù)和反向函數(shù),因此你不需要了解所有你使用的那些微積分中的函數(shù)。所以你不用擔(dān)心他們,除此之外在對(duì)深度學(xué)習(xí)的嘗試中,這周我們要進(jìn)一步深入了解微積分的細(xì)節(jié)。所有你只需要直觀地認(rèn)識(shí)微積分,用來構(gòu)建和成功的應(yīng)用這些算法。最后,如果你是精通微積分的那一小部分人群,你對(duì)微積分非常熟悉,你可以跳過這部分視頻。其他同學(xué)讓我們開始深入學(xué)習(xí)導(dǎo)數(shù)。
一個(gè)函數(shù),它是一條直線。下面我們來簡(jiǎn)單理解下導(dǎo)數(shù)。讓我們看看函數(shù)中幾個(gè)點(diǎn),假定,那么是的 3 倍等于 6,也就是說如果,那么函數(shù)。假定稍微改變一點(diǎn)點(diǎn)的值,只增加一點(diǎn),變?yōu)?2.001,這時(shí)將向右做微小的移動(dòng)。0.001 的差別實(shí)在是太小了,不能在圖中顯示出來,我們把它右移一點(diǎn),現(xiàn)在等于的 3 倍是 6.003,畫在圖里,比例不太符合。請(qǐng)看綠色高亮部分的這個(gè)小三角形,如果向右移動(dòng) 0.001,那么增加 0.003,的值增加 3 倍于右移的,因此我們說函數(shù)在,.是這個(gè)導(dǎo)數(shù)的斜率,或者說,當(dāng)時(shí),斜率是 3。導(dǎo)數(shù)這個(gè)概念意味著斜率,導(dǎo)數(shù)聽起來是一個(gè)很可怕、很令人驚恐的詞,但是斜率以一種很友好的方式來描述導(dǎo)數(shù)這個(gè)概念。所以提到導(dǎo)數(shù),我們把它當(dāng)作函數(shù)的斜率就好了。更正式的斜率定義為在上圖這個(gè)綠色的小三角形中,高除以寬。即斜率等于 0.003 除以 0.001,等于 3?;蛘哒f導(dǎo)數(shù)等于 3,這表示當(dāng)你將右移 0.001,的值增加 3 倍水平方向的量。
現(xiàn)在讓我們從不同的角度理解這個(gè)函數(shù)。?假設(shè)?,此時(shí)。?把右移一個(gè)很小的幅度,增加到 5.001,。?即在?時(shí),斜率是 3,這就是表示,當(dāng)微小改變變量的值,?。一個(gè)等價(jià)的導(dǎo)數(shù)表達(dá)式可以這樣寫?,不管你是否將放在上面或者放在右邊都沒有關(guān)系。?在這個(gè)視頻中,我講解導(dǎo)數(shù)討論的情況是我們將偏移 0.001,如果你想知道導(dǎo)數(shù)的數(shù)學(xué)定義,導(dǎo)數(shù)是你右移很小的值(不是 0.001,而是一個(gè)非常非常小的值)。通常導(dǎo)數(shù)的定義是你右移(可度量的值)一個(gè)無限小的值,增加 3 倍(增加了一個(gè)非常非常小的值)。也就是這個(gè)三角形右邊的高度。
那就是導(dǎo)數(shù)的正式定義。但是為了直觀的認(rèn)識(shí),我們將探討右移?這個(gè)值,即使 0.001 并不是無窮小的可測(cè)數(shù)據(jù)。導(dǎo)數(shù)的一個(gè)特性是:這個(gè)函數(shù)任何地方的斜率總是等于 3,不管或?,這個(gè)函數(shù)的斜率總等于 3,也就是說不管的值如何變化,如果你增加 0.001,的值就增加 3 倍。這個(gè)函數(shù)在所有地方的斜率都相等。一種證明方式是無論你將小三角形畫在哪里,它的高除以寬總是 3。
我希望帶給你一種感覺:什么是斜率?什么是導(dǎo)函數(shù)?對(duì)于一條直線,在例子中函數(shù)的斜率,在任何地方都是 3。在下一個(gè)視頻讓我們看一個(gè)更復(fù)雜的例子,這個(gè)例子中函數(shù)在不同點(diǎn)的斜率是可變的。
2.6 更多的導(dǎo)數(shù)例子(More?Derivative Examples)
在這個(gè)視頻中我將給出一個(gè)更加復(fù)雜的例子,在這個(gè)例子中,函數(shù)在不同點(diǎn)處的斜率是不一樣的,先來舉個(gè)例子:
我在這里畫一個(gè)函數(shù),,如果?的話,那么。讓我們稍稍往右推進(jìn)一點(diǎn)點(diǎn),現(xiàn)在?,則?(如果你用計(jì)算器算的話,這個(gè)準(zhǔn)確的值應(yīng)該為 4.004。0.001 我只是為了簡(jiǎn)便起見,省略了后面的部分),如果你在這兒畫,一個(gè)小三角形,你就會(huì)發(fā)現(xiàn),如果把往右移動(dòng) 0.001,那么將增大四倍,即增大 0.004。在微積分中我們把這個(gè)三角形斜邊的斜率,稱為在點(diǎn)?處的導(dǎo)數(shù)(即為 4),或者寫成微積分的形式,當(dāng)?的時(shí)候,??由此可知,函數(shù),在取不同值的時(shí)候,它的斜率是不同的,這和上個(gè)視頻中的例子是不同的。
這里有種直觀的方法可以解釋,為什么一個(gè)點(diǎn)的斜率,在不同位置會(huì)不同如果你在曲線上,的不同位置畫一些小小的三角形你就會(huì)發(fā)現(xiàn),三角形高和寬的比值,在曲線上不同的地方,它們是不同的。所以當(dāng)?時(shí),斜率為 4;而當(dāng)時(shí),斜率為 10 。如果你翻看微積分的課本,課本會(huì)告訴你,函數(shù)的斜率(即導(dǎo)數(shù))為。這意味著任意給定一點(diǎn),如果你稍微將,增大 0.001,那么你會(huì)看到將增大,即增大的值為點(diǎn)在處斜率或?qū)?shù),乘以你向右移動(dòng)的距離。
現(xiàn)在有個(gè)小細(xì)節(jié)需要注意,導(dǎo)數(shù)增大的值,不是剛好等于導(dǎo)數(shù)公式算出來的值,而只是根據(jù)導(dǎo)數(shù)算出來的一個(gè)估計(jì)值。
為了總結(jié)這堂課所學(xué)的知識(shí),我們?cè)賮砜纯磶讉€(gè)例子:
假設(shè)?如果你翻看導(dǎo)數(shù)公式表,你會(huì)發(fā)現(xiàn)這個(gè)函數(shù)的導(dǎo)數(shù),等于。所以這是什么意思呢,同樣地舉一個(gè)例子:我們?cè)俅瘟?#xff0c;所以?,如果我們又將增大一點(diǎn)點(diǎn),你會(huì)發(fā)現(xiàn), 你可以自己檢查一遍,如果我們?nèi)?8.012,你會(huì)發(fā)現(xiàn)?,和 8.012 很接近,事實(shí)上當(dāng)時(shí),導(dǎo)數(shù)值為,即。所以導(dǎo)數(shù)公式,表明如果你將向右移動(dòng) 0.001 時(shí),?將會(huì)向右移動(dòng) 12 倍,即 0.012。
來看最后一個(gè)例子,假設(shè),有些可能會(huì)寫作,函數(shù)?的斜率應(yīng)該為,所以我們可以解釋如下:如果取任何值,比如又取,然后又把向右邊移動(dòng) 0.001 那么將增大,如果你借助計(jì)算器的話,你會(huì)發(fā)現(xiàn)當(dāng)時(shí)?;而時(shí),。所以增大了 0.0005,如果你查看導(dǎo)數(shù)公式,當(dāng)?shù)臅r(shí)候,導(dǎo)數(shù)值。這表明如果你把 增大 0.001,將只會(huì)增大 0.001 的二分之一,即 0.0005。如果你畫個(gè)小三角形你就會(huì)發(fā)現(xiàn),如果?軸增加了 0.001,那么?軸上的函數(shù),將增大 0.001 的一半 即 0.0005。所以??,當(dāng)時(shí)這里是 ,就是當(dāng)時(shí)這條線的斜率。這些就是有關(guān),導(dǎo)數(shù)的一些知識(shí)。
在這個(gè)視頻中,你只需要記住兩點(diǎn):
第一點(diǎn),導(dǎo)數(shù)就是斜率,而函數(shù)的斜率,在不同的點(diǎn)是不同的。在第一個(gè)例子中?,這是一條直線,在任何點(diǎn)它的斜率都是相同的,均為 3。但是對(duì)于函數(shù)?,或者,它們的斜率是變化的,所以它們的導(dǎo)數(shù)或者斜率,在曲線上不同的點(diǎn)處是不同的。
第二點(diǎn),如果你想知道一個(gè)函數(shù)的導(dǎo)數(shù),你可參考你的微積分課本或者維基百科,然后你應(yīng)該就能找到這些函數(shù)的導(dǎo)數(shù)公式。
最后我希望,你能通過我生動(dòng)的講解,掌握這些有關(guān)導(dǎo)數(shù)和斜率的知識(shí),下一課我們將講解計(jì)算圖,以及如何用它來求更加復(fù)雜的函數(shù)的導(dǎo)數(shù)。
2.7 計(jì)算圖(Computation Graph)
可以說,一個(gè)神經(jīng)網(wǎng)絡(luò)的計(jì)算,都是按照前向或反向傳播過程組織的。首先我們計(jì)算出一個(gè)新的網(wǎng)絡(luò)的輸出(前向過程),緊接著進(jìn)行一個(gè)反向傳輸操作。后者我們用來計(jì)算出對(duì)應(yīng)的梯度或?qū)?shù)。計(jì)算圖解釋了為什么我們用這種方式組織這些計(jì)算過程。在這個(gè)視頻中,我們將舉一個(gè)例子說明計(jì)算圖是什么。讓我們舉一個(gè)比邏輯回歸更加簡(jiǎn)單的,或者說不那么正式的神經(jīng)網(wǎng)絡(luò)的例子。
我們嘗試計(jì)算函數(shù),是由三個(gè)變量組成的函數(shù),這個(gè)函數(shù)是?。計(jì)算這個(gè)函數(shù)實(shí)際上有三個(gè)不同的步驟,首先是計(jì)算??乘以?,我們把它儲(chǔ)存在變量中,因此;?然后計(jì)算;最后輸出,這就是要計(jì)算的函數(shù)。我們可以把這三步畫成如下的計(jì)算圖,我先在這畫三個(gè)變量,第一步就是計(jì)算,我在這周圍放個(gè)矩形框,它的輸入是,接著第二步,最后一步。?舉個(gè)例子:??,就是 6,?,就是 5+6=11。是 3 倍的 ,因此。即。如果你把它算出來,實(shí)際上得到 33 就是的值。?當(dāng)有不同的或者一些特殊的輸出變量時(shí),例如本例中的和邏輯回歸中你想優(yōu)化的代價(jià)函數(shù),因此計(jì)算圖用來處理這些計(jì)算會(huì)很方便。從這個(gè)小例子中我們可以看出,通過一個(gè)從左向右的過程,你可以計(jì)算出的值。為了計(jì)算導(dǎo)數(shù),從右到左(紅色箭頭,和藍(lán)色箭頭的過程相反)的過程是用于計(jì)算導(dǎo)數(shù)最自然的方式。?概括一下:計(jì)算圖組織計(jì)算的形式是用藍(lán)色箭頭從左到右的計(jì)算,讓我們看看下一個(gè)視頻中如何進(jìn)行反向紅色箭頭(也就是從右到左)的導(dǎo)數(shù)計(jì)算,讓我們繼續(xù)下一個(gè)視頻的學(xué)習(xí)。
2.8 使用計(jì)算圖求導(dǎo)數(shù)(Derivatives?with a?Computation?Graph)
在上一個(gè)視頻中,我們看了一個(gè)例子使用流程計(jì)算圖來計(jì)算函數(shù) J?,F(xiàn)在我們清理一下流程圖的描述,看看你如何利用它計(jì)算出函數(shù)的導(dǎo)數(shù)。
下面用到的公式:
?,??,?
這是一個(gè)流程圖:
假設(shè)你要計(jì)算,那要怎么算呢?好,比如說,我們要把這個(gè)值拿過來,改變一下,那么的值會(huì)怎么變呢?
所以定義上,現(xiàn)在,所以如果你讓增加一點(diǎn)點(diǎn),比如到 11.001,那么,所以我這里增加了 0.001,然后最終結(jié)果是上升到原來的 3 倍,所以,因?yàn)閷?duì)于任何??的增量都會(huì)有 3 倍增量,而且這類似于我們?cè)谏弦粋€(gè)視頻中的例子,我們有,然后我們推導(dǎo)出,所以這里我們有,所以,這里扮演了的角色,在之前的視頻里的例子。
在反向傳播算法中的術(shù)語,我們看到,如果你想計(jì)算最后輸出變量的導(dǎo)數(shù),使用你最關(guān)心的變量對(duì)的導(dǎo)數(shù),那么我們就做完了一步反向傳播,在這個(gè)流程圖中是一個(gè)反向步驟。
我們來看另一個(gè)例子,是多少呢?換句話說,如果我們提高的數(shù)值,對(duì)的數(shù)值有什么影響?
好,我們看看這個(gè)例子。變量,我們讓它增加到 5.001,那么對(duì) v 的影響就是,之前,現(xiàn)在變成 11.001,我們從上面看到現(xiàn)在?就變成 33.003 了,所以我們看到的是,如果你讓增加 0.001,增加 0.003。那么增加,我是說如果你把這個(gè) 5 換成某個(gè)新值,那么的改變量就會(huì)傳播到流程圖的最右,所以最后是 33.003。所以 J 的增量是 3 乘以的增量,意味著這個(gè)導(dǎo)數(shù)是 3。
要解釋這個(gè)計(jì)算過程,其中一種方式是:如果你改變了,那么也會(huì)改變,通過改變,也會(huì)改變,所以值的凈變化量,當(dāng)你提升這個(gè)值(0.001),當(dāng)你把值提高一點(diǎn)點(diǎn),這就是的變化量(0.003)。
首先 a 增加了,也會(huì)增加,增加多少呢?這取決于,然后的變化導(dǎo)致也在增加,所以這在微積分里實(shí)際上叫鏈?zhǔn)椒▌t,如果影響到,影響到,那么當(dāng)你讓變大時(shí),的變化量就是當(dāng)你改變時(shí),的變化量乘以改變時(shí)的變化量,在微積分里這叫鏈?zhǔn)椒▌t。
我們從這個(gè)計(jì)算中看到,如果你讓增加 0.001,也會(huì)變化相同的大小,所以。事實(shí)上,如果你代入進(jìn)去,我們之前算過,,所以這個(gè)乘積 3×1,實(shí)際上就給出了正確答案,。
這張小圖表示了如何計(jì)算,就是對(duì)變量的導(dǎo)數(shù),它可以幫助你計(jì)算,所以這是另一步反向傳播計(jì)算。
現(xiàn)在我想介紹一個(gè)新的符號(hào)約定,當(dāng)你編程實(shí)現(xiàn)反向傳播時(shí),通常會(huì)有一個(gè)最終輸出值是你要關(guān)心的,最終的輸出變量,你真正想要關(guān)心或者說優(yōu)化的。在這種情況下最終的輸出變量是 J,就是流程圖里最后一個(gè)符號(hào),所以有很多計(jì)算嘗試計(jì)算輸出變量的導(dǎo)數(shù),所以輸出變量對(duì)某個(gè)變量的導(dǎo)數(shù),我們就用命名,所以在很多計(jì)算中你需要計(jì)算最終輸出結(jié)果的導(dǎo)數(shù),在這個(gè)例子里是,還有各種中間變量,比如、、、、,當(dāng)你在軟件里實(shí)現(xiàn)的時(shí)候,變量名叫什么?你可以做的一件事是,在python中,你可以寫一個(gè)很長(zhǎng)的變量名,比如,但這個(gè)變量名有點(diǎn)長(zhǎng),我們就用,但因?yàn)槟阋恢睂?duì)求導(dǎo),對(duì)這個(gè)最終輸出變量求導(dǎo)。我這里要介紹一個(gè)新符號(hào),在程序里,當(dāng)你編程的時(shí)候,在代碼里,我們就使用變量名,來表示那個(gè)量。
好,所以在程序里是表示導(dǎo)數(shù),你關(guān)心的最終變量的導(dǎo)數(shù),有時(shí)最后是,對(duì)代碼中各種中間量的導(dǎo)數(shù),所以代碼里這個(gè)東西,你用表示這個(gè)值,所以,你的代碼表示就是。
好,所以我們通過這個(gè)流程圖完成部分的后向傳播算法。我們?cè)谙乱粡埢脽羝纯催@個(gè)例子剩下的部分。
我們清理出一張新的流程圖,我們回顧一下,到目前為止,我們一直在往回傳播,并計(jì)算,再次,是代碼里的變量名,其真正的定義是。我發(fā)現(xiàn),再次,是代碼里的變量名,其實(shí)代表的值。
大概手算了一下,兩條直線怎么計(jì)算反向傳播。
好,我們繼續(xù)計(jì)算導(dǎo)數(shù),我們看看這個(gè)值,那么是多少呢?通過和之前類似的計(jì)算,現(xiàn)在我們從出發(fā),如果你令增加到 6.001,那么之前是 11,現(xiàn)在變成 11.001 了,?就從 33 變成 33.003,所以?增量是 3 倍,所以。對(duì)的分析很類似對(duì) a 的分析,實(shí)際上這計(jì)算起來就是,有了這個(gè),我們可以算出,,最終算出結(jié)果是。
所以我們還有一步反向傳播,我們最終計(jì)算出,這里的當(dāng)然了,就是。
現(xiàn)在,我們仔細(xì)看看最后一個(gè)例子,那么呢?想象一下,如果你改變了的值,你想要然后變化一點(diǎn),讓?值到達(dá)最大或最小,那么導(dǎo)數(shù)是什么呢?這個(gè)函數(shù)的斜率,當(dāng)你稍微改變值之后。事實(shí)上,使用微積分鏈?zhǔn)椒▌t,這可以寫成兩者的乘積,就是,理由是,如果你改變一點(diǎn)點(diǎn),所以變化比如說 3.001,它影響 J 的方式是,首先會(huì)影響,它對(duì)的影響有多大?好,的定義是,所以時(shí)這是 6,現(xiàn)在就變成 6.002 了,對(duì)吧,因?yàn)樵谖覀兊睦又?#xff0c;所以這告訴我們當(dāng)你讓增加 0.001 時(shí),就增加兩倍。所以,現(xiàn)在我想的增加量已經(jīng)是的兩倍,那么是多少呢?我們已經(jīng)弄清楚了,這等于 3,所以讓這兩部分相乘,我們發(fā)現(xiàn)。
好,這就是第二部分的推導(dǎo),其中我們想知道??增加 0.002,會(huì)對(duì)?有什么影響。實(shí)際上,這告訴我們 u 增加 0.002 之后,上升了 3 倍,那么?應(yīng)該上升 0.006,對(duì)吧。這可以從推導(dǎo)出來。
如果你仔細(xì)看看這些數(shù)學(xué)內(nèi)容,你會(huì)發(fā)現(xiàn),如果變成 3.001,那么就變成 6.002,變成 11.002,然后,對(duì)吧?這就是如何得到。
為了填進(jìn)去,如果我們反向走的話,,而其實(shí)是Python代碼中的變量名,表示。
我不會(huì)很詳細(xì)地介紹最后一個(gè)例子,但事實(shí)上,如果你計(jì)算,這個(gè)結(jié)果是 9。
我不會(huì)詳細(xì)說明這個(gè)例子,在最后一步,我們可以推出。
所以這個(gè)視頻的要點(diǎn)是,對(duì)于那個(gè)例子,當(dāng)計(jì)算所有這些導(dǎo)數(shù)時(shí),最有效率的辦法是從右到左計(jì)算,跟著這個(gè)紅色箭頭走。特別是當(dāng)我們第一次計(jì)算對(duì)的導(dǎo)數(shù)時(shí),之后在計(jì)算對(duì)導(dǎo)數(shù)就可以用到。然后對(duì)的導(dǎo)數(shù),比如說這個(gè)項(xiàng)和這里這個(gè)項(xiàng):
可以幫助計(jì)算對(duì)的導(dǎo)數(shù),然后對(duì)的導(dǎo)數(shù)。
所以這是一個(gè)計(jì)算流程圖,就是正向或者說從左到右的計(jì)算來計(jì)算成本函數(shù) J,你可能需要優(yōu)化的函數(shù),然后反向從右到左計(jì)算導(dǎo)數(shù)。如果你不熟悉微積分或鏈?zhǔn)椒▌t,我知道這里有些細(xì)節(jié)講的很快,但如果你沒有跟上所有細(xì)節(jié),也不用怕。在下一個(gè)視頻中,我會(huì)再過一遍。在邏輯回歸的背景下過一遍,并給你介紹需要做什么才能編寫代碼,實(shí)現(xiàn)邏輯回歸模型中的導(dǎo)數(shù)計(jì)算。
參考資料
[1]
深度學(xué)習(xí)課程:?https://mooc.study.163.com/university/deeplearning_ai
[2]黃海廣:?https://github.com/fengdu78
[3]github:?https://github.com/fengdu78/deeplearning_ai_books
總結(jié)
以上是生活随笔為你收集整理的深度学习笔记第一门课第二周:神经网络的编程基础(上)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何写好一篇高质量的IEEE/ACM T
- 下一篇: 深度学习笔记第一门课第一周:深度学习引言