華文網

白話AI:看懂深度學習真的那麼難嗎?初中數學,就用10分鐘

今天,面對AI如此重要的江湖地位,深度學習作為重要的一個研究分支,幾乎出現在當下所有熱門的AI應用領域,其中包含語義理解、圖像識別、語音辨識,自然語言處理等等,更有人認為當前的人工智慧等同於深度學習領域。

如果在這個人工智慧的時代,作為一個有理想抱負的程式師,或者學生、愛好者,不懂深度學習這個超熱的話題,似乎已經跟時代脫節了。

但是,深度學習對數學的要求,包括微積分、線性代數和概率論與數理統計等要求,

讓大部分的有理想抱負青年踟躕前行。那麼問題來了,理解深度學習,到底需不需要這些知識?關子就不賣了,標題已經說明。

前段時間,編輯閒逛各大社區論壇,發現一篇非常適合初學者學習的深度學習的回復帖子,用風趣的白話和例子深入淺出的分析了深度學習的過程,非常通俗易懂。通過與在西門子從事人工智慧領域的楊國安老師溝通,獲得內容編輯授權,

把內容重新整理發佈,希望人人都能夠理解深度學習。

關於深度學習,網上的資料很多,不過貌似大部分都不太適合初學者。楊老師總結了幾個原因:

1、深度學習確實需要一定的數學基礎。如果不用深入淺出地方法講,有些讀者就會有畏難的情緒,因而容易過早地放棄。

2、中國人或美國人寫的書籍或文章,普遍比較難一些。

深度學習所需要的數學基礎並沒有想像中的那麼難,

只需要知道導數和相關的函數概念即可。高等數學也沒學過?很好,這篇文章其實是想讓文科生也能看懂,只需要學過初中數學就完全可以。

其實不必有畏難的情緒,比較推崇李書福的精神,在一次電視採訪中,李書福說:誰說中國人不能造汽車?造汽車有啥難的,不就是四個輪子加兩排沙發嘛。當然,他這個結論有失偏頗,不過精神可嘉。

導數是什麼?無非就是變化率。

比如:王小二今年賣了100頭豬,去年賣了90頭,前年賣了80頭。。。變化率或者增長率是什麼?每年增長10頭豬,多簡單。這裡需要注意有個時間變數---年。王小二賣豬的增長率是10頭/年,也就是說,導數是10。

函數y=f(x)=10x+30,這裡我們假設王小二第一年賣了30頭,以後每年增長10頭,x代表時間(年),y代表豬的頭數。

當然,這是增長率固定的情形,而現實生活中,很多時候,變化量也不是固定的,也就是說增長率不是恒定的。

比如,函數可能是這樣: y=f(x)=5x²+30,這裡x和y依然代表的是時間和頭數,不過增長率變了,怎麼算這個增長率,我們回頭再講。或者你乾脆記住幾個求導的公式也可以。

深度學習還有一個重要的數學概念:偏導數,偏導數的偏怎麼理解?偏頭疼的偏,還是我不讓你導,你偏要導?都不是,我們還以王小二賣豬為例,剛才我們講到,x變數是時間(年),可是賣出去的豬,不光跟時間有關啊,隨著業務的增長,王小二不僅擴大了養豬場,還雇了很多員工一起養豬。所以方程式又變了:y=f(x)=5x₁²+8x₂ + 35x₃ +30

這裡x₂代表面積,x₃代表員工數,當然x₁還是時間。

上面我們講了,導數其實就是變化率,那麼偏導數是什麼?偏導數無非就是多個變數的時候,針對某個變數的變化率。在上面的公式裡,如果針對x₃求偏導數,也就是說,員工對於豬的增長率貢獻有多大,或者說,隨著(每個)員工的增長,豬增加了多少,這裡等於35---每增加一個員工,就多賣出去35頭豬. 計算偏導數的時候,其他變數都可以看成常量,這點很重要,常量的變化率為0,所以導數為0,所以就剩對35x₃ 求導數,等於35. 對於x₂求偏導,也是類似的。

求偏導我們用一個符號表示:比如 y/ x₃ 就表示y對 x₃求偏導。

廢話半天,這些跟深度學習到底有啥關係?當然有關係,深度學習是採用神經網路,用於解決線性不可分的問題。關於這一點,我們回頭再討論,大家也可以網上搜一下相關的文章。這裡主要講講數學與深度學習的關係。先給大家看幾張圖:

圖1. 所謂深度學習,就是具有很多個隱層的神經網路。

圖2.單輸出的時候,怎麼求偏導數

圖3.多輸出的時候,怎麼求偏導數。

後面兩張圖是日本人寫的關於深度學習的書,感覺寫的不錯,把圖盜來用一下。所謂入力層,出力層,中間層,分別對應于中文的:輸入層,輸出層,和隱層。大家不要被這幾張圖嚇著,其實很簡單的。再舉一個例子,就以撩妹為例。男女戀愛我們大致可以分為三個階段:

1.初戀期。相當於深度學習的輸入層。別人吸引你,肯定是有很多因素,比如:身高,身材,臉蛋,學歷,性格等等,這些都是輸入層的參數,對每個人來說權重可能都不一樣。

2.熱戀期。我們就讓它對應於隱層吧。這個期間,雙方各種磨合,柴米油鹽醬醋茶。

3.穩定期。對應於輸出層,是否合適,就看磨合得咋樣了。大家都知道,磨合很重要,怎麼磨合呢?就是不斷學習訓練和修正的過程嘛!比如女朋友喜歡草莓蛋糕,你買了藍莓的,她的回饋是negative,你下次就別買了藍莓,改草莓了。

看完這個,有些小夥可能要開始對自己女友調參了。有點不放心,所以補充一下。撩妹和深度學習一樣,既要防止欠擬合,也要防止過擬合。所謂欠擬合,對深度學習而言,就是訓練得不夠,資料不足,就好比,你撩妹經驗不足。要做到擬合,送花當然是最基本的,還需要提高其他方面,比如,提高自身說話的幽默感等,因為本文重點並不是撩妹,所以就不展開講了。這裡需要提一點,欠擬合固然不好,但過擬合就更不合適了。過擬合跟欠擬合相反,一方面,如果過擬合,她會覺得你有陳冠希老師的潛質,更重要的是,每個人情況不一樣,就像深度學習一樣,訓練集效果很好,但測試集不行!就撩妹而言,她會覺得你受前任(訓練集)影響很大,這是大忌!如果給她這個印象,你以後有的煩了,切記切記!

深度學習也是一個不斷磨合的過程,剛開始定義一個標準參數(這些是經驗值,就好比情人節和生日必須送花一樣),然後不斷地修正,得出圖1每個節點間的權重。為什麼要這樣磨合?試想一下,我們假設深度學習是一個小孩,我們怎麼教他看圖識字?肯定得先把圖片給他看,並且告訴他正確的答案,需要很多圖片,不斷地教他,訓練他,這個訓練的過程,其實就類似于求解神經網路權重的過程。以後測試的時候,你只要給他圖片,他就知道圖裡面有什麼了。

所以訓練集,其實就是給小孩看,帶有正確答案的圖片,對於深度學習而言,訓練集就是用來求解神經網路的權重,最後形成模型;而測試集,就是用來驗證模型的準確度。

對於已經訓練好的模型,如下圖所示,權重(w1,w2...)都已知。

圖4

圖5

我們知道,像上面這樣,從左至右容易算出來。但反過來我們上面講到,測試集有圖片,也有預期的正確答案,要反過來求w1,w2......,怎麼辦?

繞了半天,終於該求偏匯出場了。目前的情況是:

1.我們假定一個神經網路已經定義好,比如有多少層,每層有多少個節點,也有默認的權重和啟動函數(後面講)等。這個沒辦法,剛開始得有一個初始值。你喜歡一個美女,她也不是剛從娘胎裡出來的,也是帶有那就得調整參數。因為輸入(圖像)確定的情況下,只有調整參數才能改變輸出的值。怎麼調整,怎麼磨合?剛才我們講到,每個參數都有一個預設值,我們就對每個參數加上一定的數值∆,然後看看結果如何?如果參數調大,差距也變大,你懂的,那就得減小∆,因為我們的目標是要讓差距變小;反之亦然。所以為了把參數調整到最佳,我們需要瞭解誤差對每個參數的變化率,這不就是求誤差對於該參數的偏導數嘛。

關鍵是怎麼求偏導。圖2和圖3分別給了推導的方法,其實很簡單,從右至左挨個求偏導就可以。相鄰層的求偏導其實很簡單,因為是線性的,所以偏導數其實就是參數本身嘛,就跟求解x₃的偏導類似。然後把各個偏導相乘就可以了。

這裡有兩個點:一個是啟動函數,其實啟動函數也沒啥,就是為了讓每個節點的輸出都在0到1的區間,這樣好算帳嘛,所以在結果上面再做了一層映射,反正都是一對一的。由於啟動函數的存在,所以在求偏導的時候,也要把它算進去,啟動函數,一般用sigmoid,也可以用Relu等。啟動函數的求導其實也非常簡單:

求導: f'(x)=f(x)*[1-f(x)]

這個方面,有時間可以翻看一下高數,如果沒時間,直接記住就行了。至於Relu,那就更簡單了,就是f(x) 當x<>

另一個是學習係數,為什麼叫學習係數?剛才我們上面講到∆增量,到底每次增加多少合適?是不是等同於偏導數(變化率)?經驗告訴我們,需要乘以一個百分比,這個就是學習係數,而且,隨著訓練的深入,這個係數是可以變的。

當然,還有一些很重要的基本知識,比如SGD(隨機梯度下降),mini batch 和 epoch(用於訓練集的選擇),限於篇幅,以後再侃吧。其實參考李宏毅的那篇文章就可以了。其實上面描述的,主要是關於怎麼調整參數,屬於初級階段。上面其實也提到,在調參之前,都有預設的網路模型和參數,如何定義最初始的模型和參數?就需要進一步深入瞭解。不過對於一般做工程而言,只需要在預設的網路上調參就可以,相當於用演算法;對於學者和科學家而言,他們會發明演算法,這有很大的難度。向他們致敬!

最後,楊老師推薦一篇非常不錯的文章:《1天搞懂深度學習》,300多頁的ppt,臺灣李宏毅教授寫的,非常棒。不誇張地說,是我看過最系統,也最通俗易懂的,關於深度學習的文章。

這是slideshare的連結:

http://www.slideshare.net/tw_dsconf/ss-62245351?qid=108adce3-2c3d-4758-a830-95d0a57e46bc&v=&b=&from_search=3

本文內容引用楊老師在知乎上的回復:

https://www.zhihu.com/question/26006703/answer/129209540

隨著業務的增長,王小二不僅擴大了養豬場,還雇了很多員工一起養豬。所以方程式又變了:y=f(x)=5x₁²+8x₂ + 35x₃ +30

這裡x₂代表面積,x₃代表員工數,當然x₁還是時間。

上面我們講了,導數其實就是變化率,那麼偏導數是什麼?偏導數無非就是多個變數的時候,針對某個變數的變化率。在上面的公式裡,如果針對x₃求偏導數,也就是說,員工對於豬的增長率貢獻有多大,或者說,隨著(每個)員工的增長,豬增加了多少,這裡等於35---每增加一個員工,就多賣出去35頭豬. 計算偏導數的時候,其他變數都可以看成常量,這點很重要,常量的變化率為0,所以導數為0,所以就剩對35x₃ 求導數,等於35. 對於x₂求偏導,也是類似的。

求偏導我們用一個符號表示:比如 y/ x₃ 就表示y對 x₃求偏導。

廢話半天,這些跟深度學習到底有啥關係?當然有關係,深度學習是採用神經網路,用於解決線性不可分的問題。關於這一點,我們回頭再討論,大家也可以網上搜一下相關的文章。這裡主要講講數學與深度學習的關係。先給大家看幾張圖:

圖1. 所謂深度學習,就是具有很多個隱層的神經網路。

圖2.單輸出的時候,怎麼求偏導數

圖3.多輸出的時候,怎麼求偏導數。

後面兩張圖是日本人寫的關於深度學習的書,感覺寫的不錯,把圖盜來用一下。所謂入力層,出力層,中間層,分別對應于中文的:輸入層,輸出層,和隱層。大家不要被這幾張圖嚇著,其實很簡單的。再舉一個例子,就以撩妹為例。男女戀愛我們大致可以分為三個階段:

1.初戀期。相當於深度學習的輸入層。別人吸引你,肯定是有很多因素,比如:身高,身材,臉蛋,學歷,性格等等,這些都是輸入層的參數,對每個人來說權重可能都不一樣。

2.熱戀期。我們就讓它對應於隱層吧。這個期間,雙方各種磨合,柴米油鹽醬醋茶。

3.穩定期。對應於輸出層,是否合適,就看磨合得咋樣了。大家都知道,磨合很重要,怎麼磨合呢?就是不斷學習訓練和修正的過程嘛!比如女朋友喜歡草莓蛋糕,你買了藍莓的,她的回饋是negative,你下次就別買了藍莓,改草莓了。

看完這個,有些小夥可能要開始對自己女友調參了。有點不放心,所以補充一下。撩妹和深度學習一樣,既要防止欠擬合,也要防止過擬合。所謂欠擬合,對深度學習而言,就是訓練得不夠,資料不足,就好比,你撩妹經驗不足。要做到擬合,送花當然是最基本的,還需要提高其他方面,比如,提高自身說話的幽默感等,因為本文重點並不是撩妹,所以就不展開講了。這裡需要提一點,欠擬合固然不好,但過擬合就更不合適了。過擬合跟欠擬合相反,一方面,如果過擬合,她會覺得你有陳冠希老師的潛質,更重要的是,每個人情況不一樣,就像深度學習一樣,訓練集效果很好,但測試集不行!就撩妹而言,她會覺得你受前任(訓練集)影響很大,這是大忌!如果給她這個印象,你以後有的煩了,切記切記!

深度學習也是一個不斷磨合的過程,剛開始定義一個標準參數(這些是經驗值,就好比情人節和生日必須送花一樣),然後不斷地修正,得出圖1每個節點間的權重。為什麼要這樣磨合?試想一下,我們假設深度學習是一個小孩,我們怎麼教他看圖識字?肯定得先把圖片給他看,並且告訴他正確的答案,需要很多圖片,不斷地教他,訓練他,這個訓練的過程,其實就類似于求解神經網路權重的過程。以後測試的時候,你只要給他圖片,他就知道圖裡面有什麼了。

所以訓練集,其實就是給小孩看,帶有正確答案的圖片,對於深度學習而言,訓練集就是用來求解神經網路的權重,最後形成模型;而測試集,就是用來驗證模型的準確度。

對於已經訓練好的模型,如下圖所示,權重(w1,w2...)都已知。

圖4

圖5

我們知道,像上面這樣,從左至右容易算出來。但反過來我們上面講到,測試集有圖片,也有預期的正確答案,要反過來求w1,w2......,怎麼辦?

繞了半天,終於該求偏匯出場了。目前的情況是:

1.我們假定一個神經網路已經定義好,比如有多少層,每層有多少個節點,也有默認的權重和啟動函數(後面講)等。這個沒辦法,剛開始得有一個初始值。你喜歡一個美女,她也不是剛從娘胎裡出來的,也是帶有那就得調整參數。因為輸入(圖像)確定的情況下,只有調整參數才能改變輸出的值。怎麼調整,怎麼磨合?剛才我們講到,每個參數都有一個預設值,我們就對每個參數加上一定的數值∆,然後看看結果如何?如果參數調大,差距也變大,你懂的,那就得減小∆,因為我們的目標是要讓差距變小;反之亦然。所以為了把參數調整到最佳,我們需要瞭解誤差對每個參數的變化率,這不就是求誤差對於該參數的偏導數嘛。

關鍵是怎麼求偏導。圖2和圖3分別給了推導的方法,其實很簡單,從右至左挨個求偏導就可以。相鄰層的求偏導其實很簡單,因為是線性的,所以偏導數其實就是參數本身嘛,就跟求解x₃的偏導類似。然後把各個偏導相乘就可以了。

這裡有兩個點:一個是啟動函數,其實啟動函數也沒啥,就是為了讓每個節點的輸出都在0到1的區間,這樣好算帳嘛,所以在結果上面再做了一層映射,反正都是一對一的。由於啟動函數的存在,所以在求偏導的時候,也要把它算進去,啟動函數,一般用sigmoid,也可以用Relu等。啟動函數的求導其實也非常簡單:

求導: f'(x)=f(x)*[1-f(x)]

這個方面,有時間可以翻看一下高數,如果沒時間,直接記住就行了。至於Relu,那就更簡單了,就是f(x) 當x<>

另一個是學習係數,為什麼叫學習係數?剛才我們上面講到∆增量,到底每次增加多少合適?是不是等同於偏導數(變化率)?經驗告訴我們,需要乘以一個百分比,這個就是學習係數,而且,隨著訓練的深入,這個係數是可以變的。

當然,還有一些很重要的基本知識,比如SGD(隨機梯度下降),mini batch 和 epoch(用於訓練集的選擇),限於篇幅,以後再侃吧。其實參考李宏毅的那篇文章就可以了。其實上面描述的,主要是關於怎麼調整參數,屬於初級階段。上面其實也提到,在調參之前,都有預設的網路模型和參數,如何定義最初始的模型和參數?就需要進一步深入瞭解。不過對於一般做工程而言,只需要在預設的網路上調參就可以,相當於用演算法;對於學者和科學家而言,他們會發明演算法,這有很大的難度。向他們致敬!

最後,楊老師推薦一篇非常不錯的文章:《1天搞懂深度學習》,300多頁的ppt,臺灣李宏毅教授寫的,非常棒。不誇張地說,是我看過最系統,也最通俗易懂的,關於深度學習的文章。

這是slideshare的連結:

http://www.slideshare.net/tw_dsconf/ss-62245351?qid=108adce3-2c3d-4758-a830-95d0a57e46bc&v=&b=&from_search=3

本文內容引用楊老師在知乎上的回復:

https://www.zhihu.com/question/26006703/answer/129209540