FortLearnerを書いていて思ったこと
FortLearnerを作成し始めてから思ったこと、今回アドベントカレンダーに初めて参加してみて思ったことなどを書こうと思います。ただの感想文(ポエム?)です。
アドベントカレンダーに参加して
一人ですべての記事を書くのはかなりきついですね。4月ごろに思い立ち、1日づつ何を題材に書こうかというのを決定しました。決定木の記事はすぐに着手して4月中にはほぼ下書きが終わっていた記憶しています。それ以降の記事については延び延びになって結局11月末に10記事程度しか作成できませんでした。それ以降は土日に記事を書いたりしていたのですが、12月19日には完全にストックが切れてしまい、毎日夜更かしして書いていました。
記事を書くというのはやはり自分の中で論理の流れができていなければならないはずですが、個々のトピックだけがのこっている状態では自分が何を書いているのかがごちゃごちゃになってしまいました。とりあえず実装でき、既存実装と比較して同じような性能が出ていればいいやという気持ちでやっていたのがいけませんでした。1年後の自分は他人というのをもう一度思い出して、設計書とでもいうべきノートを今後は作成していきます。
まともな記事を書くときには記憶だけを頼りに書くのではなく、現在の環境についても検証したり、そういえばきちんと確認していなかったなという部分もキチンと調査しなければならないのを改めて思いました。実装なしでもひと月に1本かければよいほうだと思うので(ただ実装しないと多分理解したつもりにもなれない)、2年分くらいのストックを使った今年と違い来年は多分一人でカレンダーを埋めきれないので参加しないつもりです。Fortranのカレンダーのほうで日程が空いていれば参加させていただこうと思います。
FortLearnerを書いていて思ったこと
1日目の記事でも書いたと思いますが、最初は機械学習アルゴリズムの動きを理解したいと思って始めました。初めて決定木のアルゴリズムを書いたときには計算量を考えることもまったく知りませんでした(各種ソートの計算量についても知りませんでした)。初めに実装してみて処理時間を測定してみると、Scikit-Learnと速度に全く歯が立たず、そもそもどこが遅いんだろうということもわからない状態でした。それからソート関数を調べるうえで、計算量という概念を知り、趣味でも仕事でも毎回計算量を考えるようにしました。そうすると一目見て、というわけにはいきませんが、どこが重そうかがなんとなくわかるようになった気がします(結局測定するわけですが)。
遅いのであれば、高速化するためにどのようなアルゴリズムを用いればよいかも調べたり、メモリアクセスが良くないのかなども考えるようになりました。一番コードを考えるうえで成長したと思ったのは、同じ入出力のコードでもいくつもの方法を考えられるようになったことです。その時点ではもちろん時間もメモリ使用量もなにも考えていないため、とりあえず一番良さそうなのを実装しますが、手段が増えるのはいいことだと思います。
簡単な例題からでも競技プログラミングからアルゴリズムを学びたいと思うようになりました。おそらく応用方法が浮かぶまでは長いですが、これも手段を増やすことになると考えているからです。アルゴリズムを学ぶ中でも、さらにこんな書き方があるのかと学べたらと思います。
今後の実装予定
- Classifier
- 回帰用のアルゴリズムがほとんどなので、今後はもう少し分類用のアルゴリズムも実装していきます。特に決定木はRegressorのみです。SVMは回帰側の実装を調査中ですが、簡単に見た限りでは式変形も特に難しくなさそうです。
- AutoGradの3次元Tensorへの対応や、Layerの追加
- 畳み込みニューラルネット用のConvolutional Layerは未実装なので追加したいです
- 例えばPrametricReLUなど
- RNN、GPUなど
- 速度+精度検証用のスクリプト
- 今回は一部のアルゴリズムしか速度検証として載せられませんでした。また、精度もほぼ乗せられていないので(以前検証した際にほぼSklearnと同じだったため保存していなかった)、それを比較できるようなスクリプトをきちんと作成したいです。
- 非深層学習系の時系列用のアルゴリズム
- 状態空間モデル、自己回帰モデルなど基本的なものから進めたいと思っています。
- クラスタリングではKshape
- Change-point Detectionなど
以上です。これからも細々と機能を追加していきたいです。