梯度下降
梯度下降法主要用于單個參數(shù)的取值。假如損失函數(shù)是一座山,我們從山上一個任意點開始往山下走,山坡的坡度越大,我們的垂直高度下降的越快。當我們到達某一個點是,我們往任意方向前進多都會升高使,我們就到達了最低點。準確來說是局部最低點。但是如果損失函數(shù)是個凸函數(shù),那么這個局部最優(yōu)解就是整體最優(yōu)解。

說到這我們就要提到微分方程了。對損失函數(shù)求導,導數(shù)就是我們所謂的梯度:

我們的目的是不斷更新參數(shù)以使得損失函數(shù)最小化。

那這里的α是什么?α是我們給參數(shù)的變化加上一個權(quán)重,也即是學習率。我們以此來控制參數(shù)的變化速度。為什么我們要使用學習率呢?
學習率
從上面的公式我們不難發(fā)現(xiàn),我們加入學習率就是希望在參數(shù)更新緩慢的時候加快它的更新,在參數(shù)跟新跨度太大使減弱它的更新。那么如何選擇合適的學習率呢?

如圖左所示,如果學習率太小,那么我們每次訓練之后得到的效果都太小,這無疑增大了我們的無謂的時間成本。如果如圖右所示,學習率太大,那我們有可能直接跳過最優(yōu)解,進入無限的訓練中。所以解決的方法就是,學習率也需要隨著訓練的進行而變化。
Tensorflow提供了一種靈活的學習率設置—指數(shù)衰減法。先從一個較大的學習率開始快速得到一個比較優(yōu)的解,然后隨著迭代的繼續(xù)逐步減小學習率:
current_learning_rate = \
learning_rate * decay_rate ^ (global_step / decay_steps)
current_learning_rate: 當前使用的學習率
learning_rate: 初始學習率
decay_rate: 衰減系數(shù)
decay_steps: 衰減步幅
global_step: 訓練總步數(shù)
反向傳播
反向傳播法是神經(jīng)網(wǎng)絡訓練中非常重要的算法,可以幫助我們在所有參數(shù)上使用梯度下降法,通過反向傳播更新參數(shù),從而使損失函數(shù)更小。

x和y作為輸入經(jīng)過訓練變成輸出z傳給下一層,我們計算得到誤差函數(shù)L,并對x和y求導,得出x和y對于誤差的影響,然后據(jù)此更新x和y。在實際應用中我們計算參數(shù)對于誤差的影響,然后反向更新參數(shù)。
滑動模型
我們有時候也會使用滑動模型來使模型更穩(wěn)健,原因是有時數(shù)據(jù)會有些奇異點,在連續(xù)的數(shù)據(jù)中特別突兀。有可能是誤差也有可能是真是數(shù)據(jù),這時我們會使用以當前點為中心的一段數(shù)據(jù)的平均值來代替該點的值。有時使用簡單的平均滑動模型,有時會加上權(quán)重,這都跟我們要研究的具體問題相關(guān)。
tf.train.ExponentialMovingAverage(decay_rate,step)
# Tensorflow提供的平均滑動模型,decay_rate為衰減率, step為窗口大小