深度学习的基础知识(机器学习、损失函数、梯度下降、反向传播、基础模型一网打尽)
1.預(yù)備信息
1.1了解技術(shù)的發(fā)展階段
技術(shù)一般存在幾個階段:1.發(fā)展期、2.高峰期、3.冰河期、4.應(yīng)用期
就是先達到一個高峰,但是在達到高峰之后就會被發(fā)現(xiàn)很多問題,然后熱度就會不斷地下降,到達一個冰河期,經(jīng)歷磨難,如果最終走出冰河期,才能順利的走入平穩(wěn)的應(yīng)用期。發(fā)展期變化會非常大,時常更新。這樣我們就不難理解為什么tensorflow和pytorch幾乎每個月都要更新,c語言這種卻是很久也不更新一次。同樣的,更新速度快,也同時決定了機器學(xué)習(xí)支持庫使用環(huán)境配置的必要性。
1.2機器學(xué)習(xí)初步
將人進行處理的過程,用算法來進行替代的情況下。在機器學(xué)習(xí)的過程中,我們大概率是使用監(jiān)督學(xué)習(xí)。傳統(tǒng)的算法又有哪些呢?
1.窮舉法
2.貪心法:梯度下降其實就是一個貪心的思想
3.分治法
4.動態(tài)規(guī)劃
機器學(xué)習(xí)中的算法,并不是我們?nèi)斯ぴO(shè)計出來的,而是從數(shù)據(jù)集當中挖出來算法。一般來時我們可以描述為,我們有一個數(shù)據(jù)集,之后我們提一個模型,之后再用模型來學(xué)習(xí),如果好我們就采用。
人工智能 -》機器學(xué)習(xí)-》表示學(xué)習(xí)(其實是原來數(shù)據(jù)的特征提取)-》深度學(xué)習(xí)。所以我們可以看到深度學(xué)習(xí)是其中一個非常小的分支,但是原來越熱門。但是現(xiàn)在也有不足,例如可解釋性比較差。但是依然不影響其流行性。
2.AI
這里的標號主要是體現(xiàn)各個內(nèi)容之間的相互關(guān)系
2.1 rule—base
這種程序其實是基于確定的一些過程,一些處理,最終得到一個結(jié)果。主要的缺陷就是可變性比較差。在逐漸改變這種狀態(tài)的情況下,我們發(fā)明了使用程序來完善這個過程。用程序來發(fā)現(xiàn)這個固定的函數(shù)的求解。
這個系統(tǒng)的最關(guān)鍵的就是這個規(guī)則如何來制定,但是對于一些復(fù)雜目標的程序,想要說明白這些規(guī)則的時候就變得逐漸困難。逐漸的超出了人類的可維護范圍。
2.2 機器學(xué)習(xí)
首先第一步就是將我們原來的輸入進行第一步的處理,例如我們這一部分將圖片變成一個個的向量來進行處理。這一步叫做提取Features的過程。之后我們就是將得到的向量和最后的輸出相聯(lián)系,使用機器學(xué)習(xí)的方式找到聯(lián)系。
2.2.1表示學(xué)習(xí)
表示學(xué)習(xí)其實在features的提取部分做了優(yōu)化,在features的提取的過程中也不在用人工了。也使用學(xué)習(xí)的方式來產(chǎn)生。
這個過程其實來自于到底選擇多少維度的數(shù)據(jù),我們可以簡單地將這個問題概括為:到底選擇維度的時候多大才合適呢?
維度的詛咒:如果你的輸入樣本的features的數(shù)量越多,那么我們需要的樣本數(shù)量也就更大了。其實我們可以這樣理解,在一個數(shù)軸上進行采樣,之后在二維象限中進行采樣。這時候,想要達到同樣的數(shù)據(jù)密度的時候就需要更多的點了。
這時候我們想另外一個問題,數(shù)據(jù)級是一個很貴的東西,尤其是打過標簽的數(shù)據(jù)集,是更貴的。又結(jié)合之前的維度詛咒的情況,所以我要努力降低feature的維度。這樣就可以降低樣本的需求。
所以,因此我們就產(chǎn)生了一個轉(zhuǎn)化feature的過程將10維的轉(zhuǎn)化為3維的,這樣就可以有效的降低樣本數(shù)據(jù)的數(shù)量需求了。可以節(jié)省項目經(jīng)費。但是這種轉(zhuǎn)化如果人工轉(zhuǎn)移顯然不太合理,所以就出現(xiàn)了使用機器來完成的思想。
其實就是在一個高維的空間形成了一個低維的流形。
流形:例如我們在一個三維坐標系,用一個平面來轉(zhuǎn)移,將{x,y,z}轉(zhuǎn)化為{u,v}
2.2.1.1深度學(xué)習(xí)
想要更好的理解深度學(xué)習(xí)的內(nèi)容,我們應(yīng)當理解深度學(xué)習(xí)和基礎(chǔ)的表示學(xué)習(xí)是有什么區(qū)別的地方開始理解,在基礎(chǔ)的表示學(xué)習(xí)的過程中,我們獲得features提取的訓(xùn)練過程和mapping from features學(xué)習(xí)器是相互分開的。是分開進行的兩個部分。但是在機器學(xué)習(xí)的過程中最開始輸入的是最最簡單的features之后直接將features提取和學(xué)習(xí)器合成一個整體進行。直接得到output。
因此,深度學(xué)習(xí)也被稱作端到端的學(xué)習(xí)。
SVM family是之前的基礎(chǔ)表示學(xué)習(xí)。現(xiàn)在一般是使用各種深度學(xué)習(xí)的神經(jīng)網(wǎng)絡(luò)。
3.神經(jīng)網(wǎng)絡(luò)
從上面的過程中我們可以看出神經(jīng)網(wǎng)絡(luò)是十分重要的。
SVM受到哪些限制
1.人想到的內(nèi)容有限。
2.svm不可以處理大數(shù)據(jù)。
3.無結(jié)構(gòu)的數(shù)據(jù)(沒有明確特征,eg:圖片、視頻、聲音等)處理能力不行。需要額外再來做一個提取器。
起源
最早來自于神經(jīng)的歷史。來自于寒武紀的物種大爆發(fā)。寒武紀之前大多生物都是浮游生物,在寒武紀前后生物進化出來了眼睛的結(jié)構(gòu),早起也是比較簡單,只是感知光的明暗,因此出現(xiàn)了有目標的運動,進而促進生物的大爆發(fā)。
1959年神經(jīng)科學(xué)實驗證明,給貓看各種圖片,判斷貓的神經(jīng)元的變化,但是并沒有得出顯著的反應(yīng)。最后,發(fā)現(xiàn)在切換的時候貓的神經(jīng)元有明顯的反應(yīng),最后發(fā)現(xiàn)哺乳動物的大腦是個分層,底層的只是處理簡單的信息,高層的則是繼續(xù)實現(xiàn)更復(fù)雜的功能。這個實驗是對神經(jīng)網(wǎng)絡(luò)有十分明顯的影響的。
用仿生學(xué)來做一個神經(jīng)元。被稱為一個感知機,之后感知機連接起來之后就形成了一個神經(jīng)網(wǎng)絡(luò)。
這里一個關(guān)鍵就是反向傳播(核心是計算圖),利用這個計算圖就可以求出來各種的偏導(dǎo)數(shù)了。最終的目標時,我們要求一個最終的結(jié)果對于最開始輸入的偏導(dǎo)數(shù)的問題。其實這里是要求我們求出:各個變量到損失函數(shù)的導(dǎo)數(shù),只要使用這種計算圖(復(fù)合求導(dǎo)函數(shù))就可以最終得到我們想要的結(jié)果。
神經(jīng)網(wǎng)絡(luò)這個領(lǐng)域每年都會提出特別的模型,我們不是要學(xué)習(xí)所有的模型,而是要學(xué)習(xí)其中的套路,以此來形成自己的模型。其實是使用一些基本塊來完成神經(jīng)網(wǎng)絡(luò)個構(gòu)造任務(wù)。
深度學(xué)習(xí)能夠進展如此之快因為:
1.算法的完善。
2.數(shù)據(jù)集的數(shù)據(jù)量增大。
3.算力的提升。
從頭到尾從框架搭建是不要求的,因為本身這些框架和硬件結(jié)合已經(jīng)十分有效了。現(xiàn)在比較主流的模型如下:
TF是最早使用的靜態(tài)圖現(xiàn)在也使用的是動態(tài)圖,Pytorch是一個動態(tài)圖,方便我們構(gòu)造非常靈活的模型。
4.1深度學(xué)習(xí)的主要步驟
主要步驟如下:
1.數(shù)據(jù)的收集
2.模型選擇(簡單模型或是神經(jīng)網(wǎng)絡(luò))
3.神經(jīng)網(wǎng)絡(luò)(有些模型可能不需要訓(xùn)練,例如knn模型):這里比較簡單一般是人工就可以完成了。
4.測試和推理:應(yīng)用到實際的數(shù)據(jù)當中。主要是表現(xiàn)為訓(xùn)練模型看不到最終的結(jié)果。
4.1測試部分的問題
4.1訓(xùn)練好了不能直接上線,必須進行測試來評估性能。測試集當中的結(jié)果我們其實是知道的,但是我們不能告訴數(shù)據(jù)集。
4.1.1拿到數(shù)據(jù)集之后一般是隨機分成兩個部分:1.一部分進行訓(xùn)練使用,2.另外一部分進行測試使用。如果我們不這樣分配,直接使用訓(xùn)練集進行測試,那么泛化能力不能得到成分的測試,因為訓(xùn)練集當中可能有一些我們本來沒有注意到的特性。
4.1.2同時訓(xùn)練集為了充分代表各種用戶的輸入,我們應(yīng)當從多個方面收集數(shù)據(jù)集
4.1.3過擬合的問題,我們可能將訓(xùn)練集中的噪聲也學(xué)習(xí)到了我們的模型當中,這是不好的。所以我們可以將訓(xùn)練集分成兩個部分,一個是訓(xùn)練集一個開發(fā)集,用訓(xùn)練集開發(fā),之后用開發(fā)集驗證模型中防止過擬合的設(shè)計是否達到了預(yù)期的效果。
4.2模型選擇的問題
到底什么樣子的模型對于這數(shù)據(jù)是合適的,就是要找的f(x)設(shè)置為什么模板是合理的。一般是先使用一個線性模型來做一個最基礎(chǔ)的架構(gòu)出來,發(fā)現(xiàn)模型不合適我們可以之后再更換模型。
模型最開始的模型的權(quán)重是不確定的,我們一般是先生成一個隨機數(shù),再依據(jù)差距l(xiāng)oss函數(shù),之后求這個loss函數(shù)(一般是用累加等方式讓loss函數(shù)可以反映全體數(shù)據(jù)的情況)對于當前參數(shù)的偏導(dǎo)數(shù),分析loss函數(shù)隨著權(quán)重變化的情況,來調(diào)整當前這個參數(shù),在這個參數(shù)的獲得過程中,其實還有一個問題就是怎么獲得這個參數(shù),其實只需要找到偏導(dǎo)數(shù)為0的時候我們就可以找到這個權(quán)重了(這里其實有一個貪心算法的思想)。以將平均損失降到最低為目標來不斷修正這個模型,讓模型來逐漸可以預(yù)測結(jié)果。
4.3繪圖的重要性
真實的訓(xùn)練模型當中,誤差可能是逐漸的減少減少,然后維持在一個相對穩(wěn)定的情況,于此同時,我們同時用開發(fā)集來進行測試,可能存在誤差是逐漸減少減少,然后穩(wěn)定一段時間之后就開始增加了。所以我們可能需要繪圖來找出這個最為合適的輪數(shù)。有時候我們需要visdom來實時繪制一個圖片來實時查看訓(xùn)練的情況。因為深度學(xué)習(xí)可能持續(xù)運行很久時間,這時候我們不可能持續(xù)的觀察,所以實例化、可視化比較重要。同時時間過長之后可能還會出現(xiàn)崩潰的情況,所以我們要經(jīng)常性的進行存盤。
繪制三維圖形要使用到np.meshgrid()這個函數(shù)
5.梯度下降算法
什么樣的數(shù)據(jù)集更好地適應(yīng)我們的權(quán)重
5.1嘗試
當然我們可以使用窮舉法,將所有的可能的值都舉出來,但是顯然這個不是能正常使用的,因為我們只有一個權(quán)重的時候,我們可以畫一個二維圖來看一下權(quán)重哪個是可以的。如果更高維度的將變得十分困難,另外來說維度多了時候運算的數(shù)據(jù)量將十分大,所以這種情況顯然不行。
當然我們還可以使用分治法,我們將所有的可能值分成一塊一塊的,隨機在每個區(qū)間找一個代表值,然后來判斷最優(yōu)值可能在哪個區(qū)間里面,經(jīng)過幾次分治法來找,我們就可以得到最終的結(jié)果了。但是我們想一下有兩種情況1.曲線不規(guī)則再加上隨機取點,最后我們可能會錯過我們該取的點;2.如果數(shù)據(jù)量很大的情況很難找到最優(yōu)解,運算的數(shù)據(jù)量十分龐大。
接著我們開始嘗試貪心算法來輔助求解,所以梯度下降算法就逐漸進入到了我們的視野當中。我們每次都向著當前最好的位置移動,在移動的過程中我們不斷地借助梯度尋找最優(yōu)的方向。
5.2梯度下降算法中的不利情況
5.2.1步長過大
如果每次我們都邁進一大步,那么就會存在這樣一個問題,我們計算的梯度是當前的數(shù)據(jù),如果離開這里過于遙遠的時候,這個梯度可能就不夠準確了,需要我們來進行重新計算。所以我們步長一定要短一點。
5.2.2局部最小值點
我們知道梯度下降算法是使用的貪心算法的方式,貪心算法一個重要的缺陷就是有可能找的不是最優(yōu)點而是找的一個局部的最優(yōu)點。這種情況在梯度下降算法當中是確實存在,如果曲線是波動的可能就會出現(xiàn)一個又一個局部的最優(yōu)點。這將是致命的。不過好在這種問題我們是可以解決的,我們可以在設(shè)計損失函數(shù)的過程中加以控制。
5.2.3鞍點
其實這種有問題的點還有一種,那就是鞍點,鞍點指的是偏導(dǎo)數(shù)為零的點,這時候?qū)霈F(xiàn)損失函數(shù)原地踏步的情況,這是我們主要需要解決考慮的問題。
6.反向傳播
在圖上建立一個梯度的傳播,方便進行梯度下降。我們注意是計算損失對權(quán)重的導(dǎo)數(shù)。如果是簡單的模型我們可以使用復(fù)合求導(dǎo)公式來進行求解,但是在復(fù)雜形勢下,我們就很難進行處理了。
如下圖我們就很難使用求導(dǎo)公式來順利完成損失函數(shù)對參數(shù)的偏導(dǎo)數(shù)了。首先,5個輸入轉(zhuǎn)化為6個中間值就需要一個6行5列的矩陣來完成,這就是三十個參數(shù)之后還會有更多的參數(shù),如果每個參數(shù)都算一下可能就沒法做了。
我們就必須換一種算法來做了。這時我們就有了反向傳播算法了
那么到底什么是反向傳播算法呢?
我們可以通過一個簡單的例子來理解這個過程。
首先是forward的過程這個過程計算一部分內(nèi)容。
之后是backward的過程,這個過程應(yīng)用前方回傳的內(nèi)容。算出計算結(jié)果。
從圖中我們是可以理解簡單的反向傳播的,其實是forward和backward。pytorch其實是將中間的梯度存在變量當中的那么再增加一層也是沒有問題的。
7.模型的簡單例子
MM是矩陣乘法的一個縮寫
b1(Bias)是一個偏置量
這就出現(xiàn)了全連接神經(jīng)網(wǎng)絡(luò)的第一層和第二層
矩陣求導(dǎo)的問題是一個關(guān)鍵的知識點
如下圖所示我們可以發(fā)現(xiàn)如果我們是不斷地進行線性的變換的話,那么不管有多少層,其實就相當于進行了一層。
所以我們要在每一次結(jié)束之后加入某些非線性變換,來打亂這些操作。例如讓每個成員都計算一個1/(1+ex)。這樣就不可以展開了,就不會讓多層退化為單層了。這里其實就是激活函數(shù)的一個應(yīng)用。
pytorch架構(gòu)實現(xiàn)上述的例子
(待補充)
總結(jié)
以上是生活随笔為你收集整理的深度学习的基础知识(机器学习、损失函数、梯度下降、反向传播、基础模型一网打尽)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。