指数移動平均
指数移動平均(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