こちらの記事は__機械学習をどう学んだか by 日経 xTECH ビジネスAI② Advent Calendar 2019__への参加記事になります。
一般的な機械学習の勉強への取り組みとは少し異なるステップを踏んできた話をしてみようと思います。少しでも多くの方の参考になれば嬉しいです。
普段は個人のブログの方をメインで執筆しており、自分のブログに書こうかなと思って温めていたネタなんですが、せっかくの機会なのでと思い、__qiitaに初投稿__です。
記事を書き終えて全体を見直して見ましたがこの記事は完全に読み物です。私の実績やコードはほとんどありません
簡単な自己紹介と機械学習に出会うまでの経緯
どうしても経緯だけはお話したいので記述しました。ざっくりと読み流して下さい
現在23歳の男です。いわゆる新卒という立場になります。学部生の頃は土木と建築を専攻していましたが、完全に挫折してしまい、何か面白いことないかなーと模索する内にプログラミングを選び、独習して企業様でのインターンで経験を詰みました
ある程度はスキルが身についたと認めて頂きまして、本年度より名古屋でエンジニア(webをメイン)として仕事をさせて頂いております
(学部生の頃に作った模型。センスの無さが伝わってくる...)
実をいうと、現在の職場は学部生の頃からインターンをしていた企業様です。名古屋では珍しく人工知能とwebの並行開発を行なっている企業です。しかしながら、私がインターンに参加したばかりの当時は
- webの開発が忙しい
- 機械学習への理解のある人間が1人しかいない
という状況でした。しかし、その一方で機械学習の案件相談は日々増えており、__「誰かが新たに機械学習を学ぶしかないよね〜」という方針に決まりました。webの開発チームは機械学習の学習に手を回す時間もなく、たらい回し的に自分に「機械学習の勉強してみないか?」__という話が回ってきました
一応、当時でもpython3系
は書けた(中学生の時に猫でもわかるC言語を挫折)ので、少なからず機械学習という単語は知ってましたし、python
の年収ランキングを押し上げているのも機械学習があるが故ということも知っていました。「python
やってるから、機械学習もまぁ多少はね?」という気持ちと、自分は計算ミスが多く中学生時代に数学が大嫌いになったという過去が拮抗して、「やります」と言えずにいましたが、気づいたら僕が機械学習をやることになっていました(おい
ちなみに当時python
を学習に選択したの以下の不純な理由です
- 文法がシンプルで記述しやすいらしい
- 年収ランキングで一番の言語らしい <- これが大きかった
機械学習への第一歩
kaggleのチュートリアルへの挑戦
ベタベタな第一歩ですが、まずはkaggle
のタイタニックチュートリアルをやってみることにしました。狙いとしてはこんなところだったはず
- 機械学習の概要に触れる・理解する
- 機械学習を扱う際の全体の流れを把握する
- 機械学習で何が出来るの(何が出力される)かを理解する
ブログ等の記事を参考にしながら、とりあえずは動くところまでを確認出来た。
なるほど。機械学習使ってデータを学習させてやると、こんな結果が出力されるのかーと狙いを達成することは出来たんだろうが、この作業に面白さを全く感じなかった。
当然、ほとんどのコードが丸パクリであるからだろうが、どこか作業的な処理が多いし(欠損値の穴埋めとか)、機械学習モデルの選定って言っても、sk-learn
をpip
でインストールして使いたいモデルをimport
するだけでコレジャナイ感があった
面白い所が全て作り終わられていて、あとはそれを並べて遊ぶだけって感じで、ブロックが10個もないような、めっちゃでかいLEGOを遊んでいるような気分だったと思います
とりあえずのTensorFlow
次にDeepLearning
のモデルを自分で実装してみようと思った。理解は機械学習のすごいやつ程度のレベル。当時はフレームワークのドキュメントにチュートリアルが存在しているということを理解していなかったので、こちらの一冊を買った。書店で衝動買い。薄さも丁度よく、2週間ぐらいでコードを書きながら読破した。途中GPUを使って4時間とかいう章があったので、そこはスルーした。
mnist
のシンプルな画像分類に始まり、CNN
, RNN
に触れ、Word2vec
で分散表現作ったり...と現在の業務の基盤となる作業はこの1冊で触れることが出来た
最低限のみの数式が記述されており、手を動かすことを目的とした書籍だったので個人的には楽しんで読むことが出来た。その一方でLayer
, 損失関数
, 勾配降下法
など訳の分からない言葉が出てきたので、もっと基礎知識とモデルの中で何が起きてるのかといった理論的な知識を身につける必要があるなと思い、次の学習の進め方が決まった
ここまでは手を動かして、出力を確認して直感的に機械学習を理解する作業を進めてきた
書籍を読みまくる
前回の反省を活かすために、評判の良い機械学習関連の書籍を何冊か読んでみた。手元にはないものもあるが、読んだ書籍はだいたい以下の通り
- ゼロから作るDeepLearning
- ゼロから作るDeepLearning2
- キーポイント線形代数
- 人工知能プログラミングの数学がわかる本
- データサイエンスのための統計学入門 ―予測、分類、統計モデリング、統計的機械学習とRプログラミング
- 機械学習のための特徴量エンジニアリング ―その原理とPythonによる実践
- 機械学習入門 ボルツマン機械学習から深層学習まで
- Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎
オライリー関連で機械学習の評判の良い書籍にはだいたい目を通した。ゼロから1,2は読書の時間に最も時間をかけたのでかなり、理解出来たと思うし、内容も非常に分かりやすい。何よりタイトル通り__ゼロから作っていくというのが自分の性分にあっていた。__
その一方で全ての本を読破できたわけではなく、挫折したものも当然ある。あとは読破していても、現状の知識として残っていないものも。今思うと失敗だったなと思うのは、同じ内容の事柄を複数の書籍で読んでいたこと。あれはあっちの本だとこうで、こっちの本だとこうで...と無駄な時間を過ごしてしまったし、理解が複雑になってしまったので、数をこなすことも重要だが取捨選択をすることも重要だった
今から最初の一冊として選ぶのであれば
- 非エンジニアの方 -> 機械学習入門 ボルツマン機械学習から深層学習まで
- エンジニアの方 -> ゼロから作るDeepLearning
のどちらかをオススメしたい
手を動かすべきか理論を学ぶべきなのか
これは完全に好き嫌いだと思います。自分は理論から入って、何かがうまく言った成功体験がないので手を動かすことを第一として取り組み、よく分からなかった点を後から追う形で学習した。その逆が得意な方も当然いらっしゃるかと思います。同僚の理論物理学を学んでいた彼は完全に後者だ。強すぎる...
はじめての機械学習案件
ここからがこの記事のメインとなる。初歩的な学習が終わり、理論もある程度、理解することが出来た。機械学習の説明はある程度出来るようになり、ついに自分に機械学習案件の振り出しが決まった。
しかし話を聞いてみると、機械学習を使って何をするのかは全く決まっていないようで、どちらかというと導入の目的はプロモーションの要素が強いらしい。つまりは「このアプリには人工知能が入ってますよ!」ということが言えればOKなわけだ
そのアプリが某データの検索システムで、データの検索エンジン(SQL
)も自作する必要があったため、この検索エンジン部分に機械学習を用いたらどうかという話に決まった。この当時は、その成り行きを黙って聞いているだけだった。
仕様は過去の検索ログを用いて、Aという単語とよく一緒に選択されるB, C...という単語の候補を提示するという、まぁgoogleの検索エンジンと似たようなものに決まった。また、システムはオンプレでクローズドなネットワーク内での数人利用だったのでモデルの更新も必要ないという形になった
この案件自体は、ベースとなるアルゴリズムもシンプルなものを採用して、先方が理解のある方だったこともあって、大きな炎上なく無事に納品することが出来た。
これが機械学習案件へのデビューなったが、今思うとうまく行き過ぎていた。今回取り組んだジャンルも頻出パターンマイニング
と呼ばれるもので目標の精度の話も一切なかった。要は見てくれが重要だった。次第に機械学習案件の難しさを体験していくことになる...
物体検知の案件の保守に
詳しい話をすることが契約上、出来ないが、SSD300
を用いた物体検知を行うための案件が別で動いており、そちらの保守に参加することになった。学習環境、デプロイ環境も全てGCP
のml engine(現AI-platform)
に構築されており、自分にとっては初めてのクラウド案件でもあった。
そこはさして問題ではなかったし、最初の納期(検証データで精度50%程)は問題なくクリアしたと報告を受けていた。次のステップではモデルの精度向上を多ない、最終的に__精度90%__を目指すということになっていた。さらに並行して機械学習モデルを使用したアプリの開発も控えていたため、精度向上の方向性を大きく間違えないことも求められていた。
しかしながら、この__精度90%__という設定が当然ながら良く無かった。何の数値が90%なのかという点も決まりきっていなかった(accuracy
なのかrecall
なのかmAP
なのか...etc)し、計測した精度は本番運用の精度と異なるということをこちらのフロントも先方も理解していなかった。
本来であれば、こちら側で精度について厳密に定義して、先方に説明するべきだし、本番検証の方法も決めておくべきだが、こちら側でフロントに立って以上のような話を説明できる人間がいないため、このような状態になってしまっていた。
結果として最終的な納品の定義がグチャグチャであることに納品間近になってから気づき、さらに精度90%という目標を達成することも出来なかった。
事実上、大変、燃えた案件となってしまい、大きく反省することになった案件だった
この案件から学んだこと & 新たな学習のスタート
今、思えば当然のことではあるが、ビジネスとして機械学習を使おうとしようとすると見落としてしまったり、分かっていてもスルーしてしまいがちになってしまうことがある。リスト形式で書き出しておく
- 機械学習は万能ではなく、精度が上がっていかないことも当然あるということ -> 時間をかければ良いというわけではなく、時にはモデルや仕様を見つめ直す必要がある
- そのためにも何をもってモデルの性能を測定するのかを厳密に定義しておく必要があること
- 検証データで得られた精度は必ずしもリリースした場合の精度と異なるため、モデルを納品して保守なしで終わりとなるような状態を作ってはいけない
- 先方に伝えた精度目標は必ずしも達成できるとは限らないため、その目標達成を見据えた同時開発(アプリやweb)を並行してはいけない
- 納品の説明や、定義をフロント(営業)だけに任してはいけない。エンジニアが率先してフロントに立って説明する必要がある
特に多いのがモデルとアプリの並行開発。これは絶対にオススメしない。トラブルの素でしかないし、失敗した場合に責任が取れない。「なぜ精度が目標まで行かなかったのですか?目標の精度を達成するにはどうすればいいですか?(金額と期日の設定)」という質問に責任をもって答えることが出来ないのであれば止めたほうがいい
ここに書いたような知見はゼロから作るDeepLearning
などを読んで何となくは分かるかもしれないが、実際の案件を通じて経験・体験をしないと理解することが難しい。作って終わりではないということと、作成した機械学習のモデルが実際のサービスとして稼働するというところまでを考えると開発者だけの視点では不足していまいがちになる
実際に機械学習の案件として失敗しないために何が必要かということに自分の興味は向いていった。ここで__「仕事ではじめる機械学習」__を購入し、熟読した。
まさに本のタイトル通り、仕事で機械学習を扱うために何を考えればいいのかというノウハウが詰まっていた。
営業に同行するように
丁度、この時期に機械学習に取り組んでくれる社員(Tくん)が1人増えた。Tくんがもともと、理論物理学を専攻していたというハイスペック人材だったので機械学習モデルの実装や開発は彼に任せることにした。それに伴って自分は営業の方に付いて行き
- 要件定義に大きな問題がないか(何がインプットで何がアウトプットか)
- 無茶苦茶な要求や精度設定の回避
- その場で投げかけられる技術的な質問への回答
という話をするようになった。そして、持ち帰った話をTくんに展開して、実装をする上での問題はないのか、精度の設定ラインは取り組もうとしているジャンルが類似の最新の論文の精度とかけ離れていないかを確認するようにするサイクルを作った。このサイクルを作ったことで、大きな要件定義のミスや無理な精度設定をするようなことはなくなった。
また、合わせてアプリと機械学習モデルの並行開発は先ほど説明した通り、かなり地雷であるため、チャレンジングな機械学習案件を受けるときは必ず、PoC
という形で受けるようにした。アプリに組み込むのはそれからですよという(これは先方にとっても余計なお金をかける危機を回避できる)話を必ず通すようにした
このサイクルが生み出した弊害
炎上を回避するために作ったサイクルだが実は弊害もある。一言で言ってしまうと__案件がスタートするまでに期間が遅くなってしまうということ。__以前であれば、多少、無理があったり、おかしな要件定義がされていてもOKを出して案件をスタートしていたため、当然比較すればスピード感は落ちてしまう。
また、要件定義を進める中で先方が仕様を固めていないことが分かることがよくあった。「ここはどのように進めますか?」という話をするとレスポンスがなくなったり、返信が何週間も後になるということもよくあった
しかしながら、これは炎上を回避するためには仕方のないことだと思っているが、どうしても営業サイドとの衝突は発生してしまう
久しぶりのモデル開発案件
しばらくながら営業と先方とのやり取りを行なっていたが、機械学習の開発陣が足りなくなったため、モデルの開発に戻ることになった。今回の案件はDoc2Vecを用いて類似の質問を検索するモデルの作成を目指す。
この案件はPoC
という形で受けていた。今回の改善としてモデルの精度の推移や進捗をレポートを用意して指定期間ごとに納品するという形を採用した。これはPoC
だからといって、「ダメでしたー」という納品で終わらせずに、精度が出なかった場合であっても__なぜその結果になるのか__という結果と考察をレポートという形で渡すことで失敗を失敗で終わらせないということを目指す
最終的な結果としては良い結果は出なかった。一番の要因は学習に用意できたデータ数がかなり少なかった(独自データが4000件程度)という点とデータの種類が広すぎる可能性があると考察した。レポートがなければ「なんでこんな結果なんですか?」と燃える可能性が当然あったが、レポートを都度、納品していたため、回避することができた上、次の案件の話を頂くことが出来た
これが私が参加した最新の案件であり、今はwebの開発の方に参加する便利屋状態になっている
webの開発に参加して機械学習の現場から少し距離を置くことになった
機械学習の案件よりもweb開発の案件の数が多くなってしまい、今度はweb開発の方で人手不足になってしまったため、web開発に回されることになった。web開発の詳しい話は省略するが、期間も長くしばらくは機械学習の案件に戻れる様子ではない。
その一方で機械学習の案件の相談、依頼は増えてきている。結果的に多くなった案件を早くさばこうとして、私とTくんを通さずに提案書や企画書が回るようになってしまった。これは先ほど話したサイクルが生み出した弊害を回避するために自然とそうなってしまっているが、内容的に無理があったり、検証の方法が定まっていなかったりと心配になる部分も多い
やはり、フロントと先方の間には少なからず、機械学習で何が出来て何が出来ないのか(難しいのか)を理解しており、精度検証の方法まで(何の値を持って良しと判断するのかetc)を決定できるような知識が必要だと実感している
最終的に伝えたいこと
機械学習の勉強というとkaggle
をやったり、自分でモデルを作ってみるような進め方が一般的だと思う。機械学習をやってますよという方も上記に当てはまる方が非常に多い。しかしながら現場に必要とされている知識には今回、説明したようなものもある。
このような知識は現場で活動しなければ理解することは難しいが、機械学習のベースの知識が必要不可欠なので営業の方に任せることが難しい。
とはいいつつも、エンジニアは営業に同行して説明をするような作業を嫌う方が多いため、さらにエントリーできる人は減る。自分は機械学習の素養がもともとあったわけではなく、モデルの実装には面白さを感じることが出来なかった。しかしながら、先方から頂いた課題を機械学習を使って解決する(一番良いのは機械学習を使わないこと)ためにどうすれば良いのかを考えたり、討論することに面白さを感じることが出来た。
今後、生存戦略の1つとしても、同じようなキャリアを進んでいく方の参考になればと思います。