官术网_书友最值得收藏!

5.1 關(guān)于損失度的思考——所有人工智能框架終身的魔咒

從過去的經(jīng)歷中學(xué)到一些知識(shí),并把學(xué)到的知識(shí)用于改善下一次的行為,如此循環(huán)反復(fù),實(shí)現(xiàn)能力的螺旋式上升。這樣的過程是人類正常的學(xué)習(xí)過程,也是深度學(xué)習(xí)所有框架的核心思想,及絕大多數(shù)框架的實(shí)現(xiàn)過程(有些深度學(xué)習(xí)框架的實(shí)現(xiàn)不是按照前向傳播、反向傳播的過程來實(shí)現(xiàn)的)。通過前向傳播去經(jīng)歷,通過反向傳播來反思,并不斷進(jìn)行調(diào)整。

我們在盤古人工智能框架中輸入數(shù)據(jù),實(shí)例集只有4條數(shù)據(jù),并采用了二維數(shù)組的方式,其實(shí)現(xiàn)的思想和TensorFlow是一樣的。我們在寫第一個(gè)“Hello World”程序的時(shí)候,一般是打印一行字符串,打印一行字符串和以后處理上萬條、幾十萬條數(shù)據(jù)的過程幾乎是一樣的。可能有人會(huì)認(rèn)為不一樣,幾十萬條數(shù)據(jù)可能存儲(chǔ)在網(wǎng)盤上,處理的時(shí)候可能需要多線程等,但這些不是框架運(yùn)行機(jī)制的核心內(nèi)容,是以后要優(yōu)化的內(nèi)容。因此,從本質(zhì)上講,我們使用實(shí)例集處理4條數(shù)據(jù)和處理幾十萬條數(shù)據(jù)的過程沒太大的區(qū)別。在第8章中,我們將實(shí)現(xiàn)通過矩陣的方式加載外部數(shù)據(jù)源。

接下來我們回顧一下神經(jīng)網(wǎng)絡(luò)的內(nèi)容。

1.用盤古人工智能框架構(gòu)建整個(gè)神經(jīng)網(wǎng)絡(luò)
  • Neuron_Network_Entry.py:構(gòu)建實(shí)例集輸入數(shù)據(jù),構(gòu)建神經(jīng)網(wǎng)絡(luò)運(yùn)行的主流程。
  • NetworkStructure.py:構(gòu)建神經(jīng)網(wǎng)絡(luò)的架構(gòu),創(chuàng)建整個(gè)神經(jīng)網(wǎng)絡(luò)的所有節(jié)點(diǎn),實(shí)現(xiàn)輸入層、隱藏層、輸出層。
  • Node.py:構(gòu)建神經(jīng)元節(jié)點(diǎn),設(shè)置和訪問神經(jīng)元的層次、索引ID、名稱、是否為偏愛因子、值、誤差等內(nèi)容。
  • Weight.py:構(gòu)建權(quán)重,設(shè)置和訪問權(quán)重的索引ID、來源節(jié)點(diǎn)、目標(biāo)節(jié)點(diǎn)、權(quán)重值等信息。
  • NetworkConnection.py:構(gòu)建神經(jīng)網(wǎng)絡(luò)中前后層次神經(jīng)元節(jié)點(diǎn)之間的權(quán)重關(guān)系。
2.實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)前向傳播功能

如圖5-2所示,從輸入層輸入的數(shù)據(jù)中提取特征,可以直接輸入x1x2的特征,也可以輸入x1x2、sin(x1)、sin(x2)等的特征值。這里我們構(gòu)建的是最基本、最原始的結(jié)構(gòu),暫時(shí)只關(guān)注x1x2的特征值;隱藏層根據(jù)輸入的數(shù)據(jù)和權(quán)重計(jì)算出神經(jīng)元的值,然后根據(jù)權(quán)重及上一個(gè)隱藏層的值計(jì)算下一個(gè)隱藏層所有神經(jīng)元的值;輸出層根據(jù)最后一層隱藏層的值以及權(quán)重計(jì)算出最終的預(yù)測結(jié)果。一般情況下,預(yù)測結(jié)果和實(shí)際結(jié)果會(huì)有誤差。

圖5-2 x1x2的各種特征

3.實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)反向傳播功能

實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)反向傳播的時(shí)候要更新權(quán)重,權(quán)重的賦值包含兩部分:

(1)權(quán)重初始化:在神經(jīng)網(wǎng)絡(luò)初始化的時(shí)候,根據(jù)具體的算法對(duì)權(quán)重進(jìn)行初始化賦值。

(2)權(quán)重更新:反向傳播時(shí)更新權(quán)重。

圖5-3 前向傳播及反向傳播

如圖5-3所示,所有數(shù)據(jù)從輸入到輸出運(yùn)算1次是一次時(shí)代,通過前向傳播算法得到一個(gè)預(yù)測值,計(jì)算預(yù)測值和實(shí)際值的差;然后在反向傳播算法中,將輸出層的誤差值從后往前推,依次傳遞到前面的隱藏層,計(jì)算各個(gè)節(jié)點(diǎn)要負(fù)的責(zé)任(誤差),對(duì)原有的激活函數(shù)Sigmoid進(jìn)行求導(dǎo),通過梯度下降算法更新權(quán)重。注意,調(diào)整的時(shí)候不調(diào)整輸入層,輸入層是我們的輸入數(shù)據(jù),不能修改輸入的數(shù)據(jù),要改的是神經(jīng)網(wǎng)絡(luò)隱藏層的神經(jīng)元以及神經(jīng)元關(guān)聯(lián)的權(quán)重。隨著時(shí)代的迭代,損失度將越來越低。

神經(jīng)網(wǎng)絡(luò)進(jìn)行非線性變換的時(shí)候,我們可以改變激活函數(shù),ReLU是我們運(yùn)用得最多的激活函數(shù)之一。使用ReLU函數(shù),會(huì)發(fā)現(xiàn)損失度收斂的速度會(huì)快很多,時(shí)代運(yùn)行次數(shù)越多,精度越高;也可以采用Sigmoid激活函數(shù)的方式,它的收斂速度非常快,但比ReLU差了一點(diǎn)。可以通過Sigmoid激活函數(shù)實(shí)現(xiàn)ReLU,它們之間的公式有關(guān)聯(lián),就像線性回歸是邏輯回歸的基礎(chǔ),邏輯回歸是神經(jīng)網(wǎng)絡(luò)的基礎(chǔ),神經(jīng)網(wǎng)絡(luò)是CNN的基礎(chǔ),而CNN是RNN的基礎(chǔ)。線性回歸是第一層的階梯,邏輯回歸是第二層的階梯,神經(jīng)網(wǎng)絡(luò)是第三層的階梯,CNN是第四層的階梯,RNN是第五層的階梯。

盤古人工智能框架的代碼目前還沒有改進(jìn),訓(xùn)練的效果不理想,預(yù)測值沒有向1或者0趨近。經(jīng)過改進(jìn),輸出結(jié)果的準(zhǔn)確率將達(dá)到95%。從實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)的角度,我們已經(jīng)完成了前向傳播算法、反向傳播算法,盤古人工智能框架和TensorFlow、PyTorch的第一個(gè)原型是一樣的。

本節(jié)將進(jìn)行數(shù)據(jù)可視化,如將神經(jīng)網(wǎng)絡(luò)訓(xùn)練10 000個(gè)時(shí)代,每100個(gè)時(shí)代打印一下?lián)p失度。如圖5-4所示,TensorFlow可視化圖給出了動(dòng)態(tài)損失度的曲線圖。

圖5-4 損失度曲線

在計(jì)算過程中,激活函數(shù)和梯度下降的算法不一樣,計(jì)算誤差的方法也不一樣,導(dǎo)致?lián)p失度的值不一樣。例如,最原始的誤差計(jì)算函數(shù)是用預(yù)測值減去實(shí)際值,將預(yù)測值和實(shí)際值進(jìn)行比較:第1條記錄將預(yù)測值0.4385711425310979減去實(shí)際值0;第2條記錄將預(yù)測值0.4129240972484869減去實(shí)際值1;第3條記錄將預(yù)測值0.4651651378938895減去實(shí)際值1;第4條記錄將預(yù)測值0.43581722934765915減去實(shí)際值0。

主站蜘蛛池模板: 普洱| 霸州市| 九龙县| 海宁市| 松阳县| 嘉义县| 额济纳旗| 临洮县| 泾阳县| 兴文县| 密云县| 岳阳市| 慈溪市| 金堂县| 油尖旺区| 永春县| 平谷区| 隆回县| 赤壁市| 保定市| 陇西县| 中西区| 安国市| 东丰县| 遂宁市| 宜良县| 山东| 靖宇县| 肇源县| 罗甸县| 麻阳| 洛宁县| 紫云| 法库县| 内黄县| 扎赉特旗| 肥东县| 榆社县| 潞城市| 台北市| 洛扎县|