吳恩達深度學習視頻總結

在接觸深度學習的時候有很多新的名詞,例如正向傳遞、反向傳遞、激活函數等等。深度學習中運用了很多導數計算,很多人已經把導數忘得一干二凈,也有很多人對導數的了解只是皮毛,這就是為什么會讓人覺得學習這門技能門檻高。我很感謝吳恩達教授開設了這么課,讓我重新拾起了對數學的理解,也同時讓我明白網上很多教程講的是什么。我大概整理了一下內容,希望能給自己有更深刻的理解,同時也希望能幫助到別人。

導數

我從吳老師的課中重新認識了導數,回想讀了這么多年書,書是學得很多,但卻很少讓人對學的這個東西有什么作用,應該怎么去用,在課堂上很乏味的帶過。在之前看了一個臺灣教授在講解深度學習的時候,通過解析當下學生最熱門的《pokemon go》,以抓到的寵物以進化后的性價比為課題來講解。我在想如果當今教育能更加有趣一點。我相信會更加多的人為我們創造更好的未來。

導數其實講的是該函數在某個點的斜率。

導數反應的變化率:一個函數在某一點的導數描述了這個函數在這一點附近的變化率。導數的本質是通過極限的概念對函數進行局部的線性逼近。

吳老師也在視頻中講到移動0.001只是為了更直觀的發現數值移動一小步嘗試的變化??赡苁?.0000000001甚至更小。

在函數 y = kx + b 中呈現的是一條直線,直線上的任何一個點的斜率都為k
在曲線函數中 y = x^2 中,斜率就相對復雜了起來

直線 f(a) = 3a 
當a = 2       f(a)= 6  
當a = 2.001   f(a)= 6.003 

當a移動0.001 ,f(a)移動0.003 代表斜率(導數) 在a=2時,斜率(導數)為3

曲線 f(a) = a^2 
a = 2      ==> 4
a = 2.001  ==> 4.004

a = 5      ==> 25
a = 5.001  ==> 25.010

當a在2移動0.001 ,f(a)移動0.004 代表斜率(導數) 在a=2時,斜率(導數)為4
當a在5移動0.001 ,f(a)移動0.010 代表斜率(導數) 在a=5時,斜率(導數)為10

當我們拿出教科書中的公式代入后發現是成立的

3a   ==> 3
a^2  ==> ( d / da )* a^2 = 2a
a^3  ==> ( d / da )* a^3 = 3a^2

為什么深度學習需要導數呢

這個其實就要拋出深度學習的兩個很重要的思想 ——正向傳播 反向傳播
在整個模型訓練過程中先是正向傳播 接著再 反向傳播步驟 (從左到右計算J函數的的值,從右到左計算計算導數)

正向傳播

J(a,b,c) = 3(a+b*c)
1. u = b * c
2. v = a + u
3. J = 3v
    
a         (   a   )      ==>   (v = a+u)   ==>  3v
b   ==>   (u = b*c)      ==>
c   ==>
    
a =5        (   5   )    ==>   (v = 5+6)   ==>  (3v = 3*11)
b =3  ==>   (u = 2*3)    ==>
c =2   ==>

函數J = 3(a+b*c) 中先乘除后加減分解為 123步, 通過b與c得到u,在通過u與a 得到v,以此類推算出J 這是我們正常的計算邏輯。

反向傳播

反向傳播(從右到左,計算J函數導數)
dJ/ dv ==> J對v的導數
J = 3v
v = 11  ==> 11.001
J = 33  ==> 33.003           J對v的導數是3
    
dJ/ da ==> J對a的導數
a = 5  ==>  5.001
v = 11  ==> 11.001
J = 33  ==> 33.003           J對a的導數是3
    
      ...
      ...
      ...
    
dJ/dv = 3  斜率=3
dJ/du = 3  斜率=3
dJ/da = 3  斜率=3      當a的值變大1時 J比原來變大3倍
dJ/db = 6  斜率=6      當b的值變大1時 J比原來變大6倍
dJ/dc = 9  斜率=9      當c的值變大1時 J比原來變大9倍

你是否剛開始也跟我一樣,為什么要求斜率呢,斜率有什么作用呢,這個時候拋出一個想法。
我們人類經過了不停的學習,一只貓一只狗站在我們面前,我們如何去分辨是貓是狗呢,有兩個眼睛,叫聲不同。。。但是真的能很好的去描述出來嗎,描述出來就一定是對的嗎。深度學習通過根據不同的特征及目標值不斷的去訓練,無需告訴計算機計算公式,也無需告訴計算機計算步驟,讓計算機自己去學習,自己去判別,我們只需要收集大量的數據交給計算機就可以了。
如上面的反向傳播例子。計算機只要計算出a,b,c的導數就可以去預測目標值。
剛開始,a,b,c的導數可能是與實際相差很遠。通過大量的數據去訓練 不停的去更新


深度學習

不必太過擔心自己對導數的計算去煩惱,計算機會去幫我們處理這些問題,不然還需要計算機干什么呢,我們只需要了解為什么導數能解決深度學習去訓練的方式,在以后不停的實踐后再慢慢的去探索總結,不斷的提升,相信這些都不是什么事。
在訓練模型的時候除了上面提到的通過正向傳遞、反向傳遞的傳播過程,還拋出了激活函數,損失函數,梯度下降這三個,通過這三個來完成深度學習的正向傳遞、反向傳遞傳播。

激活函數

在定義層(函數)的時候,在每一層計算后都會加上一個激活函數,激活函數可以讓你的神經網絡計算出有去的函數,如果沒有激活函數,該網絡只能夠表現出線性映射,就算有再多的隱藏層,整個網絡與單層網絡是等價的。

sigmoid 0 到 1 之間 用于二元分類 輸出層(0 - 1)

tanh -1 到 1 之間 激活函數的平均值就更接近于0 使用tanh而不是sigmoid函數也有類似數據中心化的效果,使數據的平均值更接近0 讓下一層學習更加方便
*sigmoid 和 tanh 都有一個缺點 如果Z非常大或非常小 那么導數的梯度 或者說這個函數的斜率可能就很小,函數的斜率很接近0 這樣就會拖慢梯度下降算法

ReLU 0 到 無窮大 當z為負數的時候,導數等于0
*如果你的輸出值是0和1那么sigmoid函數很適合做為輸出層的激活函數,然后其他所有單元都用ReLU(修正線性單元)

損失函數

損失函數(loss function)是用來估量你模型的預測值f(x)與真實值Y的不一致程度,它是一個非負實值函數,通常使用L(Y, f(x))來表示,損失函數越小,模型的準確性就越好。損失函數是經驗風險函數的核心部分,也是結構風險函數重要組成部分。

常用的損失函數有 平均差 ,交叉熵

梯度下降

梯度下降法是一個算法,通常也稱為最速下降法。最速下降法是求解無約束優化問題最簡單和最古老的方法之用負梯度方向為搜索方向的,最速下降法越接近目標值,步長越小,前進越慢。

    /*
    logistic : 二分類
    sigmoid  : 讓數值在 0 到 1 之間
    */

   //****************** 激活函數 ********************// 
   //y^ = w * x + b
   //y^有可能比1大得多,或者甚至為負數,在二分類中我們希望介于0到1之間
   //所以在logistic回歸中,我們的輸出變成
   // Z  =  w * x + b          //計算預測值Z
   // y^ = sigmoid( Z )        //通過非線性函數讓 Z 值,符合我們的要求
   //* 當Z值在0時,垂直軸相交0.5處 Z值越大越接近1 Z值越小越接近0
   
   //****************** 成本函數 ********************//
   
   //成本函數用于衡量算法運行情況
   // Loss = 平均交叉熵
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容