天天看點

【深度學習】指數權重滑動平均

權重平均:

我們常用的算術平均屬于權重平均的特殊形式,隻不過算術平均各項權重都相等。

權重滑動平均:

原理與權重平均類似,但重點在“滑動”一詞,即該平均過程就好似從第一個值依次向後滑動,直到滑動到最後一個值,言外之意就是,第n個值取決于第n-1個值。

滑動平均遞推公式:

【深度學習】指數權重滑動平均

一般設 v 0 v_0 v0​=0,由上述公式可知:

【深度學習】指數權重滑動平均

通過數學歸納法可知:

【深度學習】指數權重滑動平均

最終所要求得的權重滑動平均值即為 v t v_t vt​。但是問題又随之出現了,前幾個 v t v_t vt​(通過遞推公式得到的)與它們各自的原始值偏差很大,由于 v 0 v_0 v0​=0,而 β \beta β(又稱為衰減率)的值在區間[0,1)内,是以通過遞推公式得到的 v 1 v_1 v1​的值會遠遠小于原始值 θ 1 \theta_1 θ1​, v 2 v_2 v2​和 v 3 v_3 v3​的值也會較 θ 2 \theta_2 θ2​和 θ 3 \theta_3 θ3​有所偏差。為此在上述公式的基礎之上做了改進,即

【深度學習】指數權重滑動平均

該式即為指數權重滑動平均的公式。

當t=1時,對應 v t v_t vt​= v 1 v_1 v1​,1- β t \beta^t βt=1- β \beta β,通過遞推公式我們發現此時 v 1 v_1 v1​= θ 1 \theta_1 θ1​,很好地解決了偏差較大的問題。而且由于 β \beta β在區間[0,1)内,是以随着t的增大,指數權重滑動平均公式的分母越來越趨近于1,對于偏差很小的數又減弱了該指數項的影響。

import numpy as np
import matplotlib.pyplot as plt
import math

theta = [0, 10, 20, 10, 0, 10, 20, 30, 5, 0, 10, 20, 10, 0, 10, 20,
         30, 5, 0, 10, 20, 10, 0, 10, 20, 30, 5, 0, 10, 20, 10, 0,
         10, 20, 30, 5]

def moving_ave(theta, beta):
    theta = np.array(theta).reshape((-1, 1))
    m, n = theta.shape
    v = np.zeros((m, 1))
    for i in range(1, m):
        v[i, :] = beta * v[i-1, :] + (1 - beta) * theta[i, :]
    return v

def exp_moving_ave(theta, beta):
    theta = np.array(theta).reshape((-1, 1))
    m, n = theta.shape
    v = np.zeros((m, 1))
    for i in range(1, m):
        v[i, :] = (beta * v[i-1, :] + (1 - beta) * theta[i, :])
    for i in range(1, m):
        v[i, :] /= (1 - beta**i)
    return v

v = moving_ave(theta, 0.9)
v_exp = exp_moving_ave(theta, 0.9)

plt.plot(theta, lw=2, marker='*', label=r'$v_t$=$\theta_t$')
plt.plot(v[:, 0], lw=2, color='darkorange', marker='*', label=r'$v_t$=$\beta$$v_{t-1}$+(1-$\beta$)$\theta_t$')
plt.plot(v_exp[:, 0], lw=2, color='green', marker='*', label=r'$v_t$=$v_t$/(1-$\beta^t$)')
plt.legend()
plt.show()
           
【深度學習】指數權重滑動平均

通過上圖可以明顯地看出權重滑動平均和指數權重滑動平均之間的差别。

keras

BatchNormalization

函數(批次歸一化)中的

momentum

參數即為權重滑動平均的 β \beta β(初始值為0.99)。 β \beta β的值越接近1,前幾個數值的權重越高,滑動平均的結果越取決于前t個值。若 β \beta β的值越接近0,前幾個數值權重越低,滑動平均的結果越取決于距離 v t v_t vt​最近的幾個數值。

tf.keras.layers.BatchNormalization(
    axis=-1,
    momentum=0.99,
    epsilon=0.001,
    center=True,
    scale=True,
    beta_initializer="zeros",
    gamma_initializer="ones",
    moving_mean_initializer="zeros",
    moving_variance_initializer="ones",
    beta_regularizer=None,
    gamma_regularizer=None,
    beta_constraint=None,
    gamma_constraint=None,
    renorm=False,
    renorm_clipping=None,
    renorm_momentum=0.99,
    fused=None,
    trainable=True,
    virtual_batch_size=None,
    adjustment=None,
    name=None,
    **kwargs
)
           

使用指數權重滑動平均可以有效避免資料抖動,使得資料更加平穩、平滑,使得測試過程更加魯棒。

繼續閱讀