2026年 01月 30日

モールス(時系列データ)の機械学習

機械に機械学習のモデルを設計してもらう(何もわからない)の続きで、モールスの機械学習をちまちま諦めずにやってる。

PCEN (Per-Channel Energy Normalization)

音声データは非常にダイナミックレンジが広いので、なんらかの方法でノーマライズしないと、いざ実世界の、スケール 40dBぐらい違うデータを推論しようとしてもうまくいかない。

PCEN はなんかそういう圧縮してスケールする正規化をモデルの中に組込むというやつ。ちゃんと実装できているかはわかなないが挙動からするとできているのだろう……

もう少し実践的なデモ

実際にオーディオストリームから広域をFFTしつつ、一部をクロップして連続推論するというデモをつくった (マイク入力に対応)。

「しばらく動かすと推論がエラーで止まる」という現象が発生してこまった。onnx のエラーが出るのだけど、WASM のポインタアドレスが throw されてくるのでまるで情報がない。

Python 側では起きないので、ずっとJS側の実装でメモリ管理がおかしいことを疑っていたが、結局 Claude Opus 君が「モデルのマスク管理がおかしいです!」ということに気付いてくれてなおすことができた。ひさびさに Claude に感動したわ。Python 側で再現しなかったのは長時間連続のストリーム推論することがないからだった。

先読みの実装

当初から「先読み」を実装していたつもりだったのに、この期に及んで、まったく先読みできていなかったことが発覚。わたくし衝撃です。先読みせずにそこそこ精度が出てたのはすごいが…… 一応文字が確定するタイミングでCTC発火するように調整していたので、非因果的なのは長点・短点・単語間空白などを予測するヘッドだけだったはずではある。機械学習、こういう間違った実装されてても、ある程度はなんとかなっちゃうことがあるので本当に怖い。

ということで、時系列データの場合とにかく因果性というのが問題になって、常に頭を悩ませる。こんがらがってくる。ラベル自体をオフセットするのか? アテンションに未来を見せるのか? そして、コーディングエージェントは時系列というものが苦手なので、人間がちゃんと理解してテストを書かせてないとダメなのだ…… 普通につらい。

前回も言ったけどコーディングエージェントはとにかくテストを書きたがらない。いくら言ってもダメ。AGENTS で指定しても意味あるのは初回ぐらい。テストで動作を保証する発想が一切ない。ゴミスクリプトをチョチョッっと作って実行してはゴミ掃除もせず放置する。