Hope is a Dream. Dream is a Hope.

非公開ブログは再開しました。

キーボードタイピング音からキー予測

今キーボードのタイピング音から、キー入力を予想する学習アルゴリズムを試している。

[5:36]
学習アルゴリズムの開発には、アルゴリズム以外のことを考える必要がある。

[5:37]
学習アルゴリズムは、機械学習の分野で大学などの研究機関で数学と時間を使って研究されている。それを使えば良いので、DNN等の分類手法を使って、どれがいいか、どのパラメータが最適かを「試す」だけだ。

[5:37]
このような学習器を作るうえで重要になってくるのは、学習データの作り方だ。

[5:38]
タイピング音の予測の場合には、「タイプされたキー」の情報と、「タイピング音」を大量に準備する必要がある。

[5:39]
幸いにも私はエンジニアなので日々プログラミングや資料作成を行い四六時中キーボードを打っている。

[5:39]
これを活用しない手はない。

[5:39]
そこで、キー入力と録音を行うソフトの開発を進めている。

[5:40]
データが集まるとそれらを使って良い学習器を作る作業が始まる。

[5:41]
学習器を作る方法はそれこそいくらでもある。どの手法が良いのかは決まった指針はない。それぞれ一丁一旦であるからだ。例えば最近

[5:41]
では深層学習とよばれる

[5:42]
多層のニューラルネットワークを使った学習がずば抜けて優秀という報告がされ、世間ではみんながこぞってそれを始めている。

[5:42]
しかしDNNを使ったからといって仕事は終わりではない。

[5:43]
DNNも所詮はアルゴリズムなので、DNNを動かすために人が選ばなければいけない条件やパラメータが無数にある。

[5:43]
そこを人間が選び制御していたら、自動化が行えない。それこそ機械学習を行う意味がない。

[5:44]
そこで、遺伝的アルゴリズムを使って、DNNのパラメータを自動で選ばせるような仕組みを作る。つまり、学習のやりかたまでも自動化する。

[5:45]
そのためには、常に学習アルゴリズムを計算させる環境が必要だし。

[5:45]
レポートの出力や結果の確認も行う必要がある。

[5:46]
時には特定の学習器を取り出して個別に操作もしたくなるだろうし、DNN以外のアルゴリズムも試したくなるだろう。

[5:46]
また、学習データは私がタイピングすればするほど増えていく。

[5:47]
そのため、同じ学習パラメータでも、先月の計算と今日の計算では学習データが異なるため、結果も変わってくるだろう。

[5:48]
そう。機械学習で学習器を作るとは、そのようなトライアンドエラーの連続だ。施工を続けてこまるのは、先月出した結果を今日再現できるかだったり、どんなパラメータを使ったか、どんか結果だったかを覚えているかだ。

[5:50]
機械学習チュートリアルを走らせるのは簡単だ。学習データは揃っていて、それを読み込み無難なパラメータ(その無難さは無数のトライアンドエラーの結果)を使い、正答率を確かめる。

[5:50]
しかし、現実はそうもいかない。そこから始まるのだ。

[5:51]
以上の長ったらしい背景から、今作っているシステムを説明する。

[5:51]
まずはデータ収集のセクションから話そう。まずはキーボードタイピングのキャプチャソフトである。

[5:52]
これはOSにより異なるので、OSごとに使い分けができるような仕組みにしている。

[5:53]
音の録音はPythonを使ってPCのアナログ入力・マイク入力のデータを取得している。

[5:53]
上の二つがあれば、キーボードが押されたタイミングで、マイク入力のデータを取得し、押されたキーと音波形データをペアで格納する。これだけだ。

[5:54]
しかし、そこには課題が潜む。

[5:55]
タイピング音はとても短い。1秒以下だ。「ポーチーー」なんてなりはしない。「ポチ」500[ms]もあればありがたいぐらいだ。さて、その短い限られた音をどう取得するか?

[5:57]
アナログ入力のデータはある長さ(44.1kHz, 100[ms], 441

[5:57]
[サンプル])のブロックで取得できる。

[6:01]
ほしい音は、キーが押された瞬間の前後250[ms]だ。500[ms]ではサンプル数は2201サンプルだ。のちにFFT処理することを考え2024サンプル分ほしい。そしてそのサンプルの中心辺りにタイピング音のパルスが一致してほしい。

[6:01]
この実装が一番初めにハマった。

その2に続く。