前言
過年時閑來無事,瞎翻自己的博客,偶然看到之前寫的一篇文章:
這篇文章原先發布於2018年中旬,那會正是深度學習、神經網絡無腦火熱的時候。火熱到什么程度?火熱到顯卡一度賣脫銷(不是因為挖礦),研究生導師集體推薦學生轉深度學習方向、畢業論文不帶“深度學習”四個字都畢不了業、大街上隨便拉個學生問都認識吳恩達。
就這個火的程度,我那會也毅然決然地踏入了深度學習的大軍,開始追星(吳恩達、李宏毅),開始上課(CS231n、CS229),開始學習框架(Pytorch、Tensorflow),開始水論文(逃~)。
不過轉眼兩年多過去2021年了,現在怎么樣了呢?2018年那會知乎熱搜已經是“算法崗神仙打架”,2019年是“諸神黃昏”,2020年是“灰飛煙滅”,2021不知道又是啥我也很好奇。不過顯而易見的是,大家對人工智能崗位已經抱有謹慎態度,尤其是CV崗。
其實這個現象的原因是,CV在現在處於門檻低,找工作人多,職業少的一個尷尬的位置,一邊是大量的學生涌入,一邊是不景氣的經濟環境和日益飽滿的就業崗位。自然而然導致相關崗位就業難度達到18層地獄級別。
不過這可不是代表深度學習的浪潮已經過了,只不過大家對深度學習沒有之前那么盲目罷了。
最花里胡哨的階段過去了,漫天吹牛的階段過去了,現在這個時代,深度學習已經成為了基礎設施,逐漸滲透進了各個我們平時所在的行業和領域。例如人臉識別已經基本成熟(現在車站基本都通過人臉識別去實現身份證和人臉的核驗)、語音識別OCR識別技術也都在應用。
這就是智能化,自動化的浪潮。難的不是CV內卷,難的是如何不錯過這個時代(文末有福利)。
一篇文章解決機器學習,深度學習入門疑惑
以下正文寫於2018年,2021年2月15號進行了修改。
話不多說,看則新聞,人工智能已經被國家所認可:
由此可見國家對人工智能的重視程序,趁早學習,讓我們也貢獻一份力量。
這篇文章要說的東西
研究生期間,和之前的幾個學長以及幾個學弟偶爾也聊聊天。大部分聊的話題無關乎這幾年大火的機器學習深度學習神經網絡,而這篇文章的目的,則是從學生的角度(不管是研究生還是即將步入研究生的本科生)來看待這個大方向和大趨勢,也是為了替那些剛入門或者准備入門機器學習、深度學習、計算機視覺、圖像處理、語音識別及處理等等等相關方向的童鞋,或者研一童鞋學習相關方向迷茫者了清一些基本的概念,以及解決這些“名詞”代表什么,應該怎么選擇,怎么入門的問題,畢竟誰當年也迷茫過,多一些傳承,就少走一些彎路。
涉及到的專業
多了去了,現在什么專業只要和算法沾點關系,差不多都可以搞機器學習深度學習神經網絡,舉幾個比較常見的專業:機器學習、深度學習、圖像處理、計算機視覺、大數據處理、信息檢索、智能系統、數據挖掘、並行計算、圖形圖像處理、大數據處理與可視化分析…
案頭的兩本書,經典的西瓜書和深度學習聖經。
涉及到的相關應用
機器學習和深度學習方面的應用太多,什么圖像分割,語言識別,超分辨率,圖像跟蹤,圖像生成等等等等,具體到每個小的領域都有相關方面的應用,在這里簡單隨便介紹兩個使用場景。
- 機器學習:比如淘寶推薦,有那么一兩天心血來找突然想買一個游戲機。你打開手機淘寶App后點擊搜索,輸入某款游戲機的名字(例如:switch),查看一些賣游戲機的店的信息。這個時候淘寶就已經在記錄你的信息了,不管你點開哪個店主的網店,淘寶都會收集你的偏好,淘寶會記錄你點開的每一個鏈接,每一個鏈接的內容都給你記錄下來。當你下一次登錄淘寶App的時候,淘寶就會根據在你這邊收集的信息和機器學習算法來分析你的愛好和特點進而給你推送一些比較適合你的,你可能喜歡的物品。
- 深度學習:再比如之前很火的換臉項目-DeepFake:
通過變分自編碼器提取一張圖片的特征信息,再根據另一張圖片的特征信息還原出來
上面每三個圖中,最左邊是川普的臉,而最右邊則是尼古拉的臉,通過自編碼器提取特征進行生成。通過這個甚至可以對視頻進行以假亂真,這是個深度學習的應用,對這個項目有興趣的可以看其相關文章。
正文
首先聲明,正文部分可能沒有你們想象的那么多,這篇文章並不妄想將所有的機器學習和深度學習的知識概括並整理出來,沒有什么意義。因為,一是機器學習涉及到的公式算法很多很多,寫那么多公式對初學者並不友好,本來是入門很簡單的一件事情沒有必要復雜化,二是這篇文章的定位不是機器學習也不是深度學習教材,當然也不是科普文,這篇文章是以大學生的角度來談一談這個話題,把我的一些經驗跟大家分享分享。
開始說正事,不論你之前干什么學什么,在什么專業什么領域,不用擔心。有一些編程基礎(C/C++),還有一些數學的基本知識(高數、線性代數、概率統計)就可以了,另外,機器學習主要使用的語言是python。python(派森),想必大家不管熟悉不熟悉總歸是聽說過,對,這個語言很火,很強大,很牛逼,無所不能,機器學習和python有着很緊密的聯系。很多的深度學習庫都是使用python語言進行編程的,所以學習這門語言也是有必要的。
機器學習
首先說明機器學習和深度學習的關系:深度學習是機器學習的子集,深度學習是機器學習中的一個領域,一小塊部分,想要了解深度學習,首先要了解機器學習。
通過上面這張圖可以看出人工智能、機器學習和深度學習的關系,人工智能的范圍很廣,當然不止包括機器學習,而深度學習只是機器學習的一個比較重要的子集。剛開始看很容易搞混,雖然理論上深度學習屬於機器學習的一部分,但機器學習和深度學習主要定位目標還是可以區分出來的,機器學習主要是對文本數據進行處理(表格中的數據),而深度學習則主要對圖像和語音這些方面進行處理。
關於機器學習的歷史,這里不多說,網上一抓一大把,自行查閱即可。也以看看機器學習西瓜書(就是上文圖片中擺出的)上面對機器學習歷史的介紹。
那到底什么是機器學習,本質上就是利用一些數學算法來解決實際問題。並且這些數學算法我們都學過一些。做過數學建模的同學們或多或少接觸過機器學習的知識,當你使用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,如果錯了讓這個小孩記住狗的特征,下次可能就不會認錯了。這種學習過程就是有監督,在學習過程中知道自個兒做出判斷是否正確,或者說有人監督你,告訴你哪些你的判斷錯了。
上面這張圖最右面是算法得出的結果,分數最高的一項就是算法判斷出最有可能的結果(上面顯然判斷錯了,本來是貓的圖,但是貓的得到為負,而狗的得分是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課程中的一張圖:
epoch即訓練次數,不同的學習率造成的結果是不一樣的,合適即可。
這樣,我們只訓練了一次使損失由1降為0.6,當我們訓練多次的時候loss會繼續下降,但需要注意,loss並不會“恰好”地降為0,這種情況很少見,我們以后在實驗中loss降到一定程度不會發生變化說明已經訓練結束了。
機器學習暫且說這么多。
深度學習
深度學習是機器學習的一部分,可以歸納為具有網絡層數更深的神經網絡。
神經網絡的講解內容網上很多,不再贅述,大家可以看下文的相關資料部分。
相關資料
機器學習和深度學習相關的資料很多,如果想全面列舉的話,100頁的篇幅都列舉不完,在這里我只向初學者推薦一些極具性價比的一些資料。另外,機器學習和深度學習理論上不分家,但是既然要學習有個先后過程是比較好的,我的建議是先對機器學習有全面的認識和實踐,然后再來進行深度學習,這樣基礎將會很扎實。
書籍
- 推薦程序員的數學系列,一共有三本(第一本稍微雞肋,后兩本干貨較多),分別是程序員的數學1,線性代數(程序員的數學2)以及概率統計(程序員的數學3),這三本可以有效補充我們所需要的線性代數和概率統計知識。
-
《周志華-機器學習-清華大學出版社》,可以作為案頭的參考書,類似於教材,如果一章一章看的話是比較枯燥的。建議有需求的時候看,書中有很多公式和基礎知識: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(半精度推理很好),不過買什么顯卡其實重要還是看顯存和計算特性(是否支持單精度半精度等),按需購買,可以參考一下我之前寫過的一篇文章,還是有參考意義的:
后記
本文發表於2021年新年之際,老潘還是祝大家新年快樂,牛年大吉~
老潘希望我們每個人都能及時找到自己的方向,只有方向正確的時候,努力才會有回報。
分享一波上述提到的部分資源,收集於網絡,回復相應code即可:
- 回復“010”獲取程序員數學系列
- 回復“011”獲取深度學習系列
交流
如果你與我志同道合於此,老潘很願意與你交流;如果你喜歡老潘的內容,歡迎關注和支持。博客每周更新一篇深度原創文,關注公眾號「oldpan博客」不錯過最新文章。老潘也會整理一些自己的私藏,希望能幫助到大家,公眾號回復"888"獲取老潘學習路線資料與文章匯總,還有更多等你挖掘。如果不想錯過老潘的最新推文,請點擊神秘鏈接。