れぞんでーとる

すりつぶされたりせんぞ

「しょくぱにすと」の機械学習エンジニア経験を紹介

しょくぱにすと
2020/3/1 (更新: 2020/5/21)

ども、しょくぱにすとです。

4月からフリーランス(このままだと無職)になるので、 今までやってきたことを振り返りながら、案件取得のためのスキルアピールを整理しています。

機械学習のスキルや経験に関して詳しく書けていなかったので、今回ここでご紹介します。

ちなみに、お仕事募集しておりますので、ご依頼をお待ちしております。☺ (ご連絡はtwitterから -> @syokupanist)

どうやって機械学習エンジニアになったか。

就活時の話からしますね。

学部3年の頃は、web系の企業を探していて、ITエンジニアとして就職することを考えていました。

当時は研究もしたことがなかったので、専門知識を活かせるような仕事に就くことは考えられず、 趣味のアプリ開発の経験をアピールして、なんとかwebエンジニアになることができました。

入社した後しばらくは、webエンジニアとしてサーバーサイドとフロントエンドを担当し、幅広く経験させてもらえました。

業務に慣れて余裕が出てきた頃、業務外の時間にサービスデータを使って機械学習モデルを検証し、その結果について社内SNSにアウトプットするということを何度かしていました。

また面談でも、機械学習やりたいアピールを継続していところ、機械学習・レコメンド系プロジェクトが発足する際に、運良く声をかけてもらえたという経緯です。

非常に恵まれた職場環境であったからこそ、業務でも機械学習に携われるようになりました。

機械学習エンジニアとして業務でやってきたこと

機械学習を導入するまで

機械学習・レコメンドシステムに関わるエンジニアになれたは良かったが、機械学習の理論を深く理解しているというわけでもなかったので、始めは不安でした。

また、裁量が大きい分業務は細分化されていなかったため、機械学習専任で携わるというよりは、少し余裕がある時に他の業務と並行して、モデルの検討や開発を少しずつ進めていました。

あくまで業績につながる数値を向上させるためにプロジェクトがあって、その中で手段として有効であれば、機械学習を用いるスタイルです。

そのため、プロジェクト開始直後は、ルールベースでロジックを調整したり、UI改善、データ基盤整理などをメインでおこなっていました。

一通り整った後に、モデル自体の精度を向上させたいという話があがりました。 そこで深層学習を用いたレコメンドモデルの検証に関わらせてもらえました。

深層学習を用いたレコメンドモデルの導入

はじめに手をつけたのは、深層学習を用いたコンテンツベースのレコメンドです。

協調フィルタリングのシステムがありましたが、 コールドスタート問題にも対応したいとのことで、 コンテンツ情報を柔軟に扱える深層学習を使ったモデルを導入することにしました。

複数のコンテンツ情報(メタ情報やテキストラベル、画像等)を、ベクトル化してconcatし、 その特徴量を用いたauto-encoderによる次元圧縮モデルを作りました。

これによって、計算量を抑えつつ、コールドスタート問題に対応した新しいレコメンドシステムができあがりました。

単なるチューニングとは違い、ある意味0->1の機能追加であるため、ユーザー体験に直接影響を与えられた点で、達成感を感じられた仕事でした。

レコメンド精度の向上のために、深層学習モデルをチューニング

初めての深層学習モデルの導入がうまく行ったので、さらに精度向上にも活かしていきたいとのことで、 行列分解やBPRに、コンテンツ特徴量を考慮するような改良を加えた、ハイブリッドなレコメンドモデルを検証しました。

VBPRとか、他にも似たようなことをやっている論文が色々見られたので、それらを参考に単純化した実装を行いました。

これに関しては、絶対動くはずの単純なモデルでも思ったとおりに結果が得られない状態が続き、かなりデバッグに苦戦した思い出があります。

一層一層重みを確認して、推論時に部分的に学習済み重みがロードされていないバグを見つけて、原因を特定できた瞬間を今でも覚えています。

最終的にオンラインでの精度は劇的に改善されるということはなかったです。

モデルのチューニングと、実際のサービスでの性能のギャップの問題は難しいですね。

その他機械学習案件の経験

画像判定モデル

アップロード画像がポリシーに違反していないかの画像判定モデルを検証しました。

予測精度自体は9割ほど出ていて、モデル構築自体はうまく行きました。

ただ、求められる精度がやはり9割りでは足りなくて、99%の水準で欲しいという話になり、これ以上進められませんでした。

当時は、議論力・交渉力といったスキルが足りなかったために、実際モデルが使われるまでには至りませんでした。

今ならもう少し上手く事を運べるはずです。

モデル構築力以外の交渉力などの必要性を感じさせられた、個人的に苦い思い出のプロジェクトです。

技術的には、VGGやNASのようなモデルを使用しました。

画像の自動タグ付け

画像から直接タグの推論を学習させるのではなく、学習済みvggの中間層特徴量を用いることで、検証サイクルを高速化したのが工夫点です。

多層パーセプトロンを使った簡単なモデルでしたが、ある程度うまく傾向を考慮した推論が行えるモデルが得られました。

このアプローチはかなり有効で、短時間で結論を出すことができ、うまくいった仕事でした。

趣味で触っていた機械学習モデル

業務時間外で趣味などで試していたモデルが複数あります。

特に、画像生成や画風変換でいい感じの画像を出力することにこだわって、色々検証していた時期がありました。

画風変換

僕が本格的に深層学習をやりはじめるきっかけとなったのが、画風変換モデルです。

ちなみに画風変換を用いたアプリを開発して、一時期公開していました。

魔法のキャンバス

画像生成

自動着色に興味が合って、GANを色々試しながら勉強しました。

  • DCGAN
  • cGAN
  • style2paints v1
  • CartoonGAN

画風変換-画像生成技術の検証

TODO: 論文リンクと簡単な解説を追加

アニメ顔画像認識

openCVの公開モデルで既にできることは知っていたのですが、 ディープラーニングで、自分がアノテーションしたデータセットで、同じことができるのか試してみたくてやりました。

モデルは単純なCNNで、矩形領域を表す座標2点を出力する形式です。

(TODO: 詳細追記)

セグメンテーション

同じく、自分がアノテーションしたデータで学習できるのかどうか試してみたくて、かなりざっくりと試してみました。

モデルは簡単なUネットで、入力画像に対して、セグメンテーションのマスク画像を出力する形式です。

(TODO: 詳細追記)

深層強化学習

強化学習のQ-learningだけは以前試したことがあったのですが、深層学習とどう組み合わせるのか、仕組みが気になったので、実装してみました。 openAI gymを簡単に試してみました。

強化学習について興味が高まったので、さらに勉強しようとしていますが、なかなか難しく進んでいません。時間があるときに本格的に理解したいです。

DQNの後に、A3CやR2D2など面白い名前の論文が出ているので、それも自分で実装したいと考えています。

将来的には、自動取引に応用することを想定しています。

AIによるFX自動取引プログラムの実装を考えてみた

しょくぱにすとの機械学習エンジニアとしてのスキル

少し抽象的に自分の機械学習スキルについて、まとめてみると↓以下のような感じになりました。

  • 専門的な数学力がないので、数式や深い理論を理解する能力は低め。
    • これからどんどん強くしていきたい部分
  • 英語論文を読むスキルはある。英語が好きなので、機械学習系の論文に関しては、英語のまま読むのが苦ではない。
  • 限られたリソース(計算資源、時間)の中で成果を出す力
    • メモリを節約するコード、高速化を意識したコード、モデルの簡略化や応用
  • やりきる根気強さ
    • 実装面で躓いた際のデバッグ経験が複数あるため
    • 全然再現できない場合でも、デバッグし続けて、最終的には成功させた。
  • サービスに組み込む実装部分も一貫して担当できる。(サーバーサイド、フロント、効果測定)
    • インフラ構築の業務経験がないのが弱点。

まとめ

以上が現時点での僕の機械学習エンジニアとしてのスキル・経験になります。

実務での機械学習使用経験が多少あるので、 プロジェクトを進める際のノウハウや、サービス組み込みを前提としたモデル実装方法に関して知見があるかと思います。

逆に、機械学習の理論的なバックグラウンドに自信がないため、これから勉強して補足していきたいです。 (繰り返しになりますが、これがフリーランスになった目的の一つ)

© 2017-2019 れぞんでーとる All Right Reserved.