Pytorch學習體會(二)
上篇直接就上了一個示例神經網路,儘管我代碼每一行都注釋了,因為格式對齊問題,可能看起來還是費勁,我在多說幾句Pytorch的優化的思路,說白了本質上和傳統的機器學習沒區別,準備數據-定義模型-定義損失函數-使用數據反覆訓練這個模型,直到損失函數的誤差值小於一定的值即可。
變數和參數位置的轉換
這裡最難理解的就是就是函數變數的轉換,我們在正常數學裡面學的函數變數是各個坐標或維度的值,值我們是不知道的,知道的是各個項的係數,也就是說我常規處理方法是模型確定的,我們只要給模型輸入然後產出一個值就是我們所有獲取的,過程比較確定,而現在正好反過來了,我們有了大量大維度數據了,但是怎麼產生這些數據的模型我們不知道,也就是說我們需要找到個模型,尋找之前常規函數群中的係數,我們常規是通過係數來確定數據,現在是通過數據來確定係數,使函數群可以完美的解釋這些數據,最最初我們就是邏輯回歸,聚類、等方法,現在呢,我採用神經網路模型。
上一篇體會我也說了,什麼是神經網路,一句話,就是一個函數變換器,給一組輸入最後給出一個輸出。關鍵是組成神經網路的基礎運算單元都是線性函數然後外包一個非線性的變換函數,這些非線性的便函函數的形式又不是特別複雜,在導數的形式上有容易計算的特點,多個這類單元的組合顯然就可以完成複雜的非線性數據的擬合。
目標函數
目標函數-聽起來類,我的理解就是損失函數,實際的採樣輸出值和原始輸入經過神經網路預測的值的差值函數,當然這個差值的計算函數的表現形式可以自己定義成自己喜歡的或者使用系統標準的。我們梯度的反向傳播就是計算這個差值函數對各個節點的係數梯度,本質上就是這個函數對各個節點係數的導數,當然這裡係數往往是個矩陣。最後反向求導計算完的也是一個係數的梯度矩陣。
損失函數的形式:可以參見 https://blog.csdn.net/zhangxb35/article/details/72464152
優化和訓練
這是什麼東西?說白了就是計算向真實值考慮的各個係數跟新的策略,可能你會和我開始學習一樣,直接減或加梯度不就行了,那麼麻煩幹嘛,直接加減梯度數學模型沒問題,但是實際的操作過程中會有問題,我們想一下,這個模型是怎麼來的,是數據真實的模型嗎?不是,是我們自己倒騰的,是不是能夠反映這些數據的規律,真不知道,這個時候怎麼辦,和我們通常人處理問題一樣,知道方向了,小步前進,想想我們人在處理位置問題的時候,是不是在知道解決問題的大方向的時候是不是變著花樣試著怎麼解決問題最合適?優化器的原理就是這個,這些方法是拍腦袋想出來的?不是,大量實踐總結出來的,
回想一下我們人類解決問題過程是一次解決問題嗎?尤其是針對未知的問題,顯然不是,我們可能會經過N輪的嘗試,最終才能找到解決問題的方案,同樣,我們建立的神經網路的目的是在已知的數據中找適合的參數的模型,顯然一次肯定不能找到最優的參數配置,這就需要根據上一次的結果多跑幾次,然後才能得到想要的模型,等等,真能得到完美契合的模型嗎?有些問題可以,有些問題,呵呵了,顯然不能,和我們通常解決問題一樣,最靠近真實解就行了,那麼神經網路訓練就是目標函數的差值小於某個規定的值即可。這種就是訓練
常見的優化方法如下:
# SGD 就是隨機梯度下降
opt_SGD = torch.optim.SGD(net_SGD.parameters(), lr=LR)
# momentum 動量加速,在SGD函數里指定momentum的值即可
opt_Momentum = torch.optim.SGD(net_Momentum.parameters(), lr=LR, momentum=0.8)
# RMSprop 指定參數alpha
opt_RMSprop = torch.optim.RMSprop(net_RMSprop.parameters(), lr=LR, alpha=0.9)
# Adam 參數betas=(0.9, 0.99)
opt_Adam = torch.optim.Adam(net_Adam.parameters(), lr=LR, betas=(0.9, 0.99))
可以參見:https://ptorch.com/news/54.html
學習效率
等等呢,學習效率什麼鬼?就是你每次決定走多大,梯度知道了,是不是真實按照梯度值走,這就是學習效率,和我們人類解決問題一樣,我知道一步跨過去就可以到達目的地,但是,現在位置真的可以一步到達目的嗎?想想我們出去旅遊,我們和黃山風景區之間直線距離就是320公里,我直接按照這個320公里的方向走?肯定行不通,那麼怎麼辦,我們先朝著黃山的方向按照既定的策略走一小部分,這一小部分針對一下子到黃山來說就是個學習效率,也就是說,我不一下子到目的地,我先按照選定的策略方向走目前可以明確知道的,等走完了,在考慮下一步的行動。等等,我僅僅是打個比方。
推薦閱讀:
※自學python第一篇
※1.3從零開始學Scrapy爬蟲之python編碼問題
※十行以內,你寫過哪些比較酷的 Python 代碼?
※如何學好編程