您的位置:首頁>正文

白話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

圖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

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示