本文根據趙建亭老師在〖deeplus直播第275期〗線上分享演講內容整理而成。(文末有回放的方式,不要錯過)
現在的互聯網領域張口機器學習,閉口神經網絡,三句不離深度學習(Oh,oh,oh!AI、DeepLearning更容易把人唬住),外行人或甚至干了十多年的資深開發人員都會覺得觸不可及,可能的原因大概是對人工智能認知的問題,大部分人都以為人工智能是指計算機真的像科幻片似的具有了像人類一樣的思維意識,其實不然,而且永遠也不會實現。讀完本文對人工智能誤解就會得到釋疑。事實上,人工智能都是傳統的IT技術,只是大家都不愿意戳穿這薄薄的一層紙,公司需要這個噱頭爭取補助資金,員工需要這個噱頭拿到高工資,正所謂“江湖千金訣,點破不值錢”。
一、前言
依稀記得,鄙人2010剛從學校畢業時,當時物聯網之火燒得直沖云宵,大學的教師、教授,一夜之間全部都成了物聯網專家。良知和對科學態度的堅貞,鄙人實在不敢茍同這種風氣。今天這種現像再次上演,教授、導師、碩士、博士的簡歷上幾乎被深度學習的字樣占據一空,像計算機、軟件、數學等專業,至少可以胡拉硬扯地沾個邊連,但機械專業、化學專業、醫學專業的人都能瞬間變成人工智能的專家,鄙人實在佩服地無話可說。”
某度公司,天天高舉“All in AI”的大旗,號稱無人駕駛汽車5年內可上路,事實是深度學習大牛陸奇從“某度公司”離職時,強烈批判了“某度公司”只有口號,沒有任何實質性的東西。依鄙人掌握的信息,最看重AI的科技巨頭蘋果公司早已完全裁撤了整個無人駕駛團隊。
鄙人拙見,無人機有今天的成功是因為在天上,天上沒有人,不會出事故,而無人駕駛汽車30年內不可能上路,因為路上到處都是人和車,系統稍有偏差就有可能發生重大交通事故。高舉AI大旗無非是為了巨額的扶持資金。從交大“漢芯事件”,到南陽加水就能跑的“氫能神車”,難道我國人真的沒學過初中物理?
二、智能和自動化的區別
智能和自動化有著本質的區別,人類是目前唯一的智慧生物。人類之所以是智能的,是因為人類所有的行為都是主動的選擇的,即人類具有主動思維意識。而計算機所有的行為都是嚴格按照人類設定的程式,被動的執行一定的行為,都屬于自動化。
三、機器學習
1. 機器學習的算法
1)窮舉
言歸正傳,現在開始講解機器學習、神經網絡、深度學習到底是什么神秘的東東。
機器學習是指機器具有自動學習知識進化的能力,神經網絡、深度學習、人工智能都是機器學習的分支,只是采用的手段不同而已。那么到底什么是機器學習呢?如果點破這層薄薄的面紗,機器學習的本質是窮舉。請看下面的文氏圖:
正所謂:尺有所短,寸有所長。計算機的根本功能就是計算、也只能計算,無論圖像、音頻播放、視頻播放、游戲等,都是一次又不一地執行簡單的算術命令。對人類來說,識別一張圖片的物體非常容易,但對計算機來說是非常困難的,但是如果要計算11223496448484884 * 89753939393968的結果,對人類來說并非易事,但對計算機來說非常簡單。如何讓計算機識別圖片這類問題,就是人工智能所探討的核心難題。
2)線性回歸
現在我們來看下機器學習最經典的算法之一:線性回歸(也稱為預測機),通過本例就可以了解機器學習的本質。我們要解決,輸入平方米輸出畝:
假設,我們只知道兩者之間是線性關系,不知道平方米和畝的計算公式。這個問題本質就變為了求解線性方程的系數C問題:Y=CX,X是我們的輸入,Y是輸出。如果沒有其它資料,是無法求解出參數C的,怎么辦呢?我們去找一些正確的 平方米/畝 的示例:
現在假設C=0.6,然后讓計算機去式:
計算機給出的答案(我們稱為預測值)是:231.24畝,真實答案是:0.577。預測值比真實值大多了。預測值與真實值的差值,我們稱為誤差即:
誤差值 = 真實值 - 預測值 = 0.577 - 231.24 = -230.663
我們知道,C值取取得大了,現在把C值減小取C=0.05 ,并換一個輸入值:
誤差值 = 1.033 - 34.473 = -33.44
預測值還是大了,但誤差更小了,繼續減小C值,取C=0.0018:
誤差值 = 0.577 - 0.694 = -0.117
已經非常接近真實值了,如果繼續微調,就可以無限接近真實值,雖然一般無法求得最優解,但現實中只是誤差可以接受就可以了。通過現有的數據或資料,稱為樣本,通過嘗試求解參數(局部最優解)的過程,就是機器學習的核心內容。誤差值是用來控制每次調整參數的幅度。
2. 神經網絡
上述線性回歸解決的是線性問題,但有些問題是非線性的,例如要下圖中的黑點和紅點分開,是找不到這樣的一條直線的,但兩條直線就可以,這就啟示我們可以用多個分類器一起工作:
1)神經元
如果初中生物沒忘完,我們知道人類的大腦是由無數個神經元協同工作的,人類的神經元是將電信號從一端傳輸到另一端,沿著軸突,將電信號從樹突傳到樹突。然后,這些信號從一個神經元傳遞到另一個神經元。這就是我們人類感知光、聲、熱等信號的機制。一般認為,人類大腦有1000億個神經元。人類的神經元結構如下:
受此啟發,計算機學家們認為線性回歸分類器就是一個神經元,那么多個分類器一起工作就模擬了人類的神經系統,也就可以解決非線性問題了,這就是神經網絡的核心概念。我們知道,神經元接受大信號后不會立即反應而是抑制輸放,直到信號強度達到一個閾值,才會產生輸出,激活函數就是為了模仿神經元的這個功能。下圖是神經網絡中的神經元,稱之為節點。
2)激活函數
神經元可以接受多個輸入,然后對它們相加,作為激活函數的輸入,激活函數最后給出輸出。這就是神經網絡的核心神經元的主要原理。激活函數現在有好多個,我們采用S函數,圖像如下:
3)神經網絡結構?
神經網絡結構如下:
上圖就是一個三層神經網絡,每層包括三個神經元,神經網絡就是由分成多層的多個神經元組成。每個層中的每個神經元都與其前后層的神經元互連,這種網絡結構稱全連接神經網絡,這是經典的神經網絡。當然后面又了出現了卷積神經網絡,也就是吹得神乎其神的深度學習,下面會作講解。神經網絡中間層,上一層輸出就是下一層的輸入,第一層的輸入是原始輸入,最后一層的輸出就是最終結果。每個神經元的間的連接都有都有一個權重Wm,n較大的權重給加大輸入,較小的會弱化輸入。
4)神經網絡的計算過程
開始的時候,隨機生成參數Wm,n,然后根據樣本數據,計算樣本真實值和預測值的誤差值,調整Wm,n,多次以后就可以找到誤差可以接受的局部最優解,這就是神經網絡的本質,與傳統的機器學習,像線性回歸之類的算法并無本質區別。下圖展示了三層神網絡的計算過程,每層的輸入和輸出結果:
現在我們來講解整個計算過程。輸入、參數、輸出,我們均用矩陣表示,為什么在此處可以應用矩陣運算,其實純屬巧合,因為輸入、參數、輸出剛好符合矩陣的運算規律而已,其它的說法都是扯蛋。假設入輸入為:
也就是第一層第一個節點輸放為0.9,第一層第二個節點輸放為0.1,第一層第三個節點輸放為0.8
剛開始隨機生成,第一層和第二層的連接權重為0.9,也就是第一層第一個節點和第二層第二個節點連連權重為0.9,其它同理,第一層參數矩陣:
第二層和第三層的連接權重為:
最后的輸出為:
下面我們來分析下0.726是怎么計算出來的。下面再看下帶權重的神經元結構:
輸入I經過第一層直接輸出原始的輸入。所以第二層節點1的輸入為
I = [0.9 , 0.1 , 0.8]
這是a=0.9,b=0.1,c=0.8,Wa=0.9,Wb=0.3,Wc=0.4,也就是x=0.90.9+0.10.3+0.8*0.4=1.16,然后應用激活函數S,即y=S(X)=1/(1+exp(-1.16)) = 0.761,同理可計算第二層其它兩個節點的輸出,最后第二層的輸放為:OH=
第三層的輸放計算方法和上面第二層的是一樣的。下面看下應用矩陣的計算公式,我們分析下隱藏層和輸出層各們結果的計算結果正好符合下面的矩陣乘法公式(真是無巧不成書,科學就是在巧合中一步步前進),矩陣乘法完成后,然后對每一個元素應用激活函數即可:
第三層的輸出也是同樣的道理,第三層的輸入為隱藏層的輸出,矩陣乘法完成后,再對每一個元素應用激活函數即可:
第一層稱為輸入層,最后一層稱為輸出層,中間層統稱為隱藏層,無論神經網絡有多少層,計算方法和上面介紹的是一樣的。一開始隨機得到w權重矩陣,最后根據樣本一步步優化w權重矩陣。下面給出Python的代碼:
import numpy# python中sigmoid函數是 scipy.special.expitimport scipy.special#三層神經網絡結構定義class neuralNetwork: # 初始化函數, #inputnodes輸入層節點數目 #hiddennodes隱藏層節點數目 #outputnodes輸出層節點數目 #learningrate學習率,在訓練時會用到,關于學習率的設置后面的文章再討論 def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate): self.inodes = inputnodes self.hnodes = hiddennodes self.onodes = outputnodes # wih代表輸入層和隱藏層間的連接矩陣 # who代表隱藏層和輸出層間的連接矩陣 #權重矩陣一般隨機得到,但不要初始化為0和相同的值,具體的初始化方法后面會討論 self.wih = numpy.random.normal(0.0, pow(self.inodes, -0.5), (self.hnodes, self.inodes)) self.who = numpy.random.normal(0.0, pow(self.hnodes, -0.5), (self.onodes, self.hnodes)) self.lr = learningrate # 激活函數y=1/(1+exp(-x)) self.activation_function = lambda x: scipy.special.expit(x) pass # 查詢函數,也就是由輸入給出輸出 #input_list是輸入層的矩陣,注意格式和維度要正確 def query(self, inputs): # 輸入有 #下面兩行是計算隱藏層的輸出 hidden_inputs = numpy.dot(inputs, self.wih) hidden_outputs = self.activation_function(hidden_inputs) #下面兩行是計算最后的輸出 final_inputs = numpy.dot(hidden_outputs, self.who) final_outputs = self.activation_function(final_inputs) return final_outputs
3. 深度學習
深度學習的深指的就是神經網絡的層數,所以深度學習就是深層神經網絡,一般3層以上就稱為深度學習。目前深度學習只在圖像識別領域得到有限的應用(看清楚是有限),凡是鼓吹自動駕駛、語音識別、自然語言處理等純屬扯蛋,目前這些領域都是以規則為主。深度學習之所以在圖像識別領域得到應用,也是純屬巧合,而且卷積運算應用于圖像領域是很早之前的事了(以前是人工來計算),只是現在變成計算機來運算了。
卷積運算最早是應用了信號領域,在圖像領域的運算并不是嚴格的卷積運算,而是矩陣的點積,通過下面一張動圖來形像理解卷積運算的過程:
上面動圖應用于圖像的效果如下:
目的是把不重要像素弱化,像背景,重要的像素部分加深,主要是輪廓。這就是神乎其神的深度學習、AI、DL、圖像識別。現在你應該更能理解為什么深度學習目前只適合圖像識別,因為圖像本身就是一個像素矩陣,運用卷積運算后,剛好可以提取圖片的主要特征。目前火熱的人工智能其實就是指圖像識別。
四、小結
現在的人工智能都是嚴格按照人類所設定的程序來執行的,沒有任何的思維能力,甚至沒有主動能力,它永遠也不可能形成自我意識。所謂的“計算機的意識”其實就是反復地嘗試、自己調整參數而已,它仍然是在做加法。通過這節課大家應該都明白了:其實根本沒有智能,都是自動化,現在沒有,以后也不會有。
關注公眾號【dbaplus社群】,獲取更多原創技術文章和精選工具下載