Feedforce Developer Blog

フィードフォース開発者ブログ

新卒機械学習エンジニアがAI Quest2020に参加しました

この記事は Feedforce Advent Calendar 2020 の 4 日目の記事です。

昨日はますたかさん優先度より優先順位のほうが偉いでした。優先度をつける時って高高高高高高ってなってしまうのわかります...。

では、本題。

今回AI Questという長期のプログラムに参加しました。そこで実際に行ったことや、学んだことを記録として残したいと思います。 AI Questに参加してみたいと思っている方は、是非参考にしてください。 (事実を列挙しただけなので読み物としては、面白味が少ないです...)

先に書いておくと

長文失礼しました

自己紹介

私は、2020年に株式会社フィードフォースに新卒で入社した八百です。データ分析チームで機械学習エンジニアとして、業務に携わっています。 大学では、YOLOv2を用いて360度カメラで撮影された画像の物体検出を研究していました。最近、金魚を飼い始めました。 twitter.com

参加したきっかけ

弊社のデータ分析チームには機械学習経験者が私しかおらず、その私も学部で機械学習の卒論を書いた程度の知識しかありませんでした。そのような状態で社内のプロダクトにいきなり機械学習を導入するということがとてもハードルが高く、実際どのような工程を踏んで進めたら良いのかわかりませんでした。

そんな時に上司の加藤さんがAI Questというプログラムを紹介してくださいました。

AI Questは、参加者同士が学び合い、高め合いながら AI活用を通した企業の課題解決方法を身につけるプログラムです。

面白そうだし、現在抱えている「どのようにして機械学習をプロダクトに導入したら良いのか」という疑問が解消できる良い機会だと思い、応募しました。

アセスメント課題を解く

参加するにあたり、まずは自身のプロフィール(志望動機など)を提出し、その後アセスメント課題というものを解きました。このアセスメント課題は、任意課題となっていましたが、やった方が合格率が高いのではないかと思い、挑戦しました。(実際のところどうなのかはわかりません。)

内容としては、「民泊サービスにおける物件データを利用した宿泊価格予測モデルの作成」でした。基本的にはkaggleのようなコンペ形式でファイルを提出するとスコアが返ってくるというようなものです。また、それらのスコアは参加者全員に公開されており、参加者全体のうち自分がに何位なのかということを確認することができます。

私はこれまでNNしか扱ったことがなかったので、NNを用いて宿泊価格を回帰しました。しかし、思ったようにスコアは向上しませんでした。その時は精度が上がらない原因は、モデルにあるだろうと勝手に決めてしまって、モデルの最適化ばかりに時間を使っていました。(ネットワーク構造を変更してみたり、optimizarを調整してみたり)

それでもスコアは向上せず、アセスメント課題の締め切りの日数がだんだんと迫ってきていました。焦りを感じた私は、大学の頃にお世話になっていた先生に連絡を取り、相談してみました。

すると、「コンペは、入力データチューニングすることによってスコアが上がる」ということを教えていただきました。

大学の卒論では画像処理を行っていたので、入力データをチューニングする???って感じでしたが、kaggle notebookや様々な方のブログを通して、Data engineeringというものを知りました。

そこからは様々なデータ加工をkaggle courcesという無料の学習教材でData engineeringを学習し、実践してみました。

その結果、無事AI Questに参加できるということが決定しました!!

f:id:newton800:20201201154012p:plain

メールが届いた時は社内のいろんな人に自慢したい気持ちでしたが、弊社はほとんどの方がリモートワークなので席が近い複数の人に自慢したと思います。

また、業務時間を用いてAI Questに挑戦してもよいということだったので、ここで落選してしまうと、、、って感じだったので良かったです。

そこからは、AI QuestのSlackに招待されたり、SIGNATEアカウントを作成したりちょっとした雑務をやる感じでした。その中でも重要なのが、どのコースを受講するかを選択するところです。

AI Questは大きく2つのタームに分かれていて、それぞれのタームごとに個人が参加したいコースを4つのうちから1つ選ぶというものです。

ちなみに第一タームの4コースは以下のようになっていました。

f:id:newton800:20201201154054p:plain

弊社は広告配信するためのフィードを作成しているプロダクトがあるので、自動的に最適な価格に変更できたらより良い広告配信に携われるのではないかと考えてPBL_02の小売価格最適化を選択しました。

AI Questが始まった!!

初回は、開会式と今後のについての説明をZoomで行いました。そこでアイスブレイクとして参加者同士で、自己紹介を行う時間が用意されていました。

今後の流れとしては、ビジネス課題、AI課題、最終課題の3つのフェーズで区切られて、それぞれのフェーズごとに期限つきの課題が課せられるというものです。

ビジネス課題を解く

第一課題では主に要求定義、要件定義を行いました。私は新卒ということもあり業務上、そのようなことをやった経験がなく、ビジネス課題を通して新しい知識を身に付けたいと思っていました。

課題の詳細としては以下のようなものです。

  1. 要求定義
    1. 必要な情報の洗い出し、情報の取得応報の検討
  2. 要件定義
    1. AI化業務の具体化、PoCにおける要件定義項目の検討
    2. 2.1で検討したPoCにおける要件定義項目ごとの要件検討

といった感じです。

まずPoCという言葉を初めて知りました。

PoCとは、Proof of Conceptの略で、「概念実証」という意味です。新しい概念や理論、原理、アイディアの実証を目的とした、試作開発の前段階における検証やデモンストレーションを指します。

なるほど。開発する前の試行錯誤のことをPoCというのか...といった知識レベルでの参加でした。

ここは、自身で考えたものを提出することで、模範解答がダウンロードできるので、模範解答と自身で作成したものを比較することで、何が足りていなかったのかを確認する事ができました。

この時私が学んだこととしては、まず機械学習を導入するにあたりどれくらいの精度または利益が生まれることを想定しているのかを事前に相談しておく必要があるということです。 クライアントが機械学習への期待が高すぎると、実際に完成しても「それだけしか効果ないんですか?」みたいな感じになりかねないです。そのためにまず初めに、効果として具体的な目標数値をすり合わせておく必要があります。 また、ヒアリングで聞いておいたら良いことや、モデル作成のために行わなければいけない工程を一通り体験できたのは、良い経験になったと思います。

AI課題を解く

私はPBL_02の小売価格最適化を選択していたので、粗利が最大となるように約700個の商品の価格を決めるという課題でした。

また、提出回数は24回と定められており、この24回というのは6ヶ月×4週間ということを意味しています。そのため、6ヶ月間かけて週ごとのデータを用いてPoCを実施しているということですね。

そして最終的な粗利が最大となった人がコンペ形式で入賞するというものになっています。

データ収集編

今回の課題で面白いところは、最初のデータは各商品につき一つずつしか存在していないということです。なんというデータ管理なんでしょうか...

最適な価格を予想するとなると、各商品ごとに様々な価格で販売して、どれくらい売れたかのデータがすでにあることを想定していましたが、まさかの一個でした。

言葉ではデータは伝えにくいので図示すると以下のような感じになっています。

f:id:newton800:20201201154140p:plain
私がイメージしていたデータ構造

f:id:newton800:20201201154215p:plain
実際に配布されたデータ

あれ?これ最適価格を予想できなく無いか...??

三日くらい、これどうやったら最適価格を作成できるんだと悩んでいました。

しかし、ここで一人で悩むだけで終わらないのがAI Questです。同じ課題を解いている人がたくさんいるので、他の人に聞けば良いのです。

AI Questでは毎週土曜日にサロンと言って参加者同士でコミュニケーションをとり、現在悩んでいることや解決の糸口の共有などを行う機会が設けられていました。こちらは自由参加で予定が空いている人が参加するという感じになっています。

このサロンでどのようにして最適価格を予想しているのか、他の人に聞いてみると、以下の解答が得られました。

「今回の課題は、予測価格を提出するといくら売れたかのフィードバックが得られます。そのため、初めは適当な数字で価格を設定して提出すると、データが増える。」

ということでした。

なるほど。最初はデータは一つしかないが、提出回数の24回の内の何回かはデータ集めのために適当な価格で提出する必要がありました。

データ集めのイメージとしては下の画像の感じです。これらを複数回繰り返すことで機械学習に必要なデータを収集していきました。

f:id:newton800:20201201154251p:plain
データ収集のイメージ

また、適当な値といっても、ランダムな値を入力すると24回の提出を無駄にすることになるので、各商品の(原価×X)円というものを3回ほど行い最初のデータ収集を行いました。

売り上げ個数予測モデル作成編

次に売り上げ個数を予測するモデルを作成しました。粗利最大化するのに売り上げ個数を予測する理由は、粗利 = 販売個数×(価格 - 原価)なので、価格を入力として販売個数が出力されるモデルを作成すれば、粗利が最大となる各商品の値段がわかるからです。

ここでは各商品ごとの属性データ(レビューや商品のサイズ、商品説明文の長さなど)と価格を入力することで売り上げ個数を予測するモデル(xgboost)を作成しました。

この時、最適と思われる価格とその価格を提出した際に得られるフィードバックデータでデータ数がどんどん増えるので、予測精度は向上していきました。また、それに伴って粗利も向上していました。

しかし、途中から精度、粗利が横這いで停滞してしまった時がありました。その時は、モデルを見直したり、他の予測モデルと組み合わせてみたりと様々なことをして粗利向上を目指しましたが、効果は得られませんでした。

複数回粗利改善が失敗した時に、さすがに提出データがおかしいのではないか?と思い始め、改めてこれまで提出したデータとそれによって得られていたフィードバックを確認してみました。すると!!!

f:id:newton800:20201201154320p:plain

同じ価格で提出しているではありませんか!!! すでに既知の価格で提出することは、その価格での販売個数はすでにわかっているものになるので、無意味な提出となってしまいます。

このようなことを複数回にわたって行ってしまっていたので、精度は上がらず、粗利も停滞してしまいました。 もう少し早めにデータ全体を確認しておけば、防げたミスだったので、データの確認を怠ってはいけないということを学びました。

ルールベース編

ここからはルールベースを用いて最適価格を求めていきました。この段階で改めてこれまでフィードバックで得られたデータを元に各商品ごとに価格と粗利をプロットして状況を確認しました。 その結果大きく2種類の粗利曲線に分類できることがわかりました。

f:id:newton800:20201201154407p:plain
画像a:粗利最大点が定まってきている

f:id:newton800:20201201154449p:plain
画像b:粗利最大点が見つかっていない

上の画像(画像a)では大体粗利最大の位置が定まってきています。下の画像(画像b)では、まだ粗利が最大点は見つかっていないようです。

これら2パターンに場合分けを行い、それぞれにルールを用意することで次の提案価格を探索していきました。

画像aに対する次の提案価格を探索するルール

画像aのようになっている商品ではある程度、粗利の最大点がわかってきているので、現在粗利が最大となっている箇所の付近から探索しました。その方法としては、現在粗利が最大となっている価格点から両隣の価格点で間が広い価格との真ん中を新たな価格とするというものです。 言葉で説明しても伝わりづらいので、図示すると以下の感じです。

f:id:newton800:20201201154534p:plain
ルールベースで粗利が最大となる価格を求めるロジック

価格点の差が大きい箇所の方が、探索が不十分であるという仮定のもとで成り立っています。

画像bに対する次の提案価格を探索するルール

画像bの場合は、まだ最大点が見えていないので、価格と粗利の関係を二次回帰で曲線を引き、最大点となる価格を探索していきました。

ここで24回の提出が終えたという感じです。 結果は.... f:id:newton800:20201201154621p:plain

17位でした... 70人参加していたので25%には入ったという感じでしょうか...

早めに同じ価格で提出して無意味なフィードバックを得ていることに気がついておけば...と後悔が残る結果になってしまいました。

この課題でAI課題は終了です。 AI課題を振り返ってやって良かったと思うことは、毎週サロンに参加したことです。サロンでは、自分一人では思いつかないようなアイデアを誰かが持っていたり、それらを共有し合うことで次のステップが見えてきたりします。見学しているだけでも楽しいので、とりあえず参加して見るのも良いかもしれないです。 また、土曜日の昼過ぎのゴールデンタイムに開催されていたので、用事がある時などは、中抜けしたりもしていました。。。

そのほかにも、実務では挑戦していなかった新しい手法にも挑戦することができました。これまでアンサンブルで予測モデルは作成したことがなかったんですが、作成できるようになったり、Optunaでパラメータ調整に挑戦することができたのは良かったと思います。(Kaggleでも学べますが...)

逆によくなかったと思うこともあります。それは、データの確認とゴールまでの経路を考えるということです。 データの確認に関しては、分析着手する際はかなり入念にやっていたのですが、フィードバックデータが増えてから、データの確認を行わずに進めてしまっていました。そんなこともあり、同じ価格で提出してしまうという凡ミスをしてしまいました。データは定期的に確認しないといけないということを学びました。

もう一つは、ゴールまでの経路を考えるということです。PoCの実施なので右往左往することもありますが、私の場合は無計画すぎたと思います。特に今回は24回しか検証できないので、どこまでデータを集めて、どこまで機械学習を使い、どこからルールベースでやるのかといった大まかなロードマップは作成しておいた方が良いと思いました。これは、少なからず経験も必要だと思うので、あと何回でこの精度まで持っていくという目標を持ちながら、日々の分析業務を行っていきたいです。

最終課題を解く

最終課題では、これまでPoC結果を元に、実企業での意思決定の場を想定し、本番実装の意思決定をしてもらえるようなプレゼンテーション資料を作成するというものです。

そしてプレゼン資料を作成し、提出すると次は他の参加者が作成したプレゼン資料を評価するというものでした。他の参加者の資料を見るまでは、自分のプレゼン資料はそれなりにわかりやすいと思っていたのですが、他の参加者のスライドを拝見して自身のスライドの未熟さに気がつきました。

今回参加されている方々は、社会人歴が私よりも長い方が多かったので、実業務をやっている上で身についていることも多いと思います。また、他の参加者の方が作成したプレゼンをレビューすることで現在の私と何が違ったのかを何が足りなかったのかがわかったので良い経験になりました。

具体的に私自身のプレゼンが何が良くて何が足りていなかったのか振り返って見たいと思います。

よかったところ

事実は簡潔にわかりやすくかけていた 今回のプレゼンは、経営者向けのプレゼンなので機械学習の仕組みを解説することよりも全体的にどう動いているのかや、導入することでどれほどの粗利改善効果が見込めるのかといった、これまでの分析・予測から結果がはっきりしているものについては、丁寧にわかりやすく記述できていました。 また、ヒアリングで得た内容や業務フローの変化についても事実としてすでに出ていたものなので、まとめられていました。

足りていなかったところ

事実としてまだ取得されていない情報が一切記載できなかった。粗利改善効果などは計算から求めることができたが、価格設定の工数削減割合や、業務の属人化が解消が期待できるなど、分析・予測から導き出せない効果が記載できなかった。工数の削減目安などは、業務を通して得られるものなのか、それともなんらかのロジックがあるのかといった解説がなかったのでそれらをどのように算出したのかは気になりました。

次に足りていなかったことは、導入を検討する場合の予算の話です。これらもどのようにして計算しているのかは謎ですが、初期費用として???円、継続運用するのにかかる費用(サポート代)として???円などのような記載が足りていませんでした。確かに意思決定する場合は、予算の話があった方が導入判断は容易になるだろうと思います。

また、予算に伴い今後プロジェクトを進めていくスケジュールも記載できていませんでした。ソフトがいつぐらいで完成して、そこから運用に定着するまでにどれくらいの期間が必要なのかも意思決定する際にはあった方が良いなと気がつきました。

上記3つのことが足りていなかったことです。これら全てに共通して言えることは、分析・予測から求められない見込みが記載できていなかったということです。何を持ってその見込み計算を行っているのかはわかりませんが、見込みが足りていないということがわかったので、今後資料作成の際には、先輩方に頼りながら見込みの記載方法も勉強していきます。

第一タームを振り返る

第一タームを振り返り、「どのようにして機械学習をプロダクトに導入したら良いのか」が解決できたのか。 機械学習モデルの作成する前のフロー(要件定義・PoC計画)とモデル作成後のフロー(スライド作成)では、フィードバックや他の参加者の方の方法を参考にすることで、自分自身に何が足りていなかったのかを学ぶことができました。ただ現在は、足りていないことに気がついた段階で、実践はできていない状況です。これらの足りていなかった部分を第二タームや業務で実践することで、身につけていきたいと考えています。

具体的な行動としては、 1. モデル作成前に目標数値を定める 1. PoC計画を緻密に立てる(あくまで試行錯誤なので柔軟性は忘れてはいけない) 1. プレゼン資料には、事実だけでなく、見込みも記載する

明日の Feedforce Advent Calendar 2020 は、いくみんさんが「9月からダラダラと書き終わらなかったやつを納めます...」ということなので、楽しみですね。