2020-4-29 吳恩達DL學習-神經網絡和深度學習Neural Network and Deep Learning-第二週 神經網絡基礎

1.視頻網站:mooc慕課https://mooc.study.163.com/university/deeplearning_ai#/c
2.詳細筆記網站(中文):http://www.ai-start.com/dl2017/
3.github課件+作業+答案:https://github.com/stormstone/deeplearning.ai

學習如何用神經網絡的思維模式提出機器學習問題、如何使用向量化加速你的模型。

本週學習內容

  • NN,不需要用for循環遍歷m個樣本的訓練集
  • NN計算過程分爲正向傳播和反向傳播2個分開的過程
  • 邏輯迴歸的應用

2.1 二分分類

邏輯迴歸是一個用於二分分類的算法。
二分分類問題中,目標就是訓練出一個分類器,以圖片特徵向量x作爲輸入,預測結果標籤y是1或者0。

python命令: X.shape,輸出矩陣X的維度(nx,m),表示X是一個nx X m矩陣
python命令: Y.shape,輸出矩陣X的維度(1,m),表示Y是一個1 X m矩陣(構建NN中的輸出標籤通常放在矩陣列中)

慣用符號約定
在這裏插入圖片描述

2.2 logistic 迴歸 Logistic Regression

本節介紹邏輯迴歸模型。

給定x,想知道預測y爲1的概率,y^=P(y=1x)\hat y=P(y=1|x)
x是一個nx維向量,xRnxx \in R^{n_x}
已知邏輯迴歸2個參數:w也是一個nx維向量,wRnxw \in R^{n_x};b是一個實數,bRb \in R
由於在這裏,y的預測概率值範圍0y^10\leq \hat y \leq1,顯然使用線性迴歸y^=wTx+b\hat y =w^Tx+b來分類是不適合的(y可能比1大很多,也可能是複製)。
所以,我們這裏要使用sigmoid函數,y預測值y^=σ(wTx+b)\hat y =\sigma(w^Tx+b)

sigmoid函數表示如下
σ(z)=11+ez\sigma{(z)}=\frac{1}{1+e^{-z}}
在這裏插入圖片描述

  • 如果z是一個很大的正數,那麼e-z就接近0,σ(z)\sigma(z)接近1
  • 如果z是一個很大的負數,那麼e-z就是一個很大的數,σ(z)\sigma(z)接近0

這樣一來,邏輯迴歸算法就是要學習w和b參數,使得y得到很好的預測。

2.3 logistic 迴歸損失函數 Logistic Regression cost function

爲了訓練邏輯迴歸的參數w和b,需要定義一個損失函數Loss function(或者叫誤差函數error function)。優化模型,就是要最小化損失函數。

我們定義
y^(i)=σ(wTx(i)+b)\hat y^{(i)}=\sigma(w^Tx^{(i)}+b)
其中σ(z(i))=11+ez(i)\sigma(z^{(i)})= \frac1{1+ e^{−z^{(i)}}}

符號約定:帶有上標i的x,y和z,表示x,y和z與第i個訓練樣本有關。

損失函數(誤差函數)用來測量預測值y^(i)\hat y^{(i)}和期望輸出值y(i)y^{(i)}之間的差異。它可以用來衡量算法的運行情況

簡單來說,損失函數就是用來衡量預測值和實際值有多接近,即算法的效果。

我們可以利用平方誤差定義損失函數L(y^,y)=12(y^y)2L(\hat y,y)=\frac 12(\hat y -y)^2,但是用這個損失函數學習參數,優化時候可能會非凸(可以得到多個局部最優值,但是找不到全局最優值),這對於梯度下降算法不太好。

在邏輯迴歸中定義損失函數如下,它會起到和平方誤差相似的作用,這會給我們凸的優化問題(容易優化)
L(y^(i),y(i))=(y(i)log(y^(i))+(1y(i))log(1y^(i)))L(\hat y{(i)},y^{(i)})=−( y^{(i)}log(\hat y^{(i)})+(1−y^{(i)})log (1−\hat y^{(i)}))

分析一下這個損失函數的效果。這也是爲什麼要在邏輯迴歸中選用這個損失函數的原因。

  • 當y=1時,L=log(y^)L=-log(\hat y),此時要想讓L變小,或者說讓log(y^)-log(\hat y)變小,那就是要讓log(y^)log(\hat y)變大,這也就意味着讓y^\hat y變大。由於有sigmoid函數限制存在,那y^\hat y的最大值就是1。總結一下:如果y=1,就要讓y^\hat y接近1。
  • 當y=0時,L=log(1y^)L=-log(1-\hat y),此時要想讓L變小,顯然就是要讓y^\hat y變大。由於有sigmoid函數限制存在,那y^\hat y的最小值就是0。總結一下:如果y=0,就要讓y^\hat y接近0。

損失函數是在單個訓練樣本中定義的,它衡量了(參數w和b在)單個訓練樣本上的表現。

成本函數(cost function)衡量的是(參數w和b在)全體樣本上的表現。
J(w,b)=1mi=1mL(y^(i),y(i))=1mi=1m[(y(i)log(y^(i))+(1y(i))log(1y^(i))]J(w,b)= \frac1m\sum_{i=1}^m L(\hat y^{(i)},y^{(i)})=− \frac1m \sum_{i=1}^m[( y^{(i)}log(\hat y^{(i)})+(1−y^{(i)})log (1−\hat y^{(i)})]
上式表面成本函數即所有訓練樣本損失函數之和。

所以在邏輯迴歸中,我們就是要找到合適的w和b,讓成本函數J(總體成本)儘量小。

2.4 梯度下降法 Gradient Descent

梯度下降算法用來訓練或者學習訓練集上的參數w和b。

我們已經知道成本函數J(w,b)被定義成損失函數的平均值,即1m\frac 1m的損失函數之和。顯然,要提高算法的效果,就是要找到使得成本函數J儘可能小的w和b。下圖中,最下方紅色箭頭所指的紅點,就是J的最小值。
在這裏插入圖片描述

上圖中的J函數是一個凸函數。凸函數是邏輯迴歸使用這個特定成本函數J的重要原因之一。

爲了找到更好的參數值,我們首先要用某個初始值來初始化w和b。
對於邏輯迴歸,任何初始化方法都有效。一般做法會用0來初始化,不過邏輯迴歸並不需要如此。因爲函數是凸的,無論在哪個點初始化,最終都會到達(或者大致到達)同一個點。

梯度下降法所做的就是,從初始點(圖中最上方紅色箭頭指向的點)開始,朝最陡的下坡方向走一步。梯度下降一步後(初始點下方,箭頭指向的點),或許會停下來,因爲它試圖沿着最快的方向向下走,或者說盡快向下走,這就是梯度下降的一次迭代。反覆迭代後,梯度下降終於到達(或者大致接近)全局最優值點(圖中最下方紅點)。

以上就是梯度下降法的基本原理。

下面進一步解釋梯度下降法
在這裏插入圖片描述

觀察上圖,有一個代表成本函數J(w)的曲線,爲了方便說明,這裏做了簡化,省略了參數b,只使用一維曲線來替代多維曲線。

梯度下降算法實際就是在重複更新參數w
w:=wαdJ(w)dww:=w - \alpha \frac{dJ(w)}{dw}
其中

  • α\alpha代表學習率,控制每一次迭代或者說下降算法的步長。
  • 函數J(w)的導數(或者說函數J(w)在w方向上的斜率),dJ(w)dw\frac{dJ(w)}{dw}是參數w的變化量。通常用dw來表示,即w:=wαdww:=w - \alpha dw。它讓w朝下降最快的方向走,知道下一步更新(迭代)的方向在哪裏。

在算法收斂之前,會重複更新w。

上圖中,假設算法從右邊開始計算,函數J曲線上最右邊點的導數代表了這個點的斜率dw,即高除以寬(看上去象一個小三角形)。在這個點的斜率dw是正的,根據公式w:=wαdww:=w - \alpha dw,w會變小,也就是沿曲線向左下方移動一步。梯度下降算法就是按照方法,逐步的減少參數w。

同理,如果w在曲線的最左部,這裏點的斜率是負數,dJ(w)dw<0\frac{dJ(w)}{dw}<0,所以w是逐步增加。不斷用梯度下降法來迭代,w會變得越來越大。

無論初始位置在左邊或者右邊,梯度下降法都會讓參數w朝着全局最小值方向移動。

以上是J(w)只有一個參數w的簡化情況。

對於J(w,b),梯度下降法實際需要更新兩個參數w和b
w:=wαdJ(w,b)dww:=w - \alpha \frac{dJ(w,b)}{dw}
b:=bαdJ(w,b)dbb:=b - \alpha \frac{dJ(w,b)}{db}
這裏的dJ(w,b)dw\frac{dJ(w,b)}{dw}是函數J對於w的偏導數,通常用dw表示。dJ(w,b)db\frac{dJ(w,b)}{db}是函數J對於b的偏導數,通常用db表示。偏導數就是計算函數關於其中一個變量在對應點的斜率。

符號約定
導數用符號 d 表示,而偏導數通常用符號 ∂ 表示。

2.5 導數 Derivatives

2020-4-29 吳恩達-NN&DL-w2 NN基礎(2.5 導數,2.6 更多導數的例子)

2.6 更多導數的例子 More derivatives examples

2020-4-29 吳恩達-NN&DL-w2 NN基礎(2.5 導數,2.6 更多導數的例子)

2.7 計算圖 Computation Graph-前向傳播

2020-4-30 吳恩達-NN&DL-w2 NN基礎(2.7 計算圖,2.8 計算圖的導數計算,2.9 邏輯迴歸中的梯度下降法,2.10 m 個樣本的梯度下降)

2.8 計算圖的導數計算 Derivatives with a Computation Graph-反向傳播

2020-4-30 吳恩達-NN&DL-w2 NN基礎(2.7 計算圖,2.8 計算圖的導數計算,2.9 邏輯迴歸中的梯度下降法,2.10 m 個樣本的梯度下降)

2.9 logistic 迴歸中的梯度下降法 Logistic Regression Gradient descent - 反向傳播

2020-4-30 吳恩達-NN&DL-w2 NN基礎(2.7 計算圖,2.8 計算圖的導數計算,2.9 邏輯迴歸中的梯度下降法,2.10 m 個樣本的梯度下降)

2.10 m 個樣本的梯度下降 Gradient descent on m examples

2020-4-30 吳恩達-NN&DL-w2 NN基礎(2.7 計算圖,2.8 計算圖的導數計算,2.9 邏輯迴歸中的梯度下降法,2.10 m 個樣本的梯度下降)

2.11 向量化 Vectorization-加速計算

2020-5-1 吳恩達-NN&DL-w2 NN基礎(2.11 向量化 Vectorization,2.12 向量化的更多例子)

2.12 向量化的更多例子 More vectorization examples

2020-5-1 吳恩達-NN&DL-w2 NN基礎(2.11 向量化 Vectorization,2.12 向量化的更多例子)

2.13 向量化 logistic 迴歸 Vectorizing Logistic Regression - 前向傳播

2020-5-2 吳恩達-NN&DL-w2 NN基礎(2.13 向量化邏輯迴歸,2.14 向量化邏輯迴歸的梯度輸出)

2.14 向量化 logistic 迴歸的梯度輸出 Vectorizing Logistic Regression’s Gradient Computation -反向傳播

2020-5-2 吳恩達-NN&DL-w2 NN基礎(2.13 向量化邏輯迴歸,2.14 向量化邏輯迴歸的梯度輸出)

2.15 Python 中的廣播 Broadcasting in Python

2020-5-3 吳恩達-NN&DL-w2 NN基礎(2.15 Python 中的廣播)

2.16 關於 python / numpy 向量的說明 A note on p ython/numpy vectors

2020-5-3 吳恩達-NN&DL-w2 NN基礎(2.16 關於 python / numpy 向量的說明)

2.17 Jupyter / Ipython 筆記本的快速指南

省略

2.18 (選修)logistic 損失函數的解釋 Explanation of logistic regression cost function(Optional)

2020-5-5 吳恩達-NN&DL-w2 NN基礎(2.18 (選修)logistic 損失函數的解釋)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章