Atrae Tech Blog

People Tech Companyの株式会社アトラエのテックブログです。

第1回 アトラエML / DL勉強会 最終課題 まとめ(2)

f:id:atrae_tech:20210802114317j:plain

本記事はこちらの記事の続きとなっています。

(1) Yentaのユーザー同士が「会ったかどうか」判定するモデルづくりをしてみた

自己紹介

新卒3年目の夢積です。普段はYentaというビジネスマッチングアプリAndroid、Webフロントを担当しています。最近はKMM(Kotlin Multiplatform Mobile)の学習を進めていたりします。

今回この分析を行おうと思った背景ですが、Yentaではユーザー同士が会ったかどうかのデータは収集していません。しかし、それを間接的に予測できる機能が誕生すれば今後のグロースハックにも活きてくるだろうと今回の分析を行いました。

分析

今回は機械学習のロジスティック回帰、決定木を用いてモデルの生成を行いました。

目的変数

モデルを生成する上で、目的変数として「会った」とするデータを用意する必要がありますが、上述のようにそのようなデータは収集していません。そのため、類似のデータを利用する必要がありました。

今回は、ユーザー同士がレビュー機能が存在するため、マッチングしたユーザーのいずれかがレビューを行なっていれば、ユーザー同士は「会った」と仮定し、それを目的変数として分析を行いました。

説明変数

マッチングしているユーザーそれぞれの以下のデータを説明変数として利用しました。

  • 片方のユーザーの年齢
  • ユーザーの年齢差
  • それぞれのユーザーの被右スワイプ率
  • それぞれのユーザーが送ったメッセージのカウント

データの分布

モデルを生成する前に、 年齢 x 年齢, 被右スワイプ率 x 被右スワイプ率, メッセージ送信数 x メッセージ送信数 という切り口で、それぞれ マッチングカウント, レビューが行われたマッチングカウント, マッチングカウントに対するレビュー率が行われた率 をそれぞれ算出し、分布を可視化しました。

事業に関わる分析結果のため公開できませんが、下記のような図がイメージです。

マッチングカウント

f:id:muttsu_623:20210801230133p:plain

レビューが行われたマッチングカウント

f:id:muttsu_623:20210801230130p:plain

マッチングカウントに対するレビュー率が行われた率

f:id:muttsu_623:20210801230126p:plain

これを行うことにより、とある変数とそれぞれのデータがどのような関係にあるのかを目で理解をすることができました。

モデルの作成

上述した説明変数と目的変数を用いて、 ロジスティック回帰、決定木それぞれのモデルを作成しました。

今回のモデル作成で面白いことは、教師とするインプットデータの中に変数がほぼ同じでも「会った」というデータと「会っていない」というデータが存在することです。

上記の色の付いた図からもわかるように、同じ値同士の組み合わせの中でも「会った」データと「会っていない」データが存在し、とある値を超えたもの同士の組み合わせであれば マッチングカウントに対するレビュー率が行われた率 も高まっていることがわかります。

以上のことから、少ない「会った」とされるデータと大量の「会っていない」とされるデータを学習させて、「会った」かどうかを予測するという半教師あり学習という手法を用いて分析を行いました。

成果

詳細な結果の公開は控えさせていただきますが、結果としては今回作成したモデルを用いると、実際に「会った」と判定されるものが大量に削ぎ落としてしまい限定したデータのみがあったとされてしまうため、このモデルを実運用することは控えました。

今回のモデル作成により発見した面白いこととしては、とある変数の組み合わせが「会った」かどうかを予測する変数として寄与していたことがわかりました。そしてその変数は、元々Yentaチーム内で「会った」と判定していたロジックでまさに利用していたものでした。

つまり、

  • 今回機械学習を用いて作成したモデルよりも、Yentaチーム内で考えていたロジックのほうが「会った」と判定する上で優れており
  • どちらも同じ変数が「会った」かどうかを判定する上で影響が大きい

ということが今回の学習を通してわかりました。

感想

学習を始める前までは漠然と、精度が良く今までには発見できなかったことが機械学習を通して発見できるのではないかと考えていましたが、そんなことはありませんでした(笑)

それよりも元々自分たちがユーザーやサービスのことをよく把握して作っていたロジックの方が、機械学習を通して作成したものよりも優れている。もしくは、優れているまではいかなくともそこまで大きな差は生まれないこともあるということでした。

データ分析に対して漠然としていた不安や期待は晴れ、適切なシチュエーションで適切な手法を用いることでサービスづくりをよりいいものにできるということを改めて学ぶことができ、本当にいい機会だったと思います。

(2) DLで将棋AI作ってみた

自己紹介

新卒2年目の岩澤です。普段はYentaというビジネスマッチングアプリでバックエンドエンジニアをしています。趣味が将棋で今回の最終課題では「自分より強い将棋AIを作って指導対局してもらおう」をテーマに取り組みました。

将棋AIについて

最近ではDLを使った将棋AIがコンピュータ将棋の大会でもかなり好成績を残すようにはなっていますが、機械学習を用いたAIと対等以上に戦うことができるようになったのは2017年以降のことです。今回はその機会を作ったGoogle DeepMindのAlphaZeroの仕組みを踏襲して将棋AIを作っています。

今回の将棋AIの特徴

今回の実装は上記のようにAlphaZeroを見本とし実装しました。特徴としてはAI同士の自己対局の結果を訓練データとして学習を行う、手を評価する際に実際にプレイを行うのではなく価値ネットワークと言われるものに基づいて評価する、ニューラルネットワークの構成はResidual Network(ResNet)であるなどです。

特に重要なのは方策ネットワークと価値ネットワーク、探索アルゴリズムです。

方策ネットワーク

局面を数値化して画像として入力し着手の確率を出力するニューラルネットワークです。局面全体を入力とすることで大局感的な判断ができます。今回は方策ネットワークを探索の優先度順位制御に利用しています。

価値ネットワーク

局面を画像として入力し勝率を出力するニューラルネットワークです。強化学習により改良した方策ネットワークを使って自己対局を行いその勝敗結果を学習データとして学習します。これにより事前に勝率を学習することができるので手を探索する際に実際にプレイを行う場合の実行時間を削減できることに加え、探索時のプレイの質に依存して勝率がずれてしまうという問題点を回避しています。

探索アルゴリズム

モンテカルロ木探索をベースとして、方策ネットワークによる着手予測の高い手とまだ探索を行っていない手や検討された回数が少ない手が優先されるように設定しています。これは探索する手が偏ってしまわないためです。そして末端まで行ったら価値ネットワークから勝率の平均を計算し各ノードに反映していきます。

実装

今回は棋譜を使って事前に学習させたモデルと自己対局のみで学習させたモデルの2つを作成しました。 GCPGPUの環境を構築しそれぞれの学習期間は事前学習モデルが3日(10万step)、自己対局モデルは1週間ほど(1000step)で学習を行いました。 学習時間としては圧倒的に自己対局のみのモデルの方が時間がかかりました。

学習したモデルが実際に対局可能な状態にするためにはUSIと呼ばれるインターフェイスに乗っ取り出力をするようにエンジンを実装する必要があります。

作成したエンジンを「将棋所」というGUIの将棋ソフトに登録して対局を行いました。

成果

結果は事前学習モデルでは序盤定跡と呼ばれるような指手も多くみられ、人間から見てもかなり強くなっていました。一方自己対局のみで学習したモデルは意味のない手や飛車などの大駒のただ捨てなどの手もまだ見られ、素人でも勝てるくらいの強さにしかできませんでした。

序盤の対戦画面
序盤の対戦画面

今回取り組みが1ヶ月ほどであったことや、GPUのスペックも費用面の懸念から高くはなかったため、自己対局だけでは十分な対局データが集まらなかった可能性や評価関数の学習が十分でなかった可能性が高いと考えられます。

事前学習モデルでは元々将棋所と一緒にダウンロードできるLesserkaiというコンピュータ将棋に勝利を収めるくらいには強化されました。

Lesserkaiに勝利した結果画像
Lesserkaiに勝利

今後の展望

今後の課題や検証としてはもっと学習回数を増やしたり、プレイアウトの回数を増やし、より深くまで探索するなどを行った場合にどのくらい強いモデルを作ることができるのか、事前学習なしモデルは事前学習ありモデルをいつ越えるのか、ということを検証していこうと思っています。

また自己対局のみでの学習を続けていった場合にどれくらいの学習量で定跡と言われる手を指すようになるのか、またはならないのかも気になるところです。

将棋部の誕生

このように僕の趣味で始めた将棋AI作成でしたが、社内に他にも2人興味を持ってくれてこの課題の後にも一緒に将棋AIを作る仲間ができました!!! CTOの計らいで高スペックのGPU搭載コンピュータも社内に置かれることになったので今回課題だったスペックや費用面の問題も解決し、あとは実装するのみ!! 将棋部で部員それぞれで将棋AIを作成し「将棋wars」というコンピュータ将棋の大会も開かれることが決定しているので引き続き取り組んでいくとともに、いつかは社外のコンピュータ将棋の大会にも出場するという目標を掲げています。

軽い気持ちで参加した勉強会でしたが、AIやその実装方法に対する理解や興味が深まりとても楽しかったです。今度はこれを社内社外ともに還元できるよう邁進していきます。お読みいただきありがとうございました。

さいごに

このブログでは、夢積と岩澤による分析をお送りしました。

こんな感じで、Atrae は AI-Ready 化を進め、次の時代の世界を中心から作っていける会社になってやろうと目論んでおります。 一緒に働いてみたい方、 welcome です!! 興味があればこちらからどうぞ!

atrae.co.jp