logsumexpの補足

昨日書いたlogsumexpの記事についてわかりにくいといった意見があったので補足しておく。
昨日と切り口を変えて書いてみたので人によってはこちらの方が分かりやすいかも。


記事の要点はexp(a)やexp(b)が計算できないほど大きい、または小さい値になってしまうときにexp(a)やexp(b)を直接計算せずに、かわりにexp(a-b)を使って

log(exp(a) + exp(b)) 

を計算するための手法を紹介した、というもの。(a-b)はaやbに比べて絶対値が小さいので扱いやすい。
具体的にはb > aとして

   log( exp(a) + exp(b) )
 = log( exp(b)(exp(a-b) + exp(b-b)) )
 = log(exp(b)) + log(exp(a-b) + exp(b-b))
 = b + log(exp(a-b) + 1.0)

と展開することでexp(a)やexp(b)の直接計算を避けて、かわりにexp(a-b)の計算で済むようになっている。
これがどういう状況で必要かというと

log(P[i]) = log( A[i] / ΣA[i] )

を計算したいような場合に必要。この式は

log(P[i]) = log( A[i] / ΣA[i] )
          = log(A[i]) - log(ΣA[i])
          = log(A[i]) - log(Σexp(log(A[i])))

と展開できるが、最後の行の2項目は

log(exp(a) + exp(b) + ...)

という形式をしているので冒頭の計算が必要だよという話。