kntty.hateblo.jp

ここに何か書く。

指数移動平均

指数移動平均(Exponential Moving Average; EMA)を得るためのテクニックの話。

以前、確か、Temporal Ensembling [1]の論文を読んだときに、なるほどー、と思ったときのメモ書きが出てきたので、文字に起こしておく。

[1] Laine S, Aila T. Temporal Ensembling for Semi-Supervised Learning. 2017.


何某かの変数 $z _ n (n \ge 1)$ を反復更新しながら、その指数移動平均

x _ n = \frac {z_n + α z _ {n - 1} + α^2 z _ {n - 2} + ... + α^{n-1} z _ {1}} {1 + α + α^2 + ... + α^{n-1}}

を得たいとする。 ここで、αは定数($0 < α < 1$)。

もちろん$z _ i (1 \le i \le n)$を全て記録しておけば良いのだが、nが大きいとか、zが巨大ベクトルとかであれば、効率が悪い。

そこで、 zの更新と同時に、次のように$X$を更新することを考える。

$X _ n = z _ {n} + α X _ {n - 1} \quad (n \ge 1),$

$X _ 0 = 0 \quad (n =0)$

ここで、右辺の$X$に、式自身を繰り返し代入すると、

  • $X _ n = z _ {n} + α z _ {n - 1} + α ^ 2 X _ {n - 2}$
  • $X _ n = z _ {n} + α z _ {n - 1} + α ^ 2 z _ {n - 2} + α ^ 3 X _ {n - 3}$
    ...
  • $X _ n = (z _ {n} + αz _ {n - 1} + α ^ 2 z _ {n - 2} + ... α ^ {i} z _ {n - i} + ... +α ^ {n - 1} z _ {1} ) + α ^ {n} X _ {0}$

$X _ 0 = 0$であるから、

X _ n = \sum _ {i = 0} ^ {n - 1} α ^ {i} z _ {n - i}

これで、めでたく、最初の$x _ n$式の分子が得られる。 分母は、等比数列の和

$A _ n = \sum _ {i = 0} ^ {n-1} α ^ {i} = (1 - α ^ n)/(1 - α)$

であるから、次のように$x _ n$を得る。

x _ n = \frac{1 - α}{1 - α ^ n} X _ n