- 深度學(xué)習(xí)原理與PyTorch實(shí)戰(zhàn)(第2版)
- 集智俱樂(lè)部
- 9866字
- 2022-11-23 12:38:15
第1章 深度學(xué)習(xí)簡(jiǎn)介
作為開篇,本章將對(duì)深度學(xué)習(xí)進(jìn)行簡(jiǎn)要的介紹,內(nèi)容包括深度學(xué)習(xí)與人工智能、深度學(xué)習(xí)的歷史淵源、深度學(xué)習(xí)的影響因素以及取得成功的原因,并從深度網(wǎng)絡(luò)的超參數(shù)、架構(gòu)和訓(xùn)練方式等方面進(jìn)一步剖析深度學(xué)習(xí)的本質(zhì)。
什么是深度學(xué)習(xí)?稍微讀過(guò)一些科普文章的人都知道,所謂的深度學(xué)習(xí),就是一種利用深度人工神經(jīng)網(wǎng)絡(luò)來(lái)進(jìn)行自動(dòng)分類、預(yù)測(cè)和學(xué)習(xí)的技術(shù)。因此,深度學(xué)習(xí)就等于深度人工神經(jīng)網(wǎng)絡(luò),如圖1.1所示。

圖1.1 深度人工神經(jīng)網(wǎng)絡(luò)示意圖
圖1.1中黑色的圓圈表示一個(gè)人工神經(jīng)元,連線表示人工神經(jīng)突觸。信息從網(wǎng)絡(luò)最左側(cè)的節(jié)點(diǎn)傳入,經(jīng)過(guò)中間層節(jié)點(diǎn)的加工,最終由最右側(cè)4個(gè)節(jié)點(diǎn)輸出到外界。神經(jīng)網(wǎng)絡(luò)從左到右排成多少列就稱為有多少層。多少層算深呢?通常情況下,我們認(rèn)為超過(guò)三層的神經(jīng)網(wǎng)絡(luò)都可以叫作深度神經(jīng)網(wǎng)絡(luò)。而目前人們已經(jīng)可以實(shí)現(xiàn)深達(dá)1000多層的人工神經(jīng)網(wǎng)絡(luò)了。
不過(guò),以上對(duì)深度學(xué)習(xí)的認(rèn)識(shí)雖然沒有錯(cuò)誤,但并不全面,還需要從深度學(xué)習(xí)與人工智能的關(guān)系及其歷史淵源等方面來(lái)充分理解什么是深度學(xué)習(xí)。
1.1 深度學(xué)習(xí)與人工智能
首先,深度學(xué)習(xí)屬于一種特殊的人工智能技術(shù),它與人工智能及機(jī)器學(xué)習(xí)的關(guān)系如圖1.2所示。

圖1.2 人工智能、機(jī)器學(xué)習(xí)、人工神經(jīng)網(wǎng)絡(luò)、深度學(xué)習(xí)之間的關(guān)系
人工智能的覆蓋面非常廣,包括自動(dòng)推理、聯(lián)想、學(xué)習(xí)等。機(jī)器學(xué)習(xí)則是人工智能的一個(gè)重要分支,它在20世紀(jì)八九十年代才逐漸發(fā)展起來(lái),主要研究如何讓計(jì)算機(jī)具有自我學(xué)習(xí)的能力。事實(shí)上,機(jī)器學(xué)習(xí)的算法有上千種,包括決策樹算法(decision tree)、支持向量機(jī)(support vector machine,SVM)、遺傳算法(genetic algorithm),等等。
近些年來(lái),基于人工神經(jīng)網(wǎng)絡(luò)的機(jī)器學(xué)習(xí)算法日益盛行起來(lái),逐漸呈現(xiàn)出取代其他機(jī)器學(xué)習(xí)算法的態(tài)勢(shì),這主要是因?yàn)槿斯ど窠?jīng)網(wǎng)絡(luò)中有一種叫作反向傳播算法的關(guān)鍵性技術(shù)。該算法可以精確地調(diào)整人工神經(jīng)網(wǎng)絡(luò)出現(xiàn)問(wèn)題的部件,從而快速降低網(wǎng)絡(luò)進(jìn)行分類或預(yù)測(cè)的錯(cuò)誤率,這使得人工神經(jīng)網(wǎng)絡(luò)在諸多機(jī)器學(xué)習(xí)算法中勝出。所以,反向傳播算法是人工神經(jīng)網(wǎng)絡(luò)的核心。
在應(yīng)用層面,與一般的機(jī)器學(xué)習(xí)技術(shù)相比,深度學(xué)習(xí)最大的特色是可以處理各種非結(jié)構(gòu)化數(shù)據(jù)——特指文本、圖像、音頻、視頻,等等。而一般的機(jī)器學(xué)習(xí)更適合處理結(jié)構(gòu)化數(shù)據(jù),即可以用關(guān)系型數(shù)據(jù)庫(kù)進(jìn)行存儲(chǔ)、管理和訪問(wèn)的數(shù)據(jù)。
通過(guò)對(duì)比深度學(xué)習(xí)與人工智能及一般機(jī)器學(xué)習(xí)技術(shù)之間的區(qū)別和聯(lián)系,我們可以從橫向的、多學(xué)科的角度來(lái)理解深度學(xué)習(xí);另外,我們還需要從縱向的、歷史淵源的角度進(jìn)一步了解深度學(xué)習(xí)。
1.2 深度學(xué)習(xí)的歷史淵源
盡管人工神經(jīng)網(wǎng)絡(luò)的誕生比人工智能還要早上十多年,但是在人工智能的歷史上,人工神經(jīng)網(wǎng)絡(luò)一直是一個(gè)旁支,它被人們稱為人工智能的“連接學(xué)派”。這一旁支曾經(jīng)迎來(lái)過(guò)短暫的輝煌,但是真正爆發(fā)還是近些年的事情。
1.2.1 從感知機(jī)到人工神經(jīng)網(wǎng)絡(luò)
人工智能誕生于1956年的達(dá)特茅斯會(huì)議,而人工神經(jīng)網(wǎng)絡(luò)的誕生比人工智能還早,可以追溯到1943年。當(dāng)時(shí),第一個(gè)人工神經(jīng)元被發(fā)明了出來(lái),這就是著名的麥克洛克麥-皮茨(McCulloch-Pitts)模型。不過(guò),他們的工作并未引起業(yè)內(nèi)重視,人工神經(jīng)網(wǎng)絡(luò)的研究一直進(jìn)展緩慢。直到1957年,弗蘭克·羅森布萊特(Frank Rosenblatt)提出了感知機(jī)(perceptron)模型,才點(diǎn)燃了人們探索人工神經(jīng)網(wǎng)絡(luò)的熱情,并使其成為業(yè)界探索人工智能的另類路徑。這種方法并不是直接從功能的角度模擬人類的智能,而是嘗試構(gòu)建一個(gè)類似于大腦神經(jīng)網(wǎng)絡(luò)的裝置,然后通過(guò)結(jié)構(gòu)模擬的方法來(lái)解決問(wèn)題。
然而,好景不長(zhǎng)。1969年,馬文·明斯基(Marvin Lee Minsky)與西摩爾·派普特(Seymour Aubrey Papert)在其合著的書中開宗明義地指出了感知機(jī)模型的局限性:它甚至連極其簡(jiǎn)單的XOR(異或)問(wèn)題都無(wú)法解出來(lái),何況更高級(jí)的智能呢?所謂XOR問(wèn)題,就是將輸入的兩個(gè)二進(jìn)制串按照每一個(gè)位進(jìn)行比較,不同的位就輸出1,否則輸出0。例如,輸入的兩個(gè)二進(jìn)制串是1001和0111,則XOR就會(huì)輸出1110。顯然,XOR問(wèn)題是一個(gè)基礎(chǔ)、簡(jiǎn)單的問(wèn)題。然而把1001及0111輸入給感知機(jī)神經(jīng)網(wǎng)絡(luò),無(wú)論如何變換參數(shù),如何訓(xùn)練,它都不能輸出正確的答案。就這樣,人工神經(jīng)網(wǎng)絡(luò)被打入了冷宮。礙于馬文·明斯基在人工智能圈中的地位和聲勢(shì),研究者幾乎不敢再發(fā)表有關(guān)感知機(jī)和神經(jīng)網(wǎng)絡(luò)的文章了,這種局面一直持續(xù)了將近20年。
歷史的進(jìn)程需要一名拯救者來(lái)挽救連接學(xué)派的頹勢(shì),而他就是大名鼎鼎的杰弗里·辛頓(Geoffrey Everest Hinton)。1986年,辛頓與合作者大力發(fā)展了人工神經(jīng)網(wǎng)絡(luò)的反向傳播算法,從而可以構(gòu)造兩層以上的人工神經(jīng)網(wǎng)絡(luò),并且可以有效地進(jìn)行學(xué)習(xí)與訓(xùn)練。對(duì)明斯基XOR問(wèn)題的回應(yīng)就在于深度。兩層以上的神經(jīng)網(wǎng)絡(luò)可以很輕松地解決XOR問(wèn)題,從而回?fù)袅嗣魉够脑戨y。不僅如此,多層人工神經(jīng)網(wǎng)絡(luò)配備上反向傳播算法,還能幫助人們解決大量的模式識(shí)別和預(yù)測(cè)問(wèn)題。盡管當(dāng)時(shí)的精度還有待提高,但是人工神經(jīng)網(wǎng)絡(luò)作為一種通用的算法,在20世紀(jì)80年代末到90年代初曾經(jīng)風(fēng)靡一時(shí),它已經(jīng)演化成可以與經(jīng)典的人工智能符號(hào)學(xué)派和新興的人工智能行為學(xué)派并駕齊驅(qū)的連接學(xué)派。
然而好景不長(zhǎng),人工神經(jīng)網(wǎng)絡(luò)并沒有繼續(xù)沿著深度的方向發(fā)展下去。這一方面是受限于當(dāng)時(shí)的計(jì)算能力,另一方面是因?yàn)槿狈Υ笠?guī)模高質(zhì)量的訓(xùn)練數(shù)據(jù)。而且,神經(jīng)網(wǎng)絡(luò)本身就是一個(gè)黑箱,誰(shuí)也不敢保證神經(jīng)網(wǎng)絡(luò)在深度這個(gè)方向上一定能夠取得更好的結(jié)果和精度。于是,學(xué)術(shù)界的焦點(diǎn)朝向了另一個(gè)方向:尋找神經(jīng)網(wǎng)絡(luò)的基礎(chǔ)理論。到了20世紀(jì)90年代末,在兩位俄羅斯裔數(shù)學(xué)家弗拉基米爾·萬(wàn)普尼克(Vladimir Naumovich Vapnik)和亞歷克塞·澤范蘭杰斯(Alexey Yakovlevich Chervonenkis)的大力推進(jìn)下,統(tǒng)計(jì)學(xué)習(xí)理論蓬勃發(fā)展了起來(lái),它不僅奠定了模式識(shí)別問(wèn)題的數(shù)學(xué)基礎(chǔ),而且創(chuàng)造出了支持向量機(jī)這種極其實(shí)用簡(jiǎn)潔的工具。與傳統(tǒng)神經(jīng)網(wǎng)絡(luò)希望通過(guò)加深網(wǎng)絡(luò)來(lái)提升精度相反,支持向量機(jī)的解決方案是提升數(shù)據(jù)的維度,在高維空間中尋找能夠?qū)?shù)據(jù)進(jìn)行精準(zhǔn)劃分的方法,這種方法在數(shù)據(jù)量不是很大的情況下非常奏效。就這樣,支持向量機(jī)成為20世紀(jì)90年代到21世紀(jì)初的寵兒。
然而,真理似乎總是掌握在少數(shù)人手中。在主流學(xué)術(shù)圈關(guān)注支持向量機(jī)的時(shí)候,辛頓仍然在默默地堅(jiān)持著深度網(wǎng)絡(luò)的方向。2006年,辛頓在《科學(xué)》雜志上發(fā)表了一篇題為《利用神經(jīng)網(wǎng)絡(luò)進(jìn)行數(shù)據(jù)降維》的文章,提出了深度神經(jīng)網(wǎng)絡(luò)(deep neural network,DNN)模型,并指出如果增加神經(jīng)網(wǎng)絡(luò)的層數(shù),并且精心設(shè)計(jì)訓(xùn)練網(wǎng)絡(luò)的方式,那么這樣深層次的神經(jīng)網(wǎng)絡(luò)就會(huì)具有超強(qiáng)的表達(dá)能力和學(xué)習(xí)能力。
雖然很多人很早就猜想深度的神經(jīng)網(wǎng)絡(luò)也許能夠大大提高分類的準(zhǔn)確度,但是沒有人真正地嚴(yán)格驗(yàn)證過(guò)這個(gè)結(jié)論。原因在于當(dāng)時(shí)的硬件水平和數(shù)據(jù)量都遠(yuǎn)遠(yuǎn)無(wú)法與深度的神經(jīng)網(wǎng)絡(luò)相匹配,再加上深度網(wǎng)絡(luò)需要特殊的訓(xùn)練技巧,阻礙了人們往深度方向去探索。而辛頓始終堅(jiān)持著“深度”的夢(mèng)想,終于在2006年實(shí)現(xiàn)了突破,向世人證明了“深度”的作用。
1.2.2 深度學(xué)習(xí)時(shí)代
辛頓有關(guān)深度神經(jīng)網(wǎng)絡(luò)的研究激勵(lì)了大量的學(xué)者朝著這個(gè)方向前進(jìn)。借助辛頓的深度網(wǎng)絡(luò)模型,人們首先在語(yǔ)音領(lǐng)域取得了突破。微軟的鄧力邀請(qǐng)辛頓加入語(yǔ)音識(shí)別的深度神經(jīng)網(wǎng)絡(luò)模型開發(fā),大幅提升了識(shí)別準(zhǔn)確度。然而,辛頓并不想止步于此,他需要更大的數(shù)據(jù)集來(lái)訓(xùn)練超深度的網(wǎng)絡(luò),從而向世人展示“深度”的神奇威力。然而,這么大規(guī)模的數(shù)據(jù)集到哪里去找呢?
此時(shí),一位華裔女科學(xué)家走上了歷史的舞臺(tái),她就是美國(guó)斯坦福大學(xué)的計(jì)算機(jī)視覺專家李飛飛。2006年,李飛飛還是一個(gè)名不見經(jīng)傳的小人物。然而,她懷揣著一個(gè)不小的夢(mèng)想:構(gòu)造一個(gè)大規(guī)模的有關(guān)圖像的數(shù)據(jù)庫(kù)。她將其命名為ImageNet,以仿效自然語(yǔ)言處理領(lǐng)域中的WordNet,為上千種物體的圖像進(jìn)行標(biāo)注。但是,當(dāng)她寫報(bào)告申請(qǐng)研究經(jīng)費(fèi)的時(shí)候卻遭到了無(wú)情的拒絕。然而,李飛飛并未放棄夢(mèng)想,她最終找到了亞馬遜的眾包平臺(tái)——“亞馬遜土耳其機(jī)器人”(Amazon Mechanical Turk),借助大量網(wǎng)友的力量構(gòu)造出了ImageNet這樣一個(gè)大規(guī)模、高精度、多標(biāo)簽的圖像數(shù)據(jù)庫(kù)。
到了2010年,ImageNet已經(jīng)收錄了100多萬(wàn)張圖像。如此巨大的數(shù)據(jù)量應(yīng)該能促進(jìn)計(jì)算機(jī)視覺領(lǐng)域的大發(fā)展,于是李飛飛開始舉辦每年一次的圖像識(shí)別大賽:ImageNet競(jìng)賽。正是這樣的競(jìng)賽為辛頓提供了一個(gè)完美的舞臺(tái)。那時(shí),他早已準(zhǔn)備好要讓深度神經(jīng)網(wǎng)絡(luò)大顯身手了。2012年,辛頓和他的兩個(gè)學(xué)生亞歷克斯·克里澤夫斯基(Alex Krizhevsky)和伊利亞·索特思科瓦(Ilya Sutskever)采用了一個(gè)深層次的卷積神經(jīng)網(wǎng)絡(luò)(AlexNet),在ImageNet競(jìng)賽的分類任務(wù)中表現(xiàn)突出,技?jí)喝盒郏瑢⒎诸愬e(cuò)誤率從25%降到了17%。其實(shí),卷積神經(jīng)網(wǎng)絡(luò)(convolutional neural network,CNN)也不是新事物,它于20世紀(jì)80年代發(fā)展起來(lái),最早用于模仿動(dòng)物視覺皮層的結(jié)構(gòu)。到了1998年,這種網(wǎng)絡(luò)被楊立昆(Yann LeCun)等人成功應(yīng)用到了手寫數(shù)字的識(shí)別上,大獲成功。然而將卷積神經(jīng)網(wǎng)絡(luò)做到8層,而且不需要任何預(yù)處理就能將圖像分類任務(wù)做到這么好,這還是頭一次。從此,深度神經(jīng)網(wǎng)絡(luò)就成了ImageNet競(jìng)賽的標(biāo)配,從AlexNet到GoogleNet,人們不斷增加網(wǎng)絡(luò)的深度,識(shí)別準(zhǔn)確率直線提升。2012年以后,深度學(xué)習(xí)開始在學(xué)術(shù)圈流行起來(lái)。
1.2.3 巨頭之間的角逐
然而,深度學(xué)習(xí)更大范圍的應(yīng)用和工業(yè)界是分不開的。2011年,谷歌X實(shí)驗(yàn)室的杰夫·迪恩(Jeffrey Adgate Dean)和吳恩達(dá)等人采用深度學(xué)習(xí)技術(shù),讓谷歌大腦深度神經(jīng)網(wǎng)絡(luò)觀看了從YouTube中提取出來(lái)的30萬(wàn)張圖像,并讓機(jī)器自動(dòng)進(jìn)行提煉。結(jié)果,谷歌大腦自己學(xué)出了一張“貓”臉,如圖1.3所示。這張貓臉具有鮮明的“機(jī)器烙印”。第二天,這張貓臉便出現(xiàn)在了各大網(wǎng)站的頭條位置,深度學(xué)習(xí)開始引起工業(yè)界的關(guān)注。

圖1.3 谷歌大腦從30萬(wàn)張圖像中自學(xué)出來(lái)的“貓”臉
在看到深度學(xué)習(xí)技術(shù)的發(fā)展前景后,以谷歌為代表的各大公司開始瘋狂并購(gòu)人工智能、深度學(xué)習(xí)初創(chuàng)公司和團(tuán)隊(duì)。這不僅引發(fā)了人工智能人才的全球爭(zhēng)奪戰(zhàn),也促使更多的人才和創(chuàng)業(yè)公司投入到人工智能的大潮之中。
深度學(xué)習(xí)技術(shù)在語(yǔ)音和圖像領(lǐng)域的成功應(yīng)用,激發(fā)了人們將該技術(shù)擴(kuò)展到自然語(yǔ)言處理領(lǐng)域的熱情。首先,2013年,谷歌的托馬斯·米科洛夫(Tomas Mikolov)提出了Word2Vec技術(shù)(參見第9章),它可以非常快捷有效地計(jì)算單詞的向量表示,這為大規(guī)模使用人工神經(jīng)網(wǎng)絡(luò)技術(shù)處理人類語(yǔ)言奠定了重要基礎(chǔ)。
2014年,谷歌開始嘗試?yán)蒙疃鹊难h(huán)神經(jīng)網(wǎng)絡(luò)(recurrent neural network,RNN)來(lái)處理各種自然語(yǔ)言任務(wù),包括機(jī)器翻譯、自動(dòng)對(duì)話、情緒識(shí)別、閱讀理解等。盡管目前深度學(xué)習(xí)技術(shù)在自然語(yǔ)言類任務(wù)上的表現(xiàn)還無(wú)法與圖像類任務(wù)相媲美,但已取得了長(zhǎng)足的進(jìn)步。2016年,谷歌的機(jī)器翻譯技術(shù)取得重大突破,采用了先進(jìn)的深度循環(huán)神經(jīng)網(wǎng)絡(luò)和注意力機(jī)制的機(jī)器翻譯在多種語(yǔ)言上已經(jīng)接近人類的水平(參見第10章和第11章)。
除了在語(yǔ)音、圖像和自然語(yǔ)言處理等傳統(tǒng)任務(wù)上的發(fā)展,科學(xué)家還在不斷地拓寬深度學(xué)習(xí)的應(yīng)用范圍。在與強(qiáng)化學(xué)習(xí)這一古老的機(jī)器學(xué)習(xí)技術(shù)聯(lián)姻后,深度學(xué)習(xí)在計(jì)算機(jī)游戲、博弈等領(lǐng)域同樣取得了重大進(jìn)展。2015年,被谷歌收購(gòu)的DeepMind團(tuán)隊(duì)研發(fā)了一種“通用人工智能”算法,它可以像人類一樣,通過(guò)觀察電子游戲的屏幕進(jìn)行自我學(xué)習(xí),利用同一套網(wǎng)絡(luò)架構(gòu)和超參數(shù),從零開始學(xué)習(xí)每一款游戲,并最終打通了300多款雅達(dá)利游戲,在某些游戲上的表現(xiàn)甚至超越了人類(參見第15章)。
2016年3月,DeepMind團(tuán)隊(duì)又在博弈領(lǐng)域取得了重大突破。AlphaGo以4∶1的大比分戰(zhàn)勝人類圍棋冠軍,讓計(jì)算機(jī)圍棋這一領(lǐng)域的發(fā)展提前了至少十年。2017年10月,DeepMind團(tuán)隊(duì)創(chuàng)造的AlphaGo升級(jí)版AlphaGo Zero再一次取得重大突破,它可以完全從零開始學(xué)習(xí)下圍棋,而無(wú)須借鑒任何人類的下棋經(jīng)驗(yàn)。僅經(jīng)過(guò)大約3天的訓(xùn)練,AlphaGo Zero就達(dá)到了戰(zhàn)勝李世石的圍棋水平;而到了21天以后,世界上已經(jīng)沒有任何人類或程序可以在圍棋上戰(zhàn)勝它了。AlphaGo的成功不僅標(biāo)志著以深度學(xué)習(xí)技術(shù)為支撐的新一代人工智能技術(shù)大獲全勝,更暗示著人工智能的全新時(shí)代已經(jīng)到來(lái)。
我們列出了人工神經(jīng)網(wǎng)絡(luò)以及深度學(xué)習(xí)歷史上的大事件,繪制了一條時(shí)間軸,方便讀者查看,如圖1.4所示。

圖1.4 人工神經(jīng)網(wǎng)絡(luò)、深度學(xué)習(xí)大事件
1.3 深度學(xué)習(xí)的影響因素
影響深度學(xué)習(xí)爆發(fā)的主要因素有3個(gè),分別是大數(shù)據(jù)、深度網(wǎng)絡(luò)架構(gòu)和GPU。
1.3.1 大數(shù)據(jù)
前面提到,深度神經(jīng)網(wǎng)絡(luò)并不算新技術(shù),早在20世紀(jì)八九十年代,人們就提出了增加神經(jīng)網(wǎng)絡(luò)的深度以獲得更高準(zhǔn)確度的設(shè)想,但是由于當(dāng)時(shí)硬件發(fā)展速度跟不上,人們很難實(shí)現(xiàn)深度的神經(jīng)網(wǎng)絡(luò)。當(dāng)然,更主要的原因是當(dāng)時(shí)根本沒有足夠的大規(guī)模數(shù)據(jù)輸入給深度神經(jīng)網(wǎng)絡(luò),因此自然也就無(wú)法發(fā)揮深度的作用。伴隨著網(wǎng)絡(luò)深度的增加,待擬合的參數(shù)自然也會(huì)增加,如果沒有與其相匹配的海量數(shù)據(jù)來(lái)訓(xùn)練網(wǎng)絡(luò),這些參數(shù)就完全變成了導(dǎo)致網(wǎng)絡(luò)過(guò)擬合的垃圾,無(wú)法發(fā)揮作用。
然而,到了21世紀(jì)的第二個(gè)十年,一切都不一樣了。有數(shù)據(jù)顯示,2014年,整個(gè)互聯(lián)網(wǎng)上每秒鐘就有60萬(wàn)條信息在Facebook上分享,2億封郵件、10萬(wàn)條推文發(fā)出,571個(gè)新網(wǎng)站被建立,1.9E()字節(jié)的數(shù)據(jù)被交換[1]。隨著互聯(lián)網(wǎng)特別是移動(dòng)互聯(lián)網(wǎng)時(shí)代的到來(lái),我們每一個(gè)動(dòng)作都會(huì)被網(wǎng)絡(luò)服務(wù)器記錄下來(lái),這些數(shù)據(jù)促使人類一下子進(jìn)入了大數(shù)據(jù)時(shí)代。
大數(shù)據(jù)時(shí)代的到來(lái)為深度神經(jīng)網(wǎng)絡(luò)的大規(guī)模應(yīng)用鋪平了道路,加深網(wǎng)絡(luò)獲得更高精度的設(shè)想終于在海量數(shù)據(jù)的基礎(chǔ)上得以驗(yàn)證。圖1.5所示的曲線很好地說(shuō)明了數(shù)據(jù)量的大小對(duì)深度神經(jīng)網(wǎng)絡(luò)分類和預(yù)測(cè)準(zhǔn)確度的影響。

圖1.5 機(jī)器學(xué)習(xí)模型的預(yù)測(cè)準(zhǔn)確度隨數(shù)據(jù)量的增加而變化的曲線
圖1.5中橫軸表示的是輸入神經(jīng)網(wǎng)絡(luò)模型的數(shù)據(jù)規(guī)模,縱軸表示的是模型所能達(dá)到的分類或預(yù)測(cè)準(zhǔn)確度。實(shí)曲線對(duì)應(yīng)的是采用了深度學(xué)習(xí)技術(shù)的神經(jīng)網(wǎng)絡(luò)模型,虛曲線代表的則是未采用深度學(xué)習(xí)技術(shù)的模型(例如SVM算法)。對(duì)比這兩條曲線,我們可以清晰地看到,隨著數(shù)據(jù)量的增加,采用了深度學(xué)習(xí)方法的模型可以持續(xù)不斷地提高準(zhǔn)確度,而傳統(tǒng)算法則會(huì)很快地遇到精確度方面的瓶頸。
由此可見,大數(shù)據(jù)與深度學(xué)習(xí)技術(shù)的搭配才是促使人工智能突飛猛進(jìn)發(fā)展的關(guān)鍵因素。
1.3.2 深度網(wǎng)絡(luò)架構(gòu)
有人說(shuō),如今的深度學(xué)習(xí)革命完全是拜大數(shù)據(jù)所賜,只要擁有海量的數(shù)據(jù),隨便調(diào)試一個(gè)深度學(xué)習(xí)模型,就可以獲得很好的預(yù)測(cè)結(jié)果。這種認(rèn)識(shí)是非常片面的,雖然大部分深度學(xué)習(xí)技術(shù)早在20世紀(jì)八九十年代就發(fā)展了起來(lái),但是當(dāng)面對(duì)一個(gè)具體問(wèn)題時(shí),應(yīng)該采用什么樣的網(wǎng)絡(luò)架構(gòu),如何選取超參數(shù),如何訓(xùn)練這個(gè)網(wǎng)絡(luò),仍然是影響學(xué)習(xí)效率和問(wèn)題解決的重要因素。
所謂的深度網(wǎng)絡(luò)架構(gòu),就是整個(gè)網(wǎng)絡(luò)體系的構(gòu)建方式和拓?fù)溥B接結(jié)構(gòu),目前主要分為3種:前饋神經(jīng)網(wǎng)絡(luò)、卷積神經(jīng)網(wǎng)絡(luò)和循環(huán)神經(jīng)網(wǎng)絡(luò)。
01.前饋神經(jīng)網(wǎng)絡(luò)
前饋神經(jīng)網(wǎng)絡(luò)也叫全連接網(wǎng)絡(luò)(fully connected neural network)。在這種結(jié)構(gòu)中,所有的節(jié)點(diǎn)都可以分為一層一層的,每個(gè)節(jié)點(diǎn)只跟它的相鄰層節(jié)點(diǎn)而且是全部節(jié)點(diǎn)相連(也就是全連接的)。這些層一般分為輸入層(例如圖1.1中最左側(cè)的一列節(jié)點(diǎn))、輸出層(圖1.1中最右側(cè)的4個(gè)節(jié)點(diǎn))以及介于二者之間的隱含層[2]。這種前饋神經(jīng)網(wǎng)絡(luò)是目前應(yīng)用最多的一類神經(jīng)網(wǎng)絡(luò)。
02.卷積神經(jīng)網(wǎng)絡(luò)
另外一種常見的網(wǎng)絡(luò)架構(gòu)是卷積神經(jīng)網(wǎng)絡(luò)(CNN,詳見第5章),它一般用于處理數(shù)字圖像,其架構(gòu)通常如圖1.6所示。

圖1.6 卷積神經(jīng)網(wǎng)絡(luò)架構(gòu)示意圖
圖1.6中每一個(gè)立方體都是一系列規(guī)則排列的人工神經(jīng)元集合。每個(gè)神經(jīng)元到上一層次的連接稱為卷積核,這是一種局域的小窗口。圖1.6中的小錐形可以理解為從高層的某一個(gè)神經(jīng)元到低層多個(gè)神經(jīng)元之間的連接。這個(gè)小錐形在立方體上逐像素的平移就構(gòu)成了兩層次之間的所有連接。到了最后兩層,小立方體被壓縮成了一個(gè)一維的向量,這就與普通的前饋神經(jīng)網(wǎng)絡(luò)沒有任何區(qū)別了。
CNN這種特殊的架構(gòu)可以很好地應(yīng)用于圖像處理,它可以使原始圖像即使經(jīng)歷平移、縮放等變換之后仍然具有很高的可識(shí)別性。正是因?yàn)榫哂羞@樣特殊的架構(gòu),CNN才成功應(yīng)用于計(jì)算機(jī)視覺、圖像識(shí)別、圖像生成,甚至AI下圍棋、AI打游戲等廣闊的領(lǐng)域。
03.循環(huán)神經(jīng)網(wǎng)絡(luò)
還有一種常見的網(wǎng)絡(luò)架構(gòu),就是被廣泛應(yīng)用于自然語(yǔ)言處理任務(wù)中的循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN,詳見第10章),如圖1.7所示。

圖1.7 循環(huán)神經(jīng)網(wǎng)絡(luò)架構(gòu)示意圖
圖1.7的左側(cè)為輸入節(jié)點(diǎn),右側(cè)為輸出節(jié)點(diǎn),中間的隱含層節(jié)點(diǎn)互相連接。可以看到,這種網(wǎng)絡(luò)與普通的三層前饋神經(jīng)網(wǎng)絡(luò)非常相似,只不過(guò)隱含層彼此之間還具有大量的連接。
RNN這種特殊架構(gòu)使得網(wǎng)絡(luò)當(dāng)前的運(yùn)行不僅跟當(dāng)前的輸入數(shù)據(jù)有關(guān),還與之前的數(shù)據(jù)有關(guān)。因此,這種網(wǎng)絡(luò)特別適合處理諸如語(yǔ)言、音樂(lè)、股票曲線等序列類型的數(shù)據(jù)。整個(gè)網(wǎng)絡(luò)的循環(huán)結(jié)構(gòu)可以很好地應(yīng)付輸入序列之中存在的長(zhǎng)程記憶性和周期性。
04.更多的新型網(wǎng)絡(luò)架構(gòu)
最近幾年,研究人員提出了越來(lái)越多的新型網(wǎng)絡(luò)架構(gòu)類型,使得深度學(xué)習(xí)的性能大幅提升。在此,我們僅舉兩個(gè)例子進(jìn)行說(shuō)明。
第一個(gè)例子來(lái)源于機(jī)器翻譯。人們發(fā)現(xiàn),如果將兩個(gè)RNN在時(shí)間步上串聯(lián),就能以相當(dāng)可觀的精度完成機(jī)器翻譯任務(wù)。在這樣的架構(gòu)中,第一個(gè)RNN被看作編碼器,它的任務(wù)是將輸入的源語(yǔ)言編碼成RNN的隱含層節(jié)點(diǎn)狀態(tài);第二個(gè)RNN被看作解碼器,它可以將編碼器的隱含狀態(tài)解碼成翻譯的目標(biāo)語(yǔ)言,整體架構(gòu)如圖1.8所示(詳見第11章)。

圖1.8 機(jī)器翻譯的編碼器—解碼器架構(gòu)(EOS表示句子結(jié)束,SOS表示句子起始)
圖1.8中左側(cè)的方塊表示一個(gè)時(shí)刻的編碼器,它是一個(gè)多層的RNN;右側(cè)的方塊表示一個(gè)時(shí)刻的解碼器,它也是一個(gè)多層的RNN。從左到右表示時(shí)間上從前到后。開始的時(shí)候,編碼器運(yùn)作,它一步步地讀入待翻譯的源語(yǔ)言;到了源語(yǔ)言句子結(jié)束的時(shí)候(讀入EOS),解碼器開始工作,它一步步地輸出翻譯的目標(biāo)語(yǔ)言,并將每一次預(yù)測(cè)的單詞輸入給下一時(shí)刻的解碼器,從而輸出整個(gè)句子。
另一個(gè)例子是可微分計(jì)算機(jī)(或稱為神經(jīng)圖靈機(jī)),它是谷歌DeepMind的研究人員提出的一種融合了神經(jīng)網(wǎng)絡(luò)和馮·諾依曼體系式計(jì)算機(jī)的計(jì)算架構(gòu),它既可以模仿計(jì)算機(jī)的工作,又可以通過(guò)訓(xùn)練的方式進(jìn)行學(xué)習(xí),如圖1.9所示。

圖1.9 可微分計(jì)算機(jī)的架構(gòu)示意圖(圖片來(lái)源:Graves A, Wayne G, Reynolds, et al. Hybrid Computing Using A Neural Network with Dynamic External Memory. Nature, 2016.)
在這種架構(gòu)中,整個(gè)網(wǎng)絡(luò)由控制器(a)、讀寫頭(b)、存儲(chǔ)器(c),以及存儲(chǔ)器運(yùn)作中的臨時(shí)連接(d)構(gòu)成。在控制器中,從輸入到輸出的映射由一個(gè)RNN相連,它調(diào)控著讀寫頭,會(huì)產(chǎn)生一組權(quán)重,用于從存儲(chǔ)器部分讀取或者寫入數(shù)據(jù)。存儲(chǔ)器就像計(jì)算機(jī)中的內(nèi)存,也可以將其看作一組規(guī)則排列的神經(jīng)元。
這種裝置可以用于復(fù)雜的推理、閱讀理解等高級(jí)計(jì)算任務(wù),因?yàn)樗粌H僅是一個(gè)神經(jīng)網(wǎng)絡(luò),還結(jié)合了馮·諾依曼式體系架構(gòu),在問(wèn)題求解、自然語(yǔ)言處理等任務(wù)上的表現(xiàn)已經(jīng)超越了RNN。
05.訓(xùn)練方式如何影響深度網(wǎng)絡(luò)
除了架構(gòu)會(huì)影響深度網(wǎng)絡(luò)的表現(xiàn)以外,訓(xùn)練方式也會(huì)對(duì)結(jié)果產(chǎn)生很大的影響。
有兩篇文章可以說(shuō)明訓(xùn)練方式的重要性。第一篇文章是約書亞·本吉奧(Yoshua Bengio)的《課程學(xué)習(xí)》(“Curriculum Learning”)[3],該文章指出當(dāng)我們用數(shù)據(jù)訓(xùn)練人工神經(jīng)網(wǎng)絡(luò)時(shí),不同的順序會(huì)對(duì)網(wǎng)絡(luò)學(xué)習(xí)速度和最終表現(xiàn)產(chǎn)生重要影響。我們?nèi)绻葘⑸倭刻囟?biāo)簽的數(shù)據(jù)輸入網(wǎng)絡(luò),然后拿剩下的數(shù)據(jù)去訓(xùn)練它,就會(huì)比一股腦兒地把所有標(biāo)簽的數(shù)據(jù)都輸入給它要更加有效,從而提高網(wǎng)絡(luò)的“學(xué)習(xí)”能力。這就像人類學(xué)習(xí)一樣,有步驟地學(xué)習(xí)會(huì)比一股腦兒地記下所有的知識(shí)更好。該學(xué)習(xí)方式將幫助機(jī)器學(xué)習(xí)吸取人類學(xué)習(xí)的優(yōu)點(diǎn),提升學(xué)習(xí)效果,協(xié)助其跳出局部極優(yōu),提高泛化能力。
第二篇文章是《在深度神經(jīng)網(wǎng)絡(luò)中特征是如何變成可遷移的》(“How Transferable are Features in Deep Neural Network?”)[4],該文章詳細(xì)比較了不同的訓(xùn)練方式如何影響網(wǎng)絡(luò)的學(xué)習(xí)效率。有了更有效的學(xué)習(xí),我們就可以通過(guò)遷移學(xué)習(xí)(參見第6章)將訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)遷移到新的小數(shù)據(jù)集中,從而達(dá)到很好的表現(xiàn)。
AlphaGo的復(fù)雜訓(xùn)練流程也向我們展示了訓(xùn)練方式和訓(xùn)練路徑對(duì)于一個(gè)深度學(xué)習(xí)系統(tǒng)的重要性。首先,AlphaGo團(tuán)隊(duì)根據(jù)人類的下棋經(jīng)驗(yàn)快速訓(xùn)練了一個(gè)小的網(wǎng)絡(luò)——快速走棋網(wǎng)絡(luò),在此基礎(chǔ)上,再根據(jù)人類下棋的棋譜訓(xùn)練一個(gè)大的網(wǎng)絡(luò)——監(jiān)督學(xué)習(xí)走棋網(wǎng)絡(luò);然后,在這個(gè)網(wǎng)絡(luò)的基礎(chǔ)上,讓AlphaGo通過(guò)和自己下棋得到一個(gè)強(qiáng)化學(xué)習(xí)走棋網(wǎng)絡(luò);最后,在此基礎(chǔ)上得到價(jià)值網(wǎng)絡(luò)。整個(gè)訓(xùn)練流程非常復(fù)雜卻又十分精巧,包含了無(wú)數(shù)訓(xùn)練技巧。
1.3.3 GPU
影響深度學(xué)習(xí)性能的最后一個(gè)因素是GPU。GPU就是圖形處理單元(graphics processing unit),和CPU一樣,都是做計(jì)算的基本單元,只不過(guò)GPU是嵌在顯卡上的,而CPU是嵌在主機(jī)主板上的。
我們知道,深度神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過(guò)程需要耗費(fèi)大量的計(jì)算時(shí)間。如果沒有GPU的加速,我們就不可能在可接受的時(shí)間內(nèi)訓(xùn)練好一個(gè)深度神經(jīng)網(wǎng)絡(luò)。那為什么GPU可以幫助深度神經(jīng)網(wǎng)絡(luò)加速呢?原因就在于GPU非常擅長(zhǎng)大規(guī)模的張量運(yùn)算,并且可以為這種運(yùn)算加速,包含多個(gè)數(shù)值的張量運(yùn)算所需要的平均時(shí)間遠(yuǎn)遠(yuǎn)少于對(duì)每個(gè)數(shù)字運(yùn)算的時(shí)間。
原來(lái),GPU是在大規(guī)模3D電子游戲這個(gè)龐大市場(chǎng)的刺激下發(fā)明的。我們知道,3D圖像的渲染需要進(jìn)行大規(guī)模的矩陣運(yùn)算。GPU的出現(xiàn)可以讓這種運(yùn)算并行化,從而讓計(jì)算機(jī)圖形渲染畫面異常地流暢和光滑。
無(wú)巧不成書,后來(lái)人們認(rèn)識(shí)到,GPU的矩陣運(yùn)算并行化可以幫助我們快速實(shí)現(xiàn)對(duì)神經(jīng)網(wǎng)絡(luò)的訓(xùn)練,因?yàn)橛?xùn)練的運(yùn)算過(guò)程可以全部轉(zhuǎn)化成高階矩陣(一般稱為張量)的運(yùn)算過(guò)程,而這正是GPU所擅長(zhǎng)的。
大數(shù)據(jù)、深度網(wǎng)絡(luò)架構(gòu)和GPU這三駕馬車湊齊了以后,我們就可以踏上深度學(xué)習(xí)的康莊大道了。
1.4 深度學(xué)習(xí)為什么如此成功
深度學(xué)習(xí)為什么如此成功?要回答這個(gè)問(wèn)題,就要了解深度學(xué)習(xí)的本質(zhì)特色,那就是對(duì)所學(xué)特征的“表達(dá)能力”(representation)。換句話說(shuō),深度學(xué)習(xí)重要的本領(lǐng)在于它可以從海量的數(shù)據(jù)中自動(dòng)學(xué)習(xí),抽取數(shù)據(jù)中的特征。
1.4.1 特征學(xué)習(xí)
深度神經(jīng)網(wǎng)絡(luò)的一個(gè)特性是會(huì)把不同的信息表達(dá)到不同層次的網(wǎng)絡(luò)單元(權(quán)重)之中,并且這一提煉過(guò)程完全不需要手動(dòng)干預(yù),全憑機(jī)器學(xué)習(xí)過(guò)程自動(dòng)完成,這就是我們常說(shuō)的特征學(xué)習(xí)(feature learning)。深度學(xué)習(xí)的本質(zhì)就是這種自動(dòng)提取特征的功能。
例如,CNN在做圖像識(shí)別的時(shí)候,可以自動(dòng)提煉出數(shù)字圖像中的低尺度特征和高尺度特征。如圖1.10所示,低層(離輸入端比較近)的神經(jīng)元可以提取圖像中的邊緣、棱角等低尺度信息;中間層單元可以提取數(shù)據(jù)中更高一層的尺度信息;而到了更高層,它就可以提取圖像中的高尺度信息(例如整張人臉)。

圖1.10 使用深層CNN提取圖像中不同尺度的信息
事實(shí)上,從原始數(shù)據(jù)中提煉出最基本的特征一直是困擾科學(xué)家的一大難題。例如要實(shí)現(xiàn)人臉識(shí)別,早期的方法是手工從原始圖像中提取出邊緣、棱角等基礎(chǔ)性信息,然后將這些信息傳遞給一個(gè)普通的神經(jīng)網(wǎng)絡(luò)做分類。但是,這一過(guò)程相當(dāng)費(fèi)時(shí)費(fèi)力,并且和領(lǐng)域知識(shí)高度相關(guān),因此,手工特征提取成了整個(gè)流程的瓶頸。
如今,基于深度學(xué)習(xí)的算法可以將特征提取的過(guò)程自動(dòng)學(xué)習(xí)出來(lái)。我們只需要將包含人臉的原始圖像數(shù)據(jù)輸入網(wǎng)絡(luò),它通過(guò)反復(fù)的監(jiān)督學(xué)習(xí)就可以一點(diǎn)一點(diǎn)地在各個(gè)層面將重要的特征學(xué)習(xí)出來(lái),這無(wú)疑大大解放了生產(chǎn)力。
1.4.2 遷移學(xué)習(xí)
除此之外,深度神經(jīng)網(wǎng)絡(luò)的另一個(gè)重要特性就在于特征提取之后的遷移學(xué)習(xí)(transfer learning)。我們可以像做腦外科手術(shù)一樣把一個(gè)訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)切開,然后再把它拼合到另一個(gè)神經(jīng)網(wǎng)絡(luò)上。正如我們剛才所說(shuō)的,神經(jīng)網(wǎng)絡(luò)可以在各個(gè)層編碼表示數(shù)據(jù)中不同尺度的特征。也就是說(shuō),前幾層神經(jīng)網(wǎng)絡(luò)就好像一個(gè)特征提取器,作用就是提煉特征,而后面部分的網(wǎng)絡(luò)會(huì)根據(jù)這些特征進(jìn)行分類或者預(yù)測(cè)。
于是,當(dāng)把神經(jīng)網(wǎng)絡(luò)組合拼接之后,我們就可以用前面部分的神經(jīng)網(wǎng)絡(luò)進(jìn)行特征提取,再將這個(gè)特征提取器與后面的網(wǎng)絡(luò)進(jìn)行拼接,去解決另一個(gè)完全不同的問(wèn)題,這就叫遷移學(xué)習(xí)(詳見第6章)。
例如,我們可以組合CNN和RNN兩種神經(jīng)網(wǎng)絡(luò),從而得到一個(gè)全新的看圖說(shuō)話網(wǎng)絡(luò),如圖1.11所示。

圖1.11 將CNN和RNN進(jìn)行遷移、拼接
在這個(gè)實(shí)驗(yàn)中,我們首先訓(xùn)練一個(gè)CNN,讓它能夠?qū)D像進(jìn)行準(zhǔn)確分類。之后,我們將前面一半網(wǎng)絡(luò)(圖1.11矩形框中的部分)切下來(lái),作為一個(gè)特征提取器。然后,我們?cè)谒暮竺孢B接上一個(gè)RNN(可以事先訓(xùn)練好這個(gè)網(wǎng)絡(luò),使它可以生成自然語(yǔ)言)。最后,只要對(duì)拼接起來(lái)的新網(wǎng)絡(luò)稍加訓(xùn)練,它就可以完成看圖說(shuō)話的任務(wù)了。
這就是深度神經(jīng)網(wǎng)絡(luò)深受歡迎的重要原因。有了特征提取和遷移學(xué)習(xí),我們就能夠?qū)崿F(xiàn)各種端到端(end to end)式的學(xué)習(xí)。也就是說(shuō),可以直接輸入原始數(shù)據(jù),讓深度網(wǎng)絡(luò)輸出最終的結(jié)果。所有的中間處理環(huán)節(jié),我們都不需要關(guān)心,整個(gè)網(wǎng)絡(luò)會(huì)自動(dòng)學(xué)習(xí)到一種最優(yōu)的模式,從而使模型可以精確地輸出預(yù)測(cè)值。
這種端到端的機(jī)器學(xué)習(xí)方式有一個(gè)迷人之處:它可以通過(guò)不斷吸收大量數(shù)據(jù)而表現(xiàn)得越來(lái)越專業(yè),甚至在訓(xùn)練神經(jīng)網(wǎng)絡(luò)的過(guò)程中不需要所解決問(wèn)題的領(lǐng)域知識(shí)。于是,端到端的深度學(xué)習(xí)給大量初創(chuàng)公司快速占領(lǐng)市場(chǎng)提供了豐富的機(jī)會(huì)。這或許是大家看好并投身深度學(xué)習(xí)的一個(gè)原因。
1.5 小結(jié)
作為全書的開篇,本章對(duì)深度學(xué)習(xí)進(jìn)行了簡(jiǎn)明扼要的介紹。首先,從深度學(xué)習(xí)與其他學(xué)科的關(guān)系、歷史淵源這兩個(gè)層面介紹了什么是深度學(xué)習(xí)。其次,討論了導(dǎo)致深度學(xué)習(xí)爆發(fā)的三大本質(zhì)因素:大數(shù)據(jù)、深度網(wǎng)絡(luò)架構(gòu)以及GPU。在這三大因素中,我們著重強(qiáng)調(diào)了深度網(wǎng)絡(luò)架構(gòu)的重要性,將流行的網(wǎng)絡(luò)架構(gòu)分成了三大類:前饋神經(jīng)網(wǎng)絡(luò)、卷積神經(jīng)網(wǎng)絡(luò)和循環(huán)神經(jīng)網(wǎng)絡(luò)。最后,討論了深度學(xué)習(xí)取得成功的原因:一是深度神經(jīng)網(wǎng)絡(luò)可以自動(dòng)學(xué)習(xí)表征,避免了大量的人工工作,使得端到端的機(jī)器學(xué)習(xí)成為可能;二是我們可以對(duì)深度神經(jīng)網(wǎng)絡(luò)實(shí)施類似于腦外科手術(shù)的遷移和拼接,這不僅實(shí)現(xiàn)了利用小數(shù)據(jù)完成高精度的機(jī)器學(xué)習(xí),也讓我們的網(wǎng)絡(luò)能夠像軟件模塊一樣進(jìn)行拼接和組裝,這無(wú)疑會(huì)對(duì)深度學(xué)習(xí)以及人工智能技術(shù)的應(yīng)用與普及產(chǎn)生深遠(yuǎn)的影響。
1.6 參考文獻(xiàn)
[1] 集智俱樂(lè)部. 科學(xué)的極致:漫談人工智能. 人民郵電出版社,2016.
[2] Goodfellow I, Bengio Y, Courville A. 深度學(xué)習(xí). 人民郵電出版社,2017.
[3] Bengio Y, Louradour J, Collabert R, et al. Curriculum Learning. Proceedings of the 26th International Conference on Machine Learning, 2009.
[4] Yosinski J, Clune J, Bengio Y, et al. How Transferable are Features in Deep Neural Networks?. arXiv: 1411.1792, 2014.
- Cross-platform Desktop Application Development:Electron,Node,NW.js,and React
- 編程卓越之道(卷3):軟件工程化
- Xcode 7 Essentials(Second Edition)
- Python進(jìn)階編程:編寫更高效、優(yōu)雅的Python代碼
- Python程序設(shè)計(jì)案例教程
- OpenShift在企業(yè)中的實(shí)踐:PaaS DevOps微服務(wù)(第2版)
- C語(yǔ)言程序設(shè)計(jì)
- Python面向?qū)ο缶幊蹋簶?gòu)建游戲和GUI
- R語(yǔ)言數(shù)據(jù)可視化:科技圖表繪制
- Android應(yīng)用開發(fā)實(shí)戰(zhàn)
- Android Studio Cookbook
- 從零開始學(xué)Android開發(fā)
- H5+移動(dòng)營(yíng)銷設(shè)計(jì)寶典
- R語(yǔ)言實(shí)戰(zhàn)(第2版)
- Unity與C++網(wǎng)絡(luò)游戲開發(fā)實(shí)戰(zhàn):基于VR、AI與分布式架構(gòu)