目錄
- 前言
- 一、sigmoid 及導數求導
- 二、tanh?
- 三、ReLU?
- 四、Leaky Relu
- 五、 Prelu
- 六、Softmax
- 七、ELU
- 八、極大似然估計與交叉熵損失函數
- 8.1 極大似然估計與交叉熵損失函數算法理論
- 8.1.1 伯努利分布
- 8.1.2 二項分布
- 8.1.3 極大似然估計
- 總結
前言
書接上文
PaddlePaddle線性回歸詳解:從模型定義到加載,掌握深度學習基礎-CSDN博客文章瀏覽閱讀995次,點贊24次,收藏18次。本文深入講解了使用PaddlePaddle框架實現線性回歸的完整流程,涵蓋了模型定義(包括序列方式和類方式)、數據加載、模型保存(基礎API和高級API)、模型加載(基礎API和高級API)以及模型網絡結構查看等關鍵步驟,旨在幫助讀者全面掌握PaddlePaddle框架下線性回歸的實現方法,并理解其背后的原理。同時,文章還涉及曲線擬合的理論與實踐,以及多種激活函數的特性與應用,為讀者構建扎實的深度學習基礎。https://blog.csdn.net/qq_58364361/article/details/147408186?fromshare=blogdetail&sharetype=blogdetail&sharerId=147408186&sharerefer=PC&sharesource=qq_58364361&sharefrom=from_link
一、sigmoid 及導數求導
import numpy as np # 導入 numpy 庫,用于數值計算
import matplotlib.pyplot as plt # 導入 matplotlib.pyplot 模塊,用于繪圖def sigmoid(x):"""Sigmoid 激活函數:param x: 輸入值:return: Sigmoid 函數的輸出"""return 1 / (1 + np.exp(-x)) # Sigmoid 函數的公式def sigmoid_derivative(x):"""Sigmoid 激活函數的導數:param x: 輸入值:return: Sigmoid 函數導數的輸出"""return sigmoid(x) * (1 - sigmoid(x)) # Sigmoid 導數的公式x = np.linspace(-5, 5, 100) # 創建一個從 -5 到 5 的等間隔的 100 個點的數組
y = sigmoid(x) # 計算 sigmoid 函數的值
y1 = sigmoid_derivative(x) # 計算 sigmoid 導數的值plt.figure() # 創建一個新的圖形
plt.plot(x, y, label='sigmoid') # 繪制 sigmoid 函數的圖像
plt.plot(x, y1, label='sigmoid_derivative') # 繪制 sigmoid 導數的圖像
plt.legend() # 顯示圖例
plt.show() # 顯示圖形
二、tanh?
下面學一下雙曲正切的激活函數tanh
tanh激活函數的數學公式為
該函數解決了Sigmoid函數不以零為中心的問題,它的取值范圍是(-1,1),無限接近1和-1,但永不等于1或者-1,它是關于0中心對稱,以零為中心。
tanh導數公式為:
tanh特點總結:
輸出范圍:tanh 函數的輸出范圍被限制在 -1 到 1 之間,因此它可以使神經網絡的輸出更接近于零中心,有助于減少梯度消失問題。
零中心性:tanh 函數的輸出以零為中心,即在輸入為 0 時函數值為 0,這有助于減少梯度消失問題,并使得神經網絡更容易學習。
相對于Sigmoid函數,優勢顯而易見:
輸出以零為中心:tanh函數的輸出范圍是-1到1之間,其均值為零,因此它是零中心的激活函數。相比于Sigmoid函數,tanh函數能夠更好地處理數據的中心化和對稱性,有助于提高網絡的學習效率。
飽和區域更大:在輸入絕對值較大時,tanh函數的斜率較大,這使得它在非線性變換上比Sigmoid函數更加陡峭,有助于提供更強的非線性特性,從而提高了網絡的表達能力。
良好的輸出范圍:tanh函數的輸出范圍在-1到1之間,相比于Sigmoid函數的0到1之間,輸出范圍更廣,有助于減少數據在網絡中傳播時的數值不穩定性。
但是缺點也同樣明顯:
容易出現梯度消失問題:雖然相比于Sigmoid函數,tanh函數在非飽和區域的斜率較大,但在輸入絕對值較大時,其導數仍然會接近于零,可能導致梯度消失問題。
- 計算難度同樣大。
import numpy as np # 導入 numpy 庫,用于數值計算
import matplotlib.pyplot as plt # 導入 matplotlib.pyplot 模塊,用于繪圖def tanh(x):"""tanh 激活函數:param x: 輸入值:return: tanh 函數的輸出"""return np.tanh(x) # 返回 tanh 函數的計算結果def tanh_derivative(x):"""tanh 激活函數的導數:param x: 輸入值:return: tanh 函數導數的輸出"""return 1 - np.tanh(x) ** 2 # 返回 tanh 導數的計算結果x = np.linspace(-5, 5, 100) # 創建一個從 -5 到 5 的等間隔的 100 個點的數組
y = tanh(x) # 計算 tanh 函數的值
y1 = tanh_derivative(x) # 計算 tanh 導數的值plt.figure() # 創建一個新的圖形
plt.plot(x, y, label='tanh') # 繪制 tanh 函數的圖像
plt.plot(x, y1, label='tanh_derivative') # 繪制 tanh 導數的圖像
plt.legend() # 顯示圖例
plt.show() # 顯示圖形
三、ReLU?
?ReLU激活函數的數學公式為:
ReLU函數其實是分段線性函數,把所有的負值都變為0,而正值不變。
ReLU函數的導數公式為:
ReLU特點:
稀疏性:ReLU 函數的導數在輸入為負數時為零,這意味著在反向傳播過程中,只有激活的神經元會傳遞梯度,從而促進了稀疏激活的現象,有助于減少過擬合。
計算高效:ReLU 函數的計算非常簡單,并且在實踐中被證明是非常高效的。
解決梯度消失問題: ReLU函數在輸入大于零時輸出其本身值,這使得在反向傳播時梯度保持為常數1,避免了梯度消失問題。ReLU函數在深度網絡中更容易訓練。
ReLU函數的優勢:
- 解決梯度消失問題: ReLU函數在輸入大于零時輸出輸入值,這使得在反向傳播時梯度保持為常數1,避免了梯度消失問題。相比于Sigmoid和tanh函數,ReLU函數在深度網絡中更容易訓練,使得網絡能夠更有效地學習復雜的特征。
- 計算速度快: ReLU函數的計算非常簡單,只需進行一次閾值判斷和取最大值操作。這使得在大規模深度神經網絡中,ReLU函數的計算速度遠快于Sigmoid和tanh函數,加快了模型訓練的速度。
- 稀疏激活性: 在輸入小于零的情況下,ReLU函數的輸出是零,這表現為稀疏激活性。這意味著在激活后,一部分神經元將被激活,而其他神經元則保持不活躍。這有助于減少神經網絡中的冗余計算和參數數量,提高了網絡的泛化能力。
它的劣勢:
- 死亡ReLU問題(Dying ReLU): 在訓練過程中,某些神經元可能會遇到“死亡ReLU”問題,即永遠不會被激活。如果某個神經元在訓練過程中的權重更新導致在其上的輸入始終為負值,那么它的輸出將永遠為零。這意味著該神經元不會再學習或參與后續訓練,導致該神經元“死亡”,從而減少了網絡的表達能力。
死亡relu問題理解
ReLU函數導數只可以取兩個值,當輸入小于0時,導數為0;當輸入大于0時,導數為1,在反向傳播過程中,
(w新=w舊-學習率*梯度),如果學習率比較大,一個很大的梯度更新后,經過Relu激活函數,可能會導致ReLU神經元更新后的權重是負數,進而導致下一輪正向傳播過程中ReLU神經元的輸入是負數,輸出是0,由于ReLU神經元的輸出為0,在后續迭代的反向過程中,該處的梯度一直為0,相關參數不再變化,從而導致ReLU神經元的輸入始終是負數,輸出始終為0。即為“死亡ReLU問題”。
(relu產生的情況,第一種情況就是輸入大部分是負值,第二種情況 w更新后成為負數,第3種情況就是b為比較大的負數)
- 輸出不是以零為中心: ReLU函數的輸出范圍是從零開始,因此輸出不是以零為中心的。這可能會導致訓練過程中的參數更新存在偏差,降低了網絡的優化能力。
- 不適合所有問題: 盡管ReLU函數在大多數情況下表現良好,但并不是適合所有問題。對于一些問題,特別是在處理一些包含負值的數據時,ReLU函數可能不夠理想,可能會產生不良的結果。
針對ReLU函數的劣勢,研究人員也提出了一些改進的激活函數,如Leaky ReLU、Parametric ReLU和Exponential Linear Units(ELU)等,這些函數在一定程度上緩解了ReLU函數的問題,并在特定情況下表現更好。因此,在實際使用中,根據具體問題和實驗結果選擇合適的激活函數是很重要的。
import numpy as np # 導入 numpy 庫,用于數值計算
import matplotlib.pyplot as plt # 導入 matplotlib.pyplot 模塊,用于繪圖def relu(x):"""ReLU 激活函數:param x: 輸入值:return: ReLU 函數的輸出"""return np.maximum(0, x) # 返回 ReLU 函數的計算結果,即 max(0, x)def relu_derivative(x):"""ReLU 激活函數的導數:param x: 輸入值:return: ReLU 函數導數的輸出"""return np.where(x > 0, 1, 0) # 返回 ReLU 導數的計算結果,當 x > 0 時為 1,否則為 0x = np.linspace(-5, 5, 100) # 創建一個從 -5 到 5 的等間隔的 100 個點的數組
y = relu(x) # 計算 ReLU 函數的值
y1 = relu_derivative(x) # 計算 ReLU 導數的值plt.figure() # 創建一個新的圖形
plt.plot(x, y, label='relu') # 繪制 ReLU 函數的圖像
plt.plot(x, y1, label='relu_derivative') # 繪制 ReLU 導數的圖像
plt.legend() # 顯示圖例
plt.show() # 顯示圖形
四、Leaky Relu
公式:
f(x)=max(αx, x),其中 α 是一個小常數(例如0.01)
導數:
f’(x)=1,當x>0時。
f’(x)=α,當x<=0時。
Leaky ReLU 通過在負數區域引入小的正斜率 α 來避免ReLU的“死亡”問題,允許負數區域的梯度不為零。
import numpy as np # 導入 numpy 庫,用于數值計算
import matplotlib.pyplot as plt # 導入 matplotlib.pyplot 模塊,用于繪圖def leaky_relu(x, a=0.01):"""Leaky ReLU 激活函數:param x: 輸入值:param a: 斜率,默認為 0.01:return: Leaky ReLU 函數的輸出"""return np.maximum(a * x, x) # 返回 Leaky ReLU 函數的計算結果,即 max(a*x, x)def leaky_relu_derivative(x, a=0.01):"""Leaky ReLU 激活函數的導數:param x: 輸入值:param a: 斜率,默認為 0.01:return: Leaky ReLU 函數導數的輸出"""return np.where(x > 0, 1, a) # 返回 Leaky ReLU 導數的計算結果,當 x > 0 時為 1,否則為 ax = np.linspace(-5, 5, 100) # 創建一個從 -5 到 5 的等間隔的 100 個點的數組
y = leaky_relu(x) # 計算 leaky_relu 函數的值
y1 = leaky_relu_derivative(x) # 計算 leaky_relu 導數的值plt.figure() # 創建一個新的圖形
plt.plot(x, y, label='relu') # 繪制 leaky_relu 函數的圖像
plt.plot(x, y1, label='relu_derivative') # 繪制 leaky_relu 導數的圖像
plt.legend() # 顯示圖例
plt.show() # 顯示圖形
五、 Prelu
Prelu 和 Leaky Relu想比,Prelu的α是可學習的。
公式:
f(x)=max(αx, x),其中 α 是一個可學習的參數。
導數:
f’(x)=1,當x>0時。
f’(x)=α,當x<=0時。
PReLU是Leaky ReLu的一個變種,其中a是通過學習得到的,這使得模型可以適應性地改變其行為。
import numpy as np # 導入NumPy庫,用于數值計算
import matplotlib.pyplot as plt # 導入Matplotlib庫,用于繪圖def p_relu(x, alpha=0.25):"""參數化ReLU激活函數:param x: 輸入值:param alpha: 斜率小于0時的系數,默認為0.25:return: PReLU激活值"""return np.maximum(alpha * x, x) # 返回alpha*x和x中的較大值def p_relu_derivative(x, alpha=0.25):"""參數化ReLU激活函數的導數:param x: 輸入值:param alpha: 斜率小于0時的系數,默認為0.25:return: PReLU導數值"""return np.where(x > 0, 1, alpha) # 當x>0時返回1,否則返回alphax = np.linspace(-5, 5, 100) # 創建一個從-5到5的等間隔數組,包含100個點
y_p_relu = p_relu(x) # 計算x的PReLU激活值
y_p_relu_derivative = p_relu_derivative(x) # 計算x的PReLU導數值
plt.figure(figsize=(8, 6)) # 創建一個圖形,設置大小為8x6英寸
plt.plot(x, y_p_relu) # 繪制x和PReLU激活值的關系圖
plt.plot(x, y_p_relu_derivative) # 繪制x和PReLU導數值的關系圖
plt.show() # 顯示圖形
六、Softmax
softmax激活函數,但是很多地方,不會把softmax稱為激活函數,但是呢沒有一個合理的叫法,它就叫softmax函數,但是呢,它的性質上無論和我們的sigmoid或者tanh 或者relu等其實是類似的,我們可以把它稱為激活函數。
softmax激活函數為什么不把它稱為激活函數,是因為和它的位置是有關系的。為什么呢?
softmax這個函數和我們的sigmoid函數也好。relu函數也好,不一樣的點在哪里?如果sigmoid函數位于算法的最后一層,做二分類的活。softmax函數它一般只用于最后一次的激活,也就是輸出之前的一次激活,前面不用softmax。 softmax一般不用于回歸算法中,一般是用于分類中,我們前面計算的都是在算擬合和回歸,softmax它做的是分類。
eg:貓和狗,當我們的輸出不是一個值而是一個向量的時候,比如要分成三類(貓,狗 ,老虎)三類,根據輸出的向量數值,按照下面的公式進行計算。
然后再結合后面的交叉熵就可以計算損失值。
Softmax函數,可以將神經網絡計算出來的數值通過公式變成概率,經過softmax后得到的結果相加和為1。
另一個優勢就是不論向量輸出的結果是正值還是負值都能轉化為正值。
這個在后續的深度學習中用的非常多。
當n=100時,即有100類時,其圖像如下圖所示:
softmax 特點總結:
概率分布:Softmax函數將輸入轉換為概率分布,因此在多分類問題中常用于將模型的原始輸出轉換為概率值。
連續可導:Softmax函數是連續可導的,這使得它可以與梯度下降等優化算法一起使用進行訓練。
指數增長:Softmax函數中的指數運算可能會導致數值穩定性問題,特別是當輸入較大時。為了解決這個問題,可以通過減去輸入向量中的最大值來進行數值穩定的計算。
梯度計算簡單:Softmax函數的導數計算相對簡單,可以通過對Softmax函數的定義進行微分得到。
涉及到softmax求導,看一下它怎么求導?
import numpy as np # 導入NumPy庫,用于數值計算
import matplotlib.pyplot as plt # 導入Matplotlib庫,用于繪圖def softmax(x):n_val = np.exp(x) # 計算輸入x的指數d_val = np.sum(np.exp(x)) # 計算所有指數的和return n_val / d_val # 返回Softmax值def softmax_derivative(x):s = softmax(x) # 計算Softmax值return np.diagflat(s) - np.outer(s, s) # 計算Softmax導數x = np.linspace(-5, 5, 50) # 創建一個從-5到5的等間隔數組,包含50個點
y_softmax = softmax(x) # 計算x的Softmax值
y_softmax_derivative = softmax_derivative(x) # 計算x的Softmax導數
plt.figure(figsize=(8, 6)) # 創建一個圖形,設置大小為8x6英寸
plt.plot(x, y_softmax) # 繪制x和Softmax值的關系圖
plt.plot(x, y_softmax_derivative) # 繪制x和Softmax導數的關系圖
plt.show() # 顯示圖形
七、ELU
前面的激活函數學完后,現在學習最后一個激活函數,它叫ELU的激活函數。
ELU(Expoentital Linear Unit)激活函數是深度學習中用于增強網絡學習能力的又一種激活函數,ELU通過在負值輸入時提供負值輸出,旨在結合Relu的優點和解決其潛在的一些問題,如ReLU的不活躍神經元問題。
數序定義
ELU函數的數學表達式定義為:
中,x是函數的輸入,α是一個預定義的超參數,用于控制x為負值時輸出的飽和度。
圖像如下:
2.函數特性
非線性:ELU是非線性的,可以幫助神經網絡學習復雜的數據表示。
連續可導:ELU在整個定義域內連續可導,這有助于提高梯度下降優化算法的穩定性。
解決梯度消失問題:對于負值輸入,ELU提供了負值輸出,這有助于減輕梯度消失問題,尤其是在深度網絡中。
輸出均值接近0:ELU函數能夠產生負值輸出,這意味著其激活輸出的均值更接近0,有助于數據的中心化,減少訓練過程中的偏置偏移。
3.導數
ELU函數的導數如下:
圖像如下:
意味著在正數區域,梯度為1,而在負數區域,梯度取決于α和x的指數值,這有助于保持負輸入值的梯度更新。
ELU優勢:
ELU通過在負數區域引入指數衰減,能夠減少ReLU的“死亡”問題,同時保持負值的輸出,有助于保持平均激活接近零,這有助于加快學習。
ELU劣勢:
計算成本:由于ELU在負值時涉及指數運算,其計算成本高于Relu及其直接變體,尤其是在前向傳播時。
import numpy as np # 導入NumPy庫,用于數值計算
import matplotlib.pyplot as plt # 導入Matplotlib庫,用于繪圖def elu(x, alpha=0.25):"""ELU激活函數:param x: 輸入值:param alpha: x小于0時的系數,默認為0.25:return: ELU激活值"""return np.where(x > 0, x, alpha * (np.exp(x) - 1)) # 當x>0時返回x,否則返回alpha * (np.exp(x) - 1)def elu_derivative(x, alpha=0.25):"""ELU激活函數的導數:param x: 輸入值:param alpha: x小于0時的系數,默認為0.25:return: ELU導數值"""return np.where(x > 0, 1, alpha * (np.exp(x))) # 當x>0時返回1,否則返回alpha * np.exp(x)x = np.linspace(-5, 5, 100) # 創建一個從-5到5的等間隔數組,包含100個點
y_elu = elu(x) # 計算x的ELU激活值
y_elu_derivative = elu_derivative(x) # 計算x的ELU導數值plt.figure(figsize=(8, 6)) # 創建一個圖形,設置大小為8x6英寸
plt.plot(x, y_elu) # 繪制x和ELU激活值的關系圖
plt.plot(x, y_elu_derivative) # 繪制x和ELU導數值的關系圖
plt.show() # 顯示圖形
八、極大似然估計與交叉熵損失函數
從以下3個方面對極大似然估計與交叉熵損失函數進行介紹
1.極大似然估計與交叉熵損失函數算法理論講解
2.編程實例與步驟
8.1 極大似然估計與交叉熵損失函數算法理論
交叉熵損失函數是獨立于的MSE(均方差損失函數)
交叉熵損失函數是另一種損失函數。MSE損失函數和交叉熵損失函數它們的應用場合是不一樣的。
均方差損失函數主要應用在回歸、擬合領域。(eg:有一些點用直線擬合它,或者用曲線去擬合)。
交叉熵損失函數主要應用在分類領域。
交叉熵損失函數主要應用在分類領域。
eg:對有貓和狗的圖片進行分類,輸入貓和狗的照片,然后特征提取,得到兩類結果,可以先用softmax,得到兩類的概率值將求解出來的概率,交給交叉熵計算損失?就可以進行模型優化了。
那分類問題指的是什么問題呢?
分類問題是機器學習中最常見的問題之一。分類問題的目標是根據給定的特征將數據分為不同的類別。
分類問題怎么去優化的呢?
主要是使用最小化交叉熵損失去優化
MSE解決分類問題的弊端?
在回歸預測問題中,使用MSE作為損失函數,L2距離(歐式距離)能夠很漂亮的體現出預測值與實際值的差距(距離)。
在分類問題中,網絡輸出的是屬于某個類的概率。最后一層使用(softmax激活函數或者sigmoid激活函數)進行處理,二分類可以使用Sigmoid也可以使用Softmax,多分類使用Softmax,如果使用MSE,當與Sigmoid或Softmax搭配使用時,loss的偏導數的變化趨勢和預測值及真實值之間的數值的變化趨勢不一致。
當真實值y=1時,若預測值等于1,
等于0
當真實值y=1時,如預測值等于0,
等于0
也就是說,預測為錯誤時,依然沒有梯度讓網絡可以學習。可以得出MSE對于分類問題無法有效地度量類別之間的差異,導致對于分類任務的優化不夠敏感。
8.1.1 伯努利分布
伯努利分布是一種離散型概率分布,它描述的是一次伯努利試驗中成功和失敗的概率分布。在伯努利分布中,只有兩種可能的結果,通過用0和1來表示,其中0表示失敗,1表示成功。
伯努利分布的數學公式表達如下:
如果表示拋硬幣,則正面向上的概率 p為當x=1時,p(1)=p^1*(1-p)^(1-1)=p,
反面向上的概率1-p為當x=0時,p(0)=p^0*(1-p)=1-p
8.1.2 二項分布
二項分布是描述了n次獨立的伯努利試驗中成功的次數的概率分布。在二項分布中,每次試驗都是獨立的,且成功和失敗的概率保持不變。二項分布的概率質量函數公式如下:
其中n表示試驗次數,k表示成功的次數,p表示單次實驗成功的概率。
8.1.3 極大似然估計
極大似然估計,通俗理解來說,就是利用已知的樣本結果信息,反推最具有可能(最大概率)導致這些樣本結果出現的模型參數值。
假設現在進行伯努利試驗10次,結果用隨機變量xi表示,則x1,x2,...x10,滿足獨立同分布。其值為(1,0,1,0,0,0,1,0,0,0),每個樣本出現的概率的乘積為:
對于上面的例子結果為:
極大似然估計的目標是不是要求最大的L(p)值中對應的p值?
舉個例子(p=0.1 L(p)=0.0004782969
p=0.2 L(p)=0.0016777216
p=0.5 L(p)=0.0009765625 )
總結
????????本文結合理論與實踐,詳細解析Sigmoid、tanh、ReLU系列激活函數的數學特性與梯度行為,指出ReLU的死亡問題及改進方案如Leaky ReLU、PReLU和ELU的設計邏輯。通過可視化對比各函數曲線與導數,闡明零中心性、稀疏性對神經網絡訓練的影響。在損失函數部分,從極大似然估計出發,論證交叉熵在分類任務中的必要性,對比MSE的缺陷,強調概率輸出與損失函數適配的重要性。代碼實現覆蓋函數繪制、導數計算及實際應用場景,提供完整的理論與實操參考。