対数尤度の計算
確率のかけ算が繰り返されるとアンダーフローが起きる。 これを防ぐために確率の対数の足し算を行う。
フォワードアルゴリズムなどを実装すると、 例えば 0.1+0.5=0.6 のような確率の足し算を log の領域で行う必要が出てくる。
このときに exp() で戻すと、せっかく log にした意味がなくなるので、 logadd() と呼ばれる計算を行うのが一般的。
logAdd に関する情報源
Julius では addlog.c にてテーブルルックアップで実装。
HTK では HTKLib/HMath.c に LAdd() として実装されている。
Matlab言語で実装してみた
動作確認は octave で行っている。
%% logadd.m %% logadd(logX, logY) %% based on http://nlp.cs.byu.edu/mediawiki/index.php/Log_Domain_Computations %% Author: nishimotz atmark gmail.com %% Created: 2010-04-24 function [ ret ] = logadd (logX, logY) if logY > logX temp = logX; logX = logY; logY = temp; end if isinf(logX) ret = logX; return end negDiff = logY - logX; if negDiff < -20 ret = logX; return end ret = logX + log(1.0 + exp(negDiff)); endfunction
計算例 1
## A = 0.1 ; logA = -2.3026 ## B = 0.5 ; logB = -0.69315 ## A+B = 0.6 ; log(A+B) = -0.51083 > logadd(-2.3026,-0.69315) ans = -0.51083
計算例 2
## A = 0.0 ; logA = -Inf ## B = 0.9 ; logB = -0.10536 ## A+B = 0.9 ; log(A+B) = -0.10536 > logadd(-Inf,-0.10536) ans = -0.10536
<html> <div class="amazlet-box" style="margin-bottom:0px;"><div class="amazlet-image" style="float:left;margin:0px 12px 1px 0px;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4274067750/r4wh-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/412Ufa2CI%2BL._SL160_.jpg" alt="プログラミングのための確率統計" style="border: none;" /></a></div><div class="amazlet-info" style="line-height:120%; margin-bottom: 10px"><div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4274067750/r4wh-22/ref=nosim/" name="amazletlink" target="_blank">プログラミングのための確率統計</a><div class="amazlet-powered-date" style="font-size:80%;margin-top:5px;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4274067750/r4wh-22/ref=nosim/" title="プログラミングのための確率統計" target="_blank">amazlet</a> at 10.12.05</div></div><div class="amazlet-detail">平岡 和幸 堀 玄 <br />オーム社 <br />売り上げランキング: 66729<br /></div><div class="amazlet-sub-info" style="float: left;"><div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4274067750/r4wh-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div></div></div><div class="amazlet-footer" style="clear: left"></div></div> </html>