1. 程式人生 > >思考:2021年還可以入門深度學習嗎?

思考:2021年還可以入門深度學習嗎?

# 前言 過年時閒來無事,瞎翻自己的部落格,偶然看到之前寫的一篇文章: - [一篇文章解決機器學習,深度學習入門疑惑](https://oldpan.me/archives/machine-deeplearning-introduction) 這篇文章原先發佈於2018年中旬,那會正是**深度學習、神經網路無腦火熱**的時候。火熱到什麼程度?火熱到顯示卡一度賣脫銷(不是因為挖礦),研究生導師集體推薦學生轉深度學習方向、畢業論文不帶“深度學習”四個字都畢不了業、大街上隨便拉個學生問都認識吳恩達。 就這個火的程度,我那會也毅然決然地踏入了深度學習的大軍,開始追星(吳恩達、李巨集毅),開始上課(CS231n、CS229),開始學習框架(Pytorch、Tensorflow),開始水論文(逃~)。 ![深度學習](https://img2020.cnblogs.com/other/2304365/202102/2304365-20210218232918990-1259550391.png) 不過轉眼兩年多過去2021年了,現在怎麼樣了呢?2018年那會知乎熱搜已經是“演算法崗神仙打架”,2019年是“諸神黃昏”,2020年是“灰飛煙滅”,2021不知道又是啥我也很好奇。不過顯而易見的是,大家對人工智慧崗位已經抱有謹慎態度,尤其是CV崗。 其實這個現象的原因是,CV在現在處於門檻低,找工作人多,職業少的一個尷尬的位置,一邊是大量的學生湧入,一邊是不景氣的經濟環境和日益飽滿的就業崗位。自然而然導致相關崗位就業難度達到18層地獄級別。 不過這可不是代表深度學習的浪潮已經過了,只不過大家對深度學習沒有之前那麼盲目罷了。 最花裡胡哨的階段過去了,漫天吹牛的階段過去了,現在這個時代,深度學習已經成為了基礎設施,逐漸滲透進了各個我們平時所在的行業和領域。例如人臉識別已經基本成熟(現在車站基本都通過人臉識別去實現身份證和人臉的核驗)、語音識別OCR識別技術也都在應用。 這就是智慧化,自動化的浪潮。難的不是CV內卷,難的是如何不錯過這個時代(文末有福利)。 # 一篇文章解決機器學習,深度學習入門疑惑 以下正文寫於2018年,2021年2月15號進行了修改。 --- 話不多說,看則新聞,人工智慧已經被國家所認可: ![人工智慧教材出版!](https://img2020.cnblogs.com/other/2304365/202102/2304365-20210218232919448-617992183.jpg) 由此可見國家對人工智慧的重視程式,趁早學習,讓我們也貢獻一份力量。 ## 這篇文章要說的東西 研究生期間,和之前的幾個學長以及幾個學弟偶爾也聊聊天。大部分聊的話題無關乎這幾年大火的機器學習深度學習神經網路,而這篇文章的目的,則是從學生的角度(不管是研究生還是即將步入研究生的本科生)來看待這個大方向和大趨勢,也是為了替那些剛入門或者準備入門機器學習、深度學習、計算機視覺、影象處理、語音識別及處理等等等相關方向的童鞋,或者研一童鞋學習相關方向迷茫者了清一些基本的概念,以及解決這些“名詞”代表什麼,應該怎麼選擇,怎麼入門的問題,畢竟誰當年也迷茫過,多一些傳承,就少走一些彎路。 ## 涉及到的專業 多了去了,現在什麼專業只要和演算法沾點關係,差不多都可以搞機器學習深度學習神經網路,舉幾個比較常見的專業:機器學習、深度學習、影象處理、計算機視覺、大資料處理、資訊檢索、智慧系統、資料探勘、平行計算、圖形影象處理、大資料處理與視覺化分析… > 案頭的兩本書,經典的西瓜書和深度學習聖經。 ![經典的西瓜書和深度學習聖經](https://img2020.cnblogs.com/other/2304365/202102/2304365-20210218232922093-43933634.jpg) ## 涉及到的相關應用 機器學習和深度學習方面的應用太多,什麼影象分割,語言識別,超解析度,影象跟蹤,影象生成等等等等,具體到每個小的領域都有相關方面的應用,在這裡簡單隨便介紹兩個使用場景。 - 機器學習:比如淘寶推薦,有那麼一兩天心血來找突然想買一個遊戲機。你開啟手機淘寶App後點擊搜尋,輸入某款遊戲機的名字(例如:switch),檢視一些賣遊戲機的店的資訊。這個時候淘寶就已經在記錄你的資訊了,不管你點開哪個店主的網店,淘寶都會收集你的偏好,淘寶會記錄你點開的每一個連結,每一個連結的內容都給你記錄下來。當你下一次登入淘寶App的時候,淘寶就會根據在你這邊收集的資訊和機器學習演算法來分析你的愛好和特點進而給你推送一些比較適合你的,你可能喜歡的物品。 - 深度學習:再比如之前很火的換臉專案-DeepFake: > 通過變分自編碼器提取一張圖片的特徵資訊,再根據另一張圖片的特徵資訊還原出來 ![深度換臉](https://img2020.cnblogs.com/other/2304365/202102/2304365-20210218232923689-433126615.png) 上面每三個圖中,最左邊是川普的臉,而最右邊則是尼古拉的臉,通過自編碼器提取特徵進行生成。通過這個甚至可以對視訊進行以假亂真,這是個深度學習的應用,對這個專案有興趣的可以看其相關文章。 # 正文 首先宣告,正文部分可能沒有你們想象的那麼多,這篇文章並不妄想將所有的機器學習和深度學習的知識概括並整理出來,沒有什麼意義。因為,一是機器學習涉及到的公式演算法很多很多,寫那麼多公式對初學者並不友好,本來是入門很簡單的一件事情沒有必要複雜化,二是這篇文章的定位不是機器學習也不是深度學習教材,當然也不是科普文,這篇文章是以大學生的角度來談一談這個話題,把我的一些經驗跟大家分享分享。 開始說正事,不論你之前幹什麼學什麼,在什麼專業什麼領域,不用擔心。有一些程式設計基礎(C/C++),還有一些數學的基本知識(高數、線性代數、概率統計)就可以了,另外,機器學習主要使用的語言是python。python(派森),想必大家不管熟悉不熟悉總歸是聽說過,對,這個語言很火,很強大,很牛逼,無所不能,機器學習和python有著很緊密的聯絡。很多的深度學習庫都是使用python語言進行程式設計的,所以學習這門語言也是有必要的。 ## 機器學習 首先說明機器學習和深度學習的關係:深度學習是機器學習的子集,深度學習是機器學習中的一個領域,一小塊部分,想要了解深度學習,首先要了解機器學習。 ![人工智慧、機器學習、深度學習關係圖](https://img2020.cnblogs.com/other/2304365/202102/2304365-20210218232924009-57693560.jpg) 通過上面這張圖可以看出人工智慧、機器學習和深度學習的關係,人工智慧的範圍很廣,當然不止包括機器學習,而深度學習只是機器學習的一個比較重要的子集。剛開始看很容易搞混,雖然理論上深度學習屬於機器學習的一部分,但機器學習和深度學習主要定位目標還是可以區分出來的,機器學習主要是對文字資料進行處理(表格中的資料),而深度學習則主要對影象和語音這些方面進行處理。 關於機器學習的歷史,這裡不多說,網上一抓一大把,自行查閱即可。也以看看機器學習西瓜書(就是上文圖片中擺出的)上面對機器學習歷史的介紹。 那到底什麼是機器學習,本質上就是利用一些數學演算法來解決實際問題。並且這些數學演算法我們都學過一些。做過數學建模的同學們或多或少接觸過機器學習的知識,當你使用matlab在對一個函式進行線性擬合的時候,你已經在用機器學習了。 機器學習的一般過程大致分為: - 獲取你需要的資料(獲取資料,整理資料,資料增強) - 對資料進行分析(資料預處理) - 使用相應的演算法,對資料進行處理(機器學習演算法) - 然後得出結果的過程。(輸出結果) 直白點,假如我們把演算法想象成一個簡單的函式(這個函式就是你設計的演算法): `y = x + 2`。`x`就是輸入也就是資料,`y`就是輸出也就是你要得到的結果,`x + 2`這個過程就是你演算法的過程。 簡單吧,再來個稍微複雜點的函式: `5 = w*x + 4。` 這個函式不是方程嗎?對,這是個方程,如果我們得到了x的值,相應地我們就可以求出w。但我們現在不以方程的角度去想他,讓我們以機器學習的角度去想它。 假設,上面那個函式我們現在不能一眼看出結果。上面的函式是我們設計的一個機器學習演算法,使這個演算法通過輸入我們給的資料x然後得到一個結果(假設我們要得到的結果是`5`),於是,上面這個機器學習演算法(函式)是我們自己設計的,我們想要通過輸入x來得到輸出5。 於是我們設計了: `5 = w*x + 4`。 然後怎麼辦呢,機器學習,就是機器進行學習的過程。在機器學習中,我們想要我們設計的這個演算法能夠逐漸學習如何去得到最終結果,這個過程就是通過訓練來得到的。 訓練肯定和實戰是不一樣的,一般在我們機器學習的過程中,我們資料集分為兩個部分,訓練集和測試集,相當於練習和實戰了。當然訓練這個過程是針對**有監督學習**的,什麼是有監督學習,簡單來說就是有label,有標記。比如給你一張圖,上面畫有一隻貓,這張圖對應的標記就是1,如果這張圖上面是一條狗,那麼這張圖對應的標記是2,我們讓機器學習去判斷一系列上面有貓和狗的圖片,在訓練過程中我們給予其正確的圖和相應標記。可以理解為給一個幾歲小孩讓它認圖,給他貓的圖他說1,給他狗的圖他說2,如果錯了讓這個小孩記住狗的特徵,下次可能就不會認錯了。這種學習過程就是有監督,在學習過程中知道自個兒做出判斷是否正確,或者說有人監督你,告訴你哪些你的判斷錯了。 ![取自cs231n](https://img2020.cnblogs.com/other/2304365/202102/2304365-20210218232924155-580938365.jpg) 上面這張圖最右面是演算法得出的結果,分數最高的一項就是演算法判斷出最有可能的結果(上面顯然判斷錯了,本來是貓的圖,但是貓的得到為負,而狗的得分是437,顯然此時的演算法錯把貓識別成狗了,需要繼續“操練”(訓練))。 而無監督學習,就不需要標記了,讓你憑自己的感覺去判斷是否正確,就像給你一堆三角形、圓形、或者長方形的卡片讓你將他們擺成三類。你憑藉對這些卡片的形狀進行區別,從而將這些卡片分為三類。 回到我們之前的問題:`5 = w*x + 4`。 首先我們不知道w是多少,這裡我們把w稱之為權重。我們假設這個w是1(這是權重的初始化,而初始化方法也有很多),然後我們要求的輸入x是2(這裡的輸入是固定的,是2也只能是2,2在這裡相當於資料,從生活中獲得到的資料,比如你往自動售水機投入1個硬幣會出來一瓶礦泉水,這裡的1就是輸入,你投入0.5個或者2個硬幣都不會得到礦泉水)。 這樣,x是2,w是1,這是我們第一次嘗試,我們執行一遍演算法,很快我們發現,`1*2 + 4 = 6`。6不等於5,結果當然錯了。 錯了就錯了嗎?為了達到正確的結果,我們要設計一個標準,在這裡我們設計一個Loss,以下簡稱為L,我們令L = y - 5,是我們演算法結果和正確結果(這裡的正確結果又可以稱之為Ground truth)的差。這個Loss就是損失,這個函式就是損失函式,損失函式表明了我們演算法得出的結果和實際的結果中有多大的差距,當L為0時,說明我們的演算法可以完美地得到我們想要的結果。 但顯然這裡的L是`6-5=1`,損失不為0,我們對損失L進行求對權重w的導數,通過鏈式法則來進行: `dL/dw = dL/dy * dy/dw` 很顯然可以得到 `dL/dw = 1*2(x帶入為2)`。 於是我們得到了損失對輸入的導數,在這裡我們再定義一個學習率:r(learning rate)我們設其為:0.1,於是接下來我們得到了關於x的梯度下降公式: `w = w - r * dL/dw` 帶入具體數字: `w = 1 - 0.1 * 2 = 0.8` 此時,權重w為0.8。 回到最開始的公式:`w*x + 4 = 0.8 * 2 + 4 = 5.6` 雖然5.6依然不等於5,但是相比於之前的結果6來說,稍微接近了,從L中就可以看出來,`L = y - 5 = 5.6 - 5 = 0.6`,經過一次“學習過程”損失變小了。 看到這裡很容易發現,這個學習率如果改成0.2那麼豈不損失下降的更快?當然,學習率是超引數(即根據經驗來設定的引數),是由我們自行設定的,太高太低都不好,合適即可。 借用cs231n課程中的一張圖: ![好的學習率](https://img2020.cnblogs.com/other/2304365/202102/2304365-20210218232924311-720410466.jpg) epoch即訓練次數,不同的學習率造成的結果是不一樣的,合適即可。 這樣,我們只訓練了一次使損失由1降為0.6,當我們訓練多次的時候loss會繼續下降,但需要注意,loss並不會“恰好”地降為0,這種情況很少見,我們以後在實驗中loss降到一定程度不會發生變化說明已經訓練結束了。 機器學習暫且說這麼多。 ## 深度學習 深度學習是機器學習的一部分,可以歸納為具有網路層數更深的神經網路。 神經網路的講解內容網上很多,不再贅述,大家可以看下文的相關資料部分。 ## 相關資料 機器學習和深度學習相關的資料很多,如果想全面列舉的話,100頁的篇幅都列舉不完,在這裡我只向初學者推薦一些極具價效比的一些資料。另外,機器學習和深度學習理論上不分家,但是既然要學習有個先後過程是比較好的,我的建議是先對機器學習有全面的認識和實踐,然後再來進行深度學習,這樣基礎將會很紮實。 ## 書籍 - 推薦程式設計師的數學系列,一共有三本(第一本稍微雞肋,後兩本乾貨較多),分別是程式設計師的數學1,線性代數(程式設計師的數學2)以及概率統計(程式設計師的數學3),這三本可以有效補充我們所需要的線性代數和概率統計知識。 ![程式設計師的數學](https://img2020.cnblogs.com/other/2304365/202102/2304365-20210218232924587-1722653056.jpg) - 《周志華-機器學習-清華大學出版社》,可以作為案頭的參考書,類似於教材,如果一章一章看的話是比較枯燥的。建議有需求的時候看,書中有很多公式和基礎知識:https://book.douban.com/subject/26708119/ - 《機器學習實戰》,從名字中就可以看出來,這本書主要是將利用python程式來編寫機器學習相關演算法的,講解公式比較少,更多的是實戰程式碼:https://book.douban.com/subject/24703171/ - 《深度學習-人名郵電出版社》,同樣作為案頭的參考書,書中的內容很詳實,前幾章介紹了深度學習需要的機器學習只是基礎,在之後開始講解深度學習的一系列知識以及公式,基本現在所用的大部分深度學習基礎演算法上面都有講,虛擬碼和公式並存:https://book.douban.com/subject/27087503/ - 李航教授的《統計學習方法》,這本書配合機器學習西瓜書看大概可以覆蓋99%的機器學習基礎知識,但同樣這本書只是講解一些原理和公式,最好還是結合實戰來進行練習。 ## 視訊資料 - 吳恩達系列:網上所說吳恩達的課程一般是這兩個:一個是Coursera上的machine-learning|Coursera,另一個則是斯坦福大學課程:s229:Maching Learning,這兩門課都是對機器學習相關的數學知識進行講解,前者比後者簡單一些,這門課程涉及到的公式較多而工程實踐講解很少,可能看起來比價枯燥但是對於打基礎還是很重要的。如果對英文不是很熟悉或者看視訊載入慢(視訊有時需要FQ),可以考慮看國內的搬運:吳恩達給你的人工智慧第一課、網易斯坦福機器學習吳恩達公開課。另外吳恩達最近打算新出一本結合工程實踐和數學講解的一本書,完全免費只需要訂閱即可獲取,有興趣的可以看這裡。 - 臺大李巨集毅機器學深度學習課程:http://speech.ee.ntu.edu.tw/~tlkagk/talk.html, 比較出名的中文機器學習課程,講課很用心,講解使用的例子也比較生動有趣,講課幽默詼諧,知識點和興趣並存,同樣推薦。 - cs231n:斯坦福大學的深度學習課程:http://cs231n.stanford.edu/, 可以說這是全網最好,乾貨最多的深度學習課程,從最基本的分類演算法進行講解,講解了神經網路所需要的所有基礎知識,也包含了深度學習中幾個經典的神經網路架構(VggNet、ResNet)、幾個比較出名的深度學習應用,並且對比多個深度學習框架,最重要的是,課後作業很值得做,有一定難度而且可以學到很多重點。總之這門課強烈推薦。 - 優達學城系列,優達學城的課以工程示例優秀著稱,每個課程最後包含的工程大都有趣而且適用,例如預測房價、小狗品種分類、生成電影劇本等。課程數量多但是每節很短,每小節都有問題需要回答,也有很多附帶知識供你學習,雖然有些知識講解可能不是很深,但是很適合入門。只是有一點…這些課不是免費的,簡單說一下,深度學習課程分兩個學期:第一學期3299元,第二學期3999。 ## 關於學習成本 這個是老生常談的問題,知乎上各路神仙說法紛紜,一千個讀者一千個哈姆雷特。我當初也遇到過這樣的問題,選擇了一段時間,在這裡總結一下。 以下是2018年的回答: 如果你的方向是機器學習部分(不涉及神經網路,或者神經網路的層數不是很高的時候)對計算機的要求不是很高,普通膝上型電腦即可。帶不帶顯示卡都無所謂。但是如果你主要方向是深度學習,需要處理影象或者視訊資訊,尤其當你設計的神經網路的層數比較多的時候(層數深即深度學習),顯示卡的作用就會體現出來,顯示卡跑深度學習程式碼是對於顯示卡的選擇建議(前面是型號,後面是視訊記憶體大小):入門GTX 1060 6g、價效比最高GTX 1070 8g,需要深入研究GTX 1080ti 11g,當然你可以選泰坦顯示卡(3w+)或者多顯示卡,總之財富限制想象力。如果電腦上已經有Nvidia的顯示卡也是可以的,但要看計算能力是否足夠(一般capacity大於4.0勉強入門)是否可以使用,在這裡檢視你的顯示卡的計算能力(compute capacity)夠不夠吧:https://developer.nvidia.com/cuda-gpus。 ps:因為挖礦等各種因素等顯示卡漲價較為厲害,該買還是得買,要將財富轉化為生產力。 附一個cpu、gpu測試深度學習運算速度分析:https://github.com/jcjohnson/cnn-benchmarks。 2021年的看法: 最新的30系列我沒有用過,暫時不發表評論。20系的顯示卡我只用過2080ti(半精度推理很好),不過買什麼顯示卡其實重要還是看視訊記憶體和計算特性(是否支援單精度半精度等),按需購買,可以參考一下我之前寫過的一篇文章,還是有參考意義的: - [給你一份配置清單:機器學習、深度學習電腦顯示卡配置指南](https://oldpan.me/archives/machine-deeplearning-station-list) # 後記 本文發表於2021年新年之際,老潘還是祝大家新年快樂,牛年大吉~ 老潘希望我們每個人都能及時找到自己的方向,只有方向正確的時候,努力才會有回報。 分享一波上述提到的部分資源,收集於網路,回覆相應code即可: - 回覆“010”獲取程式設計師數學系列 - 回覆“011”獲取深度學習系列 # 交流 如果你與我志同道合於此,老潘很願意與你交流;如果你喜歡老潘的內容,歡迎關注和支援。部落格每週更新一篇深度原創文,關注公眾號「**oldpan部落格**」不錯過最新文章。老潘也會整理一些自己的私藏,希望能幫助到大家,公眾號回覆"888"獲取老潘學習路線資料與文章彙總,還有更多等你挖掘。如果不想錯過老潘的最新推文,請點選[神祕連結](https://oldpan.me/archives/oldpan-treasure-upda