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