但願和你們理解 AI 的一些編程思路和模型,幫助梳理自我成長路線。
前端
做者/分享人 | 李嘉璇 算法
《TensorFlow技術解析與實戰》做者,InfoQ、51CTO、Oreilly Strata 等大會講師,活躍於國內各大技術社區,知乎編程問題回答者。擅長研究深度學習框架的架構、源碼分析及在不一樣領域的應用。有處理圖像、社交文本數據情感分析、數據挖掘等深度學習實戰經驗,參與過基於深度學習的自動駕駛二維感知系統 Hackathon 競賽, 曾任職百度研發工程師。如今研究 NLP、ChatBot,以及 TensorFlow 的性能優化及 FPGA 編譯。spring
文章來源Gitchat,AI科技大本營合做發佈編程
本場 Chat 內容主要包括:數組
人工智能的總體知識體系梳理。性能優化
人工智能/深度學習工程師的職業前景如何?網絡
非相關專業有可能自學入門麼?自學的方法和進階體系如何構建?架構
在 Java/客戶端/前端/iOS 已經工做8年,那進入這個新的領域,新手深度學習工程師有哪些門檻,怎麼克服?框架
但願和你們理解 AI 的一些編程思路和模型,幫助梳理自我成長路線。機器學習
AI 領域目前有哪些知識體系構成是怎麼樣的呢?也就是說真正成爲一名深度學習工程師,咱們在現有的工程師基礎上,要作哪些方面的準備呢?
目前的深度學習的研究領域主要有如下3類人羣。
學者。主要作深度學習的理論研究,研究如何設計一個「網絡模型」,如何修改參數以及爲何這樣修改效果會好。平時的工做主要是關注科研前沿和進行理論研究、模型實驗等,對新技術、新理論很敏感。
算法改進者。這些人爲了把現有的網絡模型可以適配本身的應用,達到更好的效果,會對模型作出一些改進,把一些新算法改進應用到現有模型中。這類人主要是作一些基礎的應用服務,如基礎的語音識別服務、基礎的人臉識別服務,爲其餘上層應用方提供優良的模型。
工業研究者。這類人羣不會涉及太深的算法,主要掌握各類模型的網絡結構和一些算法實現。他們更多地是閱讀優秀論文,根據論文去復現成果,而後應用到本身所在的工業領域。這個層次的人也是如今深度學習研究的主流人羣。
我詳細目前你們的轉型需求上來看,和你們最契合以及最匹配的,就是第二類和第三類人羣,且以第三類人羣居多。這就是深度學習工程師目前要作的主要工做。
從這個目標來看,咱們從如下幾個方面進行梳理。
框架
目前市面上的 DL 框架不少,例如 TensorFlow、Caffe、Pytorch 等,框架的性能優劣也有不少人在比較。咱們僅從流行度上和轉型者上手的難易程度上來看,建議你們首選 TensorFlow。下面是截至到今年3月份的框架流行度趨勢圖:
那麼拋開特定的框架,從功能上講,一個深度學習/機器學習的框架應該具備哪些功能呢?
Tensor 庫是對 CPU/GPU 透明的,而且實現了不少操做(如切片、數組或矩陣操做等)。這裏的透明是指,在不一樣設備上如何運行,都是框架幫用戶去實現的,用戶只須要指定在哪一個設備上進行哪一種運算便可。
有一個徹底獨立的代碼庫,用腳本語言(最理想的是 Python)來操做 Tensors,而且實現全部深度學習的內容,包括前向傳播/反向傳播、圖形計算等。
能夠輕鬆地共享預訓練模型(如 Caffe 的模型及 TensorFlow 中的 slim 模塊)。
沒有編譯過程。深度學習是朝着更大、更復雜的網絡發展的,所以在複雜圖算法中花費的時間會成倍增長。並且,進行編譯的話會丟失可解釋性和有效進行日誌調試的能力。更多請參考《The Unreasonable Effectiveness of Recurrent Neural Networks》。
TensorFlow 提供了 Python、C++、Java 接口來構建用戶的程序,而核心部分是用 C++ 實現的。
下圖給出的是 TensorFlow 的系統架構,自底向上分爲設備層和網絡層、數據操做層、圖計算層、API 層、應用層,其中設備層和網絡層。
數據操做層、圖計算層是 TensorFlow 的核心層。
下面就自底向上詳細介紹一下 TensorFlow 的系統架構。最下層是網絡通訊層和設備管理層。網絡通訊層包括 gRPC(google Remote Procedure Call Protocol)和遠程直接數據存取(Remote Direct Memory Access,RDMA),這都是在分佈式計算時須要用到的。設備管理層包括 TensorFlow 分別在 CPU、GPU、FPGA 等設備上的實現,也就是對上層提供了一個統一的接口,使上層只須要處理卷積等邏輯,而不須要關心在硬件上的卷積的實現過程。
其上是數據操做層,主要包括卷積函數、激活函數等操做。再往上是圖計算層,也是咱們要了解的核心,包含本地計算圖和分佈式計算圖的實現。再往上是 API 層和應用層。
使用 TensorFlow 的公司有不少,除了谷歌在本身的產品線上使用 TensorFlow 外,國內的京東、小米、新浪、中興等公司,以及國外的 Uber、eBay、Dropbox、Airbnb 等公司,都在嘗試使用 TensorFlow。
論文
每週讀懂一篇論文,每個月實現或者讀懂一篇論文的開源實現,是一個比較合理的學習節奏。
從工程上轉型的人,以前缺少論文閱讀的習慣,可能一時半會讀起來費力,加上英語的語言障礙,會很長時間徘徊在外面沒法入門。
這裏的一個好的建議就是:
先看和這篇論文主要思想相關的中文綜述,中文博士論文,然後是英文綜述。
經過中文綜述,能夠首先了解這個領域的基本名詞、實驗經常使用方法。不然直接從論文入手的話,做者站的高度和咱們的水平不一致,很容易想固然的理解或者根本看不下去。所以,在閱讀這篇文章以前,對於這篇文章中涉及到的基礎知識,對應中文基礎都理解透徹。
那麼轉型時期讀哪些論文能儘快掌握精髓呢?咱們以 CNN 的發展爲例,來看:
卷積神經網絡的發展過程如圖所示。
卷積神經網絡發展的起點是神經認知機(neocognitron)模型,當時已經出現了卷積結構。第一個卷積神經網絡模型誕生於1989年,其發明人是 LeCun。學習卷積神經網絡的讀本是 Lecun的論文,在這篇論文裏面較爲詳盡地解釋了什麼是卷積神經網絡,而且闡述了爲何要卷積,爲何要降採樣,徑向基函數(radial basis function,RBF)怎麼用,等等。
1998年 LeCun 提出了 LeNet,但隨後卷積神經網絡的鋒芒逐漸被 SVM 等手工設計的特徵的分類器蓋過。隨着 ReLU 和 Dropout 的提出,以及GPU和大數據帶來的歷史機遇,卷積神經網絡在2012年迎來了歷史性突破—AlexNet。
如圖所示,AlexNet 以後卷積神經網絡的演化過程主要有4個方向的演化:
一個是網絡加深;
二是加強卷積層的功能;
三是從分類任務到檢測任務;
四是增長新的功能模塊。
如上圖,分別找到各個階段的幾個網絡的論文,理解他們的結構和特色以後,在 TensorFlow Models 下,都有對這幾個網絡的實現。
對着代碼理解,並親自運行。隨後在本身的數據集上作一作 finetune,會對從此工業界進行深度學習網絡的開發流程有個直觀的認識。
下面就簡單講述各個階段的幾個網絡的結構及特色。
LeNet
LeNet 的論文詳見:
http://vision.stanford.edu/cs598_spring07/papers/Lecun98.pdf
LeNet包含的組件以下。
輸入層:32×32
卷積層:3個
降採樣層:2個
全鏈接層:1個
輸出層(高斯鏈接):10個類別(數字0~9的機率)
LeNet的網絡結構如圖所示
下面就介紹一下各個層的用途及意義。
輸入層。輸入圖像尺寸爲32×32。這要比MNIST數據集中的字母(28×28)還大,即對圖像作了預處理 reshape 操做。這樣作的目的是但願潛在的明顯特徵,如筆畫斷續、角點,可以出如今最高層特徵監測卷積核的中心。
卷積層(C1, C3, C5)。卷積運算的主要目的是使原信號特徵加強,而且下降噪音。在一個可視化的在線演示示例中,咱們能夠看出不一樣的卷積核輸出特徵映射的不一樣,如圖所示。
下采樣層(S2, S4)。下采樣層主要是想下降網絡訓練參數及模型的過擬合程度。一般有如下兩種方式。
最大池化(max pooling):在選中區域中找最大的值做爲採樣後的值。
平均值池化(mean pooling):把選中的區域中的平均值做爲採樣後的值。
全鏈接層(F6)。F6是全鏈接層,計算輸入向量和權重向量的點積,再加上一個偏置。隨後將其傳遞給sigmoid函數,產生單元i的一個狀態。
輸出層。輸出層由歐式徑向基函數(Euclidean radial basis function)單元組成,每一個類別(數字的0~9)對應一個徑向基函數單元,每一個單元有84個輸入。也就是說,每一個輸出 RBF 單元計算輸入向量和該類別標記向量之間的歐式距離。距離越遠,RBF 輸出越大。
通過測試,採用 LeNet,6萬張原始圖片的數據集,錯誤率可以下降到0.95%;54萬張人工處理的失真數據集合並上6萬張原始圖片的數據集,錯誤率可以下降到0.8%。
接着,歷史轉折發生在2012年,Geoffrey Hinton 和他的學生 Alex Krizhevsky 在 ImageNet 競賽中一舉奪得圖像分類的冠軍,刷新了圖像分類的記錄,經過比賽迴應了對卷積方法的質疑。比賽中他們所用網絡稱爲 AlexNet。
AlexNet
AlexNet 在2012年的 ImageNet 圖像分類競賽中,Top-5錯誤率爲15.3%;2011年的冠軍是採用基於傳統淺層模型方法,Top-5錯誤率爲25.8%。AlexNet 也遠遠超過2012年競賽的第二名,錯誤率爲26.2%。AlexNet 的論文詳見 Alex Krizhevsky、Ilya Sutskever 和 Geoffrey E.Hinton 的《ImageNet Classification with Deep Convolutional Neural Networks》。
AlexNet 的結構如圖所示。圖中明確顯示了兩個 GPU 之間的職責劃分:一個 GPU 運行圖中頂部的層次部分,另外一個 GPU 運行圖中底部的層次部分。GPU 之間僅在某些層互相通訊。
AlexNet 由5個卷積層、5個池化層、3個全鏈接層,大約5000萬個可調參數組成。最後一個全鏈接層的輸出被送到一個1000維的 softmax 層,產生一個覆蓋1000類標記的分佈。
AlexNet 之因此可以成功,讓深度學習卷積的方法重回到人們視野,緣由在於使用了以下方法。
防止過擬合:Dropout、數據加強(data augmentation)。
非線性激活函數:ReLU。
大數據訓練:120萬(百萬級)ImageNet圖像數據。
GPU 實現、LRN(local responce normalization)規範化層的使用。
要學習如此多的參數,而且防止過擬合,能夠採用兩種方法:數據加強和 Dropout。
數據加強:增長訓練數據是避免過擬合的好方法,而且能提高算法的準確率。當訓練數據有限的時候,能夠經過一些變換從已有的訓練數據集中生成一些新數據,來擴大訓練數據量。一般採用的變形方式如下幾種,具體效果如圖所示。
水平翻轉圖像(又稱反射變化,flip)。
從原始圖像(大小爲256×256)隨機地平移變換(crop)出一些圖像(如大小爲224×224)。
給圖像增長一些隨機的光照(又稱光照、彩色變換、顏色抖動)。
Dropout。AlexNet 作的是以0.5的機率將每一個隱層神經元的輸出設置爲0。以這種方式被抑制的神經元既不參與前向傳播,也不參與反向傳播。所以,每次輸入一個樣本,就至關於該神經網絡嘗試了一個新結構,可是全部這些結構之間共享權重。由於神經元不能依賴於其餘神經元而存在,因此這種技術下降了神經元複雜的互適應關係。所以,網絡須要被迫學習更爲健壯的特徵,這些特徵在結合其餘神經元的一些不一樣隨機子集時頗有用。若是沒有 Dropout,咱們的網絡會表現出大量的過擬合。Dropout 使收斂所需的迭代次數大體增長了一倍。
Alex 用非線性激活函數 relu 代替了 sigmoid,發現獲得的 SGD 的收斂速度會比 sigmoid/tanh 快不少。單個 GTX 580 GPU 只有3 GB 內存,所以在其上訓練的數據規模有限。從 AlexNet 結構圖能夠看出,它將網絡分佈在兩個 GPU 上,而且可以直接從另外一個 GPU 的內存中讀出和寫入,不須要經過主機內存,極大地增長了訓練的規模。
VGGNet
VGGNet 能夠當作是加深版本的 AlexNet,參見 Karen Simonyan 和 Andrew Zisserman 的論文《Very Deep Convolutional Networks for Large-Scale Visual Recognition》。
VGGNet 和下文中要提到的 GoogLeNet 是2014年 ImageNet 競賽的第二名和第一名,Top-5錯誤率分別爲7.32%和6.66%。VGGNet 也是5個卷積組、2層全鏈接圖像特徵、1層全鏈接分類特徵,能夠看做和 AlexNet 同樣總共8個部分。根據前5個卷積組,VGGNet 論文中給出了 A~E 這5種配置,如圖所示。卷積層數從8(A 配置)到16(E 配置)遞增。VGGNet 不一樣於 AlexNet 的地方是:VGGNet 使用的層更多,一般有16~19層,而 AlexNet 只有8層。
GoogLeNet
提到 GoogleNet,咱們首先要提及 NIN(Network in Network)的思想(詳見 Min Lin 和 Qiang Chen 和 Shuicheng Yan 的論文《Network In Network》),它對傳統的卷積方法作了兩點改進:將原來的線性卷積層(linear convolution layer)變爲多層感知卷積層(multilayer perceptron);將全鏈接層的改進爲全局平均池化。這使得卷積神經網絡向另外一個演化分支—加強卷積模塊的功能的方向演化,2014年誕生了 GoogLeNet(即 Inception V1)。谷歌公司提出的 GoogLeNet 是2014年 ILSVRC 挑戰賽的冠軍,它將 Top-5的錯誤率下降到了6.67%。GoogLeNet 的更多內容詳見 Christian Szegedy 和 Wei Liu 等人的論文《Going Deeper with Convolutions》。
GoogLeNet 的主要思想是圍繞「深度」和「寬度」去實現的。
深度。層數更深,論文中採用了22層。爲了不梯度消失問題,GoogLeNet 巧妙地在不一樣深度處增長了兩個損失函數來避免反向傳播時梯度消失的現象。
寬度。增長了多種大小的卷積核,如1×一、3×三、5×5,但並無將這些全都用在特徵映射上,都結合起來的特徵映射厚度將會很大。可是採用了圖6-11右側所示的降維的 Inception 模型,在3×三、5×5卷積前,和最大池化後都分別加上了1×1的卷積核,起到了下降特徵映射厚度的做用。
未完待續……