01.神经网络和深度学习 W2.神经网络基础
文章目錄
- 1. 二分類
- 2. 邏輯回歸
- 3. 邏輯回歸損失函數(shù)
- 4. 梯度下降
- 5. 導(dǎo)數(shù)
- 6. 計(jì)算圖導(dǎo)數(shù)計(jì)算
- 7. 邏輯回歸中的梯度下降
- 8. m個(gè)樣本的梯度下降
- 9. 向量化
- 10. 向量化的更多例子
- 11. 向量化 logistic 回歸
- 12. 向量化 logistic 回歸梯度輸出
- 13. numpy 廣播機(jī)制
- 14. 關(guān)于 python / numpy 向量的說明
- 作業(yè)
參考:
吳恩達(dá)視頻課
深度學(xué)習(xí)筆記
1. 二分類
- 判斷圖片中動(dòng)物是貓?不是貓? 特征向量 是 3通道的RGB矩陣 展平
2. 邏輯回歸
3. 邏輯回歸損失函數(shù)
幾種常見的損失函數(shù)
L(y^(i),y(i))=?(y(i)log?(y^(i))+(1?y(i))log?(1?y^(i)))L\left(\hat{y}^{(i)}, y^{(i)}\right)=-\left(y^{(i)} \log \left(\hat{y}^{(i)}\right)+\left(1-y^{(i)}\right) \log \left(1-\hat{y}^{(i)}\right)\right)L(y^?(i),y(i))=?(y(i)log(y^?(i))+(1?y(i))log(1?y^?(i)))
交叉熵?fù)p失函數(shù),常用于二分類問題。
代價(jià)函數(shù):
- 所有的樣本的損失函數(shù)的平均值
J(w,b)=1m∑i=1mL(y^(i),y(i))=?1m∑i=1m[y(i)log?(y^(i))+(1?y(i))log?(1?y^(i))]J(w, b)=\frac{1}{m} \sum_{i=1}^{m} L\left(\hat{y}^{(i)}, y^{(i)}\right)=-\frac{1}{m} \sum_{i=1}^{m}\left[y^{(i)} \log \left(\hat{y}^{(i)}\right)+\left(1-y^{(i)}\right) \log \left(1-\hat{y}^{(i)}\right)\right]J(w,b)=m1?i=1∑m?L(y^?(i),y(i))=?m1?i=1∑m?[y(i)log(y^?(i))+(1?y(i))log(1?y^?(i))]
目標(biāo)就是找到合適的參數(shù),使得代價(jià)函數(shù)最小化
4. 梯度下降
如何尋找合適的 w,bw,bw,b 使得代價(jià)函數(shù)最小呢?
迭代的過程中,不斷的在各參數(shù)的偏導(dǎo)數(shù)方向上更新參數(shù)值,α\alphaα 是學(xué)習(xí)率
w:=w?α?J(w,b)?wb:=b?α?J(w,b)?b\begin{array}{l}w:=w-\alpha \frac{\partial J(w, b)}{\partial w} \\ \\ b:=b-\alpha \frac{\partial J(w, b)}{\partial b}\end{array}w:=w?α?w?J(w,b)?b:=b?α?b?J(w,b)??
5. 導(dǎo)數(shù)
函數(shù)在某一點(diǎn)的斜率,在不同的點(diǎn),斜率可能是不同的。
6. 計(jì)算圖導(dǎo)數(shù)計(jì)算
鏈?zhǔn)角髮?dǎo)法則:
7. 邏輯回歸中的梯度下降
z=wTx+by^=a=σ(z)L(a,y)=?(ylog?(a)+(1?y)log?(1?a))\begin{array}{l}z=w^{T} x+b \\ \hat{y}=a=\sigma(z) \\ \mathcal{L}(a, y)=-(y \log (a)+(1-y) \log (1-a))\end{array}z=wTx+by^?=a=σ(z)L(a,y)=?(ylog(a)+(1?y)log(1?a))?
sigmoid 函數(shù):f(z)=11+e?zf(z)=\frac{1}{1+e^{-z}}f(z)=1+e?z1?
sigmoid 求導(dǎo):
?f(z)?z=?1??1?e?z(1+e?z)2=e?z(1+e?z)2=1+e?z?1(1+e?z)2=11+e?z?1(1+e?z)2=11+e?z(1?11+e?z)=f(z)(1?f(z))\begin{aligned} \frac{\partial f(z)}{\partial z} &=\frac{-1 *-1 * e^{-z}}{\left(1+e^{-z}\right)^{2}}\\ &=\frac{e^{-z}}{\left(1+e^{-z}\right)^{2}}\\ &=\frac{1+e^{-z}-1}{\left(1+e^{-z}\right)^{2}}\\ &=\frac{1}{1+e^{-z}}-\frac{1}{\left(1+e^{-z}\right)^{2}}\\ &=\frac{1}{1+e^{-z}}\left(1-\frac{1}{1+e^{-z}}\right) \\ &=f(z)(1-f(z))\end{aligned}?z?f(z)??=(1+e?z)2?1??1?e?z?=(1+e?z)2e?z?=(1+e?z)21+e?z?1?=1+e?z1??(1+e?z)21?=1+e?z1?(1?1+e?z1?)=f(z)(1?f(z))?
?L?a=?ya+1?y1?a?L?z=?L?a?a?z=(?ya+1?y1?a)?a(1?a)=a?y?L?w1=?L?z?z?w1=x1(a?y)nameddw1?L?w2=?L?z?z?w2=x2(a?y)nameddw2?L?b=?L?z?z?b=a?ynameddb\begin{aligned} \frac{\partial\mathcal{L}}{\partial a} &= -\frac{y}{a}+\frac{1-y}{1-a}\\ \frac{\partial\mathcal{L}}{\partial z} &= \frac{\partial\mathcal{L}}{\partial a}\frac{\partial{a}}{\partial z} = \bigg(-\frac{y}{a}+\frac{1-y}{1-a}\bigg)*a(1-a)=a-y\\ \frac{\partial\mathcal{L}}{\partial w_1} &=\frac{\partial\mathcal{L}}{\partial z}\frac{\partial{z}}{\partial w_1} = x_1(a-y) \quad named \quad dw_1\\ \frac{\partial\mathcal{L}}{\partial w_2} &=\frac{\partial\mathcal{L}}{\partial z}\frac{\partial{z}}{\partial w_2} = x_2(a-y) \quad named \quad dw_2\\ \frac{\partial\mathcal{L}}{\partial b} &=\frac{\partial\mathcal{L}}{\partial z}\frac{\partial{z}}{\partial b} = a-y \quad\quad\quad named \quad db\\ \end{aligned} ?a?L??z?L??w1??L??w2??L??b?L??=?ay?+1?a1?y?=?a?L??z?a?=(?ay?+1?a1?y?)?a(1?a)=a?y=?z?L??w1??z?=x1?(a?y)nameddw1?=?z?L??w2??z?=x2?(a?y)nameddw2?=?z?L??b?z?=a?ynameddb?
w1:=w1?α?dw1w2:=w2?α?dw2b:=b?α?db\begin{array}{l}w_1:=w_1-\alpha *dw_1 \\ w_2 :=w_2-\alpha *dw_2 \\ b:=b-\alpha* db\end{array}w1?:=w1??α?dw1?w2?:=w2??α?dw2?b:=b?α?db?
8. m個(gè)樣本的梯度下降
假設(shè)有m個(gè)樣本,樣本有2個(gè)特征
// 偽代碼 from http://www.ai-start.com/dl2017/html/lesson1-week2.html J=0; dw1=0; dw2=0; db=0; for i = 1 to mz(i) = wx(i)+b;a(i) = sigmoid(z(i));J += -[y(i)log(a(i))+(1-y(i))log(1-a(i))];dz(i) = a(i)-y(i);dw1 += x1(i)dz(i); // 全部樣本的梯度累加dw2 += x2(i)dz(i);db += dz(i);// 求平均值 J /= m; dw1 /= m; dw2 /= m; db /= m;// 更新參數(shù) w, b w = w - alpha*dw b = b - alpha*db- 顯式的使用 for 循環(huán)是很低效的,要使用向量化技術(shù) 加速計(jì)算速度
9. 向量化
使用 numpy 等庫實(shí)現(xiàn)向量化計(jì)算,效率更高
import numpy as np #導(dǎo)入numpy庫 a = np.array([1,2,3,4]) #創(chuàng)建一個(gè)數(shù)據(jù)a print(a) # [1 2 3 4] import time #導(dǎo)入時(shí)間庫 a = np.random.rand(1000000) b = np.random.rand(1000000) #通過round隨機(jī)得到兩個(gè)一百萬維度的數(shù)組tic = time.time() #現(xiàn)在測(cè)量一下當(dāng)前時(shí)間 #向量化的版本 c = np.dot(a,b) toc = time.time() print(c) print('Vectorized version:' + str(1000*(toc-tic)) +'ms') #打印一下向量化的版本的時(shí)間#繼續(xù)增加非向量化的版本 c = 0 tic = time.time() for i in range(1000000):c += a[i]*b[i] toc = time.time() print(c) print('For loop:' + str(1000*(toc-tic)) + 'ms')#打印for循環(huán)的版本的時(shí)間上面例子,向量化計(jì)算快了600多倍
250241.79388712568 Vectorized version:0.9975433349609375ms 250241.7938871326 For loop:687.734842300415ms10. 向量化的更多例子
J=0; db=0; dw = np.zeros((nx,1)) // numpy向量化 for i = 1 to mz(i) = wx(i)+b;a(i) = sigmoid(z(i));J += -[y(i)log(a(i))+(1-y(i))log(1-a(i))];dz(i) = a(i)-y(i);dw += x(i)dz(i); // 向量化,全部樣本的梯度累加db += dz(i);// 求平均值 J /= m; dw /= m;// 向量化 db /= m;// 更新參數(shù) w, b w = w - alpha*dw b = b - alpha*db這樣就把內(nèi)層的 dw1,... dwn 的計(jì)算使用向量化了,只用1層 for 循環(huán),還可以做的更好,往下看
11. 向量化 logistic 回歸
邏輯回歸前向傳播步驟:
- 對(duì)每個(gè)樣本進(jìn)行計(jì)算
z(1)=wTx(1)+bz^{(1)}=w^{T} x^{(1)}+bz(1)=wTx(1)+b - 計(jì)算激活函數(shù),得到預(yù)測(cè)值 y`
a(1)=σ(z(1))a^{(1)} = \sigma(z^{(1)})a(1)=σ(z(1))
可以使用 numpy 來計(jì)算:
- Z=np.dot(wT,X)+bZ = np.dot(w^T, X)+bZ=np.dot(wT,X)+b,+ b 會(huì)對(duì)每個(gè)元素操作,是 numpy 的廣播機(jī)制
- A=[a(1)a(2)…a(m)]=σ(Z)A=\left[a^{(1)} a^{(2)} \ldots a^{(m)}\right]=\sigma(Z)A=[a(1)a(2)…a(m)]=σ(Z)
這樣就沒有顯式使用 for 循環(huán),計(jì)算非常高效
12. 向量化 logistic 回歸梯度輸出
Z=wTX+b=np.dot(w.T,X)+bA=σ(Z)dZ=A?Ydw=1m?X?dZTdb=1m?np.sum(dZ)w:=w?a?dwb:=b?a?db\begin{array}{l}Z=w^{T} X+b=n p . d o t(w . T, X)+b \\ A=\sigma(Z) \\ d Z=A-Y \\ d w=\frac{1}{m} * X * d Z^{T} \\ d b=\frac{1}{m} * n p . sum(d Z) \\ w:=w-a * d w \\ b:=b-a * d b\end{array}Z=wTX+b=np.dot(w.T,X)+bA=σ(Z)dZ=A?Ydw=m1??X?dZTdb=m1??np.sum(dZ)w:=w?a?dwb:=b?a?db?
非向量化、向量化對(duì)比:
- 這樣就向量化的計(jì)算,完成了邏輯回歸的 1 次迭代,要完成 n_iter 次迭代就在外層加一層 for 循環(huán),這個(gè) for 是省不了的
13. numpy 廣播機(jī)制
import numpy as npA = np.array([[56, 0, 4.4, 68],[1.2, 104, 52, 8],[1.8, 135, 99, 0.9] ])cal = A.sum(axis=0) # 按列求和 print(cal)percentage = 100 * A / cal.reshape(1, 4) print(percentage) [ 59. 239. 155.4 76.9] [[94.91525424 0. 2.83140283 88.42652796][ 2.03389831 43.51464435 33.46203346 10.40312094][ 3.05084746 56.48535565 63.70656371 1.17035111]]axis指明運(yùn)算 沿著哪個(gè)軸執(zhí)行,在numpy中,0軸是垂直的,也就是列,而1軸是水平的,也就是行
- 例1
- 例2
- 例3
- 廣播機(jī)制與執(zhí)行的運(yùn)算種類無關(guān)
14. 關(guān)于 python / numpy 向量的說明
- 總是使用 nx1 維矩陣(列向量),或者 1xn 維矩陣(行向量)
- 為了確保所需要的維數(shù)時(shí),不要羞于 reshape 操作
作業(yè)
01.神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí) W2.神經(jīng)網(wǎng)絡(luò)基礎(chǔ)(作業(yè) - 邏輯回歸 圖片識(shí)別)
總結(jié)
以上是生活随笔為你收集整理的01.神经网络和深度学习 W2.神经网络基础的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 1550. 存在连续三
- 下一篇: 天池 在线编程 高效作业处理服务(01背