2003年6月20日

[julius-u:00133] 不具合報告

皆さま初めまして,大河と申します。

このMLにふさわしい話題か分かりませんが
julius3.3p4-multipathを使っていまして
core dumpをすることがありまして,少し原因を探ってみました。

使った音響モデルなのですが,最大64mixtureの状態共有モデルです。
PTMモデルですが<TMIX>ではなく<MIXTURE>で表記してあります。

このモデルなんですが,学習データが少なかったらしく

下のようにところどころ<mixture>タグが抜けています。
~s "TC_i2_1"
<NUMMIXES> 64
<MIXTURE> 3 5.032351e-02
~m "i3m3"
<MIXTURE> 4 1.199540e-02
~m "i3m4"
<MIXTURE> 10 8.401376e-03
~m "i3m10"
<MIXTURE> 11 4.948544e-02
~m "i3m11"
[以下略]

で,
libsent/src/phmm/calc_mix.cのなかで
for(i=0;i<OP_calced_num;i++) {
OP_calced_score[i] += OP_state->bweight[OP_calced_id[i]];
}
logprob = addlog_array(OP_calced_score, OP_calced_num);
のように全mixtureの結果をまとめているのですが,
libsent/src/phmm/gprune_none.cのなかで
int *id = OP_calced_id;
OP_calced_num = num;
for(; num >= 1; num--) {
dens = *(g++);
if (!dens) continue; /* skip if density = NULL */
*(prob++) = compute_g_base(dens);
*(id++) = i++;
}
のように,あらかじめOP_calced_idにmixtureのあるところだけを
登録してあります。
ところがcalc_mix.cのなかではOP_calced_numの個数分だけ計算するのですが
途中に分布が抜けていようがいまいが, gprune_none.cのなかで混合数の値が
OP_calced_numに代入されています。
つまり,OP_calced_idの中身が,分布が存在しなかった個数分だけ
不定になっているのもかかわらず,そこにアクセスしますから,
セグメンテーション違反を起こすわけです。

多分,
libsent/src/phmm/gprune_none.c:58
int *id = OP_calced_id;
- OP_calced_num = none;
for(; num >= 1; num--) {
dens = *(g++);
if (!dens) continue; /* skip if density = NULL */
*(prob++) = compute_g_base(dens);
*(id++) = i++;
}
+ OP_calced_num = i;
}
が正しいのではないかと思います。

もちろんこのバグは-gprune noneの時にしか起こりませんので
<TMIX>を使ってモデルを表現すればいいのですが…

--
====================================================
大 河 雄 一 OHKAWA Yuichi (kuri@xxxxx)
東北大学 大学院 教育情報学研究部・教育部
Research and Education Divisions,
Graduate School of Educational Informatics,
Tohoku University, 980-8576 Sendai, JAPAN.
====================================================

投稿者 xml-rpc : 2003年6月20日 19:23
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/3771
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。