初めまして。今は亡き、経営工学科(通称「i科」)という学科のOBです。
卒業後は縁あってIT業界に足を踏み入れ、縁あってエンジニアになり、最近またまた縁あって機械学習というものに着手しております。
同じく理科大で学んだ皆さまにとって、プログラミングだったり数学系の話題だったり、その方面でああだこうだ言うのは釈迦に説法をするようなものでしょう。
ただ、この機械学習という分野に業務で携わっている中で、さまざまに発見・学びがあったので是非この場をお借りして共有したいと思います。
技術面でも、ビジネス面でも。なにか一つ役に立つ情報がお届けできれば幸い。
###「それ、本当に機械学習でやる必要ありますか?」
文面だけだとなんかケンカふっかけてるみたいですが、全然そんなことはありません。
弊社への問い合わせ内容の中では、
####「今の業務を、AI・機械学習で自動化したい」
みたいな感じ…が一番多い気がします。(他の企業様もやはりそうなのかな?)
これまでのシステム開発とはやはり勝手が違うので、探り探りな人は多いのだと思います。
なので要件を聞き出すとともに、「本当にやりたいこと・実現したいことは具体的に何であるか」をはっきりさせる必要があります。
中には、機械学習を用いることなく解決できる課題もあるので、「機械学習」に無理にこだわる必要もありません。
目的と手段を混合してしまうことの無いよう、導いてあげることが大事です。
「機械学習でなにかできませんか?」
「我が社でも機械学習に取り組もう。キミ、あとはよろしく。」
###いきなり「機械学習モデル」をガリガリ実装することはない
ベタなキーワードでいえば、Python、Tensorflowあたりでしょうか。ほかにもKerasやScikit-learnなどなど。
データを用いて学習し、目的となるパラメータを予測できるようなモデルを実装する必要があります。
しかし、そもそも学習・推定させるためのデータがそろっていないと話が進みません。
今、手元に十分な質・量のデータがありますか?あるいは、データを作成できるだけの準備が整っていますか?
場合によっては前処理をかけて、学習・推定に最適なフォーマットに再成型する作業も必要です。
時間もそれなりにかかります。
クライアントからGB単位のcsvを渡されて→適切な形に再成型←実装+動作確認などで2週間とかかかります。
(そのうちの大半は、実行が終わるのをただ待つという時間です。ものすごい時間がかかります。)
まだ書き始めたばかりですが、csvを扱う上でのヒントなんかも書いているのでもしよければご参考までに。今後更新した記事を書いていく予定です。
###本実装と学習
いよいよデータがそろって、学習用のモデルを実装するぞ!
しかし全データを学習させるとなると、GPUを使って●●時間、とかいう次元の話になってくるので少ない試行回数で成功させたいものです。
そんなときこそ"divide and conquer"の精神を忘れないこと。(原義としては「分割統治」。転じて「問題やタスクを細かく分割してひとつひとつ対処する」というニュアンスで使われます。)
実装の時は、試験的に小規模のデータを作ってこまめに動かしてみること。
その時の所要時間やメモリの消費量についてチェックし、全量データでの学習にも耐えうる設計となっているか確認すること。
また、実装時の精度は基本的に宛てにしないこと 結果そのものまでを出すまでが正しく動作することに意味がある。
学習時にやることといえば、コンソールでの出力を見守ることくらい。。。
###結果考察
いい感じの結果が出ることもあれば、そうでないこともあります。
なぜその結果になったのか、という考察は、実装の改善だけでなくクライアントへの報告時にも必要になります。
前処理が間違っていたのか?学習回数が少ないのか?逆に過学習になってしまっていたのか?そもそもデータに不備があったのか?
どのパターンも実際にありうることです。
犯人探しでは断じてありません。「なぜ」そうなったのかを考え、次回の学習やプロジェクトに活かすことが何より重要です。
###上記以外で知っておくべきこと
ドキュメントやプログラムを納品した後、クライアント側の環境ででシステムに組み込んで運用してもらう…なんてことがあります。
ドキュメントに書くものとして主だったものは、クライアントで用意しなければならない環境の情報やプログラムの使い方、あとは学習・推定結果に対する考察報告などです。プロジェクトによって必要なものは違うはずなのですり合わせはしっかりしておきましょう。
また、実運用してもらうにあたっては「使い勝手」もよくしておくことを意識しましょう。
シェルスクリプトのコマンドだけで前処理や学習まで自動でやってくれるようにすること
前回実行時の出力結果を削除してくれること
処理にかかった時間をログで吐き出すこと
処理が何らかの原因でコケた場合、何がおかしいのか、どういう操作をすべきなのかをログに出してあげること
…などなど。
最近上司にもらったアドバイスには「暗黙の了解が必要な部分を残すな」なんて言葉もありました。
今週はまさに納品に向けた作業がメインになっていくので、この記事で共有するとともに、自身への戒めとして認めておきます。
###終わりに
結構書きなぐる感じでしたが、機械学習においてはおそらく皆さんが思う以上に泥臭い部分が多いと思います。
ただ、とても楽しいです。データの流れを深く考えすぎて、脳みそがちぎれるような感覚に襲われてからが本番です。
理科大で数学・統計学・情報処理を学んでいる(学んでいた)方は、その素養が備わっているはずなのでぜひ取り組んでみてほしいと思っています。
個人で「〇〇を推定してみた」なんて記事を挙げている方も多いので、大分とっつきやすくなってきているはずです。
それでは。