學(xué)習(xí)資源
別人的中文筆記:
李宏毅機(jī)器學(xué)習(xí)筆記(LeeML-Notes)
李宏毅機(jī)器學(xué)習(xí)筆記(LeeML-Notes) - github地址
不這這個(gè)筆記跟我看的上面的視頻不是同一個(gè)寇僧,可能目錄排版有區(qū)別:
視頻:李宏毅《機(jī)器學(xué)習(xí)》
我是比較推薦看上面這份別人的筆記的摊腋,說(shuō)是筆記其實(shí)更像是視頻的文字版,視頻的錄音質(zhì)量很差婉宰,聲音忽大忽小歌豺,而且比較尖銳有點(diǎn)傷聽力推穷,所以我推薦直接看文字版更快更直接心包,有看不懂的再去找對(duì)應(yīng)視頻結(jié)合來(lái)看。
筆記
P1P1ML Lecture 1_ Regression - Case Study
第一節(jié)課非常重要馒铃。
Linear model 線性模型:
: weight蟹腾,權(quán)重
: bias,偏置
: an attribute of input x (feature特征)区宇,輸入的各種不同的屬性即特征娃殖。
Loss Function L:
Input: a function, output: how bad it is.
表示正確的結(jié)果的值,
表示第n只寶可夢(mèng)的cp值议谷。
即是我們預(yù)測(cè)出的值炉爆。
所以整個(gè)式子的意思就是把每一組的正確結(jié)果值與預(yù)測(cè)值的差算出平方,然后再把所有的正確與預(yù)測(cè)差的這個(gè)平方值加在一起。
然后我們要找到一個(gè)最好的Function:
的意思是使后面這個(gè)式子達(dá)到最小值時(shí)的變量的取值芬首。
所以上式的意思就是找到一個(gè)function使Loss function最小赴捞。
由
決定,所以:
使用Gradient Descent梯度下降來(lái)解上式方程:
讀作eta郁稍。表示learning rate赦政,即學(xué)習(xí)率。
對(duì)上式使用微分的連鎖律公式:
連鎖律公式:
得到:
解析后面一項(xiàng):
對(duì)微分時(shí):
對(duì)微分時(shí)
讀作partial耀怜,意思是偏導(dǎo)的意思恢着。
Overfitting: 過擬合。
Regularization: 正則:
做Regularization是為了得到更平滑的Function财破。
讀作:lambda掰派。是個(gè)常數(shù)璧疗。
P2 P2ML Lecture 3-1_ Gradient Descent
Gradient Descent
其中:揪垄,
做梯度下降的過程:
用原參數(shù)減去偏微分跟學(xué)習(xí)率的積得到新的參數(shù)图张,然后一直迭代牲平。
要小心調(diào)節(jié)學(xué)習(xí)率登舞,做梯度下降時(shí)可視化loss結(jié)果來(lái)輔助調(diào)節(jié)學(xué)習(xí)率且蓬。
通常學(xué)習(xí)率是隨著參數(shù)的更新越來(lái)越小会傲。
優(yōu)化方法AdaGrad:
每個(gè)參數(shù)都有不同的learning rate磅废,
讀作sigma纳像。是過去所有的微分值的root mean square即均方根誤差。
Stochastic Gradient Descent:
Stochastic: 隨機(jī)的意思拯勉。
正常的梯度下降是先求總的loss竟趾,再進(jìn)行梯度下降。
隨機(jī)梯度下降是每次隨機(jī)取一個(gè)example 計(jì)算loss后就進(jìn)行梯度下降宫峦。
Feature Scaling:
特征縮放岔帽。
dimension:維度。
**Taylor Series: **
泰勒級(jí)數(shù)导绷。
P3 P3ML Lecture 3-2_ Gradient Descent (Demo by AOE)
沒啥可看犀勒。以《帝國(guó)時(shí)代》地圖舉例,我們永遠(yuǎn)不知道找到的local minimize是不是最小的local minimize妥曲。
P4 P4ML Lecture 3-3_ Gradient Descent (Demo by Minecraft)
沒啥可看贾费。以《我的世界》舉例,梯度下降法在某個(gè)時(shí)間的loss不降反升檐盟。
P5 P5ML Lecture 1_ Regression - Demo
python例子做梯度下降褂萧。
這個(gè)例子對(duì)于理解上面的P1,P2課程內(nèi)容非常有幫助,需要仔細(xì)研究葵萎。
例子我增加了一些注釋导犹。
1. 未特制化learning rate的源碼:
import numpy as np
import matplotlib.pyplot as plt # plt
# wbt解析:
# 調(diào)節(jié)縮小lr唱凯,一開始還是有用的,但是到后來(lái)會(huì)overfitting谎痢,所以請(qǐng)參看使用特制lr順利收斂的lhy1.2.py波丰。
# 特制lr的修改:
# 對(duì) b 和 w 給予特制化的Learning Rate:
# 學(xué)習(xí)率 lr 改為 1,lr_b = 0; lr_w = 0 ;
# 對(duì)b舶得、w定制化的學(xué)習(xí)率lr,采用Adagard
# b = b - lr / np.sqrt(lr_b) * b_grad ; w = w - lr / np.sqrt(lr_w) * w_grad
x_data = [338, 333, 328, 207, 226, 25, 179, 60, 208, 606]
y_data = [640, 633,619, 393, 428, 27, 193, 66, 226, 1591]
# ydata = b + w*xdata # 公式
# np.arange函數(shù)用于創(chuàng)建等差數(shù)組掰烟,參數(shù):
# start:可忽略不寫,默認(rèn)從0開始;起始值
# stop:結(jié)束值沐批;生成的元素不包括結(jié)束值
# step:可忽略不寫纫骑,默認(rèn)步長(zhǎng)為1;步長(zhǎng)
# dtype:默認(rèn)為None九孩,設(shè)置顯示元素的數(shù)據(jù)類型
x = np.arange(-200, -100, 1) # bias
y = np.arange(-5, 5, 0.1) # weight
Z = np.zeros((len(x), len(y))) # 生成len(x)行l(wèi)en(y)列的零矩陣
# X,Y = np.meshgrid(x, y) # 生成網(wǎng)格點(diǎn)坐標(biāo)矩陣, 代碼其實(shí)沒用到先馆。
# Z用來(lái)畫等高線的
for i in range(len(x)):
for j in range(len(y)):
b = x[i]
w = y[j]
Z[j][i] = 0
for n in range(len(x_data)):
Z[j][i] = Z[j][i] + (y_data[n] - b - w*x_data[n])**2
Z[j][i] = Z[j][i]/len(x_data)
# ydata = b + w*xdata
b = -120 # intial b
w = -4 # intial w
lr = 0.0000001 # learning rate
iteration = 100000
# store initial values for plotting
b_history = [b]
w_history = [w]
# iterations
for i in range(iteration): #進(jìn)行10萬(wàn)次迭代
b_grad = 0.0
w_grad = 0.0
# 計(jì)算所有l(wèi)oss,并且把所有l(wèi)oss相加
for n in range(len(x_data)):
# 2.0*(y_data[n] - b - w*x_data[n])*1.0 套用使用微分連鎖律公式后的結(jié)果計(jì)算loss
# b_grad -躺彬, 使用減號(hào)是因?yàn)楹竺嬖臼?1.0煤墙,把負(fù)號(hào)提取出來(lái)到前面了
b_grad = b_grad - 2.0*(y_data[n] - b - w*x_data[n])*1.0
# 2.0*(y_data[n] - b - w*x_data[n])*x_data[n] 套用使用微分連鎖律公式后的結(jié)果計(jì)算loss
# b_grad -, 使用減號(hào)是因?yàn)楹竺嬖臼?x_data[n]宪拥,把負(fù)號(hào)提取出來(lái)到前面了
w_grad = w_grad - 2.0*(y_data[n] - b - w*x_data[n])*x_data[n]
# 更新參數(shù): P2 P2ML Lecture 3-1_ Gradient Descent筆記的圖1的公式
# update parameters
b = b - lr*b_grad
w = w - lr*w_grad
# store parameters for plotting
b_history.append(b)
w_history.append(w)
# plot the figure
#plt.contourf: 填充等高線
plt.contourf(x, y, Z, 50, alpha=0.5, cmap=plt.get_cmap('jet'))
# 李宏毅課程原代碼為markeredeweight=3,無(wú)法運(yùn)行仿野,改為了marker=3。
# ms和marker分別代表指定點(diǎn)的長(zhǎng)度和寬度她君。
plt.plot([-188.4], [2.67], 'x', ms=6, marker=6, color='orange') # 目標(biāo)點(diǎn)
plt.plot(b_history, w_history, 'o-', ms=3, lw=1.5, color='black')# 梯度下降的路線圖
plt.xlim(-200, -100)
plt.ylim(-5, 5)
plt.xlabel(r'$b$', fontsize=16)
plt.ylabel(r'$w$', fontsize=16)
plt.show()
2. 特制化learning rate后順利收斂的源碼:
import numpy as np
import matplotlib.pyplot as plt # plt
# wbt解析:
# 特制lr的修改:
# 對(duì) b 和 w 給予特制化的Learning Rate:
# 學(xué)習(xí)率 lr 改為 1脚作,lr_b = 0; lr_w = 0 ;
# 對(duì)b、w定制化的學(xué)習(xí)率lr,采用Adagard
# b = b - lr / np.sqrt(lr_b) * b_grad ; w = w - lr / np.sqrt(lr_w) * w_grad
x_data = [338, 333, 328, 207, 226, 25, 179, 60, 208, 606]
y_data = [640, 633,619, 393, 428, 27, 193, 66, 226, 1591]
# ydata = b + w*xdata # 公式
# np.arange函數(shù)用于創(chuàng)建等差數(shù)組缔刹,參數(shù):
# start:可忽略不寫球涛,默認(rèn)從0開始;起始值
# stop:結(jié)束值;生成的元素不包括結(jié)束值
# step:可忽略不寫校镐,默認(rèn)步長(zhǎng)為1亿扁;步長(zhǎng)
# dtype:默認(rèn)為None,設(shè)置顯示元素的數(shù)據(jù)類型
x = np.arange(-200, -100, 1) # bias
y = np.arange(-5, 5, 0.1) # weight
Z = np.zeros((len(x), len(y))) # 生成len(x)行l(wèi)en(y)列的零矩陣
# X,Y = np.meshgrid(x, y) # 生成網(wǎng)格點(diǎn)坐標(biāo)矩陣, 代碼其實(shí)沒用到鸟廓。
# Z用來(lái)畫等高線的
for i in range(len(x)):
for j in range(len(y)):
b = x[i]
w = y[j]
Z[j][i] = 0
for n in range(len(x_data)):
Z[j][i] = Z[j][i] + (y_data[n] - b - w*x_data[n])**2
Z[j][i] = Z[j][i]/len(x_data)
# ydata = b + w*xdata
b = -120 # intial b
w = -4 # intial w
lr = 1 # 0.0000001 # learning rate
iteration = 100000
# store initial values for plotting
b_history = [b]
w_history = [w]
# 對(duì)b从祝、w定制化的學(xué)習(xí)率lr
lr_b = 0
lr_w = 0
# iterations
for i in range(iteration): #進(jìn)行10萬(wàn)次迭代
b_grad = 0.0
w_grad = 0.0
# 計(jì)算所有l(wèi)oss,并且把所有l(wèi)oss相加
for n in range(len(x_data)):
# 2.0*(y_data[n] - b - w*x_data[n])*1.0 套用使用微分連鎖律公式后的結(jié)果計(jì)算loss
# b_grad -肝箱, 使用減號(hào)是因?yàn)楹竺嬖臼?1.0哄褒,把負(fù)號(hào)提取出來(lái)到前面了
b_grad = b_grad - 2.0*(y_data[n] - b - w*x_data[n])*1.0
# 2.0*(y_data[n] - b - w*x_data[n])*x_data[n] 套用使用微分連鎖律公式后的結(jié)果計(jì)算loss
# b_grad -稀蟋, 使用減號(hào)是因?yàn)楹竺嬖臼?x_data[n]煌张,把負(fù)號(hào)提取出來(lái)到前面了
w_grad = w_grad - 2.0*(y_data[n] - b - w*x_data[n])*x_data[n]
# 更新參數(shù): P2 P2ML Lecture 3-1_ Gradient Descent筆記的圖1的公式
# update parameters
# b = b - lr*b_grad
# w = w - lr*w_grad
#Adagard公式參看:P2 P2ML Lecture 3-1_ Gradient Descent筆記的圖5
# 對(duì)b、w定制化的學(xué)習(xí)率lr,采用Adagard
lr_b = lr_b + b_grad ** 2
lr_w = lr_w + w_grad ** 2
# update parameters
# 對(duì)b退客、w定制化的學(xué)習(xí)率lr,采用Adagard
b = b - lr / np.sqrt(lr_b) * b_grad
w = w - lr / np.sqrt(lr_w) * w_grad
# store parameters for plotting
b_history.append(b)
w_history.append(w)
# plot the figure
#plt.contourf: 填充等高線
plt.contourf(x, y, Z, 50, alpha=0.5, cmap=plt.get_cmap('jet'))
# 李宏毅課程原代碼為markeredeweight=3,無(wú)法運(yùn)行骏融,改為了marker=3链嘀。
# ms和marker分別代表指定點(diǎn)的長(zhǎng)度和寬度。
plt.plot([-188.4], [2.67], 'x', ms=6, marker=6, color='orange') # 目標(biāo)點(diǎn)
plt.plot(b_history, w_history, 'o-', ms=3, lw=1.5, color='black')# 梯度下降的路線圖
plt.xlim(-200, -100)
plt.ylim(-5, 5)
plt.xlabel(r'$b$', fontsize=16)
plt.ylabel(r'$w$', fontsize=16)
plt.show()
看代碼進(jìn)一步了解到:
迭代的目的:
10萬(wàn)次迭代是為了不斷執(zhí)行梯度下降使bias, weight, learning rate不斷更新趨近目標(biāo)档玻。
P6 P6ML Lecture 0-2_ Why we need to learn machine learning_
沒啥可看怀泊,可以跳過。
P7 P7The Next Step for Machine Learning
可以不看也可以看看玩误趴。
P8 P8ML Lecture 2_ Where does the error come from_
這節(jié)課跟概率相關(guān)霹琼。
可以跟這篇一起看:理解Bias(偏差),Error(誤差)凉当,和Variance(方差)的區(qū)別和聯(lián)系枣申?
Bias(偏差)反映的是模型在樣本上的輸出與真實(shí)值之間的誤差,即模型本身的精準(zhǔn)度看杭。
Variance(方差)反映的是模型每一次輸出結(jié)果與模型輸出期望之間的誤差忠藤,即模型的穩(wěn)定性。在概率論和統(tǒng)計(jì)學(xué)中方差是衡量隨機(jī)變量或一組數(shù)據(jù)時(shí)離散程度的度量楼雹。
一模孩、Bias和模型復(fù)雜度的關(guān)系:當(dāng)模型復(fù)雜度上升時(shí),Bias減小贮缅。當(dāng)模型復(fù)雜度降低時(shí)榨咐,Bias增加。(反比關(guān)系)
二谴供、Variance和模型復(fù)雜度的關(guān)系:當(dāng)模型復(fù)雜度低時(shí)祭芦,Variance更低,當(dāng)模型復(fù)雜度高時(shí)憔鬼,Variance更高龟劲。(正比關(guān)系)
實(shí)際情景中我們?cè)趺磁袛嘧约旱哪P褪荁ias大還是Variance大呢,這個(gè)就要看到底是你的模型無(wú)法盡量大的擬合你的樣本還是你的模型高度擬合你的樣本但是用測(cè)試數(shù)據(jù)算時(shí)誤差又很大轴或。前者就是應(yīng)該bias大導(dǎo)致的昌跌,也就是模型復(fù)雜度太低導(dǎo)致的。后者就是因?yàn)槟P蛷?fù)雜度高導(dǎo)致Variance高導(dǎo)致的照雁。
偏差Bias蚕愤,方差Variance:
Large Bias,Small Variance集中但偏離目標(biāo)饺蚊。欠擬合萍诱。
解決辦法:
1. 重寫model添加更多的參數(shù).
2. 更復(fù)雜的model。
Small Bias污呼,Large Variance離目標(biāo)近雖然不能都命中紅心但是平均后接近紅心裕坊。過擬合。
解決辦法:
1. 更多的數(shù)據(jù)燕酷,但是現(xiàn)實(shí)可能沒有那么多數(shù)據(jù)籍凝,可以根據(jù)對(duì)問題的理解自己模擬數(shù)據(jù)周瞎。
2. Regularization:使曲線更平滑。
Public Testing Set的err一般大于Private Testing Set饵蒂。
Training Set分成多份分組Traning Set和Validation声诸,然后計(jì)算出多個(gè)model的結(jié)果,取平均錯(cuò)誤最小的也就是最好的結(jié)果退盯。
P9 P9ML Lecture 4_ Classification
分類Classification彼乌。
使用高斯分布即正態(tài)分布。