科技新知 | 深度學習的前世今生
你可能已經接觸過程式設計,並開發過一兩款程式。同時你可能讀過關於深度學習或者機器學習的鋪天蓋地的報導, 儘管很多時候它們被賦予了更廣義的名字——人工智慧 。實際上,或者說幸運的是,大部分程式並不需要深度學習或者是更廣義上的人工智慧技術。例如,如果我們要為一臺微波爐編寫一個使用者介面,只需要一點兒工夫我們便能設計出十幾個按鈕以及一系列能精確描述微波爐在各種情況下的表現的規則;再比如,假設我們要編寫一個電子郵件客戶端。這樣的程式比微波爐要複雜一些,但我們還是可以沉下心來一步一步思考:客戶端的使用者介面將需要幾個輸入框來接受收件人、主題、郵件正文等,程式將監聽鍵盤輸入並寫入一個緩衝區,然後將它們顯示在相應的輸入框中。當使用者點選“傳送”按鈕時,我們需要檢查收件人郵箱地址的格式是否正確,並檢查郵件主題是否為空,或在主題為空時警告使用者,而後用相應的協議傳送郵件。
值得注意的是,在以上兩個例子中,我們都不需要收集真實世界中的資料,也不需要系統地提取這些資料的特徵。只要有充足的時間,我們的常識與程式設計技巧已經足夠讓我們完成任務。
與此同時,我們很容易就能找到一些 連世界上最好的程式設計師也無法僅用程式設計技巧解決的簡單問題 。例如,假設我們想要編寫一個判定一張影像中有沒有貓的程式。這件事聽起來好像很簡單,對不對?程式只需要對每張輸入影像輸出“真”(表示有貓)或者“假”(表示無貓)即可。但令人驚訝的是,即使是世界上最優秀的電腦科學家和程式設計師也不懂如何編寫這樣的程式。
我們該從哪裡入手呢?我們先進一步簡化這個問題:若假設所有影像的高和寬都是同樣的 400 畫素大小,一個畫素由紅綠藍3個值構成,那麼一張影像就由近 50 萬個數值表示。那麼哪些數值隱藏著我們需要的資訊呢?是所有數值的平均數,還是4個角的數值,抑或是影像中的某一個特別的點?事實上,要想解讀影像中的內容,需要尋找僅僅在結合成千上萬的數值時才會出現的特徵,如邊緣、質地、形狀、眼睛、鼻子等,最終才能判斷影像中是否有貓。
一種解決以上問題的思路是逆向思考。 與其設計一個解決問題的程式,不如從最終的需求入手來尋找一個解決方案。事實上,這也是目前的機器學習和深度學習應用共同的核心思想:我們可以稱其為“用資料程式設計” 。與其枯坐在房間裡思考怎麼設計一個識別貓的程式,不如利用人類肉眼在影像中識別貓的能力。我們可以收集一些已知包含貓與不包含貓的真實影像,然後我們的目標就轉化成如何從這些影像入手得到一個可以推斷出影像中是否有貓的函式。這個函式的形式通常透過我們的知識來針對特定問題選定。例如,我們使用一個二次函式來判斷影像中是否有貓,但是像二次函式係數值這樣的函式引數的具體值則是透過資料來確定。
通俗來說, 機器學習是一門討論各式各樣的適用於不同問題的函式形式,以及如何使用資料來有效地獲取函式引數具體值的學科。 深度學習是指機器學習中的一類函式,它們的形式通常為多層神經網路。近年來,仰仗著大資料集和強大的硬體,深度學習已逐漸成為處理影像、文字語料和聲音訊號等複雜高維度資料的主要方法。
我們現在正處於一個程式設計得到深度學習的幫助越來越多的時代。這可以說是電腦科學歷史上的一個分水嶺。 舉個例子,深度學習已經在你的手機裡:拼寫校正、語音識別、認出社交媒體照片裡的好友們等。得益於優秀的演算法、快速而廉價的算力、前所未有的大量資料以及強大的軟體工具,如今大多數軟體工程師都有能力建立複雜的模型來解決10年前連最優秀的科學家都覺得棘手的問題。
《動手學深度學習》希望能幫助讀者進入深度學習的浪潮中。我們希望結合數學、程式碼和樣例讓深度學習變得觸手可及 。本書 不要求讀者具有高深的數學或程式設計背景 ,我們將隨著章節的發展逐一解釋所需要的知識。更值得一提的是,本書的每一節都是一個可以獨立執行的 Jupyter 記事本。讀者可以從網上獲得這些記事本,並且可以在個人電腦或雲端伺服器上執行它們。這樣讀者就可以隨意改動書中的程式碼並得到及時反饋。 我們希望本書能幫助和啟發新一代的程式設計師、 創業者、統計學家、生物學家,以及所有對深度學習感興趣的人 。
1 起源
雖然深度學習似乎是最近幾年剛興起的名詞,但它所基於的神經網路模型和用資料程式設計的核心思想已經被研究了數百年。自古以來,人類就一直渴望能從資料中分析出預知未來的竅門。實際上,資料分析正是大部分自然科學的本質,我們希望從日常的觀測中提取規則,並找尋不確定性。
早在17世紀,雅各比·伯努利(1655—1705)提出了描述只有兩種結果的隨機過程(如拋擲一枚硬幣)的 伯努利分佈 。大約一個世紀之後,卡爾·弗里德里希·高斯(1777—1855)發明了今日仍廣泛用在從保險計算到醫學診斷等領域的 最小二乘法 。機率論、統計學和模式識別等工具幫助自然科學的工作者從資料迴歸到自然定律,從而發現了 如歐姆定律 (描述電阻兩端電壓和流經電阻電流關係的定律) 這類可以用線性模型完美表達的一系列自然法則 。
即使是在中世紀, 數學家也熱衷於利用統計學來做出估計 。例如,在雅各比·科貝爾(1460—1533)的幾何書中記載了使用 16 名男子的平均腳長來估計男子的平均腳長。
如圖1-1所示,在這個研究中,16位成年男子被要求在離開教堂時站成一排並把腳貼在一起,而後他們腳的總長度除以16得到了一個估計:這個數字大約相當於今日的0.3米。這個演算法之後又被改進,以應對特異形狀的腳—— 最長和最短的腳不計入,只對剩餘的腳長取平均值,即裁剪平均值的雛形。
現代統計學在 20 世紀的真正騰飛要歸功於資料的收集和釋出 。統計學巨匠之一羅納德·費雪(1890—1962)對統計學理論和統計學在基因學中的應用功不可沒。他發明的許多演算法和公式,例如線性判別分析和費雪資訊,仍經常被使用。即使是他在 1936 年釋出的 Iris 資料集,仍然偶爾被用於演示機器學習演算法。
克勞德·夏農(1916—2001)的資訊理論以及阿蘭·圖靈(1912—1954)的計算理論也對機器學習有深遠影響 。圖靈在他著名的論文《計算機器與智慧》中提出了“機器可以思考嗎?”這樣一個問題。在他描述的“圖靈測試”中,如果一個人在使用文字互動時不能區分他的對話物件到底是人類還是機器的話,那麼即可認為這臺機器是有智慧的。時至今日,智慧機器的發展可謂日新月異。
另一個對深度學習有重大影響的領域是神經科學與心理學 。既然人類顯然能夠展現出智慧,那麼對於解釋並逆向工程人類智慧機理的探究也在情理之中。最早的演算法之一是由唐納德·赫布(1904—1985)正式提出的。在他開創性的著作《行為的組織》中,他提出神經是透過正向強化來學習的,即赫布理論。赫布理論是感知機學習演算法的原型,併成為支撐今日深度學習的隨機梯度下降演算法的基石:強化合意的行為、懲罰不合意的行為,最終獲得優良的神經網路引數。
來源於生物學的靈感是神經網路名字的由來 。這類研究者可以追溯到一個多世紀前的亞歷山大·貝恩(1818—1903)和查爾斯·斯科特·謝靈頓(1857—1952)。研究者們嘗試組建模仿神經元互動的計算電路。隨著時間流逝,神經網路的生物學解釋被稀釋,但仍保留了這個名字。時至今日,絕大多數神經網路都包含以下的核心原則。
- 交替使用線性處理單元與非線性處理單元,它們經常被稱為“層”。
- 使用鏈式法則(即反向傳播)來更新網路的引數。
在最初的快速發展之後,自約1995年起至2005年,大部分機器學習研究者的視線從神經網路上移開了 。這是由於多種原因。首先, 訓練神經網路需要極強的計算力 。儘管20世紀末記憶體已經足夠,計算力卻不夠充足。其次, 當時使用的資料集也相對小得多 。費雪在1936年釋出的的Iris 資料集僅有150個樣本,並被廣泛用於測試演算法的效能。具有6萬個樣本的MNIST資料集在當時已經被認為是非常龐大了,儘管它如今已被認為是典型的簡單資料集。由於資料和計算力的稀缺,從經驗上來說,如核方法、決策樹和機率圖模型等統計工具更優。它們不像神經網路一樣需要長時間的訓練,並且在強大的理論保證下提供可以預測的結果。
2 發展
網際網路的崛起、價廉物美的感測器和低價的儲存器令我們越來越容易獲取大量資料。加之便宜的計算力,尤其是原本為電腦遊戲設計的GPU的出現 ,前面描述的情況改變了許多。一瞬間,原本被認為不可能的演算法和模型變得觸手可及。這樣的發展趨勢從表1-1中可見一斑。
很顯然,儲存容量沒能跟上資料量增長的步伐。與此同時,計算力的增長又蓋過了資料量的增長。這樣的趨勢使得統計模型可以在最佳化引數上投入更多的計算力,但同時需要提高儲存的利用效率,例如使用非線性處理單元。這也相應導致了機器學習和統計學的最優選擇從廣義線性模型及核方法變化為深度多層神經網路。這樣的變化正是諸如多層感知機、卷積神經網路、長短期記憶迴圈神經網路和Q學習等深度學習的支柱模型在過去10年從坐了數十年的冷板凳上站起來被“重新發現”的原因。
近年來在統計模型、應用和演算法上的進展常被拿來與寒武紀大爆發(歷史上物種數量大爆發的一個時期)做比較。但這些進展不僅僅是因為可用資源變多了而讓我們得以用新瓶裝舊酒。下面僅列出了 近10年來深度學習長足發展的部分原因 。
- 優秀的容量控制方法,如丟棄法,使大型網路的訓練不再受制於過擬合 (大型神經網路學會記憶大部分訓練資料的行為)。這是靠在整個網路中注入噪聲而達到的,如訓練時隨機將權重替換為隨機的數字。
- 注意力機制解決了另一個困擾統計學超過一個世紀的問題:如何在不增加引數的情況下擴充套件一個系統的記憶容量和複雜度 。注意力機制使用了一個可學習的指標結構來構建出一個精妙的解決方法。也就是說,與其在像機器翻譯這樣的任務中記憶整個句子,不如記憶指向翻譯的中間狀態的指標。由於生成譯文前不需要再儲存整句原文的資訊,這樣的結構使準確翻譯長句變得可能。
- 記憶網路和神經編碼器-直譯器這樣的多階設計使得針對推理過程的迭代建模方法變得可能 。這些模型允許重複修改深度網路的內部狀態,這樣就能模擬出推理鏈條上的各個步驟,就好像處理器在計算過程中修改記憶體一樣。
- 另一個重大 發展是 生成對抗網路的發明 。傳統上,用在機率分佈估計和生成模型上的統計方法更多地關注於找尋正確的機率分佈,以及正確的取樣演算法。生成對抗網路的關鍵創新在於將取樣部分替換成了任意的含有可微分引數的演算法。這些引數將被訓練到使辨別器不能再分辨真實的和生成的樣本。生成對抗網路可使用任意演算法來生成輸出的這一特性為許多技巧開啟了新的大門。例如,生成奔跑的斑馬和生成名流的照片都是生成對抗網路發展的見證。
- 許多情況下單塊GPU已經不能滿足在大型資料集上進行訓練的需要。 過去10年內我們構建分散式並行訓練演算法的能力已經有了極大的提升 。設計可擴充套件演算法的最大瓶頸在於深度學習最佳化演算法的核心:隨機梯度下降需要相對更小的批次。與此同時,更小的批次也會降低GPU的效率。如果使用1 024塊GPU,每塊GPU 的批次大小為32個樣本,那麼單步訓練的批次大小將是32 000 個以上。近年來的工作將批次大小增至多達64 000個樣例,並把在ImageNet資料集上訓練ResNet-50模型的時間降到了7分鐘。與之相比,最初的訓練時間需要以天來計算。
- 平行計算的能力也為至少在可以採用模擬情況下的強化學習的發展貢獻了力量 。平行計算幫助計算機在圍棋、雅達利遊戲、星際爭霸和物理模擬上達到了超過人類的水準。
- 深度學習框架也在傳播深度學習思想的過程中扮演了重要角色 。Caffe、Torch和Theano這樣的第一代框架使建模變得更簡單。許多開創性的論文都用到了這些框架。如今它們已經被TensorFlow(經常是以高層 API Keras的形式被使用)、CNTK、Caffe 2和Apache MXNet所取代。第三代,即命令式深度學習框架,是由用類似NumPy的語法來定義模型的Chainer所開創的。這樣的思想後來被PyTorch和MXNet 的Gluon API 採用,後者也正是本書用來教學深度學習的工具。
系統研究者負責構建更好的工具,統計學家建立更好的模型 。這樣的分工使工作大大簡化。舉例來說,在 2014 年時,訓練一個邏輯迴歸模型曾是卡內基梅隆大學佈置給機器學習方向的新入學博士生的作業問題。時至今日,這個問題只需要少於 10 行的程式碼便可以完成,普通的程式設計師都可以做到。
3 成功案例
長期以來機器學習總能完成其他方法難以完成的目標。例如,自20世紀 90 年代起,郵件的分揀就開始使用光學字元識別。實際上這正是知名的 MNIST 和 USPS 手寫數字資料集的來源。機器學習也是電子支付系統的支柱,可以用於讀取銀行支票、進行授信評分以及防止金融欺詐。機器學習演算法在網路上被用來提供搜尋結果、個性化推薦和網頁排序。雖然長期處於公眾視野之外,但是機器學習已經滲透到了我們工作和生活的方方面面。直到近年來,在此前認為無法被解決的問題以及直接關係到消費者的問題上取得突破性進展後,機器學習才逐漸變成公眾的焦點。 下列進展基本歸功於深度學習。
- 蘋果公司的 Siri、亞馬遜的 Alexa 和谷歌助手一類的智慧助手能以可觀的準確率回答口頭提出的問題,甚至包括從簡單的開關燈具(對殘疾群體幫助很大)到提供語音對話幫助。 智慧助手的出現或許可以作為人工智慧開始影響我們生活的標誌 。
- 智慧助手的關鍵是需要能夠精確識別語音,而這類系統在某些應用上的精確度已經漸漸增長到可以與人類比肩。
- 物體識別也經歷了漫長的發展過程。在2010 年從影像中識別出物體的類別仍是一個相當有挑戰性的任務。當年日本電氣、伊利諾伊大學香檳分校和羅格斯大學團隊在 ImageNet 基準測試上取得了28%的前五錯誤率。到2017年,這個數字降低到了2.25%。研究人員在鳥類識別和皮膚癌診斷上,也取得了同樣驚世駭俗的成績。
- 遊戲曾被認為是人類智慧最後的堡壘。自使用時間差分強化學習翫雙陸棋的 TD-Gammon開始,演算法和算力的發展催生了一系列在遊戲上使用的新演算法。與雙陸棋不同,國際象棋有更復雜的狀態空間和更多的可選動作。“深藍”用大量的並行、專用硬體和遊戲樹的高效搜尋打敗了加里·卡斯帕羅夫。圍棋因其龐大的狀態空間被認為是更難的遊戲,AlphaGo 在 2016 年用結合深度學習與蒙特卡洛樹取樣的方法達到了人類水準。對德州 撲 克遊戲而言,除了巨大的狀態空間之外,更大的挑戰是遊戲的資訊並不完全可見,例如看不到對手的牌。而“冷撲大師”用高效的策略體系超越了人類玩家的表現。以上的例子都體現出了先進的演算法是人工智慧在遊戲上的表現提升的重要原因。
- 機器學習進步的另一個標誌是自動駕駛汽車的發展。儘管距離完全的自主駕駛還有很長的路要走,但諸如Tesla、NVIDIA、 MobilEye和Waymo這樣的公司釋出的具有部分自主駕駛功能的產品展示出了這個領域巨大的進步。完全自主駕駛的難點在於它需要將感知、思考和規則整合在同一個系統中。目前,深度學習主要被應用在計算機視覺的部分,剩餘的部分還是需要工程師們的大量除錯。
以上列出的僅僅是近年來深度學習所取得的成果的冰山一角。 機器人學、物流管理、計算生物學、粒子物理學和天文學近年來的發展也有一部分要歸功於深度學習 。可以看到,深度學習已經逐漸演變成一個工程師和科學家皆可使用的普適工具。
4 特點
在描述深度學習的特點之前,我們先回顧並概括一下機器學習和深度學習的關係。 機器學習研究如何使計算機系統利用經驗改善效能。它是人工智慧領域的分支,也是實現人工智慧的一種手段 。在機器學習的眾多研究方向中,表徵學習關注如何自動找出表示資料的合適方式,以便更好地將輸入變換為正確的輸出,而 本書要重點探討的深度學習是具有多級表示的表徵學習方法 。在每一級(從原始資料開始),深度學習透過簡單的函式將該級的表示變換為更高階的表示。因此, 深度學習模型也可以看作是由許多簡單函式複合而成的函式。當這些複合的函式足夠多時,深度學習模型就可以表達非常複雜的變換 。
深度學習可以逐級表示越來越抽象的概念或模式 。以影像為例,它的輸入是一堆原始畫素值。深度學習模型中,影像可以逐級表示為特定位置和角度的邊緣、由邊緣組合得出的花紋、由多種花紋進一步匯合得到的特定部位的模式等。最終,模型能夠較容易根據更高階的表示完成給定的任務,如識別影像中的物體。值得一提的是,作為表徵學習的一種,深度學習將自動找出每一級表示資料的合適方式。
因此, 深度學習的一個外在特點是端到端的訓練 。也就是說,並不是將單獨除錯的部分拼湊起來組成一個系統,而是將整個系統組建好之後一起訓練。比如說,計算機視覺科學家之前曾一度將特徵抽取與機器學習模型的構建分開處理,像是 Canny邊緣探測和SIFT特徵提取曾佔據統治性地位達 10 年以上,但這也就是人類能找到的最好方法了。當深度學習進入這個領域後,這些特徵提取方法就被效能更強的自動最佳化的逐級過濾器替代了。
相似地,在 自然語言處理領域 ,詞袋模型多年來都被認為是不二之選。詞袋模型是將一個句子對映到一個詞頻向量的模型,但這樣的做法完全忽視了單詞的排列順序或者句中的標點符號。不幸的是,我們也沒有能力來手工抽取更好的特徵。但是 自動化的演算法反而可以從所有可能的特徵中搜尋最好的那個,這也帶來了極大的進步 。例如,語義相關的詞嵌入能夠在向量空間中完成如下推理:“柏林-德國 + 中國 = 北京”。可以看出,這些都是端到端訓練整個系統帶來的效果。
除端到端的訓練以外, 我們也正在經歷從含引數統計模型轉向完全無引數的模型 。當資料非常稀缺時,我們需要透過簡化對現實的假設來得到實用的模型。當資料充足時,我們就可以用能更好地擬合現實的無引數模型來替代這些含引數模型。這也使我們可以得到更精確的模型,儘管需要犧牲一些可解釋性。
相對於其他經典的機器學習方法而言,深度學習的不同在於對非最優解的包容、非凸非線性最佳化的使用,以及勇於嘗試沒有被證明過的方法 。這種在處理統計問題上的新經驗主義吸引了大量人才的湧入,使得大量實際問題有了更好的解決方案。儘管大部分情況下需要為深度學習修改甚至重新發明已經存在數十年的工具,但是這絕對是一件非常有意義並令人興奮的事。
最後,深度學習社群長期以來以在學術界和企業之間分享工具而自豪,並開源了許多優秀的軟體庫、統計模型和預訓練網路。正是 本著開放開源的精神,本書的內容和基於它的教學影片可以自由下載和隨意分享 。我們致力於為所有人降低學習深度學習的門檻,並希望大家從中獲益。
小結
- 機器學習研究如何使計算機系統利用經驗改善效能。它是人工智慧領域的分支,也是實現人工智慧的一種手段。
- 作為機器學習的一類,表徵學習關注如何自動找出表示資料的合適方式。
- 深度學習是具有多級表示的表徵學習方法。它可以逐級表示越來越抽象的概念或模式。
- 深度學習所基於的神經網路模型和用資料程式設計的核心思想實際上已經被研究了數百年。
- 深度學習已經逐漸演變成一個工程師和科學家皆可使用的普適工具。
本文摘自《動手學深度學習》, @人民郵電出版社 出版
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29829936/viewspace-2647534/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 最簡單的深度學習演算法——感知器的前世今生深度學習演算法
- 深度解析:主流分散式架構的前世今生分散式架構
- 【機器學習】Logistic Regression 的前世今生(理論篇)機器學習
- InfiniBand 的前世今生
- Serverless 的前世今生Server
- Dubbo的前世今生
- IPD的前世今生
- MySQL 的前世今生MySql
- Mybatis的前世今生MyBatis
- DBHub的前世今生
- CRM的前世今生
- RabbitMQ的前世今生MQ
- Unicode的前世今生Unicode
- Webpack前世今生Web
- 聊聊 HTAP 的前世今生
- 聊聊ChatGPT的前世今生ChatGPT
- 遊戲的前世今生遊戲
- 元件化的前世今生元件化
- 外掛的前世今生
- HTTP/2.0的前世今生HTTP
- React ref 的前世今生React
- React Portal的前世今生React
- 重新學習MySQL資料庫開篇:資料庫的前世今生MySql資料庫
- Serverless For Frontend 前世今生Server
- LangChain和Hub的前世今生LangChain
- 雲原生的前世今生(一)
- “錕斤拷”的前世今生
- 資料庫的前世今生資料庫
- 中國SaaS的前世今生
- lua保護的前世今生
- SAP Cloud for Customer的前世今生Cloud
- HTTP 協議的前世今生HTTP協議
- iOS Device ID 的前世今生iOSdev
- Redux的前世-今生-來世Redux
- JavaScript – 非同步的前世今生JavaScript非同步
- SAP UI5 的前世今生UI
- SQLMap的前世今生(Part1)SQL
- Apache Hudi和Presto的前世今生ApacheREST