吳恩達(dá)《機(jī)器學(xué)習(xí)》學(xué)習(xí)筆記(一)
一、機(jī)器學(xué)習(xí)
什么是神經(jīng)網(wǎng)絡(luò)?
神經(jīng)網(wǎng)絡(luò)類似一個函數(shù)y=f(x),神經(jīng)網(wǎng)絡(luò)可以訓(xùn)練出一個非常精準(zhǔn)的函數(shù)。我們可以借此來完成相關(guān)的下游任務(wù)。
ReLU激活函數(shù),它的全稱是Rectified Linear Unit
為什么要引入ReLU?

1、采用sigmoid等函數(shù),算激活函數(shù)時(指數(shù)運(yùn)算),計算量大,反向傳播求誤差梯度時,求導(dǎo)涉及除法,計算量相對大,而采用Relu激活函數(shù),整個過程的計算量節(jié)省很多。
2、對于深層網(wǎng)絡(luò),sigmoid函數(shù)反向傳播時,很容易就會出現(xiàn)梯度消失的情況(在sigmoid接近飽和區(qū)時,變換太緩慢,導(dǎo)數(shù)趨于0,這種情況會造成信息丟失),從而無法完成深層網(wǎng)絡(luò)的訓(xùn)練。
3、ReLu會使一部分神經(jīng)元的輸出為0,這樣就造成了網(wǎng)絡(luò)的稀疏性,并且減少了參數(shù)的相互依存關(guān)系,緩解了過擬合問題的發(fā)生。
監(jiān)督學(xué)習(xí) supervised learning
監(jiān)督學(xué)習(xí)是機(jī)器學(xué)習(xí)的一周類別,目前使用最多的是在線廣告。
RNN(recurrent neural network):時間序列數(shù)據(jù)處理
CNN(Convolutional neural network):圖像處理
Training時設(shè)計到的數(shù)據(jù)分為structured和unstructured(圖像、語音、文本)
為什么深度學(xué)習(xí)會興起?
數(shù)字化社會提供了大量數(shù)據(jù)信息;在大數(shù)據(jù)的環(huán)境下,深度學(xué)習(xí)取得的效果比傳統(tǒng)機(jī)器學(xué)習(xí)要好;機(jī)器設(shè)備更加先進(jìn);算法不斷更新。
二、Logistic regression
二分類
邏輯回歸是一個用于二分類的算法。
訓(xùn)練部分包括前向和反向傳播
對于圖片數(shù)據(jù),可以提取三通道的像素值來獲取特征向量
一張圖片,需要保存三個矩陣,分別對應(yīng)圖片中的紅、綠、藍(lán)三種顏色通道,代表對應(yīng)圖片中紅、綠、藍(lán)三種像素的強(qiáng)度值。
在python中可以使用 X.shape 來獲取數(shù)據(jù)集矩陣的大小(????, ??) ?Y.shape 獲取對應(yīng)標(biāo)簽(1, ??)
邏輯回歸模型
怎么使用邏輯回歸去處理一個圖像問題?例如這張圖片是不是一只貓? 使用一個簡單的函式

去獲取你這是一只貓的圖片的機(jī)率,利用sigmoid函數(shù)
將值域映射到[0,1]。

同時我們注意到,當(dāng)x的取值在兩端時,函數(shù)的斜率趨近于0,這里會造成梯度消失的現(xiàn)象。
代價函數(shù) cost function
為什么需要代價函數(shù)?
因為需要通過代價函數(shù)來更新我們的參數(shù),代價函數(shù)可以看成一個目標(biāo)函數(shù),放映當(dāng)前模型的好壞程度。
損失函數(shù)loss function
一般我們用預(yù)測值和實際值的平方差或者它們平方差的一半,但是通常在邏輯回歸中我們不這么做,因為當(dāng)我們在學(xué)習(xí)邏輯回歸參數(shù)的時候,會發(fā)現(xiàn)我們的優(yōu)化目標(biāo)不是凸優(yōu)化,只能找到多個局部最優(yōu)值,梯度下降法很可能找不到全局最優(yōu)值,雖然平方差是一個不錯的損失函數(shù),但是我們在邏輯回歸模型中會定義相關(guān)熵?fù)p失函數(shù)

如果??等于1,我們就盡可能讓y變大,如果y等于0,我們就盡可能讓y變小
損失函數(shù)只適用于單個訓(xùn)練樣本,而代價函數(shù)是參數(shù)的總代價,對于每一個樣本的損失函數(shù)求和取平均。
梯度下降gradient decent
實際情況的函數(shù)可能是非凸且有多個local minima ,故我們可以假設(shè)代價函數(shù)為凸函數(shù)初始化參數(shù),也可以隨機(jī)初始化。對于邏輯回歸幾乎所有的初始化方法都有效,因為函數(shù)是凸函數(shù),無論在哪里初始化,應(yīng)該達(dá)到同一點(diǎn)或大致相同的點(diǎn)。
參數(shù)更新:

lr表示學(xué)習(xí)率,用來控制步長。
計算圖
正向

反向(鏈?zhǔn)椒▌t)

對于logistic regression而言,

最后結(jié)果:


對于n個樣本,即取平均進(jìn)行更新
缺點(diǎn):第一個for循環(huán)是一個小循環(huán)遍歷??個訓(xùn)練樣本,第二個for循環(huán)是一個遍歷所有特征的 for循環(huán)。
向量化
z=0
for i in range(n_x)
z+=w[i]*x[i]
z+=b
可以使用z=np.dot(w,x)+b代替
示例代碼
import numpy as np #導(dǎo)入 numpy 庫
?
a = np.array([1,2,3,4]) #創(chuàng)建一個數(shù)據(jù) a
?
print(a)
?
# [1 2 3 4]
?
import time #導(dǎo)入時間庫
?
a = np.random.rand(1000000)
?
b = np.random.rand(1000000) #通過 round 隨機(jī)得到兩個一百萬維度的數(shù)組
?
tic = time.time() #現(xiàn)在測量一下當(dāng)前時間
?
#向量化的版本
?
c = np.dot(a,b)
?
toc = time.time()
?
print(“Vectorized version:” + str(1000*(toc-tic)) +”ms”) #打印一下向量化的版本的時間
?
#繼續(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)的版本的時間
numpy 庫有很多向量函數(shù)。比如 u=np.log 是計算對數(shù)函數(shù)(??????)、np.abs()是計算數(shù)據(jù)的絕對值、np.maximum() 計算元素 ?? 中的最大值,你也可以np.maximum(v,0) 、????2代表獲得元素??每個值得平方、1/??獲取元素 ?? 的倒數(shù)等等。所以當(dāng)你想寫循環(huán)時候,檢查numpy是否存在類似的內(nèi)置函數(shù),從而避免使用循環(huán)(loop)方式。
利用??個訓(xùn)練樣本一次性計算出小寫??和小寫a
Z = np.dot(w.T,X) + b
Broadcast: 實數(shù) ?? 擴(kuò)展成一個 1 × ?? 的行向量

A.sum(axis=0)中的參數(shù)axis。axis用來指明將要進(jìn)行的運(yùn)算是沿著哪個軸執(zhí)行,在numpy中,0軸是垂直的,也就是列,而1軸是水平的,也就是行。


numpy 廣播機(jī)制
矩陣??(3,4)后緣維度的軸長度是4,而矩陣 ??????(1,4)的后緣維度也是4,則他們滿足后緣維度軸長度相符,可以進(jìn)行廣播。廣播會在軸長度為1的維度進(jìn)行,軸長度為1的維度對應(yīng)axis=0,即垂直方向,矩陣cal(1,4)沿axis=0(垂直方向)復(fù)制成為cal_temp(3,4),之后兩者進(jìn)行逐元素除法運(yùn)算。
