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