tf.clip_by_value函數(shù)可以限制log運算時不會出現(xiàn)log0這類的數(shù)出現(xiàn)
矩陣乘法tf.matmul伤提,直接使用*是元素間相乘
根據(jù)交叉熵的公式遵岩,應該將每行中的 m 個結(jié)果相加得到所有樣例的交叉熵恨旱,然后再對這 n 行取平均得到 一個 batch 的平均交叉熵店印。但因為分類問題的類別數(shù)量是不變的尚揣,所以可以直接對整個矩陣做平均而并不改變計算結(jié)果的意義咏花。
通過計算交叉熵會得到一個n*m的矩陣战得,n是一個batch的樣本數(shù)疯坤,而m是分類的類別數(shù)强品。
求平均使用 tf.reduce_mean()
tf.nn .softmax_cross_entropy_with_logits( labels=y_, logits=y)
上面的函數(shù)可以直接使用訓練出來的y和原始標簽y_計算出交叉熵寺晌,而不用自己添加softmax獲得矩陣后再更新穆咐。
梯度下降的兩個問題
1)無法全局最優(yōu)
2)計算時間太長
關(guān)于優(yōu)化學習率
眾所周知尔邓,使用梯度下降的時候名秀,需要在每次確定梯度方向后確定一個步長象踊,也就是所謂的梯度前進多少温亲,這個就是所謂的學習率。
學習率太大或者太小都不好杯矩,因為太大容易震蕩栈虚,太小迭代速度又太慢。
TensorFlow提供另一個學習率設置方法-指數(shù)衰減法史隆。
tf.train.exponential_decay函數(shù)實現(xiàn)了這個學習率魂务。
可以先使用一個較大的學習率來快速達到一個較好的解,然后隨著迭代的繼續(xù)逐步減小學習率,使得模型在訓練后期更加穩(wěn)定粘姜。
學習率的更新其實是
其中 decayed_learning_rate 為每一輪優(yōu)化時使用的學習率 鬓照, learning_rate 為事先設定的 初始學習率, decay_rate 為衰減系數(shù)相艇, decay_steps 為衰減速度颖杏。
tf.train.exponential_decay函數(shù)可以通過設置參數(shù) staircase 選擇不同的衰減方式。 staircase 的默認值為 False坛芽,這時學習率隨法代輪數(shù)變化的趨勢如 圖 4-13 中灰色曲線所示留储。當 staircase 的值被設置為 True 時, global_step I decay_steps 會被 轉(zhuǎn)化成整數(shù)咙轩。這使得學習率成為 一個階梯函數(shù)( staircase function)
關(guān)于正則化
常用的正則化化是有兩種分為L1和L2
無論是哪一種正則化方式获讳,基本的思想都是希望通過限制權(quán)重的大小,使得模型不能 任意擬合訓練數(shù)據(jù)中的隨機噪音活喊。但這兩種正則化的方法也有很大的區(qū)別丐膝。 首先, Ll正則 化會讓參數(shù)變得更稀疏钾菊,而 L2 正則化不會 帅矗。 所謂參數(shù)變得更稀疏是指會有更多的 參數(shù)變?yōu)?0,這樣可以達到類似特征選取的功能煞烫。之所以 L2 正則化不會讓參數(shù)變得稀疏的原因是當 參數(shù)很小時浑此,比如 0.001,這個參數(shù)的平方基本上就可以忽略了滞详,于是模型不會進一步將這 個參數(shù)調(diào)整為 0凛俱。其次 , LI 正則化的計算公式不可導料饥,而 L2 正則化公式可導蒲犬。因為在優(yōu) 化時需要計算損失函數(shù)的偏導數(shù),所以對含有 L2 正則化損失函數(shù)的優(yōu)化要更加簡潔 岸啡。