神經(jīng)網(wǎng)絡(luò)基礎(chǔ)
1. 二分分類
例子:識(shí)別圖片中是否有貓搀缠,有輸出1否則輸出0奠伪。
-
計(jì)算機(jī)儲(chǔ)存圖片通過RGB铝宵,即用三個(gè)矩陣分別儲(chǔ)存red、green和blue的像素值看成,以常見64*64為例君编,從而用一個(gè)64*64*3的矩陣儲(chǔ)存一張圖片。
計(jì)算機(jī)對(duì)圖片的儲(chǔ)存
如何用一個(gè)特征向量(列向量)來表示這個(gè)像素矩陣川慌?按照視頻中的說明吃嘿,先讀取red矩陣的像素祠乃,逐行讀取,以上圖為例兑燥,讀為
亮瓷,接著讀取green矩陣的像素,仍是逐行讀取贪嫂,從而矩陣為
寺庄,最后讀取blue矩陣的像素,所以整個(gè)圖片存儲(chǔ)為一個(gè)列向量
力崇。
即表示成如下:圖片的儲(chǔ)存矩陣 -
符號(hào)約定
:一個(gè)樣本斗塘,
為輸入,
為輸出亮靴。
個(gè)訓(xùn)練樣本:
訓(xùn)練集的樣本數(shù):或
測(cè)試集的樣本數(shù):
矩陣:每一列是一個(gè)樣本馍盟,從而是
維的。
樣本的矩陣表示- 對(duì)應(yīng)python命令X.shape輸出
的維數(shù)
同樣的茧吊,輸出
也表示為一個(gè)
維向量
贞岭。python命令Y.shape會(huì)輸出
。
- 對(duì)應(yīng)python命令X.shape輸出
2. Logistic回歸
-
:對(duì)輸出
的預(yù)測(cè)值搓侄,在二分類問題中就是
取1的概率
瞄桨。
- 參數(shù):
,
- 給出輸入變量
和參數(shù)
讶踪,如何得到預(yù)測(cè)值
?
線性回歸是芯侥,但并不是一個(gè)很好的二分分類方法,因?yàn)槲覀兿M?img class="math-inline" src="https://math.jianshu.com/math?formula=%5Chat%7By%7D" alt="\hat{y}" mathimg="1">是個(gè)介于0和1之間的數(shù)以表示概率乳讥,而
可以取任何值甚至是負(fù)數(shù)柱查,為克服這個(gè)困難將輸出做一個(gè)sigmoid函數(shù)變換
,其中sigmoid函數(shù)為
云石,其函數(shù)圖像為
sigmoid函數(shù)圖像
可以看到:- 當(dāng)
取相當(dāng)大的數(shù)時(shí)唉工,
趨向于0,從而
趨向于1
- 而當(dāng)
取相當(dāng)大的負(fù)數(shù)時(shí)汹忠,
趨向于
淋硝,從而
趨向于0
- 當(dāng)
時(shí),
所以取值位于0和1之間宽菜。
- 當(dāng)
3. Logistic 回歸——cost function(成本函數(shù)/代價(jià)函數(shù))
- 為了訓(xùn)練
和
需要定義cost function谣膳,用來衡量算法效果。
- 回顧:Logistic回歸
赋焕,其中
参歹,給定訓(xùn)練集
,希望有
隆判。
- 先定義針對(duì)單個(gè)樣本的Loss (Error) Function
:度量預(yù)測(cè)值
與實(shí)際值
之間有多接近犬庇。
- 例如僧界,可以定義
,事實(shí)上并不這樣應(yīng)用臭挽,因?yàn)檫@樣會(huì)導(dǎo)致函數(shù)非凸從而有多個(gè)局部最優(yōu)解捂襟,所以使用梯度下降法時(shí)無法找到最優(yōu)解(
)欢峰。
- 在Logistic回歸中會(huì)定義一個(gè)凸的損失函數(shù):
- 若
葬荷,則
,讓損失函數(shù)盡可能小纽帖,從而
盡可能大宠漩,從而
盡可能大,而
是sigmoid函數(shù)的輸出懊直,最大就是1扒吁,所以此時(shí)是要讓
;
- 若
,則
室囊,讓損失函數(shù)盡可能小雕崩,從而
盡可能大,從而
盡可能大融撞,即
盡可能小盼铁,而
是sigmoid函數(shù)的輸出,最小就是0尝偎,所以此時(shí)是要讓
- 若
- 例如僧界,可以定義
- cost function(成本函數(shù)):度量在訓(xùn)練集上的整體表現(xiàn)饶火。
- 注:
4.梯度下降法
用來訓(xùn)練或?qū)W習(xí)訓(xùn)練集上的參數(shù)
趁窃。
回顧:
-
梯度下降法就是給定初始的
牧挣,找到當(dāng)前下降最快的方向走一步急前,再找當(dāng)前下降最快的方向走一步,一直到找到最優(yōu)解為止瀑构,因?yàn)槲覀兩厦娑x的Loss Function是凸函數(shù)裆针,所以肯定能找到全局最優(yōu)解。如下圖所示寺晌。
梯度下降法示意圖- Logistic回歸基本上任意初始化方法都好用世吨,一般初始化為0。
-
其具體過程為呻征,針對(duì)參數(shù)
耘婚,迭代為
- 其中
是學(xué)習(xí)率,可以控制每次迭代或者說梯度下降法中的步長(zhǎng)陆赋。
- 編程時(shí)就用
表示對(duì)
的偏導(dǎo)數(shù)沐祷。
-
是凸函數(shù)嚷闭,因此,若
赖临,
迭代后向著減小的方向步進(jìn)胞锰,圖上來看就是向左迭代;若
兢榨,
迭代后向著增大的方向步進(jìn)嗅榕,圖上來看就是向右迭代,無論哪種情況吵聪,都會(huì)找到全局最優(yōu)解凌那,如下圖所示。
w迭代示意圖
- 其中
類似的吟逝,
的迭代為:
5.計(jì)算圖(前向傳播)及其導(dǎo)數(shù)計(jì)算(后向傳播)
5.1 計(jì)算圖
- 計(jì)算圖感覺像高數(shù)里的函數(shù)復(fù)合過程用圖表示出來案怯。
- toy example
,其復(fù)合與計(jì)算過程如下圖
toy example的復(fù)合和計(jì)算過程
5.2 計(jì)算圖的導(dǎo)數(shù)計(jì)算
從右向左推導(dǎo)出復(fù)合函數(shù)的鏈?zhǔn)角髮?dǎo)法則澎办。
6.Logistic回歸中的梯度下降
6.1 單個(gè)樣本的情況
- 回顧Logistic回歸
- 公式:
- 計(jì)算步驟(前向嘲碱,計(jì)算loss function):
假設(shè)有兩個(gè)特征,從而所需參數(shù)為
- Step1:計(jì)算
;
- Step2:計(jì)算
局蚀,其中
是sigmoid函數(shù)
;
- Step3:計(jì)算loss function:
麦锯。
即輸入?yún)?shù)計(jì)算損失函數(shù)最小。如圖所示琅绅。
單個(gè)樣本的logistic流程圖
- Step1:計(jì)算
- 計(jì)算步驟(后向扶欣,計(jì)算偏導(dǎo)數(shù))
- Step1:
- Step2:
。所以有
千扶;
- Step3.
- Step4.迭代公式:
- Step1:
- 公式:
6.2
個(gè)樣本的訓(xùn)練集
- 回顧:
其中
- 計(jì)算偏導(dǎo)數(shù)
- 偽代碼流程
# w料祠,b一次迭代的流程
dw_1=0,dw_2=0,db=0,J=0
for i in range(m): #m個(gè)樣本
z(i) = w^T*x(i)+b
a(i) = \sigma(z(i))
J+=-[y(i)log(a(i))+(1-y(i))log(1-a(i))]
dz(i) = a(i)-y(i)
dw_1 += x_1(i)[a(i)-y(i)]
dw_2 += x_2(i)[a(i)-y(i)] #假設(shè)有2個(gè)特征,即n=n_x=2
db += a(i)-y(i)
J/=m
dw_1/=m,dw_2/=m,db/=m
w_1 -=\alpha * dw_1
w_2 -=\alpha * dw_2
b -=\alpha * db
- 說明:
- 該流程有2個(gè)for循環(huán)澎羞,第一個(gè)是遍歷m個(gè)樣本點(diǎn)髓绽,第二個(gè)是遍歷2個(gè)特征。
- 深度學(xué)習(xí)中有大量的數(shù)據(jù)妆绞,所以盡量避免使用顯式的for循環(huán)顺呕,從而引出vectorization。
7.Vectorizaion(向量化)
7.1 向量化
- 只要有其他可能括饶,就不要用顯式for循環(huán)
Whenever possible, avoid explicit for-loops株茶。 - numpy模塊的內(nèi)置函數(shù)
np.exp()
np.log()
np.abs()
- 利用向量化,前面的程序可以修改為
import numpy as np
# w图焰,b一次迭代的流程
dw=np.zeros((n_x,1)),db=0,J=0
for i in range(m): #m個(gè)樣本
z(i) = w^T*x(i)+b
a(i) = \sigma(z(i))
J+=-[y(i)log(a(i))+(1-y(i))log(1-a(i))]
dz(i) = a(i)-y(i)
dw += x(i)[a(i)-y(i)]
db += a(i)-y(i)
J/=m
dw /=m, db/=m
w_1 -=\alpha * dw_1
w_2 -=\alpha * dw_2
b -=\alpha * db
7.2 向量化Logistic回歸
- 回顧:m個(gè)樣本的訓(xùn)練集
,
,
………
,
記,既每一列是一個(gè)樣本启盛,矩陣維數(shù)為
。
既
的行向量。從而上式可寫為
僵闯。A=[a{(1)},a{(2)},…,a{(m)}]笤闯。
z=np.dot(w.T,X)+b
a=\sigma(z)
7.3 向量化Logistic回歸的梯度計(jì)算
- 回顧公式:
- 向量化
所以,.
- Logistic回歸的向量化偽代碼
z = w^T*X + b = np.dot(w^T,X) + b
a = \sigma(z)
dz = A - Y
dw = 1/m*X*dz^T db = 1/m*np.sum(dz)
dw /=m, db/=m
w := w - \alpha * dw
b = b - \alpha * db
8. Python 中的Broadcasting
8.1 Broadcasting
Broadcasting是計(jì)算中對(duì)維數(shù)要求沒有那么嚴(yán)格,可以自己調(diào)整維度以適應(yīng)計(jì)算棍厂。
-
例子
示意矩陣
問題:計(jì)算每種食物中各成分的占比
import numpy as np
A = np.array([[56,0,4.4,68],
[1.2,104,52,8],
[1.8,135,99,0.9]])
cal = A.sum(axis=0)
percentage = A/cal.reshape(1,4)
print(100 * percentage)
Broadcasting維度不必嚴(yán)格要求颗味,但是行或列必須有一個(gè)是相同的,python才能自己復(fù)制成合適維度的矩陣進(jìn)行計(jì)算牺弹。
- MATLAB中類似的是bsxfun函數(shù)浦马。
8.2 編程小技巧
*盡量不要使用秩為1的數(shù)組
a = np.random.randn(5)
使用有明確維度的矩陣
a = np.random.randn(5,1)
可以使用reshape()來改變矩陣的維度
a.reshape(1,5)
可以使用assert()來聲明你希望的矩陣維度
assert(a.shape == (1,5))