1. 程式人生 > >獨家連載 | 覃秉豐深度學習重磅新書首發搶讀!!!(1)

獨家連載 | 覃秉豐深度學習重磅新書首發搶讀!!!(1)

前言:在很早以前我就跟電子工業出版社簽約,要出版一本深度學習相關的入門書籍,書籍的內容會從深度學習基礎開始講解,面向0基礎讀者,儘量通俗易懂,講解清晰。書中程式碼是使用python,深度學習框架tensorflow。

本著認真負責的態度,這本書寫了很久(其實是懶)。

如今內容已經寫了一些,估計2019年年後新書會出版,所以打算先做一些書籍內容的連載。以後每週二會在我的各個平臺同步更新,覺得我的內容寫得不錯的話,歡迎點贊轉發收藏關注。

 

第01章-深度學習介紹

對於一些人類比較擅長的任務,比如影象識別,語音識別,自然語言處理等,計算機卻完成得很差。人類的視覺從眼睛採集資訊開始,但起到主要作用的是大腦。人類的每個腦半球中都有著非常複雜的視覺皮層,包含著上億個神經元以及幾百億條神經元之間的連線。人類的大腦就像是一臺超級計算機,可以輕鬆處理非常複雜的影象問題。神經元之間的電訊號可以快速傳遞,但是就像前面說到的,對於複雜的問題,計算速度只是一方面。人類的視覺能力是通過幾億年地不斷進化,不斷演變最終才得到的。人類視覺和聽覺的能力很強,因為從人類誕生,人類的視覺能力就一直在運用,不斷地在鍛鍊。更強的視覺和聽覺能力使得人類可以擁有更強的生存能力。

在人工智慧的早期階段,計算機的智慧通常是基於人工制定的“規則”,我們可以通過詳細的規則去定義下棋的套路,推理的方法,以及路徑規劃的方案。但是我們卻很難用規則去詳細描述圖片中的物體,比如我們要判斷一張圖片中是否存在貓。那我們首先要通過規則去定義一隻貓,如圖1.1所示。

圖1.1貓
圖1.1貓

 

觀察圖1.1中的貓,我們可以知道貓有一個圓腦袋,兩個三角形的耳朵,又胖又長的身體,和一條長尾巴,然後可以定義一套規則在圖片中尋找貓。這看起來好像是可行的,但是如果我們遇到的是圖1.2,圖1.3中的貓該怎麼辦?

圖1.2藏起來的貓
圖1.2藏起來的貓

 

 

圖1.3 姿勢奇怪的貓標題

 

有些貓可能只露出身體的一部分,有些貓可能會擺出奇怪的造型,那麼我們又要針對這些情況定義新的規則。從這個例子中大家應該能看得出來,即使是一隻很普通的家養寵物,都可能會出現無數種不同的外形。如果我們使用人工定義的規則去定義這個物體,那麼可能需要設定非常大量的規則,並且效果也不一定會很好。僅僅一個物體就這麼複雜,而現實中常見的各種物體成千上萬,所以在影象識別領域,使用使用人為定義的規則去做識別肯定是行不通的。很多其他的領域也同樣存在這種問題。

 

 

1.1機器學習

由於人們沒有辦法設計出足夠複雜的規則來精確描述世界,所以AI系統需要具備自我學習的能力,即從原始資料中獲取有用的知識。這種能力被稱為機器學習(Machine Learning)

機器學習其實與人類學習的過程類似。打個比方:假如我們現在都是原始人,並不知道太陽和月亮是什麼東西。但是我們可以觀察天上的太陽和月亮,並且把太陽出來時候的光線和溫度記錄下來,把月亮出來時候的光線和溫度記錄下來(這就相當於是收集資料)。觀察了100天之後,我們進行思考,總結這100天的規律我們可以發現,太陽和月亮是交替出現的(偶爾同時出現可以忽略)。出太陽的時候光線比較亮,溫度比較高。月亮出來的時候光線比較暗,溫度比較低(這相當於是分析資料,建立模型)。之後我們看到太陽準備落山,月亮準備出來的時候我們就知道溫度要降低可能要多穿衣服,光線也準備要變暗了(預測未來的情況)。機器學習也可以利用已有的資料進行學習,獲得一個訓練好的模型,然後可以利用此模型預測未來的情況。

圖1.4中表現了機器學習與人類思維的對比。我們可以使用歷史資料來訓練一個機器學習的模型,模型訓練好之後,再放入新的資料,模型就可以對新的資料進行預測分析。人類也善於從以往的經驗中總結規律,當遇到新的問題時,我們可以根據之前的經驗來預測未來的結果。

 

圖1.4機器學習與人類思維的對比

 

1.1.1 訓練資料,驗證資料和測試資料

通常我們在做機器學習分析的時候,會把資料分成兩大部分。一部分是訓練資料(Training Data),可以用來訓練,構建模型。另一部分是測試資料(Testing Data),可以用來驗證模型的好壞。這兩部分就有點像我們上學時課本中的習題。正文中的例題是訓練資料,有答案和詳細講解,是用來教我們學習新知識的,可以看作是用來對我們進行訓練。而課後習題是測試資料,我們要先做題,做完之後再對答案,是用來檢查我們學習效果的。

有時我們會把資料分成三部分,1.訓練集(Training Set);2.驗證集(Validation Set);3.測試集(Testing Set)。訓練集還是用來訓練,構建模型。驗證集是用來進一步確定模型的引數(或結構)的。等模型訓練好,並且結構和引數都調整好之後,再用測試集來評估模型的好壞。通常我們可以把所有資料的60%分配給訓練集,20%分配的驗證集,20%分配給測試集。或者80%分配給訓練集,10%分配給驗證集,10%分配給測試集。

K折交叉檢驗(K-fold cross-validation)—— K折交叉檢驗的大致思想是把資料集分成K份,每次取一份作為測試集,取餘下的K-1份作為訓練集。重複訓練K次,每次訓練都從K個部分中選一個不同的部分作為測試集(要保證K個部分的資料都分別做過測試),剩下的K-1份做訓練集。最後把得到的K個結果做平均。

 

1.1.2 學習方式

在機器學習或者人工智慧領域,不同的問題可能會有不同的學習方式。主要的學習方法有:監督學習(Supervised Learning)—— 監督學習也稱為有監督學習,通常可以用於分類(Classification)以及迴歸(Regression)的問題。它的主要特點是,所有的資料都有與之相對應的標籤(Label)。比如我們想做一個識別手寫數字的模型,那麼我們的資料集就是大量手寫數字的圖片,並且每一張圖片都有對應的標籤,如圖1.5:

 

標題圖1.5

 

圖片是一個手寫數字3,所以這張圖片的標籤可以設定為3。同樣的,如果是一張手寫數字8的圖片,那麼該圖片的標籤就可以是8。或者我們要建立一個判別垃圾郵件的模型,那我們先要對郵件進行標記,標記出哪些屬於垃圾郵件,哪些不屬於垃圾郵件,然後建立模型。

監督學習在建模過程中,會將預測結果與訓練資料的實際結果(也就是標籤)做對比,如果預測結果跟實際結果不符合,將通過一些方式去調整模型的引數,直到模型的預測結果能達到比較高的準確率。

非監督學習(Unsupervised Learning)—— 非監督學習也稱為無監督學習,通常可以用於聚類(Clustering)的問題。非監督學習中,所有的資料都是沒有標籤的。可以使用機器學習的方法讓資料自動聚類。例如許多公司都擁有龐大的客戶資訊資料庫,使用非監督學習的方法就可以自動對客戶進行市場分割,將客戶分到不同的細分市場中,從而有助於我們對不同細分市場的客戶進行更有效的銷售或者廣告推送。或許我們事先並不知道有哪些細分市場,也不知道哪些客戶屬於細分市場一,哪些客戶屬於細分市場二。不過沒關係,我們可以讓非監督學習演算法在資料中挖掘這一切資訊。

半監督學習(Semi-supervised Learning)—— 半監督學習是監督學習和非監督學習相結合的一種學習方式,通常可以用於分類以及迴歸問題。。主要是用來解決使用少量帶標籤的資料和大量沒有標籤的資料進行訓練和分類的問題。此類演算法首先試圖對沒有標籤的資料進行建模,然後再對帶有標籤的資料進行預測。

強化學習(Reinforcement Learning)—— 強化學習靈感來源於心理學中的行為主義理論,即有機體如何在環境給予的獎勵或懲罰的刺激下,逐步形成對刺激的預期,產生能夠獲得最大利益的習慣性行為。強化學習沒有任何的標籤來告訴演算法應該怎麼做,它會先去嘗試做一些動作,然後得到一個結果,通過判斷這個結果是對還是錯來對之前的動作進行反饋。特別值得一提的是,AlphaGo用到的學習方式就是強化學習。

 

 

1.1.3 機器學習常用演算法

機器學習的演算法有很多,下面給大家簡單介紹一些機器學習中常用的演算法。

決策樹(Decision Tree)—— 決策樹是一種簡單但又使用廣泛的監督學習分類演算法。它是一種分而治之的決策過程,把一個複雜的預測問題,通過樹的分支節點,劃分成兩個或多個較為簡單的子集,從結構上劃分為不同的子問題。當分支節點滿足一定停止規則時,該分支節點就會停止分叉,得到分類結果。一顆簡單的決策樹如圖1.6:

圖1.6 決策樹(Decision Tree)

 

線性迴歸(Linear Regreesion)—— 線性迴歸是一種監督學習的演算法。線上性迴歸中,資料使用線性預測函式來建模,模型建立好之後可以用來預測未知的值。也就是可以根據現在,預測未來。舉個例子,假入我們有一組房屋面積跟房屋價格的資料,我們可以利用這些資料來建立迴歸模型,如圖1.7所示:

標題圖1.7線性迴歸(Linear Regreesion)

 

模型建立好之後,我們可以得到一條最符合房屋面積跟房屋價格關係的直線。根據這個模型,我們可以把一個新的房屋面積輸入,就能得到該房屋的價格預測值。

KNN(Linear Regreesion)—— KNN演算法又稱為k近鄰分類(k-nearest neighbor classification)演算法\cite{Hastie1994},是一種監督學習演算法。最簡單的最近鄰演算法就是遍歷所有已知標籤的樣本集中的資料,計算它們和需要分類的樣本之間的距離(這裡的距離一般指的是歐氏距離(Clustering)\cite{Deza2009}),同時記錄目前的最近點。KNN查詢的是已知標籤的樣本集中跟需要分類的樣本最鄰近的K個樣本,需要分類的樣本最終的標籤是由這K個樣本的標籤決定的,採用的方式是“多數表決”,也就是在這K個樣本中哪種標籤最多,那麼需要分類的樣本就歸為哪一類。

下圖中,方形表示分類1,圓形表示分類2,圖中正中心的五角星表示需要分類的樣本。

當K等於1時,其實就是計算距離五角星最近的樣本屬於哪一個分類。圖1-8中我們可以看到距離五角星最近的是方形,屬於分類1。

所以我們可以把五角星歸為分類1。

圖1.8 KNN分類,K等於1

 

 

當我們取K=5時,其實就是找出距離五角星最近的5個樣本,然後統計這5個樣本哪種分類比較多。圖1-9中我們可以看到,有1個方形和4個圓形,那麼圓形比較多,所以我們可以把五角星歸為分類2。

圖1.9 KNN分類,K等於5

 

這裡我們可以看到,五角星最終的分類跟K的取值有很大關係。K值取多少,模型的效果才比較好呢?這可能需要對模型進一步除錯,才能得到答案,比如我們可以不斷改變K值,然後用測試集來做測試,最終選取一個可以使得測試誤差比較小的K值。

K-Means —— K-Means是一種無監督學習演算法,通常可以用於聚類分析。所謂聚類問題,就是給定一個元素集合A,集合中的每個元素有n個可觀測的屬性。我們需要使用某種方法把A劃分為k個子集,並且要使得每個子集內部元素之間的差異儘可能小,不同子集之間元素的差異儘可能大。K-Means演算法的計算過程比較直觀也比較簡單:

1.先從沒有標籤的元素集合A中隨機取k個元素,作為k個子集各自的重心。

2.分別計算剩下的元素到k個子集重心的距離(這裡的距離也可以使用歐氏距離),根據距離將這些元素分別劃歸到最近的子集。

3.根據聚類結果,重新計算重心(重心的計算方法是計運算元集中所有元素各個維度的算數平均數)。

4.將集合A中全部元素按照新的重心然後再重新聚類。

5.重複第4步,直到聚類結果不再發生變化。

K-Means執行過程如圖1.10,圖1.11,圖1.12所示:

圖1.10 K-Means演算法,第1次迭代 

 

圖1.11  K-Means演算法,第5次迭代

 

 

圖1.12 K-Means演算法,第9次迭代

 

 

聚類模型一共迭代了9次,最終收斂。從圖中我們可以看得出來第1次迭代的時候,模型的聚類效果是很差的,一看就不太合理。迭代了5次之後,模型有了一些改善,聚類的效果已經不錯了,不過看得出來還有一些提高的空間。迭代9次之後,模型就訓練好了,很好地把沒有標籤的資料分成了4類。相同類別之間的差距比較小,不同類別之間的差距比較大。

神經網路(Neural Network)—— 神經網路是一種模擬人類大腦神經網路結構構建出來的演算法。神經網路的結構可以有多層,多層的神經網路可以由輸入層(Input Layer)隱藏層(Hidden Layers)以及輸出層(Output Layer)組成。其中隱藏層可能有0到多個,所以最簡單的神經網路就只有輸入層和輸出層。神經網路的每一層都由若干個神經元(Neuron)節點組成。

訊號從輸出層傳入網路,與神經元的權值(Weights)作用後再經過啟用函式(Activation Function)傳入下一層。每一層訊號的輸出都是下一層的輸入,直到把訊號傳到輸出層得出結果。網路結構如圖1.13所示:

圖1.13神經網路(Neural Network)

 

神經網路是深度學習的重要基礎,在後面的章節中我們會從頭開始詳細學習神經網路的搭建以及應用,這裡只是先做一個簡單介紹。

除了上面介紹的這些演算法以外,機器學習領域還有很多其他的演算法,如樸素貝葉斯(Naive Bayes)支援向量機SVM(Support Vector Machine)Adaboost等等。

 

 

1.2人工智慧,機器學習,神經網路以及深度學習之間的關係

新聞媒體在報道AlphaGo的時候,可能人工智慧,機器學習,神經網路和深度學習這幾個詞都有用到過。對於初學者來說,難免容易混淆。

人工智慧—— 我們先說說人工智慧,人工智慧是這幾個詞中最早出現的。1956年,在美國達特茅斯會議(Dartmouth Conference)上被提出。人工智慧其實是一種抽象的概念,並不是指任何實際的演算法。人工智慧可以對人的意識、思維進行模擬,但又不是人的智慧。有時候我們還會把人工智慧分為弱人工智慧強人工智慧

弱人工智慧是擅長於單個方面技能的人工智慧。比如AlphaGo能戰勝了眾多世界圍棋冠軍的,在圍棋領域所向披靡,但它只會下圍棋,做不了其他事情。我們目前的人工智慧相關的技術,比如影象識別,語言識別,自然語言處理等等,基本都是處於弱人工智慧階段。

強人工智慧指的是在各方面都能和人類智慧差不多的人工智慧,人類能幹的腦力勞動它都能幹。創造強人工智慧比創造弱人工智慧難度要大很多,我們現階段還做不到,只有在一些科幻電影中才能看到。著名的教育心理學教授Linda Gottfredson 把智慧定義為“一種寬泛的心理能力,能夠進行思考、計劃、解決問題、抽象思維、理解複雜理念、快速學習和從經驗中學習等操作。”強人工智慧在進行這些操作時應該跟人類一樣得心應手。

機器學習 —— 機器學習是最近20多年興起的一門多領域交叉學科,涉及概率論、統計學、逼近學、凸分析、計算複雜性理論等多門學科。關於機器學習,上一章節我們已經做了一些討論說明,我們可以發現機器學習包含很多具體的演算法。既然人工智慧是飄在天上的概念,那我們就需要一些具體的演算法使得人工智慧可以落地應用,而一般來說,這些具體的演算法可以統稱為機器學習演算法。

神經網路—— 神經網路是眾多機器學習演算法中的其中一個,是模仿人類大腦神經結構構建出來的一種演算法,構建出來的網路稱為人工神經網路(Artificial Neural Networks,ANN)。神經網路演算法在機器學習中並不算特別出色,所以一開始的時候並沒有引起人們的特別關注。神經網路的發展已經經歷了三次發展浪潮:20世紀40年代到60年代神經網路的雛形出現在控制論(Cybernetics)中,20世紀80年代到90年代表現為聯結主義(Connectionism)。直到2006年神經網路重新命名為深度學習,再次興起。

深度學習—— 深度學習的基礎其實就是神經網路,之所以後來換了一種叫法,主要是由於之前的神經網路演算法中網路的層數不能太深,也就是不能有太多層網路,網路層數過多會使得網路無法訓練。隨著神經網路理論的發展,科學家研究出了多種方式使得訓練深層的網路也成為可能,深度學習由此誕生。如卷積神經網路(Convolutional Neural Network, CNN)長短時記憶網路(Long Short Term Memory Network, LSTM)深度殘差網路(Deep Residual Network)等都屬於深度學習,其中深度殘差網路的深度可以到達1000層,甚至10000層或更多。深層的網路有助於挖掘資料中深層的特徵,可以使得網路擁有更強大的效能。

圖1.14描繪了人工智慧,機器學習,神經網路,深度學習之間的關係。

 

寫在最後的話:如果你也是個深度學習愛好者,或者有任何的疑問,可以加我的個人微訊號:sdxxqbf