1、“比較”這一步會(huì)讓你知道自己的模型錯(cuò)了多少。誤差總是正的屈呕。均方誤差是評(píng)估神經(jīng)網(wǎng)絡(luò)準(zhǔn)確性的常用方法
2、在“預(yù)測(cè)”步驟結(jié)束時(shí)棺亭,“學(xué)習(xí)”這一步會(huì)為每項(xiàng)權(quán)重計(jì)算一個(gè)數(shù)字虎眨。這個(gè)數(shù)字告訴我們,如果想要減少誤差,權(quán)重應(yīng)該向哪個(gè)方向變化嗽桩。然后可以根據(jù)這個(gè)數(shù)字對(duì)權(quán)重做出相應(yīng)的調(diào)節(jié)岳守,直到達(dá)到目的
1 冷熱學(xué)習(xí)
1、冷熱學(xué)習(xí)指的是通過擾動(dòng)權(quán)重來(lái)確定向哪個(gè)方向調(diào)整可以使得誤差的降低幅度最大碌冶,基于此將權(quán)重的值向那個(gè)方向移動(dòng)湿痢,不斷重復(fù)這個(gè)過程,直到誤差趨向于0
2种樱、冷熱學(xué)習(xí)的特點(diǎn):
(1)簡(jiǎn)單 在上一次做出預(yù)測(cè)后蒙袍,模型又進(jìn)行了兩次預(yù)測(cè)俊卤,一次的權(quán)重稍高嫩挤,一次的權(quán)重稍低。權(quán)重實(shí)際調(diào)節(jié)的量取決于哪個(gè)方向所得到的誤差更小
(2)效率低 需要多次預(yù)測(cè)才能進(jìn)行一次權(quán)重更新
(3)有時(shí)無(wú)法準(zhǔn)確的預(yù)測(cè)出目標(biāo) step_amout 是任意選擇的消恍,這可能讓你學(xué)不到正確的權(quán)重值
weight = 0.5
input = 0.5
goal_prediction = 0.8
step_amout = 0.001 #每個(gè)迭代岂昭,權(quán)重應(yīng)該調(diào)節(jié)多少
for iteration in range(1101):
#預(yù)測(cè)
prediction = input * weight
error = (prediction - goal_prediction)**2
print("Error:" + str(error) + " Prediction:" + str(prediction))
#權(quán)重稍高
up_prediction = input * (weight + step_amout)
up_error = (goal_prediction - up_prediction)**2
#權(quán)重稍低
down_prediction = input * (weight - step_amout)
down_error = (goal_prediction - down_prediction)**2
if up_error < down_error:
weight = weight + step_amout
if up_error > down_error:
weight = weight - step_amout
print('weight:' ,weight)
2 基于誤差調(diào)節(jié)權(quán)重
1、相對(duì)與冷熱學(xué)習(xí)狠怨,更高級(jí)的學(xué)習(xí)形式叫作梯度下降(Gradient-Descent )约啊。它可以在一行代碼中同時(shí)進(jìn)行方向和幅度的計(jì)算,對(duì)權(quán)重進(jìn)行調(diào)整以減少錯(cuò)誤
2佣赖、縮放恰矩、負(fù)值反轉(zhuǎn)和停止調(diào)節(jié) 這三個(gè)屬性的共同作用是將純誤差轉(zhuǎn)換為我們所需要的權(quán)重調(diào)節(jié)的絕對(duì)幅度。停止調(diào)節(jié): 當(dāng)輸入是0外傅,那么它將強(qiáng)制 direction_and_amount 也為0;負(fù)值反轉(zhuǎn): 即使輸入是負(fù)值俩檬,那么純誤差乘以輸入將改變 direction_and_amount 的方向萎胰;縮放: 如果輸入很大,則權(quán)重更新也會(huì)變得很大棚辽,這更像一種副作用技竟,因?yàn)樗?jīng)常可能失去控制屈藐。我們可以使用 alpha 來(lái)處理這種情況
weight = 0.5
goal_pred = 0.8
input = 0.5
for iteration in range(20):
pred = input * weight
error = (pred - goal_pred)**2
#pred - goal_pred 為純誤差
#(pred - goal_pred) *input 純誤差與輸入的相乘操作榔组,用于執(zhí)行縮放、負(fù)值反轉(zhuǎn)和停止調(diào)節(jié)
direction_and_amount = (pred - goal_pred) *input
print('direction_and_amount:',direction_and_amount)
weight = weight - direction_and_amount
print("Error:" + str(error) + " Prediction:" + str(pred))
3联逻、對(duì)于任何 input 和 goal_pred搓扯,結(jié)合有關(guān) prediction 和 error 的公式,我們可以在誤差和權(quán)重之間定義一個(gè)精確的關(guān)系遣妥;這里的 input 和 goal_pred 是確定的值擅编,假設(shè)他們分別是0.5和0.8,那么 error 和 weight 關(guān)系就是下面的一元二次方程和圖像;這里需要用到導(dǎo)數(shù)的知識(shí)爱态,可以用兩種方式解釋導(dǎo)數(shù):一種方法是谭贪,將它理解成函數(shù)中的一個(gè)變量在你移動(dòng)另一個(gè)變量時(shí)是如何變化的。另一種說法是锦担,導(dǎo)數(shù)是直線或曲線上一點(diǎn)的斜率
4俭识、神經(jīng)網(wǎng)絡(luò)實(shí)際上就是一件事情:一堆你可以計(jì)算誤差函數(shù)的權(quán)重。對(duì)于任何誤差函數(shù)洞渔,基于任意權(quán)重值套媚,都可以計(jì)算出網(wǎng)絡(luò)的最終誤差。有了這些信息磁椒,就可以改變神經(jīng)網(wǎng)絡(luò)中的每一項(xiàng) weight 堤瘤,將 error 減少到 0 ,這就是你要做的事情
5浆熔、微積分就是記憶和練習(xí)所有可能存在的函數(shù)的每一個(gè)可能的導(dǎo)數(shù)規(guī)則本辐。實(shí)際應(yīng)用中可以在參考資料中查找導(dǎo)數(shù)
6、將權(quán)重值向?qū)?shù)(derivative)的相反方向移動(dòng)医增,就能得到使誤差更小的權(quán)重值慎皱。這種學(xué)習(xí)方法稱為梯度下降法
error = (input * weight - goal_pred)**2
error = (0.5 * weight - 0.8)**2
梯度下降過程如下:
weight,goal_pred,input = (0.0,0.8,1.1)
for iteration in range(4):
print('weight:',weight)
pred = input * weight
error = (pred - goal_pred)**2
delta = pred - goal_pred
weight_delta = input * delta
weight -= weight_delta
print('Error:' + str(error) + ' Prediction:' + str(pred))
print('Delta:' + str(delta) + ' Weight Delta:' + str(weight_delta))
7、如果 input 足夠大叶骨,即使誤差很小茫多,也會(huì)使權(quán)值的增量很大。當(dāng)你的權(quán)重增量(weight_delta = input * delta)很大而誤差很小的時(shí)候忽刽,網(wǎng)絡(luò)會(huì)矯枉過正天揖。這就導(dǎo)致了預(yù)測(cè)結(jié)果爆咋的現(xiàn)象,稱為發(fā)散缔恳。
#將 input 值變?yōu)?時(shí)宝剖,產(chǎn)生發(fā)散現(xiàn)象
weight,goal_pred,input = (0.5,0.8,2)
for iteration in range(20):
print('weight:',weight)
pred = input * weight
error = (pred - goal_pred)**2
delta = pred - goal_pred
weight_delta = input * delta
weight -= weight_delta
print('Error:' + str(error) + ' Prediction:' + str(pred))
print('Delta:' + str(delta) + ' Weight Delta:' + str(weight_delta))
8、對(duì)于發(fā)散現(xiàn)象歉甚,解決方案是將權(quán)重的增量乘以一個(gè)比較小系數(shù)万细,讓它變得更小。將權(quán)值增量乘以一個(gè)介于0和1之間的實(shí)數(shù)纸泄,稱為α(alpha)赖钞。隨著時(shí)間推移,如果誤差開始發(fā)散(上升)聘裁,那么alpha值就太高了雪营,需要調(diào)低一點(diǎn)。如果學(xué)習(xí)進(jìn)展太慢衡便,那么 alpha 值太低献起,需要調(diào)高一些洋访。
weight = 0.5
goal_pred = 0.8
input = 2
alpha = 0.1
for iteration in range(20):
pred = input * weight
error = (pred - goal_pred)**2
delta = pred - goal_pred
derivative = input*delta
weight = weight - derivative*alpha
print('Error:' + str(error) + ' Prediction:' + str(pred))
3 參考資料
《深度學(xué)習(xí)圖解》