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