2020年6月30日火曜日

算数の問題を解く

おじさん、子供の公文式の分数の計算問題があまりにめんどくさくてできません。
帯分数を仮分数に直して通分して計算して約分して仮分数を帯分数に直さないといけないのです。
もうなんなんだこのめんどくささ。

小学生の子供にどうやって問題を解いているのか聞いたら、Photomathというアプリをタブレットに入れて、写真を撮れば答えがわかるよと言われました。

どうも最近はスマホで算数の問題の写真を撮ると答えが出るらしい。
しかもきちんと計算の順序まで出る。
おじさん、最近の小学生のタブレット学習についていけない・・・。


これ、どういう仕組みになってるの?
調べてみると、im2markupというもので、数式の写真を文字列に変換し、計算しているらしい。

im2markup
http://arxiv.org/pdf/1609.04938v1.pdf

日本語のページが一つもヒットしないのは、きっと日本人は誰もやってないのね。
さみしいねぇ。これだけディープラーニングと言われている中、おじさんしかいないのかよ。

最近はなんでもLSTMですね。
LSTMって完全チューリングマシンなので、人間ができてLSTMでできないことなどないはず。
でもTensorFlowもTorchもLSTMはGPUがないと動かない・・・・

これをおじさんのパソコンでもうごかしたいので、本日はim2markupをWindowsのGPUがないマシンでも動くように移植します。
LSTMでできないことはないはずだけど、おじさんもC言語で実装できないものはない!


ディープラーニングって、論文や公開されているソースコードを動かそうとしても、だいたいそのままじゃ動きません。
使っているライブラリのバージョンが合わないとか、論文が間違っているとか、本当に大変な作業です。
これを自分のところで動くようになるまでにだいたい一か月くらいかかります。

よくディープラーニングのエンジニア募集のところにも書いてあるもんね、論文を読んで実装できることと。
これをさくさくできる人、日本にいるんだろうか?

論文とソースコードをにらめっこして、ひたすらおかしいところを直し、img2markupをWindowsのGPUなしでも動くC言語のコードにしてみました。

オリジナルはLuaJitコンパイラでLua言語で書かれている部分をコンパイルしないと動かないのですが、インタープリタで動くFFIライブラリも移植して、C言語とLuaのスクリプトファイルだけで動きます。
これでどんなマシンでもim2markupが動く。たぶんほかのLSTMのものも動く。

ここでいつもは学習済みデータをとってくるのですが、torchで書かれたものはGPUがあるマシンで学習させると、GPUがあるマシンでないと認識のテストができません。
CPU版の学習済みデータがない・・・。
なので本日は頑張ってGPUがないマシンで、im2markupの学習も行います。

おじさん、学習もできるんです。
サンプルの学習は数式が1000個、GPUなしで1エポック8時間かかります。
1日に3エポックしか進まないじゃないか。
15エポック学習するには5日間もかかるので、とりあえず3エポック学習させてみました。

ソースコードと学習済みデータはこちら。
https://drive.google.com/file/d/1VF_hckbuAH28UjtoAjMeUK2OW7hfCtvk/view?usp=sharing

この画像を文字列に変換してみます。


----------------
\Gamma ( z + 1 ) = \int _ { 0 } ^ { \infty } \, \, d x \, \, e ^ { - x } x ^ { z }
----------------

おー、認識に数分かかるけどなんかあってる。
3エポックしか学習させていないのに。

これを全データで120時間かけて学習させるときっとかなりの確率で数式を認識するんだと思います。このあとテキストに変換された数式を数式の計算ソフトに食わせればよいのね。

LSTMほんとすごいね。
本日はLSTMは時間かかるけどGPUがないマシンでもできるよっていう話でした。


0 件のコメント:

コメントを投稿