詳細筆記位址: http://www.ai-start.com/dl2017/ 這裡隻是做些自己的摘抄與了解
寫在前面
吳恩達(英語:Andrew Ng)是斯坦福大學計算機科學系和電氣工程系的客座教授,曾任斯坦福人工智能實驗室主任。他還與達芙妮·科勒一起建立了線上教育平台Coursera。
吳恩達老師的機器學習課程可以說是入門機器學習的同學最先接觸的課程,當然後續的deeplearning.ai是更深入的課程。對線上教育,以及人工智能領域的發展提供了很大的幫助,感謝。
Classes 1 神經網絡
1 神經網絡與深度學習
1.1什麼是神經網絡

輸入層輸入的是特征,什麼是特征,與預測或處理物體息息相關的事情都可以考慮作為特征,隻是特征有輕有重,不同的特征對應的權重不一樣,是以需要神經網絡去學習特征前的權重參數。
給予足夠多的訓練樣本有關𝑥 和𝑦,神經網絡非常擅長計算從𝑥到𝑦的精準映射函數。
1.2 神經網絡的監督學習
- 監督學習:表明你的資料不僅隻有特征,還有标簽
- 結構化資料:結構化資料意味着資料的基本資料庫。例如有專門的幾列資料告訴你卧室的大小和數量,這就是結構化資料。
- 非結構化資料:非結構化資料是指比如音頻,原始音頻或者你想要識别的圖像或文本中的内容。這裡的特征可能是圖像中的像素值或文本中的單個單詞。
吳恩達深度學習課程筆記-Classes 1
神經網絡算法對于結構化和非結構化資料都有用處
1.3 為什麼深度學習會興起
傳統的算法面對大資料時候性能有瓶頸
對于神經網絡而言,得益于大資料的發展以及計算性能的提升,再次得到發展。
想要獲得較高的性能展現,那麼你有兩個條件要完成,第一個是你需要訓練一個規模足夠大的神經網絡,以發揮資料規模量巨大的優點
小型網絡、中型網絡以及大型網絡對應的資料量以及其性能
另外就是算法上的創新
- 激活函數
- 網絡結構
- 快速的疊代
吳恩達深度學習課程筆記-Classes 1
2 神經網絡的程式設計基礎
2.1 二分類(Binary Classification)
在電腦的眼裡,圖檔是用矩陣的形式表示
這裡将矩陣轉化為列向量後作為神經網絡的輸入
2.2 邏輯回歸
為什麼用邏輯回歸而不是線性回歸,因為線性回歸wx+b的輸出值比1大,或者是比 0小,無法比較輸出類别的機率大小,是以使用sigmoid函數對其進行非線性激活,将範圍變為0-1之間
2.4 邏輯函數的損失函數
損失函數:用來衡量預測輸出值和實際值有多接近
邏輯回歸不實用mse均方誤差這類損失函數是由于其不是凸函數,隻能找到多個局部最優值,梯度下降法很可能找不到全局最優值。
在邏輯回歸中用到的損失函數是二進制交叉熵損失函數:
𝐿(𝑦^ , 𝑦) = −𝑦log(𝑦^) − (1 − 𝑦)log(1 − 𝑦^)
- 當𝑦 = 1時損失函數𝐿 = −log(𝑦^) ,如果想要損失函數𝐿盡可能得小,那麼𝑦^就要盡可能大,因為 sigmoid 函數取值[0,1],是以𝑦^會無限接近于 1。
- 當𝑦 = 0時損失函數𝐿 = −log(1 − 𝑦^) ,如果想要損失函數𝐿盡可能得小,那麼𝑦^就要盡可能小,因為 sigmoid 函數取值[0,1],是以𝑦^會無限接近于 0。
吳恩達深度學習課程筆記-Classes 1
損失函數隻适用于像這樣的單個訓練樣本,而代價函數是參數的總代價。這裡總容易将損失函數與代價函數混為一談,損失函數關心個體,代價函數關心總的樣本。
2.4 梯度下降算法
用于更新參數的一種訓練方法,這裡不作過多的介紹
2.5 計算圖
一個神經網絡的計算,都是按照前向或反向傳播過程組織的。首先我們計算出一個新的網絡的輸出(前向過程),緊接着進行一個反向傳輸操作。
2.6 使用計算圖求導數
鍊式法則反向求J對變量a、b、c的偏導數
2.7 邏輯回歸的計算題求解梯度下降
以單樣本為例,損失函數L為
-(ylog(a) + (1-y)log(1-a)) y是标簽,a是激活值
求解得到
dl/da = (-y/a + (1-y)/(1-a))
dl/dz = dl/da da/dz = (-y/a + (1-y)/(1-a)) a(1-a) = a-y
dl/dw1 = dl/da da/dz dz/dw1 = (a-y) * x1
2.8 向量化(Vectorization)
向量化是非常基礎的去除代碼中 for 循環的藝術
用向量操作替換循環元素處理
2.9 向量化邏輯回歸(Vectorizing Logistic Regression)
numpy 廣播機制
- axis=0: 沿着列進行處理
-
axis=1: 沿着行進行處理
建議不使用一維數組, 總是使用 𝑛 × 1維矩陣(基本上是列向量),或者 1 × 𝑛 維矩陣(基本上是行向量)表示n個元素。
或者用assert來判斷其形狀assert(a.shape == (5, 1))
3 淺層神經網絡
3.1 神經網絡概述
可以把許多sigmoid 單元堆疊起來形成一個神經網絡
3.2 神經網絡的表示
輸入層:傳遞輸入
隐藏層:線性權重求和,再通過激活函數激活
輸出層:預測值
向量化表示
3.3 激活函數的類型
sigmoid:輸出範圍是0~1
tanh: 輸出範圍是-1~1
注意:
- tanh 函數或者雙曲正切函數是總體上都優于 sigmoid 函數的激活函數。tanh 函數是 sigmoid 的向下平移和伸縮後的結果。對它進行了變形後,穿過了(0,0)點。
- sigmoid和tanh共同的缺點是,在𝑧特别大或者特别小的情況下,導數的梯度或者函數的斜率會變得特别小,最後就會接近于 0,導緻降低梯度下降的速度。
ReLU: 輸出範圍0~+∞
正數的導數為1,負數的導數為0,神經元此時不會訓練,易導緻稀疏性。
Leaky Relu:輸出範圍 -∞ ~ + ∞
避免了ReLU負數階段的導數為0,以一個非常小的數作為梯度值。
總結
- ReLu 激活函數神經網絡通常會比使用 sigmoid 或者 tanh 激活函數學習的更快;
- sigmoid 和 tanh 函數的導數在正負飽和區的梯度都會接近于 0,這會造成梯度彌散,而 Relu 和 Leaky ReLu 函數大于 0 部分都為常數,不會産生梯度彌散現象。(同時應該注意到的是,Relu 進入負半區的時候,梯度為 0,神經元此時不會訓練,産生所謂的稀疏性,而 Leaky ReLu 不會有這問題)
- sigmoid 激活函數:除了輸出層是一個二分類問題基本不會用它。
- tanh 激活函數:tanh 是非常優秀的,幾乎适合所有場合。
- ReLu 激活函數:最常用的預設函數,如果不确定用哪個激活函數,就使用 ReLu 或者Leaky ReLu。
如果不确定哪一個激活函數效果更好,可以把它們都試試,然
後在驗證集或者發展集上進行評價。然後看哪一種表現的更好,就去使用它。
3.4 為什麼使用非線性激活函數
如果隐藏層使用的是線性函數的話就沒有意義,等價于邏輯回歸時候,中間的多個隐藏層可以直接由一個線性函數表示。
對于神經網絡而言,就是需要使用非線性激活函數來獲得有意思的函數映射。
但是對于回歸問題,其輸出層可以使用線性激活函數。唯一可以用線性激活函數的通常就是輸出層。
3.5 激活函數的導數
- sigmoid
吳恩達深度學習課程筆記-Classes 1 - tanh
吳恩達深度學習課程筆記-Classes 1
-
ReLU 和leaky ReLU
*
吳恩達深度學習課程筆記-Classes 1
3.6 神經網絡的梯度下降算法
梯度下降算法用于更新網絡中的參數w和偏置b,基于輸出值與預期值之間的誤差函數來進行反向傳播來更新的。
- 正向傳播(forward): 從左到右
吳恩達深度學習課程筆記-Classes 1 - 方向傳播(back propagation): 從右到左
吳恩達深度學習課程筆記-Classes 1
3.7 随機初始化
當你訓練神經網絡時,權重随機初始化是很重要的。如果你把權重或者參數都初始化為 0,那麼梯度下降将不會起作用。
對于𝑊可以随機初始化,𝑏可以初始化為 0。
𝑊= 𝑛𝑝.𝑟𝑎𝑛𝑑𝑜𝑚.𝑟𝑎𝑛𝑑𝑛(2,2) ∗ 0.01
𝑏 = 𝑛𝑝.𝑧𝑒𝑟𝑜𝑠((2,1))
通常傾向于初始化為很小的随機數, 你用 tanh 或者sigmoid 激活函數,或者說隻在輸出層是 sigmoid,如果(數值)波動太大,當計算激活值時,如果𝑊很大,𝑧就會很大。𝑧的激活值𝑎就會很大或者很小,這種情況下很可能停在 tanh/sigmoid 函數的平坦的地方,這些地方梯度很小也就意味着梯度下降會很慢,是以學習也就很慢。
4 深層神經網絡
4.1 深層神經網絡
- 嚴格上來說邏輯回歸也是一個一層的神經網絡,而上邊右圖一個深得多的模型,淺與深僅僅是指一種程度。
- 算神經網絡的層數時,不算輸入層,隻算隐藏層和輸出層。
到有一些函數,隻有非常深的神經網絡能學會,而更淺的模型則學不到。盡管對于任何給定的問題很難去提前預測到底需要多深的神經網絡,是以先去嘗試邏輯回歸,嘗試一層然後兩層隐含層,然後把隐含層的數量看做是另一個可以自由選擇大小的超參數,然後再保留交叉驗證資料上評估,或者用你的開發集來評估。
4.2 深層神經網絡反向傳播
- 前向傳播
吳恩達深度學習課程筆記-Classes 1 - 反向傳播
吳恩達深度學習課程筆記-Classes 1
4.3 為什麼使用深層表示
深度神經網絡的這許多隐藏層中,較早的前幾層能學習一些低層次的簡單特征,等到後幾層,就能把簡單的特征結合起來,去探測更加複雜的東西。