寫在前面:感謝北京大學(xué)軟件與微電子學(xué)院的曹教授所授知識(shí)躏仇。
1.1人工智能三學(xué)派:
i.? 行為主義(感知-動(dòng)作控制系統(tǒng)蕾各,控制論)
ii.? 符號(hào)主義(基于算術(shù)邏輯表達(dá)式,問題->表達(dá)式->求解表達(dá)式)
iii.? 連接主義(仿生學(xué)询张,模擬神經(jīng)元連接關(guān)系劈榨,實(shí)現(xiàn)感性思維)
1.2神經(jīng)網(wǎng)絡(luò)設(shè)計(jì)過程
????1.2.1 神經(jīng)網(wǎng)絡(luò)的一般過程:
????????①? 準(zhǔn)備數(shù)據(jù):采集大量(輸入特征和標(biāo)簽)數(shù)據(jù)對(duì)構(gòu)成數(shù)據(jù)集
????????②? 搭建網(wǎng)絡(luò):搭建神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)
????????③? 優(yōu)化參數(shù):往網(wǎng)絡(luò)喂入數(shù)據(jù),訓(xùn)練粒梦,獲取最佳參數(shù)(反傳)
????????④? 應(yīng)用網(wǎng)絡(luò):將網(wǎng)絡(luò)保存為模型亮航,輸入新數(shù)據(jù),輸出分類或預(yù)測結(jié)果(前傳)
????1.2.2 神經(jīng)網(wǎng)絡(luò)的具體設(shè)計(jì)
? ??1.2.3 損失函數(shù)(以鶯尾花的分類為例)
搭建網(wǎng)絡(luò)時(shí)谍倦,會(huì)隨機(jī)初始化所有參數(shù)(如wi權(quán)值,和b偏置)泪勒。
輸入特征xi為鶯尾花的各項(xiàng)數(shù)據(jù)(葉長葉寬等)昼蛀,輸出yi分別對(duì)應(yīng)鶯尾花的三種分類宴猾。
輸出值得分最高的就越有可能是該種類型〉鹦可此次(第一次)分類結(jié)果卻不對(duì)仇哆。(輸入特征對(duì)應(yīng)的標(biāo)簽為0,可是最高得分卻是1類鶯尾花)
利用損失函數(shù)(loss function)【預(yù)測值(y)與標(biāo)準(zhǔn)答案(y_)的差距】夫植,損失函數(shù)可以定量判斷W讹剔、b的優(yōu)劣,當(dāng)損失函數(shù)輸出最小時(shí)详民,參數(shù)W延欠、b會(huì)出現(xiàn)最優(yōu)值。
常用的損失函數(shù):均方誤差沈跨,表征了網(wǎng)絡(luò)前向傳播推理(結(jié)果)和標(biāo)準(zhǔn)答案之間的差距由捎。
損失函數(shù)的梯度,表示損失函數(shù)對(duì)各參數(shù)求偏導(dǎo)后的向量饿凛。損失函調(diào)梯度下降的方向就是函數(shù)減小的方向狞玛。
question:【為什么要令均方誤差對(duì)分量系數(shù)的偏導(dǎo)數(shù)等于0 ?】
answer:【為了選擇最佳系數(shù),這個(gè)最佳涧窒,可以理解為均方誤差最小心肪。而均方誤差是系數(shù)的一個(gè)函數(shù)(不同系數(shù)的選擇對(duì)應(yīng)不同誤差),要使該函數(shù)達(dá)到最小纠吴,按多元函數(shù)的理論硬鞍,應(yīng)該是極值,而極值的必要條件就是對(duì)該變量的偏導(dǎo)數(shù)等于0呜象∩拍】
梯度下降法:沿?fù)p失函數(shù)梯度下降的方向,尋找損失函數(shù)的最小值恭陡,得到最優(yōu)參數(shù)的方法蹬音。
梯度下降法更新參數(shù)的計(jì)算:
學(xué)習(xí)率(lr):學(xué)習(xí)率設(shè)置過小,收斂會(huì)很慢休玩;學(xué)習(xí)率設(shè)置過大著淆,梯度會(huì)在最小值附近來回震蕩,跳過了最小值拴疤,可能無法收斂永部。
反向傳播:從后向前,逐層求損失函數(shù)對(duì)每層神經(jīng)元參數(shù)的偏導(dǎo)數(shù)呐矾,迭代更新所有參數(shù)苔埋。如下圖,當(dāng)w= -1時(shí)蜒犯,損失函數(shù)loss()的值最小组橄。
代碼實(shí)現(xiàn):
Import tensorflow as tf
w = tf.Variable(tf.constant(5, dtype =tf.float32))
lr = 0.2
epoch = 40
for epoch in range(epoch): #頂層循環(huán)荞膘,表示對(duì)數(shù)據(jù)集循環(huán)epoch次
????withtf.GradientTape() as tape:
?????????? loss= tf.square(w + 1)
????? grads= tape.gradient(loss , w)
w.assign_sub(lr* grads)
print(“After%s epoch, w is %f, loss is %f” %(epoch, w.numpy(), loss))