歡迎光臨
每天分享高質量文章

Python神經網路是這樣識別手寫字元噠?

來自:非同步圖書(微訊號:ptpressitbooks)

當谷歌的AlphaGo戰勝了人類頂級棋手,人工智慧開始更多進入大眾視野。而谷歌AI教父認為:“AlphaGo有直覺神經網路已接近大腦”。


千百年來,人類試圖瞭解智慧的機制,並將它複製到思維機器上。而從不滿足於讓機械或電子裝置幫助做一些簡單的任務,例如,使用燧石打火,使用滑輪吊起沉重的岩石,使用計算器做算術。


相反,我們希望能夠自動化執行更具有挑戰性、相對複雜的任務,如對相似的照片進行分組、從健康細胞中識別出病變細胞,甚至是來一盤優雅的國際象棋博弈。這些任務似乎需要人類的智慧才能完成,或至少需要人類思維中的某種更深層次、更神秘的能力來完成,而在諸如計算器這樣簡單的機器中是找不到這種能力的。


具有類似人類智慧的機器是一個如此誘人且強大的想法,我們的文化對它充滿了幻想和恐懼,如斯坦利·庫布里克導演的《2001: A Space Odyssey》中的HAL 9000(擁有巨大的能力卻最終給人類帶來了威脅)、動作片中瘋狂的“終結者(Terminator)”機器人以及電視劇《Knight Rider》中具有冷靜個性的話匣子KITT汽車。


1997年,國際象棋衛冕世界冠軍、國際象棋特級大師加里·卡斯帕羅夫被IBM“深藍”計算機擊敗,我們在慶祝這一歷史性成就的同時,也擔心機器智慧的潛力。


我們如此渴望智慧機器,以至於一些人受到了誘惑,使用欺騙手段,例如,臭名昭著的國際象棋機器Turkey僅僅是使用一個人隱藏在機櫃內而已!

在20世紀50年代,人工智慧這門學科正式成立,此時,人類雄心勃勃,對人工智慧抱著非常樂觀的態度。最初的成功,讓人們看到了計算機可以進行簡單的博弈、證明定理,因此,一些人相信,在十年左右的時間內,人類級別的人工智慧將會出現。


但是,實踐證明:發展人工智慧困難重重,進展一度停滯不前。20世紀70年代,人們在學術界挑戰人工智慧的雄心遭到了毀滅性的打擊。接下來,人們削減了人工智慧研究經費,對人工智慧的興趣消失殆盡。機器那冰冷的邏輯,絕對的1和0,看起來似乎永遠不能夠實現細緻入微的、有機的,有時甚至模糊的生物大腦思維過程。


在一段時間內,人類未能獨具匠心,百尺竿頭,更進一步,將機器智慧探索帶出其既定軌跡。在此之後,研究人員靈光一現,嘗試透過複製生物大腦工作的機制,來構建人工大腦?真正的大腦具有神經元,而不是邏輯閘。真正人腦具有更優雅更有機的推理,而不是冰冷的、非黑即白的、絕對的傳統演演算法。


蜜蜂或鴿子大腦的簡單性與其能夠執行複雜任務的巨大反差,這一點啟發了科學家。就是這零點幾克的大腦,看起來就能夠做許多事情,如導航、適應風向、識別食物和捕食者、快速地決定是戰鬥還是逃跑。當今的計算機擁有大量的廉價資源,能夠模仿和改進這些大腦嗎?一隻蜜蜂大約有950 000個神經元,今天的計算機,具有G位元和T位元的資源,能夠表現得比蜜蜂更優秀嗎?


但是,如果使用傳統的方法來求解問題,那麼即使計算機擁有巨大的儲存和超快的處理器,也無法實現鳥和蜜蜂使用相對微小的大腦所做的事情。受到仿生智慧計算的驅動,神經網路(Netural Network)出現了,並且神經網路從此成為在人工智慧領域中最強大、最有用的方法之一。


今天,谷歌的Deepmind以神經網路為基礎,能夠做一些非常奇妙的事情,如讓計算機學習如何玩影片遊戲,並且在人類歷史上第一次在極其變化多端的圍棋博弈中擊敗了世界級的大師。如今,神經網路已經成為了日常技術的核心,例如自動車牌號碼識別、解碼手寫的郵政編碼。

《Python神經網路程式設計》所探討的就是神經網路,讓你瞭解神經網路如何工作,幫你製作出自己的神經網路,訓練神經網路來識別人類的手寫字元。如果使用傳統的方法來執行這個任務,那麼將是非常困難的。

神經網路是如何實現的


計算機的核心部分就是計算器。這些計算器做算術非常快。對於執行與計算器相匹配的任務而言,如對數字進行相加算出銷售 額、運用百分比算出稅收、繪製現存資料的圖表,這是很不錯的。 


即使是在計算機上觀看網路電視節目或聽流媒體的音樂,也只涉及一 次又一次地執行簡單的算術指令。在網際網路上透過管道將 1 和 0 輸送到計 算機,重建影片幀,所使用的算術也不會比你在中學所做的加法運算複雜,這一點也許令你頗為驚奇。 


計算機可以以相當快的速度,在1 秒鐘內進行4 位數甚至10 位數的相加,這也許給人留下了深刻的印象,但是這不是人工智慧。人類可能發 現自己很難快速地進行加法運算,然而進行加法運算的過程不需要太多的 智慧。簡單說來,這隻要求計算機擁有遵循基本指令的能力,而這正是計 算機內的電子器件所做的事情。


現在,讓我們轉到事情的背面,掀開計算機的底牌。 讓我們觀察下麵的圖片,看看你能認出圖片中包含哪些內容。 你和我都看到了人臉、貓和樹的圖片,並識別出了這些內容。


事實上, 我們可以以非常高的精確度快速地做到這一點。在這方面,我們通常不會出錯。 我們可以處理影象中所包含的相當大量的資訊,並且可以成功地識別影象中有哪些內容。但這種任務對計算機而言,並不是那麼容易,實際上,是相當 困難的。


我們懷疑影象識別需要人類智慧,而這是機器所缺乏的。無論我 們造出的機器多麼複雜和強大,它們依然不是人類。但是,由於計算 機速度非常快,並且不知疲倦,我們恰恰希望計算機能更好地進行求 解影象識別這類問題。人工智慧所探討的一切問題就是解決這種類 型的難題。 

當然,計算機將永遠使用電子器件製造,因此研究人工智慧的任務就 是找到新方法或新演演算法,使用新的工作方式,嘗試求解這類相對困難的問 題。即使計算機不能完美地解決這些問題,但是我們只要求計算機足夠出 色,給人們留下一種印象,讓人覺得這是智慧在起作用。

一臺簡單的預測機

讓我們先從構建超級簡單的機器開始。 想象一下,一臺基本的機器,接受了一個問題,做了一些“思考”, 並輸出了一個答案。與我們在上面的例子中進行的操作一樣,我們從眼睛 輸入圖片,使用大腦分析場景,並得出在場景中有哪些物體的結論。 

下麵就是這臺機器看起來的樣子。

記住,計算機不是真的思考,它們只是得到包裝的計算器,因此讓我 們使用更恰當的詞語來形容這個過程。

一臺計算機接受了一些輸入,執行了一些計算,然後彈出輸出。下 列的內容詳細說明瞭這一點。一臺計算機對“3×4”的輸入進行處理, 這種處理也許是將乘法運算轉化為相對簡單的一組加法,然後彈出答案 “12”。

你可能會想“這也沒什麼了不起的吧!”,沒關係。這裡,我們使用 簡單和熟悉的例子來引出此後我們將看到的更有趣的神經網路的概念。

讓我們稍微增加一點複雜度。 試想一下將千米轉化為英里的一臺機器,如下所示。

現在想象一下,我們不知道千米和英里之間的轉換公式。我們所知道 的就是,兩者之間的關係是線性的。這意味著,如果英里數加倍,那麼表 示相同距離的千米數也是加倍的。這是非常直觀的。如果這都不是真理, 那麼這個宇宙就太讓人匪夷所思了。 


千米和英里之間的這種線性關係,為我們提供了這種神秘計算的線索, 即它的形式應該是“英里 =千米 ×C”,其中 C為常數。現在,我們還不知道這個常數 C是多少。 


我們擁有的唯一其他的線索是,一些正確的千米/ 英里匹配的數 值對示例。這些示例就像用來驗證科學理論的現實世界觀察實驗一樣, 顯示了世界的真實情況。


我們應該做些什麼,才能計算出缺失的常數 C 呢?我們信手拈來一 個隨機的數值,讓機器試一試!讓我們試著使用 C = 0.5,看看會發生什麼情況。

這裡,我們令:英里 =千米 ×C,其中千米為 100,當前,我們猜測 C為0.5。 

這臺機器得到 50 英里的答案。 嗯,鑒於我們隨機選擇了 C = 0.5,這種表現還算不錯。但是,編號為 2 的真實示例告訴我們,答案應該是 62.137,因此我們知道這是不準 確的。 我們少了 12.137。這是計算結果與我們列出的示例真實值之間的差值,是誤差。即: 

誤差值 = 真實值 – 計算值    

 = 62.137-50   

= 12.137

下一步,我們將做些什麼呢?我們知道錯了,並且知道差了多少。我 們無需對這種誤差感到失望,我們可以使用這個誤差,指導我們得到第二 個、更好的 C的猜測值。 

再看看這個誤差值。我們少了12.137。由於千米轉換為英里的公式 是線性的,即英里= 千米 ×C,因此我們知道,增加C 就可以增加 輸出。 

讓我們將 C 從 0.5 稍微增加到 0.6,觀察會發生什麼情況。 現在,由於將 C 設定為 0.6,我們得到了英里 = 千米 ×C = 100×0.6 = 60,這個答案比先前 50 的答案更好。我們取得了明顯的進步。 

現在,誤差值變得更小了,為2.137。這個數值甚至可能是我們很樂 於接受的一個誤差值。

這裡,很重要的一點是,我們使用誤差值的大小指導如何改變C 的 值。我們希望輸出值從 50 增大一些,因此我們稍微增加了 C 的值。 

我們不必嘗試使用代數法計算出 C需要改變的確切量,讓我們繼續使用 這種方法改進 C值。如果你還不能被我說服,還是認為計算出確切的答案才 夠簡單,那麼,請記住,更多有趣的問題是沒有一個簡單的數學公式將輸出 和輸入關聯起來的。這就是我們需要諸如神經網路這樣相對成熟而複雜的方 法的原因。 

讓我們再次重覆這個過程。輸出值 60 還是太小了。我們再次微調 C, 將其從 0.6 調到 0.7。

糟糕!過猶不及,結果超過了已知的正確答案。先前的誤差值為 2.137,現在的誤差值為 -7.863。這個負號告訴我們,我們不是不足,而是超調了。請記住上面的公式,誤差值等於真實值減去計算值。 

如此說來,C = 0.6 比 C = 0.7 好得多。我們可以就此結束這個練習,欣然接受C = 0.6 帶來的小小誤差。但是,讓我繼續向前走一小段距離。 我們為什麼不使用一個較小的量,微調 C,將 C 從 0.6 調到 0.61 呢?

這比先前得到的答案要好得多。我們得到輸出值 61,比起正確答案 62.137,這隻差了 1.137。

因此,最後的這次嘗試告訴我們,應該適度調整 C 值。如果輸出 值越來越接近正確答案,即誤差值越來越小,那麼我們就不要做那 麼大的調整。使用這種方式,我們就可以避免像先前那樣得到超調的 結果。

 

同樣,讀者無需為如何使用確切的方式算出 C 值而分心,請繼續關註 這種持續細化誤差值的想法,我們建議將修正值取為誤差值的百分比。直 覺上,這是正確的:大誤差意味著需要大的修正值,小誤差意味著我們只 需要小小地微調 C 的值。 


無論你是否相信,我們剛剛所做的,就是走馬觀花地瀏覽了一遍神 經網路中學習的核心過程。我們訓練機器,使其輸出值越來越接近正確的 答案。

這值得讀者停下來,思考一下這種方法,我們並未像在學校裡求解數 學和科學問題時所做的一樣一步到位,精確求解問題。相反,我們嘗試得 到一個答案,並多次改進答案,這是一種非常不同的方法。一些人將這種 方法稱為迭代,意思是持續地、一點一點地改進答案。


分類器與預測器並無太大差別


因為上述的簡單機器接受了一個輸入,並做出應有的預測,輸出結 果,所以我們將其稱為預測器。我們根據結果與已知真實示例進行比較所 得到的誤差,調整內部引數,使預測更加精確。 現在,我們來看看測量得到的花園中小蟲子的寬度和長度。

在上圖中,你可以清楚地看到兩群小蟲。毛蟲細而長,瓢蟲寬而短。 你還記得給定千米數,預測器試圖找出正確的英里數這個示例 嗎?這臺預測器的核心有一個可調節的線性函式。當你繪製輸入輸 出的關係圖時,線性函式輸出的是直線。可調引數C改變了直線的 斜率。 


如果我們在這幅圖上畫上一條直線,會發生什麼情況呢? 雖然我們不能使用先前將千米數轉換成英里數時的同樣方式,但是我們也許可以使用直線將不同性質的事物分開。

在上圖中,如果直線可以將毛蟲與瓢蟲劃分開來,那麼這條直線就可 以根據測量值對未知小蟲進行分類。由於有一半的毛蟲與瓢蟲在分界線的 同一側,因此上述的直線並沒有做到這一點。 讓我們再次調整斜率,嘗試不同的直線,看看會發生什麼情況。 這一次,這條直線真是一無是處!它根本沒有將兩種小蟲區分開來。 讓我們再試一次:

這條直線好多了!這條直線整齊地將瓢蟲與毛蟲區分開來了。現在, 我們可以用這條直線作為小蟲的分類器。 我們假設沒有未經發現的其他型別的小蟲,現在來說,這樣假設是沒有問題的,因為我們只是希望說明構建一臺簡單的分類器的思路。 


設想一下,下一次,計算機使用機器手臂抓起一隻新的小蟲,測量其寬 度和長度,然後它可以使用上面的分界線,將小蟲正確歸類為毛蟲或瓢蟲。 看看下圖,你可以看到未知的小蟲位於直線之上,因此這是一條毛 蟲。這種分類非常簡單,但是非常強大!

我們已經看到了,在簡單的預測器中,如何使用線性函式對先前未知 的資料進行分類。 但是,我們忽略了一個至關重要的因素。我們如何得到正確的斜率 呢?我們如何改進不能很好劃分這兩種小蟲的分界線呢? 這個問題的答案處於神經網路學習的核心地帶。讓我們來看《Python神經網路程式設計》

內容介紹

《Python神經網路程式設計》

[英] 塔裡克·拉希德(Tariq Rashid)

點選封面購買紙書


當前,深度學習和人工智慧的發展和應用給人們留下了深刻的印象。神經網路是深度學習和人工智慧的關鍵元素,然而,真正瞭解神經網路工作機制的人少之又少。本書用輕鬆的筆觸,一步一步揭示了神經網路的數學思想並介紹如何使用Python程式語言開發神經網路。本書將帶領您進行一場妙趣橫生卻又有條不紊的旅行——從一個非常簡單的想法開始,逐步理解神經網路的工作機制。您無需任何超出中學範圍的數學知識,並且本書還給出易於理解的微積分簡介。

本書為美亞五星暢銷書,備受關註。基於Python3.5,全綵印刷,如果只選一本神經網路圖書,他是首選。


本書的標的是讓盡可能多的普通讀者理解神經網路。讀者將學習使用Python開發自己的神經網路,訓練它識別手寫數字,甚至可以與專業的神經網路相媲美。本書適合想要瞭解深度學習、人工智慧和神經網路的讀者閱讀,尤其適合想要透過Python程式設計進行神經網路開發的讀者參考。


本書目錄:(滑動手機檢視)

第 1 章 神經網路如何工作001

1.1 尺有所短,寸有所長 001

1.2 一臺簡單的預測機 003

1.3 分類器與預測器並無太大差別008

1.4 訓練簡單的分類器 011

1.5 有時候一個分類器不足以求解問題 020

1.6 神經元——大自然的計算機器 024

1.7 在神經網路中追蹤訊號 033

1.8 憑心而論,矩陣乘法大有用途 037

1.9 使用矩陣乘法的三層神經網路示例 043

1.10 學習來自多個節點的權重 051

1.11 多個輸出節點反向傳播誤差053

1.12 反向傳播誤差到更多層中 054

1.13 使用矩陣乘法進行反向傳播誤差 058

1.14 我們實際上如何更新權重 061

1.15 權重更新成功範例 077

1.16 準備資料 078

第 2 章 使用Python進行DIY 083

2.1 Python 083

2.2 互動式Python = IPython 084

2.3 優雅地開始使用Python 085

2.4 使用Python製作神經網路 105

2.5 手寫數字的資料集MNIST 121

第 3 章 趣味盎然 153

3.1 自己的手寫數字 153

3.2 神經網路大腦內部 156

3.3 建立新的訓練資料:旋轉影象 160

3.4 結語 164

附錄A 微積分簡介 165

A.1 一條平直的線 166

A.2 一條斜線 168

A.3 一條曲線 170

A.4 手繪微積分 172

A.5 非手繪微積分 174

A.6 無需繪製圖表的微積分 177

A.7 樣式 180

A.8 函式的函式 182

附錄B 使用樹莓派來工作 186

B.1 安裝IPython 187

B.2 確保各項工作正常進行 193

B.3 訓練和測試神經網路 194

B.4 樹莓派成功了 195


●編號381,輸入編號直達本文

●輸入m獲取文章目錄

推薦↓↓↓

 

大資料與人工智慧

更多推薦:18個技術類微信公眾號

涵蓋:程式人生、演演算法與資料結構、駭客技術與網路安全、大資料技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。

贊(0)

分享創造快樂