關於反向傳播在Python中應用的入門教程

2021-02-20 Python程式設計師

Python部落(python.freelycode.com)組織翻譯,禁止轉載,歡迎轉發。

我來這裡的目的是為了測試我對於Karpathy的博客《駭客的神經網絡指導》以及Python的理解,也是為了掌握最近精讀的Derek Banas的文章《令人驚奇的注釋代碼博覽》。作為一個沉浸在R語言和結構化數據的經典統計學習方法的人,我對於Python和神經網絡都很陌生,所以最好不要對個人能力產生錯覺,以為通過閱讀就可以掌握事物。因此,開始寫代碼吧。

神經門

理解神經網絡中任何節點的一種方法是把它當作門,它接收一個或多個輸入,並產生一個輸出,就像一個函數。

例如,考慮一個接受x和y作為輸入的門,並計算:f(x,y) = x * y,讓我們一起在Python中實現它:

類似地,我們可以實現一個門來計算它的兩個輸入的和。

和一個計算兩個輸入最大值的門。

最優化問題

考慮到電路的目標是最大化輸出。這其實是神經網絡的優化問題(實際上是最小化損失函數,但差別是微不足道的,這與最大化負損失函數相同)。現在,關鍵在於如何確定修改一點點輸入,就可以使輸出變大一點。如果我們能夠設計出一種識別的方法,可以一次又一次地嘗試這種方法來獲得更大的輸出值,直到我們碰到南牆,輸出停止增加。在那時,我們可以說我們已經將產出最大化,或者說至少在局部上達到了。

用一個只有一個門的簡單的電路來說明,就是前向乘法門

假設上文定義的前向乘法門是我們在神經網絡裡的唯一門。如何來調整每個輸入,完全取決於輸出對輸入的更改的敏感性(或響應)。因為就像之前所展示的那樣,輸出本質上是輸入的函數,輸出對每個輸入的敏感性就是那個輸入的偏導數,讓我們來計算一下:

當x=3和y=4時,乘法門的梯度,等於4,因為del(xy)/del(x)=y,也就是4。

由於梯度肯定是正的,所以增大一點x理應會增加輸出。讓我們來試試:

輸出果然增加了,和我們設想的一樣

這只是一個簡單門。如果我們讓門來實現函數f(x): f(x) = 100 - (x-y)^2會怎樣呢

如果我們給這個門提供的輸入是3和4,按道理它應該儘量讓x和y更接近,這樣輸出才會最大化。這個函數在x=y上的最大化是不重要的

請參見下面的圖片:

現在讓我們定義這個門,看看我們的梯度計算和輸入修改的方法是否有助於增加這個門的輸出。

正如預期的那樣,在梯度暗示的方向上對輸入進行一些修改,結果會產生更高的輸出。現在讓我們來多做幾次,幾十次,直到產量的提高或增加都不再明顯了

也和預期一樣,以這種方式來進行優化,讓x從3提升到3.49同時讓y從4降到3.51,從而使輸出達到了99.999。

使用解析梯度

到目前為止,我們已經證明了梯度下降法優化的一個應用,getNumericalForwardGradient函數來計算梯度數值。在實踐中,神經網絡包含大量複雜的門,這些門的數值的每次計算都變得非常昂貴。因此,我們經常使用解析梯度,它更準確,計算量也更少。

這就提出了新的問題:如果表達式複雜到,即使數學方法也很難求解梯度的解析解。我們將看到,為了處理這種情況,我們可以計算出一些簡單表達式的解析梯度,然後應用鏈式法則。

多神經門電路

讓我們考慮一個電路門,以x,y和z分別作為輸入和輸出。

實際上,這是兩個基本門的合體:一個是加門,輸入為x和y,另一個是乘積門,輸入為r和加門的輸出q。我們可以定義這個門如下:

上圖來源於 http://karpathy.github.io/neuralnets/


反向傳播

優化這個電路本來是需要我們計算整個電路的梯度。現在相反,我們將計算每個組件門的梯度,然後應用鏈式法則來獲得整個電路的梯度。

在這裡,q只是一個輸入為x和y的前向加法門, f是一個輸入為z和q的前向乘法門。上述最後兩個方程是整個的關鍵: 當使用x(或y)計算整個電路的梯度時,我們僅僅計算了關於x(或y)的門q的梯度,並用一個因子將其放大,就等於與門q的輸出有關的電路的梯度。

對於這個電路的輸入,x=-2,y=5,z=-4,這不難計算

讓我們看看這裡發生了什麼。照此∂x/∂q就等於1,即,增加x從而增加了門的輸出q。然而,在較大的電路中(f)輸出是由於輸出q的減少而增加的,因為∂f/∂q= z = -4是一個負數。因此,我們的目標是通過減少q來實現最大的電路f的輸出,同樣x的值也需要減少。

在這個電路中展示的很明顯,為了計算任何輸入的梯度,我們需要根據每個輸入,計算出那些直接接受輸入的門的梯度,然後將電路的每個門的梯度結果相乘(鏈式法則)。

但是在一個更複雜的電路中,在輸出階段之前,這個門可能會通向多個其他門,所以最好先從輸出階段開始進行逆向鏈式計算。(反向傳播)

上圖來源於http://karpathy.github.io/neuralnets/

看過我們如何使用鏈式法則後,我們現在可以把重點放在一些簡單門的局部梯度上:

我剛意識到我們好久都沒有寫代碼了。哦。現在,我們將對我們所討論的一切進行代碼化,來看看反向傳播使用鏈式法則到底是如何幫助我們計算相同的梯度。

在定義了門和單元之後,讓我們運行正向傳遞來生成輸出值:

現在,讓我們運行反向傳遞來破譯梯度df/dx:

現在我們已經從零開始在一個簡單的電路上實現了反向傳播,並且看到了如何利用鏈式法則來獲得一個更大的電路的梯度。實在是太有趣啦!

英文原文:https://sushant-choudhary.github.io/blog/2017/11/25/a-friendly-introduction-to-backrop-in-python.html
譯者:任宇は神様

相關焦點

  • 書聲琅琅:好的Python入門教程
    好的Python入門教程,書聲琅琅教育番茄老師微信pykf20介紹,python語言現在應用非常廣泛,不管是大數據還是人工智慧,應用最多的語言還是python,因此對於許多小白來講,看到python從業者的高薪資,想要轉行,或者致力於python開發的朋友,如果要學習python,從零基礎開始,一定需要一套完整的學習路線。
  • 學python?不是一個python入門教程就行,學之前你必須知道這些
    第一 學習方向:python應用方向很多,必須明確學習方向想全棧開發:就是web應用開發,是用來寫網站後臺的數據分析:就是做大數據分析的,數據量級起碼是千萬級別的,做的是大數據分析網絡爬蟲:其實屬於數據分析的部分,就是獲取數據源的方式。
  • Python快速入門的方法
    import一個easygui,初學者分分鐘做個圖形界面出來,對於初學python,成就感!!除了這本書之外,還有《笨辦法學python》《可愛的 Python》這兩本書也非常適合新手,如果你是完全零基礎的小白,不妨先從這裡看起。
  • 如何快速學會Python爬蟲(入門篇)
    一、爬蟲入門Python爬蟲入門一之綜述2. Python爬蟲入門二之爬蟲基礎了解3. Python爬蟲入門三之Urllib庫的基本使用4. Python爬蟲入門四之Urllib庫的高級用法5. Python爬蟲入門五之URLError異常處理6.
  • Python零基礎入門教程,如何使用lambda、filter和map函數?
    大綱函數類型定義及特性lambda函數定義及使用filter函數定義及使用map函數定義及使用引入函數類型概念函數類型定義:python中任意一個函數都有數據類型,這種數據類型是function(函數類型)
  • 如何入門Python之Python基礎教程詳解
    隨著人工智慧的發展,Python近兩年也是大火,越來越多的人加入到Python學習大軍,對於毫無基礎的人該如何入門Python呢?這裡整理了一些個人經驗和Python入門教程供大家參考。如果你是零基礎入門 Python 的話,建議初學者至少達到兩個目標: 會用,理解。
  • Python入門很簡單,只要掌握3456點
    特整理出學Python最基礎的知識學習框架,希望幫助大家快速入門。 創一個小群,供大家學習交流聊天 如果有對學python方面有什麼疑惑問題的,或者有什麼想說的想聊的大家可以一起交流學習一起進步呀。
  • 每天一分鐘,python一點通(Python 連接資料庫mysql)
    人工智慧一加一 舉報   上期文章我們分享了如何使用資料庫界面化操作mysql資料庫每天一分鐘,python
  • Python入門指南教程:10天學會使用python做爬蟲!免費領取!
    從去年開始,公眾號鋪天蓋地的python廣告,讓很多行外人也知道了python這個東西,python語言開始變得無所不能,剛畢業的新手用python能做什麼?前些天我弟弟突然聊天,推薦我學python,我把聊天截圖給了學計算機的楊先生。楊先生的解釋:python和C語言、java一樣是一門程式語言。學會了或許可以三分鐘做好excel的數據分析。但是,為了寫這個三分鐘的程序,你可能要花一個星期的時間。
  • 零基礎學習python,這幾本書少不了
    python是世界上最強大、最受歡迎的程式語言之一,即使不是程式設計師,我們平時在工作中也會經常用到,例如用python分析競品數據,做財務報表等等。《Python學習手冊》《Python學習手冊》解釋詳細,案例豐富;關於全面詳細地對python語言進行講解,循序漸進又不斷重複,同時對於python語言的機制和原理也做了詳細介紹;除此之外,還包含編程實踐、設計和高級主題。讀者通過這本書可以迅速高效地精通核心python語言基礎,從而可以在所從事的任何應用領域中使用它。
  • Python300本電子書強力贈送,你敢來我就敢送!
    這是小編最近整理的很多python電子書,免費分享出來,方便大家在以後學習過程中需要,直接來這裡查找就可以,建議大家先轉發收藏,方便查找
  • 如何自學成 Python 大神?這裡有些建議
    他的博客(http://www.csestack.org/python/)上有很多非常棒的 Python 教程。同其他程式語言(如 C、C ++ 和 Java)相比,Python 學習起來很容易,至少入門很容易。Python 有兩個版本:Python 2.x 和 Python 3.x。選擇合適的 Python 版本非常重要。
  • 關於零基礎學習Python有什麼好的建議?
    並且該網站的作者翻譯了一本非常適合入門的Python學習書籍——《Think Python 》。這位作者選擇《Think Python》進行翻譯,一是因為這是他入門使用的第一本教材。二是因為它確實非常淺顯易懂,把很多概念用非常樸實的話進行了解釋,零基礎初學者學起來並沒有多少太大的障礙。
  • 《小灰教你零基礎學python》-Python入門語言
    程式語言有很多,咱們就學簡單強大的python即可。三、python程式語言介紹Python是荷蘭人吉多·范羅蘇姆(Guido van Rossum)在1989年聖誕節期間開發的一門解釋性的腳本語言,什麼是解釋性的語言,大家可以參照百度百科(
  • python字典操作大全,學習python第7天
    python字典跟列表類型,能存儲多個數據,並且還能在訪問元素的時候可以很快定位到需要的元素。而python字典操作方法有多少種呢?下面羽憶教程為您介紹。,python字典都是由一個鍵和一個值組成的「鍵值對」,兩者之間用冒號隔開,結構如:sco = {'name':'小明','age': 11},需要注意的是python字典中的值不允許重複。
  • python入門第二課:變量和數據類型
    本教程使用的課本是《Python編程:從入門到實踐》,作者:[美] Eric Matthes在Python中,變量可以理解為抽屜,數據就是一個蘋果、香蕉、書本等可以放進抽屜的東西,變量是用來存儲數據的。我們對上一節課的hello world代碼稍加改動,改成下面的代碼,看看會輸出什麼?
  • 算法推導:反向傳播算法
    13.3.1 反向傳播算法推導如下圖所示為一個神經網絡的結構圖,由於本文主要探討激活函數在反向傳播過程中的作用,因此不會帶入數值進行計算,而是以兩個權重的更新為案例進行公式的推導,分別為如何通過反向傳播算法更新和的值。
  • 《python 入陣曲:初級》開題報告
    編者序雖然b站上已經有很多python教程
  • blender python入門系列教程一:認識bpy.data.objects
    直接選用Scripting界面,在python控制臺,直接輸入bpy.data.objects,系統返回<bpy_collection[3], BlendDataObjects> 中文翻譯:bpy集合[3],blender數據對象輸入:bpy.data.objects
  • 徹底解決梯度爆炸問題,新方法不用反向傳播也能訓練ResNet
    機器之心報導參與:思、一鳴反向傳播是深度學習算法中必不可少的組成部分,但是其固有的梯度爆炸(消失),計算速度慢等問題一直困擾著學界。近日,紐西蘭維多利亞惠靈頓大學的研究者提出了一種新型的算法,可以讓深度學習在不依賴反向傳播的情況下進行收斂,徹底解決了梯度爆炸問題。同時,研究者表示,只需要額外訓練單層的網絡就可以達到圖像分類中的 SOTA 性能。