行家 | 如何跨領域成為一位人工智慧工程師?

AI科技大本營發表於2019-03-03

希望和大家理解 AI 的一些程式設計思路和模型,幫助梳理自我成長路線。

作者/分享人 | 李嘉璇

《TensorFlow技術解析與實戰》作者,InfoQ、51CTO、Oreilly Strata 等大會講師,活躍於國內各大技術社群,知乎程式設計問題回答者。擅長研究深度學習框架的架構、原始碼分析及在不同領域的應用。有處理影像、社交文字資料情感分析、資料探勘等深度學習實戰經驗,參與過基於深度學習的自動駕駛二維感知系統 Hackathon 競賽, 曾任職百度研發工程師。現在研究 NLP、ChatBot,以及 TensorFlow 的效能優化及 FPGA 編譯。

文章來源Gitchat,AI科技大本營合作釋出

本場 Chat 內容主要包括:

  1. 人工智慧的整體知識體系梳理。

  2. 人工智慧/深度學習工程師的職業前景如何?

  3. 非相關專業有可能自學入門麼?自學的方法和進階體系如何構建?

  4. 在 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×1、3×3、5×5,但並沒有將這些全都用在特徵對映上,都結合起來的特徵對映厚度將會很大。但是採用了圖6-11右側所示的降維的 Inception 模型,在3×3、5×5卷積前,和最大池化後都分別加上了1×1的卷積核,起到了降低特徵對映厚度的作用。

未完待續……

相關文章