2.1二元分類(binary classification)
現有一張圖片,大小為:64*64像素。標簽為:是貓則標1,不是貓則標0.
小知識:圖片在計算機中如何表示
保存一張圖片需要三個矩陣,它們分別對應圖中的紅、綠、藍三種顏色通道。若圖片大小為64*64像素,那么就有三個64*64的矩陣,這三個矩陣表示圖片紅色,綠色,藍色的像素強度值分別是多少。為了方便理解,現在有一個大小為54像素的圖片如上圖。為了方便表示,需要將三個矩陣放入一個向量中,先去紅色,再取綠色,最后取藍色,因此就形成了一個大向量,若圖片大小為64*64像素,那么向量的維度為(64*64*3,1)。
關於數據集的符號約定
將數據向量化處理:
2.2 logistic regression
對於一個二元分類問題:給定一個輸入特征向量來表示一張圖片,識別這張圖片是貓( )或者不是貓(
)。
算法思路:
給定一個向量 ,輸出為
,這是一個預測值,針對這一問題,我們將其定義為:輸入一張圖片的特征向量
,那么這張圖片是貓也就是
(數據的標簽)的概率,數學表達為:
一些符號定義:
求解方法:
- 法一:線性回歸
實際上這是行不通的,原因是: 的取值范圍是0到1,而上述式子取值為正無窮到負無窮。
- 法二:將線性函數轉化為非線性
這里采用Sigmoid非線性函數。
關於Sigmoid函數:
- 公式:
- 圖形
- 一些性質
z=0時,對應值為0.5;z趨於正無窮時,值為1;z趨於負無窮大時,值為0。
2.3 logistic regression cost function
為了讓模型通過有標簽的樣本調整權重向量W和偏差b,需要定義一個函數來衡量 之間的差距,上圖中,上角標
。
- 損失函數
用來衡量單個樣本的預測值 和實際值
有多接近。
常見的損失函數有:
但是在logistic regression中學習參數的過程中,優化目標是非凸的,只能找到多個局部最優值,采用梯度下降法很可能找不到全局最優解。
在logistic regression中采用的損失函數為:
采用損失函數學習參數的過程中是希望損失函數盡可能的小,這里給出采用這個損失函數的簡要說明:
1.當 時,
,若要損失函數盡可能小,則
趨近於1.
2.當 時,
,若要損失函數盡可能小,則
趨近於0。
- 代價函數
損失函數是在單個訓練樣本中定義的,衡量的是算法在單個樣本中的表現情況。為了衡量算法在整個訓練集中的表現,需要定義代價函數。
假設訓練集有 個樣本,則代價函數為:
在訓練logistic regression時就是通過將代價函數最小從而學到參數 。
2.4 梯度下降法
算法朝着最陡的方向更新參數,也就是朝着梯度的方向更新參數。
訓練算法的目的就是通過找到上圖曲面的最小值,從而得到參數 。這是一個凸函數,采用梯度下降算法可以找到最小值。
現只考慮W來具體講述梯度下降算法。
這時采用梯度下降算法來更新參數W,只要算法收斂前就重復執行下面的程式。
其中 為學習率,用來控制步長,也就是向着梯度方向走一步的長度。
當兩個參數都考慮時,也就是在 的曲面上找全局最優解,參數更新如下。
2.7 計算圖
從一個簡單例子說起:
畫出計算圖:
驗證是否畫對:
實際值為 ,因此畫對了。
在采用梯度下降算法時,需要用到導數,這就需要反向傳播,從而更新參數。
上面講述了從左到右的計算過程,也就是正向傳播;下面將講述反向傳播過程,這是在計算導數。
反向傳播計算導數:
2.8 Logistic Regression 中的梯度下降法
以單個樣本為例說明
引入一些變量對模型進行分解來畫出計算圖:
假設樣本只有兩個特征 ,則有
。
正向傳播:
反向傳播計算導數:
由於需要學習的參數是w和b,因此,x的導數不用計算,計算結果如下:
更新參數:
2.8 m個樣本的梯度下降法
前面介紹了單個樣本的梯度下降法,現在介紹m個樣本的梯度下降法。
現知道m個樣本的損失也就是代價函數,其實這也就是樣本1到m項的各個損失的平均,所以它表示代價函數對權重參數的微分。為此,讓算法遍歷m個樣本以后得到權重參數和偏差參數的微分在m個樣本上的總和,然后求其平均值,這個值就是全局梯度值,將其用來更新權重參數和偏差參數就是實現了m個樣子的梯度下降法。
具體實現:
最后就是更新參數:
方法缺點
該方法需要用到兩個for循環,第一個for循環是一個小循環來遍歷m個樣本;第二個for循環是一個遍歷所有特征的for循環。這里只有兩個特征,但是當特征很多時候需要用到for循環。
在深度學習算法中,樣本數量很大,特征的數量規模也是很龐大的,因此,for循環是非常低效的,代碼可能要花費很長的時間去運行,可以用接下來講的向量化技術來解決這個問題。
2.9 向量化
作用:消除代碼中的for循環。
如果訓練樣本數量很大或者特征很多,向量化技術非常有必要。
給出向量化技術和非向量化技術運算時間的比較:
import numpy as np #導入numpy庫 a = np.array([1,2,3,4])#建立一個數組 print(a)#打印出這個數組 import time #導入時間庫 a = np.random.rand(1000000) b = np.random.rand(1000000)#建立兩個一百萬維度的數組 tic = time.time() #測量一下當下時間 #下面用分別用向量化版本和非向量化版本來從上面建立的數組進行相同運算從而比較哪種版本的運算更快 # 向量化的版本 c = np.dot(a,b) toc = time.time()#計算當下的時間(運算結束后的時間) print(c)#輸出運算結果 print("向量化版本:"+ str(1000*(toc-tic))+"ms")#打印向量化版本的時間 #繼續增加非向量化版本 c = 0 tic = time.time()#測出程序執行到此處的時間 for i in range(1000000): c += a[i]*b[i] toc = time.time()#測出運算結束后的時間 print(c) print("for循環:" + str(1000*(toc-tic))+"ms")#打印for循環版本的時間
最終結果:
2.10 更多向量化的例子
1)將左邊轉化為右邊
for循環的實現:
u = np.zeros((n,1))
for i in range(n):
u[i] = math.exp(v[i])
向量化版本實現:
import numpy as np
u = np.exp(v)
2)邏輯回歸的向量化
采用for循環時:
將其改為采用向量化實現:
這里采用向量化替代了原來的多個特征采用for循環的實現邏輯,大大提高了算法運行速度。
但是,還有一個遍歷樣本數量的for循環。
2.11 Logistic Regression正向傳播的向量化
當沒有采用向量化時候,需要用for循環計算出下圖
現采用向量化:
step1:設樣本集為 ,維度為
,行表示特征維,列表示樣本數量。
step2:
上圖在python中的實現代碼為:
Z = np.dot(w.T,X)+b
step3:
在python中的實現見本周編程作業。
一個小知識:
在step2中的b表示一個數值,但是b是和一個矩陣在相加,我們知道只有同型矩陣才能相加,這里運用了python的廣播(brosdcasting)機制。
2.12 Logistic Regression反向傳播的向量化
關於
for循環時為:
利用向量化處理則有:
關於權重的梯度:
采用for循環時:
現采用向量化實現:
關於偏差的梯度:
for循環時:
現采用向量化實現:
給出整個邏輯回歸的for循環與向量化的對比:
如果我們想要多次對整個樣本集使用多次梯度下降,還是需要一個for循環用在最外層。
2.13 python中的廣播技術
計算上圖中,三種營養成分各占該種食物的百分比。
#計算給定食物中三種成分的百分比
import numpy as np
A = np.array([[56.0,0.0,4.4,68.0],
[1.2,104.0,52.0,8.0],
[1.8,135.0,99.0,0.9]])
print(A)
結果:
cal = A.sum(axis=0)#對A的每一列求和
print(cal)
結果:
percentage = 100*A/cal.reshape(1,4)#求出各營養成分的百分比
print(percentage)
結果:
對於這個程序的一些解釋:
1).A.sum(axis = 0)中的axis:用來指明將要進行的運算是沿着哪個軸執行,在numpy中,0是垂直,1是水平,也就是行。
2).A/cal.reshape(1,4)指令則調用了numpy中的廣播機制,這里是的矩陣A除以
的矩陣cal。
從技術的角度來說:並不需要將矩陣cal 重塑為,因為cal本身就是
。
但是當我們不確定矩陣的維度的時候,通常會對矩陣進行重塑來確保得到我們想要的列向量或者行向量。
另一個廣播的例子:
上圖在python中的實現:
同樣有:
python實現:
再有:
總結:
符號前的矩陣為(m,n),則符號后的矩陣擴展為(m,n)。
2.14 關於numpy的說明
本節的重點就是:設置一個數組的時候一定要把維度都設置全,比如要想獲得一個 的數組,那么代碼為:
a = np.random.randn(5,1)
此外要經常使用斷言來看看設置的維度或者計算后的維度是不是我們想要的。
2.15 Logistic Regression的代價函數
上圖是邏輯回歸實現的推理過程,現在我們可以將最后兩行合並成以下公式:
假設: 表示y=1的概率,那么
就是y=0的概率。
我們自然希望概率越大越好,這樣就是算法預測的效果越好。為此我們需要最大化 ,為了更加方便我們對其取對數,則有,最大化
,可以將其寫為:
上面等號后面是我們要最大化的,也就是損失函數的相反數。
現在就把問題轉化為:最小化損失函數了。這樣就可以采用梯度下降法求解損失函數的最小值了從而學得參數:權重矩陣和偏差向量。
上面介紹了單個樣本,現在介紹在整個樣本上是如何建立代價函數的。
假設:
所有的訓練樣本服從同一分布且相互獨立。
因此則有:
所有樣本的概率的乘積就是每個樣本概率的乘積:
現采用最大似然估計使得給定樣本的觀測概率值最大:
由於 ,因此在我們采用算法時是在計算目標函數的最小值,所有需要去掉前面的負號,最后為了方便,我用采用平均化,因此對建立的代價函數進行縮放,則有: