在前幾天的學習中,我們了解了有關神經網路的基本組成,
像是資料如何進入模型(前向傳播)、如何透過啟動函數轉換訊號、
還有如何利用損失函數評估模型的表現等等。
但到目前為止,還有一個重要的問題我們還沒去討論到:
當我們知道模型的預測結果和真實答案有差距時,
模型究竟是怎麼「修正自己」的呢?
答案就在於「反向傳播」與「梯度」這兩個核心概念。
反向傳播提供了一種有效率的方法,能夠逐層計算每個參數對誤差的影響,
而梯度則像一個方向指引,告訴模型應該如何調整參數,才能更接近正確答案。
在今天,我們就要揭開這個讓神經網路「會學習」的關鍵機制,
來剖析這兩個關鍵概念。
梯度(Gradient)是數學上的一個概念,
可以把它想像成函數在某個點的斜率在多維空間的延伸。
如果函數只有一個變數,斜率告訴我們函數在該點是往上升還是往下降。
而在多維的情況下,梯度則變成是一個向量,指出函數上升最快的方向。
在神經網路裡,損失函數告訴我們模型預測和真實答案的差距,
而梯度則告訴我們:如果要減少這個差距,應該怎麼調整參數。
換句話說,梯度是一種「指引」,幫助模型一步一步找到讓損失降低的路線。
用簡單一些的比喻來形容的話,梯度有點像是一張地圖,
地圖上每個點會告訴你哪個方向是「下坡」。
模型學習的過程,就是沿著下坡方向不斷走,
直到找到一個谷底,也就是損失函數最低的地方。
參考資料:
https://vocus.cc/article/677e72cdfd897800019867dc
反向傳播(Backpropagation)則是一種演算法,
用來計算神經網路中每個參數對最終損失的影響。
它的核心是「鏈式法則」(Chain Rule),
也就是大家可能數學課上學過的(連鎖率),
用來處理複合函數微分的工具。
在前向傳播時,資料一層一層地經過神經網路,最後得到一個預測結果,並計算出損失函數。
接下來,反向傳播就會從輸出層開始,
把誤差往回傳,並在每一層計算該層的權重和偏差對誤差的貢獻。
這樣一來,我們就能得到每個參數的梯度,然後再用最佳化方法(例如梯度下降法)去更新參數。
我覺得反向傳播的概念有一點「責任分攤」的感覺:
當模型算錯答案或算的不好時,它會回頭去問每一層,「是你的錯嗎!(大吼)」
然後一層一層問反著問回去,
再根據各層的責任比例,來調整它們的參數以減少錯誤。
今天針對反向傳播流程,我不想討論太多數學相關問題,畢竟數字太沒感情了。
我下面會著重討論在「概念」部分,讓讀者可以有基礎的觀念,
若是想深入了解的可以再去查閱其他相關文獻,這邊就不占用篇幅了。
我們就直接開始吧:
第一步還是輸入資料,把資料一路傳到輸出層,得到模型的預測結果。
也就是我們前面介紹過「前向傳播」的部份,連結下收:
https://ithelp.ithome.com.tw/articles/10384049
接下來要比較預測結果和正確答案,計算誤差。
這個數值會告訴我們:模型這次表現得好不好。
比如說,模型說「這張圖是 5」,但正確答案是「3」,那誤差就不小(~很大很大很大很大~~)。
這裡就是反向傳播的重點了。模型不會只知道「我錯了」,它還要知道「是誰害我錯的」。
所以演算法會把這個錯誤從輸出層往回傳,經過一層一層的神經元,
去計算每一層、甚至每一個權重對錯誤的貢獻。
這就像如果一個團隊把方案做壞了,上面的頭頭就會檢討每個部門在其中的影響一樣,
一個一個部門、一個一個人抓出來究責。
經過上一步的責任分配之後,每個參數都會有一個「梯度」,
它就像一個方向箭頭,指出要怎麼調整才會讓誤差變小。
如果梯度是正的,代表要往某個方向減少權重;
而如果是負的,代表要往另一個方向增加權重。
有了梯度,我們就能更新模型的參數。
這個更新通常會搭配「學習率」這個設定,它決定我們每次修正的幅度要多大。
如果學習率太大,容易過頭,模型就會震盪;如果太小,學習就會變得很慢。
反向傳播不是一次就能讓模型變聰明,它必須不斷重複這個流程。
每一次模型都會稍微調整自己的參數,誤差也會慢慢下降。
當這個循環重複很多次之後,模型就會逐漸學會怎麼做出更準確的預測。
在今天我們學習了有關「梯度」以及「反向傳播」的概念,
算是把整個資料在模型內傳播的流程都補齊了,
也因為由於配置的緣故,
今天沒有一個一個把數學公式抓出來大談,
如果還想了解更多的人我就在下面放幾篇我的參考資料,
大家有興趣再行前往閱讀。
https://hackmd.io/@kk6333/HJqZGce1s
[https://zh.wikipedia.org/zh-tw/%E5%8F%8D%E5%90%91%E4%BC%A0%E6%92%AD%E7%AE%97%E6%B3%95]