'“深度學習”(2)神經網絡的神奇操作'

"
"
“深度學習”(2)神經網絡的神奇操作

今天我們來做一個神經網絡學習的實戰。這是一套可以說是神奇的操作 —— 因為它簡直是出乎意料地簡單。你會感慨,為什麼這麼複雜的問題,居然能用這麼一個簡單粗暴的方法就解決了。

在我看來這絕對是一個工程上的幸運發現。很多發明創造都是工程師偶然鼓搗出來的。噴氣式發動機到底是什麼原理?到現在人們也沒說清楚。阿司匹林為什麼有這樣和那樣的療效?醫學研究還得繼續做實驗。神經網絡計算就是這麼一種發明,計算機科學家發現它很有用,可是要想用嚴格的數學說明它為什麼這麼有用,那很困難。

我們要用神經網絡來識別手寫的阿拉伯數字。這是一個非常成熟的項目,網上有現成的數據庫和好幾個教程。有個邁克爾·尼爾森(Michael Nielsen)做了個深度學習在線教程值得你深入瞭解 [1],他只用了74行 Python 程序代碼就做成了這件事。

給你幾個手寫阿拉伯數字,可能是信封上的郵政編碼也可能是支票上的錢數,你怎麼教會計算機識別這些數字呢?

"
“深度學習”(2)神經網絡的神奇操作

今天我們來做一個神經網絡學習的實戰。這是一套可以說是神奇的操作 —— 因為它簡直是出乎意料地簡單。你會感慨,為什麼這麼複雜的問題,居然能用這麼一個簡單粗暴的方法就解決了。

在我看來這絕對是一個工程上的幸運發現。很多發明創造都是工程師偶然鼓搗出來的。噴氣式發動機到底是什麼原理?到現在人們也沒說清楚。阿司匹林為什麼有這樣和那樣的療效?醫學研究還得繼續做實驗。神經網絡計算就是這麼一種發明,計算機科學家發現它很有用,可是要想用嚴格的數學說明它為什麼這麼有用,那很困難。

我們要用神經網絡來識別手寫的阿拉伯數字。這是一個非常成熟的項目,網上有現成的數據庫和好幾個教程。有個邁克爾·尼爾森(Michael Nielsen)做了個深度學習在線教程值得你深入瞭解 [1],他只用了74行 Python 程序代碼就做成了這件事。

給你幾個手寫阿拉伯數字,可能是信封上的郵政編碼也可能是支票上的錢數,你怎麼教會計算機識別這些數字呢?

“深度學習”(2)神經網絡的神奇操作

1. 簡化

想要讓計算機處理,首先你得把問題“數學化”。寫在紙上的字千變萬化,我們首先從中簡化出來一個數學問題。我們首先用幾個正方形把各個數字分開,就像下面這張圖一樣 ——

"
“深度學習”(2)神經網絡的神奇操作

今天我們來做一個神經網絡學習的實戰。這是一套可以說是神奇的操作 —— 因為它簡直是出乎意料地簡單。你會感慨,為什麼這麼複雜的問題,居然能用這麼一個簡單粗暴的方法就解決了。

在我看來這絕對是一個工程上的幸運發現。很多發明創造都是工程師偶然鼓搗出來的。噴氣式發動機到底是什麼原理?到現在人們也沒說清楚。阿司匹林為什麼有這樣和那樣的療效?醫學研究還得繼續做實驗。神經網絡計算就是這麼一種發明,計算機科學家發現它很有用,可是要想用嚴格的數學說明它為什麼這麼有用,那很困難。

我們要用神經網絡來識別手寫的阿拉伯數字。這是一個非常成熟的項目,網上有現成的數據庫和好幾個教程。有個邁克爾·尼爾森(Michael Nielsen)做了個深度學習在線教程值得你深入瞭解 [1],他只用了74行 Python 程序代碼就做成了這件事。

給你幾個手寫阿拉伯數字,可能是信封上的郵政編碼也可能是支票上的錢數,你怎麼教會計算機識別這些數字呢?

“深度學習”(2)神經網絡的神奇操作

1. 簡化

想要讓計算機處理,首先你得把問題“數學化”。寫在紙上的字千變萬化,我們首先從中簡化出來一個數學問題。我們首先用幾個正方形把各個數字分開,就像下面這張圖一樣 ——

“深度學習”(2)神經網絡的神奇操作

現在問題變成給你一個包含一個手寫數字的正方形區域,你能不能識別其中是個什麼數字 ——

"
“深度學習”(2)神經網絡的神奇操作

今天我們來做一個神經網絡學習的實戰。這是一套可以說是神奇的操作 —— 因為它簡直是出乎意料地簡單。你會感慨,為什麼這麼複雜的問題,居然能用這麼一個簡單粗暴的方法就解決了。

在我看來這絕對是一個工程上的幸運發現。很多發明創造都是工程師偶然鼓搗出來的。噴氣式發動機到底是什麼原理?到現在人們也沒說清楚。阿司匹林為什麼有這樣和那樣的療效?醫學研究還得繼續做實驗。神經網絡計算就是這麼一種發明,計算機科學家發現它很有用,可是要想用嚴格的數學說明它為什麼這麼有用,那很困難。

我們要用神經網絡來識別手寫的阿拉伯數字。這是一個非常成熟的項目,網上有現成的數據庫和好幾個教程。有個邁克爾·尼爾森(Michael Nielsen)做了個深度學習在線教程值得你深入瞭解 [1],他只用了74行 Python 程序代碼就做成了這件事。

給你幾個手寫阿拉伯數字,可能是信封上的郵政編碼也可能是支票上的錢數,你怎麼教會計算機識別這些數字呢?

“深度學習”(2)神經網絡的神奇操作

1. 簡化

想要讓計算機處理,首先你得把問題“數學化”。寫在紙上的字千變萬化,我們首先從中簡化出來一個數學問題。我們首先用幾個正方形把各個數字分開,就像下面這張圖一樣 ——

“深度學習”(2)神經網絡的神奇操作

現在問題變成給你一個包含一個手寫數字的正方形區域,你能不能識別其中是個什麼數字 ——

“深度學習”(2)神經網絡的神奇操作

再進一步,我們忽略字的顏色,降低正方形的分辨率,就考慮一個 28×28 = 784 個像素的圖像。我們規定每一個像素值都是0到1之間的一個小數,代表灰度的深淺,0表示純白色,1表示純黑。這樣一來,手寫的數字“1”就變成了下面這個樣子 ——

"
“深度學習”(2)神經網絡的神奇操作

今天我們來做一個神經網絡學習的實戰。這是一套可以說是神奇的操作 —— 因為它簡直是出乎意料地簡單。你會感慨,為什麼這麼複雜的問題,居然能用這麼一個簡單粗暴的方法就解決了。

在我看來這絕對是一個工程上的幸運發現。很多發明創造都是工程師偶然鼓搗出來的。噴氣式發動機到底是什麼原理?到現在人們也沒說清楚。阿司匹林為什麼有這樣和那樣的療效?醫學研究還得繼續做實驗。神經網絡計算就是這麼一種發明,計算機科學家發現它很有用,可是要想用嚴格的數學說明它為什麼這麼有用,那很困難。

我們要用神經網絡來識別手寫的阿拉伯數字。這是一個非常成熟的項目,網上有現成的數據庫和好幾個教程。有個邁克爾·尼爾森(Michael Nielsen)做了個深度學習在線教程值得你深入瞭解 [1],他只用了74行 Python 程序代碼就做成了這件事。

給你幾個手寫阿拉伯數字,可能是信封上的郵政編碼也可能是支票上的錢數,你怎麼教會計算機識別這些數字呢?

“深度學習”(2)神經網絡的神奇操作

1. 簡化

想要讓計算機處理,首先你得把問題“數學化”。寫在紙上的字千變萬化,我們首先從中簡化出來一個數學問題。我們首先用幾個正方形把各個數字分開,就像下面這張圖一樣 ——

“深度學習”(2)神經網絡的神奇操作

現在問題變成給你一個包含一個手寫數字的正方形區域,你能不能識別其中是個什麼數字 ——

“深度學習”(2)神經網絡的神奇操作

再進一步,我們忽略字的顏色,降低正方形的分辨率,就考慮一個 28×28 = 784 個像素的圖像。我們規定每一個像素值都是0到1之間的一個小數,代表灰度的深淺,0表示純白色,1表示純黑。這樣一來,手寫的數字“1”就變成了下面這個樣子 ——

“深度學習”(2)神經網絡的神奇操作

[圖片來自packtpub.com, The MNIST dataset。實際分辨率是28×28。]

你看這就完全是一個數學問題了。現在無非就是給你784個0-1之間的數,你能不能對這組數做一番操作,判斷它們對應的是哪個阿拉伯數字。輸入784個數,輸出一個數。

這件事從常理來說並不是一點頭緒都沒有。比如任何人寫數字“7”,左下角的區域應該是空白的,這就意味著784個像素點中對應正方形左下角區域那些點的數值應該是0。再比如說,寫“0”的時候的中間是空的,那麼對應正方形中間的那些像素點的數值應該是0。

但這個人為找規律的思路非常不可行。首先你很難想到所有的規則,更重要的是很多規則都是模糊的 —— 比如,7的左下角空白,那這個空白區域應該有多大呢?不同人的寫法肯定不一樣。

肯定有規律,可你說不清都是什麼規律,這種問題特別適合神經網絡學習。

2. 設定

我們要用的這個方法叫做“誤差反向傳播網絡”,它最早起源於1986年發表在《自然》雜誌上的一篇論文 [2],這篇論文的被引用次數已經超過了4萬次,是深度學習的里程碑。

根據尼爾森的教程,我們建一個三層的神經網絡,就是下面這張圖 ——

"
“深度學習”(2)神經網絡的神奇操作

今天我們來做一個神經網絡學習的實戰。這是一套可以說是神奇的操作 —— 因為它簡直是出乎意料地簡單。你會感慨,為什麼這麼複雜的問題,居然能用這麼一個簡單粗暴的方法就解決了。

在我看來這絕對是一個工程上的幸運發現。很多發明創造都是工程師偶然鼓搗出來的。噴氣式發動機到底是什麼原理?到現在人們也沒說清楚。阿司匹林為什麼有這樣和那樣的療效?醫學研究還得繼續做實驗。神經網絡計算就是這麼一種發明,計算機科學家發現它很有用,可是要想用嚴格的數學說明它為什麼這麼有用,那很困難。

我們要用神經網絡來識別手寫的阿拉伯數字。這是一個非常成熟的項目,網上有現成的數據庫和好幾個教程。有個邁克爾·尼爾森(Michael Nielsen)做了個深度學習在線教程值得你深入瞭解 [1],他只用了74行 Python 程序代碼就做成了這件事。

給你幾個手寫阿拉伯數字,可能是信封上的郵政編碼也可能是支票上的錢數,你怎麼教會計算機識別這些數字呢?

“深度學習”(2)神經網絡的神奇操作

1. 簡化

想要讓計算機處理,首先你得把問題“數學化”。寫在紙上的字千變萬化,我們首先從中簡化出來一個數學問題。我們首先用幾個正方形把各個數字分開,就像下面這張圖一樣 ——

“深度學習”(2)神經網絡的神奇操作

現在問題變成給你一個包含一個手寫數字的正方形區域,你能不能識別其中是個什麼數字 ——

“深度學習”(2)神經網絡的神奇操作

再進一步,我們忽略字的顏色,降低正方形的分辨率,就考慮一個 28×28 = 784 個像素的圖像。我們規定每一個像素值都是0到1之間的一個小數,代表灰度的深淺,0表示純白色,1表示純黑。這樣一來,手寫的數字“1”就變成了下面這個樣子 ——

“深度學習”(2)神經網絡的神奇操作

[圖片來自packtpub.com, The MNIST dataset。實際分辨率是28×28。]

你看這就完全是一個數學問題了。現在無非就是給你784個0-1之間的數,你能不能對這組數做一番操作,判斷它們對應的是哪個阿拉伯數字。輸入784個數,輸出一個數。

這件事從常理來說並不是一點頭緒都沒有。比如任何人寫數字“7”,左下角的區域應該是空白的,這就意味著784個像素點中對應正方形左下角區域那些點的數值應該是0。再比如說,寫“0”的時候的中間是空的,那麼對應正方形中間的那些像素點的數值應該是0。

但這個人為找規律的思路非常不可行。首先你很難想到所有的規則,更重要的是很多規則都是模糊的 —— 比如,7的左下角空白,那這個空白區域應該有多大呢?不同人的寫法肯定不一樣。

肯定有規律,可你說不清都是什麼規律,這種問題特別適合神經網絡學習。

2. 設定

我們要用的這個方法叫做“誤差反向傳播網絡”,它最早起源於1986年發表在《自然》雜誌上的一篇論文 [2],這篇論文的被引用次數已經超過了4萬次,是深度學習的里程碑。

根據尼爾森的教程,我們建一個三層的神經網絡,就是下面這張圖 ——

“深度學習”(2)神經網絡的神奇操作

第一層是輸入數據,圖中只畫了8個點,但其實上有784個數據點。第二層是隱藏層,由15個神經元組成。第三層是輸出層,有10個神經元,對應0-9這10個數字。

上一講我們說了,每個神經元都由輸入、權重和偏移值參數、輸出三個部分組成。隱藏層15個神經元中的每一個都要接收全部784個像素的數據輸入,總共有784×15=11760個權重和15個偏移值。第三層10個神經元的每一個都要跟第二層的所有15個神經元連接,總共有150個權重和10個偏移值。這樣下來,整個神經網絡一共有11935個可調參數。

理想狀態下,784個輸入值在經過隱藏層和輸出層這兩層神經元的處理後,輸出層的哪個神經元的輸出結果最接近於1,神經網絡就判斷這是哪一個手寫數字。當然一開始肯定做不到,我們可以乾脆隨機選擇這11935個參數的初始值。

3. 訓練

網上有個公開的現成數據庫叫“MNIST”,其中包括6萬個手寫的數字圖像,都標記了它們代表的是哪些數字 ——

"
“深度學習”(2)神經網絡的神奇操作

今天我們來做一個神經網絡學習的實戰。這是一套可以說是神奇的操作 —— 因為它簡直是出乎意料地簡單。你會感慨,為什麼這麼複雜的問題,居然能用這麼一個簡單粗暴的方法就解決了。

在我看來這絕對是一個工程上的幸運發現。很多發明創造都是工程師偶然鼓搗出來的。噴氣式發動機到底是什麼原理?到現在人們也沒說清楚。阿司匹林為什麼有這樣和那樣的療效?醫學研究還得繼續做實驗。神經網絡計算就是這麼一種發明,計算機科學家發現它很有用,可是要想用嚴格的數學說明它為什麼這麼有用,那很困難。

我們要用神經網絡來識別手寫的阿拉伯數字。這是一個非常成熟的項目,網上有現成的數據庫和好幾個教程。有個邁克爾·尼爾森(Michael Nielsen)做了個深度學習在線教程值得你深入瞭解 [1],他只用了74行 Python 程序代碼就做成了這件事。

給你幾個手寫阿拉伯數字,可能是信封上的郵政編碼也可能是支票上的錢數,你怎麼教會計算機識別這些數字呢?

“深度學習”(2)神經網絡的神奇操作

1. 簡化

想要讓計算機處理,首先你得把問題“數學化”。寫在紙上的字千變萬化,我們首先從中簡化出來一個數學問題。我們首先用幾個正方形把各個數字分開,就像下面這張圖一樣 ——

“深度學習”(2)神經網絡的神奇操作

現在問題變成給你一個包含一個手寫數字的正方形區域,你能不能識別其中是個什麼數字 ——

“深度學習”(2)神經網絡的神奇操作

再進一步,我們忽略字的顏色,降低正方形的分辨率,就考慮一個 28×28 = 784 個像素的圖像。我們規定每一個像素值都是0到1之間的一個小數,代表灰度的深淺,0表示純白色,1表示純黑。這樣一來,手寫的數字“1”就變成了下面這個樣子 ——

“深度學習”(2)神經網絡的神奇操作

[圖片來自packtpub.com, The MNIST dataset。實際分辨率是28×28。]

你看這就完全是一個數學問題了。現在無非就是給你784個0-1之間的數,你能不能對這組數做一番操作,判斷它們對應的是哪個阿拉伯數字。輸入784個數,輸出一個數。

這件事從常理來說並不是一點頭緒都沒有。比如任何人寫數字“7”,左下角的區域應該是空白的,這就意味著784個像素點中對應正方形左下角區域那些點的數值應該是0。再比如說,寫“0”的時候的中間是空的,那麼對應正方形中間的那些像素點的數值應該是0。

但這個人為找規律的思路非常不可行。首先你很難想到所有的規則,更重要的是很多規則都是模糊的 —— 比如,7的左下角空白,那這個空白區域應該有多大呢?不同人的寫法肯定不一樣。

肯定有規律,可你說不清都是什麼規律,這種問題特別適合神經網絡學習。

2. 設定

我們要用的這個方法叫做“誤差反向傳播網絡”,它最早起源於1986年發表在《自然》雜誌上的一篇論文 [2],這篇論文的被引用次數已經超過了4萬次,是深度學習的里程碑。

根據尼爾森的教程,我們建一個三層的神經網絡,就是下面這張圖 ——

“深度學習”(2)神經網絡的神奇操作

第一層是輸入數據,圖中只畫了8個點,但其實上有784個數據點。第二層是隱藏層,由15個神經元組成。第三層是輸出層,有10個神經元,對應0-9這10個數字。

上一講我們說了,每個神經元都由輸入、權重和偏移值參數、輸出三個部分組成。隱藏層15個神經元中的每一個都要接收全部784個像素的數據輸入,總共有784×15=11760個權重和15個偏移值。第三層10個神經元的每一個都要跟第二層的所有15個神經元連接,總共有150個權重和10個偏移值。這樣下來,整個神經網絡一共有11935個可調參數。

理想狀態下,784個輸入值在經過隱藏層和輸出層這兩層神經元的處理後,輸出層的哪個神經元的輸出結果最接近於1,神經網絡就判斷這是哪一個手寫數字。當然一開始肯定做不到,我們可以乾脆隨機選擇這11935個參數的初始值。

3. 訓練

網上有個公開的現成數據庫叫“MNIST”,其中包括6萬個手寫的數字圖像,都標記了它們代表的是哪些數字 ——

“深度學習”(2)神經網絡的神奇操作

我們要做的是用這些圖像訓練神經網絡,去調整好那11935個參數。我們可以用其中3萬個圖像訓練,用剩下3萬個圖像檢驗訓練效果。

這個訓練調整參數的方法,就是“誤差反向傳播”。比如我們輸入一個數字“7”的圖像 ——

"
“深度學習”(2)神經網絡的神奇操作

今天我們來做一個神經網絡學習的實戰。這是一套可以說是神奇的操作 —— 因為它簡直是出乎意料地簡單。你會感慨,為什麼這麼複雜的問題,居然能用這麼一個簡單粗暴的方法就解決了。

在我看來這絕對是一個工程上的幸運發現。很多發明創造都是工程師偶然鼓搗出來的。噴氣式發動機到底是什麼原理?到現在人們也沒說清楚。阿司匹林為什麼有這樣和那樣的療效?醫學研究還得繼續做實驗。神經網絡計算就是這麼一種發明,計算機科學家發現它很有用,可是要想用嚴格的數學說明它為什麼這麼有用,那很困難。

我們要用神經網絡來識別手寫的阿拉伯數字。這是一個非常成熟的項目,網上有現成的數據庫和好幾個教程。有個邁克爾·尼爾森(Michael Nielsen)做了個深度學習在線教程值得你深入瞭解 [1],他只用了74行 Python 程序代碼就做成了這件事。

給你幾個手寫阿拉伯數字,可能是信封上的郵政編碼也可能是支票上的錢數,你怎麼教會計算機識別這些數字呢?

“深度學習”(2)神經網絡的神奇操作

1. 簡化

想要讓計算機處理,首先你得把問題“數學化”。寫在紙上的字千變萬化,我們首先從中簡化出來一個數學問題。我們首先用幾個正方形把各個數字分開,就像下面這張圖一樣 ——

“深度學習”(2)神經網絡的神奇操作

現在問題變成給你一個包含一個手寫數字的正方形區域,你能不能識別其中是個什麼數字 ——

“深度學習”(2)神經網絡的神奇操作

再進一步,我們忽略字的顏色,降低正方形的分辨率,就考慮一個 28×28 = 784 個像素的圖像。我們規定每一個像素值都是0到1之間的一個小數,代表灰度的深淺,0表示純白色,1表示純黑。這樣一來,手寫的數字“1”就變成了下面這個樣子 ——

“深度學習”(2)神經網絡的神奇操作

[圖片來自packtpub.com, The MNIST dataset。實際分辨率是28×28。]

你看這就完全是一個數學問題了。現在無非就是給你784個0-1之間的數,你能不能對這組數做一番操作,判斷它們對應的是哪個阿拉伯數字。輸入784個數,輸出一個數。

這件事從常理來說並不是一點頭緒都沒有。比如任何人寫數字“7”,左下角的區域應該是空白的,這就意味著784個像素點中對應正方形左下角區域那些點的數值應該是0。再比如說,寫“0”的時候的中間是空的,那麼對應正方形中間的那些像素點的數值應該是0。

但這個人為找規律的思路非常不可行。首先你很難想到所有的規則,更重要的是很多規則都是模糊的 —— 比如,7的左下角空白,那這個空白區域應該有多大呢?不同人的寫法肯定不一樣。

肯定有規律,可你說不清都是什麼規律,這種問題特別適合神經網絡學習。

2. 設定

我們要用的這個方法叫做“誤差反向傳播網絡”,它最早起源於1986年發表在《自然》雜誌上的一篇論文 [2],這篇論文的被引用次數已經超過了4萬次,是深度學習的里程碑。

根據尼爾森的教程,我們建一個三層的神經網絡,就是下面這張圖 ——

“深度學習”(2)神經網絡的神奇操作

第一層是輸入數據,圖中只畫了8個點,但其實上有784個數據點。第二層是隱藏層,由15個神經元組成。第三層是輸出層,有10個神經元,對應0-9這10個數字。

上一講我們說了,每個神經元都由輸入、權重和偏移值參數、輸出三個部分組成。隱藏層15個神經元中的每一個都要接收全部784個像素的數據輸入,總共有784×15=11760個權重和15個偏移值。第三層10個神經元的每一個都要跟第二層的所有15個神經元連接,總共有150個權重和10個偏移值。這樣下來,整個神經網絡一共有11935個可調參數。

理想狀態下,784個輸入值在經過隱藏層和輸出層這兩層神經元的處理後,輸出層的哪個神經元的輸出結果最接近於1,神經網絡就判斷這是哪一個手寫數字。當然一開始肯定做不到,我們可以乾脆隨機選擇這11935個參數的初始值。

3. 訓練

網上有個公開的現成數據庫叫“MNIST”,其中包括6萬個手寫的數字圖像,都標記了它們代表的是哪些數字 ——

“深度學習”(2)神經網絡的神奇操作

我們要做的是用這些圖像訓練神經網絡,去調整好那11935個參數。我們可以用其中3萬個圖像訓練,用剩下3萬個圖像檢驗訓練效果。

這個訓練調整參數的方法,就是“誤差反向傳播”。比如我們輸入一個數字“7”的圖像 ——

“深度學習”(2)神經網絡的神奇操作

神經網絡實際收到的是784個像素值。經過兩層神經元的傳播計算,理想情況下,輸出層的7號神經元的輸出值應該最接近於1,其他的都很接近於0。可是一開始肯定不是這樣,我們要用一套特定的規則去調整各個神經元的參數。

關鍵思想在於,參數調整有個方向,叫做“誤差梯度”。比如對輸出層的7號神經元來說,調整方向就是要讓它的輸出值變大;對其他9個神經元,調整方向則是讓輸出值變小。這個調整策略是看哪個輸入信息對結果的影響大,對它的權重的調整就要大一點。

隱藏層神經元的參數調整更麻煩。我們必須考慮到,調整一個隱藏層的神經元,會同時影響全部10個輸出層神經元的輸入值。這就涉及到誤差反向傳遞了,也就是調整前面神經元的參數,必須考慮它對後面神經元總體誤差的影響。

具體的調整算法都是技術細節,我們這裡關鍵是要理解這個設計思想:每次新的訓練數據進來,就根據正確答案對參數進行一次微調,使得神經網絡輸出數值更接近正確答案。

這有點像是體育訓練中的刻意練習。反饋是即時的,你做的結果立即就能跟正確答案比較。不要求你馬上就做對,但是每次總要進步一點點。而你每一次都明確知道,身體上每一個關節的動作應該往哪個方向調整。

幾萬個訓練圖像可能會被反覆使用多次,神經網絡參數改過來改過去,最終將會達到穩定。你會發現,慢慢地,新圖像喂進來,這11935個參數的變化越來越小、最終幾乎不動了。那就是說,這個識別手寫數字的神經網絡,已經練成了。

事實證明這個簡單網絡的識別準確率能達到95%!這個結果讓我們有很多感慨和問題。

4. 感慨

如果是一個數學家聽說這波操作,他問的第一個問題肯定是,為什麼最後居然能得到一組穩定的參數?為什麼不一直都是每輸入一個數,所有參數都劇烈變動呢?用數學語言來說,就是為什麼這些參數能“收斂”?

這隻能是因為手寫數字是有規律的。所有人寫數字差不多都是相似的寫法,神經網絡訓練一段時間就見怪不怪了。如果你一會兒把這個寫法叫7,一會兒把一個完全不同的寫法叫7,神經網絡就會無所適從。

比如說,如果我們用歷史上的股票價格走向去訓練一個神經網絡,看看它能不能預測未來的股價,我敢打賭你將不會得到一組穩定的參數。因為股價變動幾乎是沒有規律的。

我們能這麼做,是因為手寫數字允許你這麼做。

第二,雖然有規律很重要,雖然我們的神經網絡已經能做出出色的判斷,但是我們仍然不知道到底有哪些規律。

整個神經網絡就像一個黑箱。你能看到那11935個參數的數值,但是你不知道,這些數值到底用到了哪些規律。

當神經網絡判斷數字“7”的時候,它利用了“7的左下角都是空白”這個規律嗎?我猜如果你仔細分析神經網絡的信息傳遞,這個規律肯定已經體現在其中了。這就是神經網絡的妙處!現在你還是不能一一列舉所有的規律,但是所有的規律都已經被默默包含在11935個參數之中。

會,但是說不清 —— 人腦的這個特點,就這樣簡單粗暴地被神經網絡複製了。

第三,神經網絡必須得用專門的數據喂出來。訓練好之後,它就相當於長成了一個專門判斷阿拉伯數字的網絡。它不能判斷英文字母或者別的什麼東西。

當然,我們完全可以使用同樣的網絡設定,訓練一個專門判斷“零、壹、……玖”大寫中文數字的神經網絡 —— 但是對不起,你得先有幾萬個圖像作為訓練素材才行。深度學習的原理都是公開的,訓練數據才是各家公司真正的稀缺資源,得慢慢積累。

第四,深度學習非常消耗資源。我們只用了25個神經元和28×28的低分辨率的圖像,就要每次訓練都調整11935個參數。應用級別的深度學習將會是海量的計算。現在最新的芯片,比如蘋果的A11和A12芯片上,已經有專門的神經網絡計算引擎。

為什麼今天的例子只用了兩層神經元,為什麼不再多加一層、每層多用幾個神經元呢?首先運算量會大大增加,其次更復雜的網絡需要更多的訓練,可能幾萬個圖像就不夠了。工程學不是從第一性原理出發的科學,只要能用就是對的 —— 到底怎麼搭配是最優解,那是留給數學家的難題。

還有一點,這個方法按現代標準就算是太簡單了。我們的訓練素材中,每個數字都不大不小,都寫在正方形區域的正中間。那要是一張很大的圖片裡有個很小的數字,用這個神經網絡就不能識別了。

而新一代深度學習網絡,哪怕是一張照片的角落裡有一隻貓,它都能識別出來。這就是“卷積網絡”做的事,它除了一般的隱藏層,還會在中間再加入幾個邏輯層……關於這個話題,咱們下一講再說。

參考文獻

[1] http://neuralnetworksanddeeplearning.com/chap1.html

[2] David E. Rumelhart, Geoffrey E. Hinton & Ronald J. Williams, Learning representations by back-propagating errors, Nature 323, 533–536 (1986).

"

相關推薦

推薦中...