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