深度 學習

兔兔求放过鸭發表於2024-03-21

深度學習入門...小魚書

資料是學習的核心

概念梳理:

1.感知機:

感知機是二分類的線性分類模型,感知機的目的是求出將輸入資料劃分為兩類的分離超平面。

他需要合適的,符合預期的權重才能夠正常工作。

感知機是構成神經網路的最小構成單位。可以理解為神經元的仿生結構。

2.神經網路:

歷史:

1958年,計算科學家Rosenblatt提出了由兩層神經元組成的神經網路。他給它起了一個名字--“感知器”(Perceptron)(有的文獻翻譯成“感知機”,下文統一用“感知器”來指代)。

  感知器是當時首個可以學習的人工神經網路。Rosenblatt現場演示了其學習識別簡單影像的過程,在當時的社會引起了轟動。

  人們認為已經發現了智慧的奧秘,許多學者和科研機構紛紛投入到神經網路的研究中。美國軍方大力資助了神經網路的研究,並認為神經網路比“原子彈工程”更重要。這段時間直到1969年才結束,這個時期可以看作神經網路的第一次高潮。

模擬人類神經元的工作機理。由輸入,輸出和計算功能組成,分別照應了人類神經元中樹突,軸突,細胞核的功能。輸入接受訊號由計算做出反應並將反應訊號輸出。--摘抄

在形式上,神經網路是節點與連線構成的網路,每個連線上存在一個“權重”,將輸入的訊號計算加權後輸出給下一個神經元便完成了一次神經傳遞。

神經網路可分為單層神經網路(即為感知機),和多層神經網路,層數=輸入層+隱藏層+輸出層-1在意義上感知機層數與實際與權重有關,也有些人會層數=輸入層+隱藏層+輸出層與層的數目有關,本書使用的是前者。感知機沒有隱藏層,只有單次權重。

3.權重

權重是神經網路中最重要的東西。權重的合適程度直接決定了神經網路是否是優良的。訓練一個神經網路就是使其權重達到最佳的過程。

在權重作用的過程時,即節點與節點間傳輸訊號的過程中偏值也起了一定的作用,偏值會改變神經元被啟動的難易程度。

神經元能否被啟動取決於傳入的訊號是否達到峰值,偏值影響峰值大小。

4.計算

計算在神經元中進行,神經元具備儲存和計算的功能。將輸入(x)與輸出(y)掛鉤的函式(f(x))我們稱之為啟用函式,啟用函式代表的神經元中樞細胞體對輸入的資料進行反應的過程。

正常神經的反應過程是:輸入的訊號傳至細胞體,細胞體對訊號進行判斷後輸出新的訊號並輸出。

5.啟用函式

啟用函式旨在幫助神經網路學習資料中的複雜模式。在神經元中,輸入的input經過一系列加權求和後作用 的另一個函式

----摘抄[深度學習筆記:如何理解啟用函式?(附常用啟用函式) - 知乎 (zhihu.com)]

啟用函式可以適用在複雜環境中,人類神經元的傳遞過程是複雜的,倘若只用權重來改變輸入和輸出,那麼無論電腦神經網路在形式上(隱藏層數目多少)有多麼複雜,其最後的結果仍會是線性相加的結果,其複雜度難以達到人類神經網路的複雜程度。

插入片段:文字內容記錄:

迴歸問題和分類問題。

不管是分類,還是迴歸,其本質是一樣的,都是對輸入做出預測,並且都是監督學習。說白了,就是根據特徵,分析輸入的內容,判斷它的類別(分類),或者預測其值(迴歸)。

兩者的含義近似對立,分類問題即將事物歸類,就像把人按照性別分為男女,按照身高規定大於1.7米為高否則為低,其結果是離散的。而回歸問題則是根據已有資料進行預測

兩者都可以用來判斷:對於身高,分類問題的判斷會根據標準給出這個人是否可以被分到高的一組,其輸出的結果只能為是或否。而回歸問題則是根據視覺感受判斷這個人的身高,其輸出的結果可以是連續的一串數字。

兩者都可以用於預測:在天氣預報中,預測天氣,只能在晴,雨,陰,雪中選擇,此為分類問題。而在預測氣溫時,通常給出的是一個區間,此為迴歸問題。

結果的離散和連續為結果特徵的差別,其本質區別在於損失函式的形式不同

6.損失函式:

當大學生在宿舍中攀比誰的電腦效能更好時,如果我們只是說電腦的價格,電腦的硬體,不太清晰的人是無法聽懂的,也不明白其中的價值,但如果使用類似某大師的跑分程式,我們可以獲得直觀的電腦評分,透過電腦的評分我們能夠輕鬆選看出誰的電腦的效能更高。

損失函式在這裡就起到了一個跑分的作用,不過損失函式的結果表明的是神經網路的惡劣程度,即損失函式的結果越大,神經網路的準確性越差。

損失函式表明的是神經網路返回預測值與真實值的差異程度。預測值與真實值之間的差異值被稱為損失值

損失函式的工作原理:損失函式利用於訓練神經網路的過程中。測試資料()被送入神經網路並且返回預測值,損失函式利用預測值和真實值求出損失值,之後神經網路根據損失函式的結果反向傳播更新各個引數,使得後來的損失值減小,使得神經網路向真實靠攏,達到學習的效果。

將神經網路的準確率具象化為損失函式的結果,透過損失函式計算神經網路調整前後的結果來判定對神經網路的調整是否是進步的。同時,將神經網路進步這個抽象問題轉化為損失函式縮小這個具體的數學問題,同時函式的性質也為如何提高神經網路的準確率提供了依據。

作為函式,損失函式可以透過求某一點的導數(具體來說是梯度)來了解該點的走勢,然後以這個導數為指引,逐漸更新引數。

7.one-hot表示
y =  [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
t = [0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]
# t是用one-hot表示的真實值,y是用softmax函式生成的預測值(機率值)。
# one-hot表示中只有正確選項標記為1錯誤選項標記為0
# 在10個數中,只有“2”數字是正確的(從0開始數)其機率是0.6也就是說該神經網路在
# <此次>測試中有0.6機率正確。
8.梯度法:

為了瞭解梯度,我們先了解導數以及導數在程式中的實現。

導數表明可以表明函式圖形中某個點的變化趨勢,包括變化方向(增大還是減小),導數大於0,則此處的函式值隨著自變數的增大有增大的趨勢;變化速率,導數的絕對值越大,則表明該點函式值的變化快。

如果要在程式中利用導數,瞭解導數的圖形含義是必要的,因為程式中求導的方法就是利用的圖形意義。

導數的圖形意義:導數的值等於函式影像中以該點為切點的切線的斜率。

如果是直線,該點的切線斜率也就是直線斜率,曲線的斜率我們會利用微分的方法求得

      		f(x+Δx) - f(x)
k =  lim	---------------# 將x+Δx 和x兩個函式點連線,當Δx趨向於0時,該
	Δx->0	       Δx		 連線近似趨向於點x處的切線。
	
	
上式為導數的圖形理解
但是在深度學習中,我們一般使用下式


      		f(x+Δx) - f(x-Δx)
k =  lim	---------------
	Δx->0	       2*Δx		 
	

OIP-C

導數的程式實現:
def numerical_diff(f, x):
	h = 0.0001
	return (f(x+h) - f(x-h)) / 2h
	
在上面的解讀中,我們提出要求h無限趨近於0,但是因為在程式中存在舍入誤差的緣故(是指因省略小數的精細部分的數值(比如,小數點第8位以後的數值)而造成最終的計算結果上的誤差)
即 h = 1e-50
   print(h)
   >>>0.0
   因為h數字極小導致最後結果變為0.0使得導數的結果與正確值相差甚遠。
   同時,因為h並不能像理想的那羊無限接近於0,所以如果最後➗h的結果的誤差也會變大,為了縮小誤差,取x前後各一個h的距離的兩個點所連成的直線的斜率近似表示為x處的切線的斜率。這種演算法也成為中心差分。
9.批mini-batch(小批次處理):

批是一種處理資料的方式,用透過樣本近似代替整體的方法縮小計算量。

批大小的選擇必須合適,過小的資料量難題代表整體,過大的資料量又無法顯著達到減小計算量的目的。

減小計算量的益處:

1.當有1000個測試資料時,如果直接把1000個資料投入神經網路中計算,可能會對計算機的配置提出更高的需求,其次即便配置過關,其執行速度也不一定能達到理想狀態。但如果將1000個資料分成10組,每次只投入100個資料,其對電腦的配置要求更低,同時,透過矩陣的並行性來縮短計算的時間,也可以使用多執行緒的方法來縮短計算時間(同時進行多個批次的處理,佔用不同的程序,所以時間線上不衝突)。(當然,如果你只有10個小資料,那麼再分成10個1份明顯有些畫蛇添足,所以要考慮每批的大小,和資料總量的大小問題)

2.如果資料的量級過大,比如上百萬,上千萬甚至是上億的程度,我們也可以用分批的方法,隨機選擇一部分資料作為樣本資料,用這部分樣本資料作為測試資料進行操作。即將測試資料分批,但是隻選取其中幾批進行操作。

10.引數

引數包括:

​ 模型引數:

​ 從資料中學習和估計得到。

​ 超引數:

​ 人為設定的引數

超引數的設定很大程度上會影響神經網路學習的結果。

常用啟用函式:

恆等函式:將輸入的值原封不動的輸出

階躍函式:

# 類比人類神經元,可以理解為只有當傳入神經元的訊號強度高於闕值才會使細胞體做出相應的反應。

而在階躍函式中,階躍代表這裡輸出的結果是具有跳躍性的,於分類問題性質類似。

--f(x) = 0   x <= 0

--f(x) = 1   x > 0

Sigmoid(Logistic)函式:

# f(x) = 1/1+exp(-x)
# exp(-x)表達的是e的-x次(e**-x)
# 不難看出這個啟用函式的返回值介於(0:1)之間

缺點:將輸出的結果定於0到1之間,實現了神經元輸出結果的歸一化。

這個梯度平滑,且函式可微分,前者能夠避免了輸出值的大幅度變化並利於後續神經網路的學習,後者是梯度下降法的基礎。

不足:

其函式圖形呈現”s“形,兩端趨向於水平,即兩端的導數結果極小,此處在神經網路學習過程中,權重可能出現不更新的結果,同時與之相連的神經元的更新速度也會被減慢。

計算成本高,因為此處使用了exp。

不以0為中心。

20191015192015699

Tanh(雙曲正切函式):

f(x) = 2/(1+exp(-2*x)) - 1

Tanh(x) = 2*Sigmoid(2x) -1

這個函式與sigmoid函式的一些區別

首先,該函式的輸出結果介於(-1,1)之間,並以0為中心。

但依然保留了Sigmoid函式兩端的導數偏向0的問題(梯度消失問題)

Softmax函式:

>>> a = np.array([0.3, 2.9, 4.0])
>>>
>>> exp_a = np.exp(a) # 指數函式
>>> print(exp_a)
[  1.34985881  18.17414537  54.59815003]
>>>
>>> sum_exp_a = np.sum(exp_a) # 指數函式的和
>>> print(sum_exp_a)
>>> 74.1221542102
>>> y = exp_a / sum_exp_a
>>> print(y)
"""
		e**ak
yk =  --------   分母代表所有輸入資料經此括號內運算後求和
		sum(e**ai)  
		
將上一層的原始資料進行處理,返回一個介於0.1之間的數字,通常用來標識機率問題。

softmax處理資料的意義:
softmax將資料的原始輸出轉化為機率分佈只能作為softmax的特徵,而不能作為softmax的意義,意義應該表明其益處,也就是說,softmax的意義應該包括但不僅限於轉化為機率分佈所帶來的便利性。防止有人將只看到softmax的機率歸一化處理而忽略其他優點。

包括後續對交叉熵損失函式使用的遍歷以及求導的裨益,視覺上的直觀性。



"""

RELU函式:

-----f(x) = 0   x <= 0
-----f(x) = x   x  > 0

# 當 x 大於0時x不變,小於等於0變為0

優點:

一定程度上避免了Tanh和Sigmoid函式中梯度消失的問題。

計算速度更快。

被認為具有生物學合理性(Biological Plausibility),比如單側抑制、寬興奮邊界(即興奮程度可以非常高)

不足:

當輸入為負數時失效

不已0為中心

【Dead ReLU問題】ReLU神經元在訓練時比較容易“死亡”。在訓練時,如果引數在一次不恰當的更新後,第一個隱藏層中的某個ReLU 神經元在所有的訓練資料上都不能被啟用,那麼這個神經元自身引數的梯度永遠都會是0,在以後的訓練過程中永遠不能被啟用。這種現象稱為死亡ReLU問題,並且也有可能會發生在其他隱藏層。

恆等函式:

f(x) = x
即為恆等。

細節:

softmax與sigmoid函式類似,其返回的結果都是介於0~1之間。其中softmax函式各項結果之和為1,因為這個特性,softmax又被稱之為機率函式。在"softmax"這個單詞中,“soft”意思是軟的,“max”代表最大值。

softmax適合用於解決二分類問題。二分類是一種特殊的分類問題,其結果只有對錯,好壞兩種分類。在二分類問題中,softmax可以將機率轉化為兩種結果的機率。

當啟用函式使用softmax函式時,損失函式常常使用交叉熵函式:

交叉熵函式常用於評估機率分佈之間的差異,與softmax得出機率的性質相適應。

在神經網路輸出的值非常大的時候,直接使用這些數值進行計算容易造成的數值溢位的結果,透過softmax歸一化處理可以有效避免這種情況。

常用的損失函式:

--->y為預測值

--->t為真實值

--->k為總數

均方誤差損失函式(MSE):

res = 0 
for i in range(k):
	res += (y-t)**2
return res/k
"""
形式與方差類似,不同的是y為預測值,t為真實值。
"""
	

交叉熵誤差損失函式:

E = -t1 * ln( y1 ) - t2 * ln( y2 ) - …… - tk * ln ( yk )

神經網路的學習隨機梯度下降法(SGD):

關於資料對於神經網路學習的重要性:

神經網路的特徵就是可以從資料中學習,資料是神經網路學習的基礎。

從資料中尋找答案、從資料中發現模式、根據資料講故事……這些機器學習所做的事情,如果沒有資料的話,就無從談起。因此,資料是機器學習的核心。這種資料驅動的方法,也可以說脫離了過往以人為中心的方法。--《深度學習》

學習意味著神經網路可以根據已有資料對網路中的權重進行調整。

在第三章中,神經網路的學習體現在神經網路的函式的值從當前位置沿著梯度方向前進一定的距離的過程,這裡我們用二維狀態下的球過坡來描述這個問題。

其中學習率(lr-->learning rate)決定前進的速度。

step_num表示前進移動的次數

為了方便接下里的理解,我們引入一個現實問題:這裡有一個小球放在斜坡上,受到重力和摩擦力影響,小球會在斜坡底部往復運動且其運動的高度會不斷降低,假如時間無限延長下去,小球總會有停下的時刻。

我們將現實問題對映在神經網路的學習中:斜率的絕對值代表滾動的速度,斜率的正負代表滾動的方向,由learning rate(下文寫作lr) 和 setp-num(sn代替),這裡的時間是分段的lr代表每一段的時間有多少,而sn代表時間段數的多少,速度的大小隻會在時間節點的開始發生變化,並且是瞬時變化,即每一段lr會存在一個不變的速度。因為時間的定義問題產生了一些與上文引述的現實問題不同的現象。比如:

1.在這裡小球的運動狀態會存在這樣的幾種情況。若lr的數值很小,如果sn也很小那麼會出現小球還沒怎麼動,距離谷底仍然有較打距離時結束,學習的結果不佳。如果要透過增大sn的數值來提高學習的最終效果,以下面這個例子來介紹

# 一個簡單的f(x) = x**2 的例子來介紹
a1 = 3
for i in range(sn):
    a1 -= lr * (a1 * 2)

    print(a1 , i)
# 不難知道,這個函式的谷底是當x = 0時,那麼x = 0就是我們的目標了
# 條件1:如果lr = 0.02 , sn = 100,最後的結果大約是0.05
# 2:但如果設定lr為0.01 sn = 100 最後的結果是0.397     # 這裡的結果省略了小數
# 如果lr = 0.01想到達到和條件1一樣的效果需要200次數
# 如果lr = 0.005,則需要400次
# lr = 0.0025需要800次
# 這個簡單的函式中,不完全統計可以推測lr每少一半,sn要提高一倍。

2.學習率過大,小球每一步的跨度過大,導致本該在谷底附近減速的小球沒有減速而穿過谷底後又再次上升。此時,如果小球能夠停在谷底附近,那麼接下來小球仍會被約束在谷底附近且靠近谷底,但是另一種情況如果小球攀升的高度過大,這意味著小球從右坡向下走的速度仍會較大,如果在這段lr中小球再次經過了谷底並且超過了起始位置,這意味著小球很有可能會不斷偏離谷底,而無法達到學習的目的。

QQ截圖20240314145105

為了讓小球最後停止的位置接近於谷底,從理論上講,如果時間可以無限延長,那麼學習率越小越好,但事實上卻存在一個時間上的取捨問題。如果只是減小學習率,會減慢學習的效率,同時,如果學習提前停止了,那麼學習的效果差-->需要提高學習次數,但是學習次數的提高同樣伴隨著學習時間的提高(計算成本與時間-->學習成本)。

同時,學習效果過強同樣面臨著過擬合的結果,特別是在訓練資料中,如果損失函式結果過低,導致神經網路在特別適應訓練資料的情況下排斥後來的測試資料,使得其對資料處理的泛化能力降低。在真實世界的資料還包括噪聲和許多不確定性因素,過擬合的表現可能會導致神經網路對這些不確定因素的處理能力下降。

當然,神經網路中損失函式結果過低也不意味著一定會出現過擬合現象,這取決於演算法的複雜度,訓練策略和訓練資料的特徵。

誤差反向傳播:

反向傳播演算法是梯度下降演算法在神經網路中的實現方式,由於深度學習網路是按層深入,層層巢狀,對深度學習網路目標函式計算梯度的時候,需要使用反向傳播的方式由深到淺倒著計算以及更新引數。

隨機梯度性下降法中:我們要求的是損失函式的結果對權重的微分,但是在多層神經網路中,權重的數量並不唯一,而我們需要的是損失函式結果對所有權重的微分,我們知道,神經網路以層劃分,層與層之間是相互關聯,這種情況下合理利用鏈式法則的特性大有裨益。

鏈式法則的應用:在神經網路的學習中,我們將神經網路看作是一個複合函式,其中每一層看作複合函式中的一個單獨函式,利用下述導函式的特性可以關聯每一權重對損失函式結果的影響。

# 導函式的特性:
# 對於f(x)而言
# f(x)對x的導數等於df(x)/dx,*此處的df(x) and dX都可以看作是一個獨立的數值*
# 假如此時還有一個變數名為y.記f(x)的導數為z
       df(x)         df(x)      dy       df(x)     dy
z = ---------  =  -----------*------ = ------- * -------
	   dx	          dx        dy        dy       dx
也就是最終f(x)對x求導的結果變為了f(x)對y求導的結果乘以y對x的求導結果反過來也是如此的
當f(x)為最終的損失函式,y、x……代表每一層輸出的結果,相鄰結果的導數為權重。

如此,從輸出層開始反向遞迴每一層的梯度並儲存起來,再根據梯度下降等最佳化演算法來更新模型的權重。

神經網路輸出的結果是一個資料,可能是一個單純的數字,也可能是一個矩陣

仿射函式(Affine):

變數為多維陣列(矩陣),當面對這種情況進行反向傳播時,一般利用元件的方式先構造出dot(矩陣乘法)前兩個矩陣的形狀。

梯度確認:

透過數值微分的方法來確認誤差反向傳播的正確性。兩者的結果並一定是完全相等的,只要處於一定的範圍內即可。

與學習相關的技巧

引數的更新:

提出了不同於SGD(隨機梯度下降法)的三種最最佳化方法:

我們需要介紹SGD和其他三種方法的優點和不足,這是我們學習多種方法的原因:

優點 : SGD在實現的過程中比較簡單。

缺點: 這與梯度的含義相關,某個點的梯度是指該點函式結果下降最快的點而並不是指向整個函式最小的點雖然這可能並不會影響最後該函式會到達最小值的結果,但是其前往最小值的路徑會增長。使得SGD最佳化效率下降。

其次,對於學習率的選擇會在一定程度上影響學習的結果超引數不佳可能會使學習效率不佳甚至學習錯誤。

1.Momentum學習法:

介紹:

momentum的核心思想在於模擬物理學中的動量概念,透過積累歷史梯度資訊來加速最佳化過程,並幫助演算法更快速地收斂到最優解。在模擬的過程中,它不僅會考慮此時的梯度問題,還會綜合考慮歷史梯度的問題,(簡單理解)當歷史梯度都是正數且此時的梯度也是正數,它將放大這個正數的效果,如果歷史梯度都是負數,但此時的梯度為正數,它將會削弱此時梯度的作用。(困難理解)歷史引數會乘以一個權重(超引數)並被儲存在一個列表中待用,當計算當前時刻的梯度時,需要新增這個列表中的各資料。

優點:

透過引入Momentum演算法能夠在相關方向上加速學習,同時抑制振盪,從而加速收斂速度。此外,Momentum最佳化方法還有助於解決Hessian矩陣病態條件問題,即梯度在某些方向上高度敏感的問題。

缺點:

在該最佳化演算法中存在一個超引數,需要人為設定良好的超引數才能體現出該最佳化方法的效果,超引數的選擇對學習效率有影響。

AdaGrad:

介紹:這個最佳化方法是建立在SGD的基礎上。

(簡單理解)學習率過大可能導致學習失敗,學習率過低可能會導致學習效率低,而該最佳化方法在開始時使用較大的學習率,學習效率高,隨著學習的進行,學習率會逐漸降低,從而一定程度上避免了因學習率過高和過低帶來的問題--一種動態學習率的方法。

(困難理解)這個最佳化方法透過引入一個新的動態變數h(h在數值上等於歷史梯度的平方和)並以->lr/h**0.5<-作為學習率,進行學習。

優點:

降低超引數敏感程度:削弱了學習率取值是否合適對SGD的困擾

缺點:

後期學習率過低:導致當學習進行到後期的時候,神經網路可能很難再學到新的東西。

Adam:

介紹:

Adam最佳化方法學習了上文中Momentum方法(M)和AdaGrad(AG)最佳化方法的特點和優點。

保留了M模擬物理動量的思想,同時利用了AG的動態思想。有望成為能夠快速找到最佳結果的最佳化方法。

優點:

計算高效:引數更新更加穩定和高效。

記憶體需求適中:相對於其他一些最佳化演算法,Adam的記憶體需求相對適中,使得它適用於大規模資料集和引數空間。

自適應學習率:Adam透過計算梯度的一階和二階矩估計來自動調整每個引數的學習率,這使得它對於不同的引數和訓練階段具有更好的適應性。

適合非平穩問題:由於Adam能夠動態調整學習率,因此它特別適合處理非平穩目標函式和噪聲較大的問題。

缺點:

超引數敏感:Adam引入了幾個超引數(如學習率、β1、β2等),這些超引數的選擇對演算法的效能有很大影響。如果設定不當,可能導致演算法收斂速度變慢或陷入區域性最優。

可能收斂到非最優解:在某些情況下,Adam可能收斂到非最優解,尤其是在某些特定的損失函式和模型結構下。這可能是由於Adam的自適應學習率調整策略在某些情況下過於激進或保守。

早期停止:由於Adam的學習率調整機制,有時演算法可能在達到全域性最優之前過早地停止更新。

----------------------------------------------------------------------------------------------------------------------------上次上傳的筆記中標題處的ReLU打錯了

圖片還不會上傳。


相關文章