Tensorflow深度學習-第四天

前向傳播的最後一步就是完成誤差的計算

L = g(f_{\theta} (x), y)

L = g(f_{\theta} (x), y)

f_{\theta}(.)代表了利用𝜃參數化的神經網絡模型,𝑔(∙)稱之爲誤差函數,用來描述當前網絡的預測值𝑓 (𝒙)與真實標籤𝒚之間的差距度量,比如常用的均方差誤差函數。L稱爲網絡的誤差 𝜃(Error,或損失 Loss),一般爲標量。我們希望通過在訓練集𝔻train上面學習到一組參數𝜃使 得訓練的誤差L最小:

 

從另一個角度來理解神經網絡,它完成的是特徵的維度變換的功能,比如 4 層的 MNIST 手寫數字圖片識別的全連接網絡,它依次完成了784 → 256 → 128 → 64 → 10的特 徵降維過程。原始的特徵通常具有較高的維度,包含了很多底層特徵及無用信息,通過神 經網絡的層層特徵變換,將較高的維度降維到較低的維度,此時的特徵一般包含了與任務 強相關的高層抽象特徵信息,通過對這些特徵進行簡單的邏輯判定即可完成特定的任務, 如圖片的分類。

網絡的參數量是衡量網絡規模的重要指標。那麼怎麼計算全連接層的參數量呢?考慮 權值矩陣𝑾,偏置向量𝒃,輸入特徵長度爲𝑑in,輸出特徵長度爲𝑑out的網絡層,𝑾的參數 量爲𝑑in ∙ 𝑑out,再加上偏置𝒃的參數,總參數量爲𝑑in ∙ 𝑑out + 𝑑out。對於多層的全連接神經 網絡,比如784 → 256 → 128 → 64 → 10,總參數量的計算表達式爲:

256 ∙ 784 + 256 + 128 ∙ 256 + 128 + 64 ∙ 128 + 64 + 10 ∙ 64 + 10 = 242762

約 242K 個參數。

全連接層作爲最基本的神經網絡類型,對於後續的神經網絡模型,例如卷積神經網絡 和循環神經網絡等,的研究具有十分重要的意義,通過對其他網絡類型的學習,我們會發 現它們或多或少地都源自全連接層網絡的思想。

我們來介紹神經網絡中的常見激活函數,與階躍函數和符號函數不同,這些函數都是平滑可導的,適合於梯度下降算法。

sigmod函數

relu函數

在 ReLU(REctified Linear Unit,修正線性單元)激活函數提出之前,Sigmoid 函數通常 是神經網絡的激活函數首選。但是 Sigmoid 函數在輸入值較大或較小時容易出現梯度值接 近於 0 的現象,稱爲梯度彌散現象。出現梯度彌散現象時,網絡參數長時間得不到更新, 導致訓練不收斂或停滯不動的現象發生,較深層次的網絡模型中更容易出現梯度彌散現 象。2012 年提出的 8 層 AlexNet 模型採用了一種名叫 ReLU 的激活函數,使得網絡層數達 到了 8 層,自此 ReLU 函數應用的越來越廣泛。

 

ReLU 函數在𝑥 < 0時導數值恆爲 0,也可能會造成梯度彌散現象,

爲了克服這個問 題,LeakyReLU 函數被提出。

Tanh

在機器學習中, 一般會將圖片的像素值歸一化到[0,1]區間,如果直接使用輸出層的值,像素的值範圍會分 布在整個實數空間。爲了讓像素的值範圍映射到[0,1]的有效實數空間,需要在輸出層後添 加某個合適的激活函數𝜎,其中 Sigmoid 函數剛好具有此功能。

softmax

每個值代表了當前樣本屬於每個類別的概率,概率值之和爲 1

TensorFlow 中提供了一個統 一的接口,將 Softmax 與交叉熵損失函數同時實現,同時也處理了數值不穩定的異常,一 般推薦使用這些接口函數,避免分開使用 Softmax 函數與交叉熵損失函數。函數式接口爲tf.keras.losses.categorical_crossentropy(y_true, y_pred, from_logits=False),其中 y_true 代表了 One-hot 編碼後的真實標籤,y_pred 表示網絡的預測值,當 from_logits 設置爲 True 時, y_pred 表示須爲未經過 Softmax 函數的變量 z;當 from_logits 設置爲 False 時,y_pred 表示 爲經過 Softmax 函數的輸出。爲了數值計算穩定性,一般設置 from_logits 爲 True,此時 tf.keras.losses.categorical_crossentropy 將在內部進行 Softmax 函數計算,所以不需要在模型 中顯式調用 Softmax 函數.

z = tf.random.normal([2,10]) # 構造輸出層的輸出
y_onehot = tf.constant([1,3]) # 構造真實值
y_onehot = tf.one_hot(y_onehot, depth=10) # one-hot編碼
# 輸出層未使用 Softmax 函數,故 from_logits 設置爲 True
# 這樣 categorical_crossentropy 函數在計算損失函數前,會先內部調用 Softmax 函數 
loss = keras.losses.categorical_crossentropy(y_onehot,z,from_logits=False)
loss = tf.reduce_mean(loss) # 計算平均交叉熵損失

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章