見出し画像

機械学習 in REALITY - REALITY Advent Calendar #09

REALITY Advent Calendar 9日目担当のうすぎぬです!機械学習詳しそうなサムネは作ったものの本当は何も分かりません!!!!助けて!!!!!

本記事は機械学習何も分からんけど興味はある!挑戦したい!という人向けの記事になっております。一部サーバサイドの知識が必要です。

具体的にはGCPの機械学習周りのサービスの紹介になります。
・BigQueryML
・AutoML
・Vertex AI

それではいきましょー!

機械学習(ML)について

MLは「データから規則性や判断基準を学習し、それに基づき未知のものを予測、判断する技術」の総称です。
https://www.soumu.go.jp/ict_skill/pdf/ict_skill_3_5.pdf

詳しい説明は割愛しますが、特に人間にも容易にロジックを組み立てられるような分析器ではなく、依存する変数が非常に多いなど人力ではなかなか構築が難しい分析器が必要な時などに利用したいものです。

一般に、MLはしっかり理解するためには学習コストが高い分野と言われています。しかし、最近は難しいところをすっ飛ばして手軽にMLを利用できるサービスが登場しており、今回の合宿ではそれらをREALITYに絡めてお試ししてみた、というわけです。

今回の目標

MLというと鉄板のテーマは「売上予測」「レコメンデーション」「画像識別」などが挙げられます。鉄板通りにREALITYの来月の売上予測をするのもいいかとは思いますが、今回は合宿のお祭り感に乗じて「REALITYに絡めたやや挑戦的なテーマ」に臨みたいと思い、合宿中のテーマは
・アバターの可愛さを評価する
・アイコン画像の評価をする
にしました。

より具体では
・ML modelの作成
・ML modelの利用
・ML modelの公開
の3つをクリアすることが目標になります。

特に、ML modelの作成には
・BigQueryML
・AutoML
ML modelの公開には
・Vertex AI
を採用しました。本記事ではその辺の紹介をします。

画像13

BigQueryML

BigQueryはGCPのサービスの一つで、ビッグデータを手軽に扱うためのデータウェアハウスです。GCPではBigQueryMLとしてBigQuery上のデータを元にML modelを生成するサービスが提供されています。

REALITYは分析ログ基盤にBigQueryを採用しており、今回必要になるであろうユーザのアバター情報を事前に保持しています。今回はそれらアバターデータログを活用しML modelを生成します。目標は前述の通りアバターの可愛さを評価してくれるML modelを作ることです。

今回のシチュエーションには「教師あり学習」が適しているため、アバターデータの他に可愛さを評価する指標が必要です。やや挑戦的なテーマを選んだとはいえ、可愛いアバターとはいったい何なのだろう、ということを考えるのに一番時間を費やしました。
・フォロワーが多い人はかわいい?
・いいねをたくさんもらった人はかわいい?
はたまた
・「かわいい系ギフト」をたくさんもらったユーザがかわいい?
など、むくどりんさんにも考えてもらいつつなかなかピンとくるかわいいを定量評価できる指標を見つけられません。

ML modelで一番時間を費やすところは学習元データの整形と言われています。良い機械学習モデルを作成するのは一筋縄では行きませんね。今回の学びです。

時間ないしとりあえずML modelを作っていくぞ!!!

詳しいところは割愛しますが、とりあえずアバターデータと教師データを突っ込んだテーブルを作ります!
実際に作成したBigQueryテーブルのイメージ図です。

画像2

さて、ここからはML modelを作るわけですが、学習データの準備とは打って変わってBigQueryMLでML modelを作成するのは非常に簡単です。分析手法や教師データなどを指定したSQLっぽいやつを一発流し込むだけです。データ量に依存するところではありますが、今回は3分程度でトレーニングが終了しました。

CREATE OR REPLACE MODEL ${生成する機械学習モデル名}
OPTIONS
 (model_type=${機械学習アルゴリズム}, -- 線形回帰は"linear_reg"など
 input_label_cols=['result']) AS
SELECT
 *
FROM
 `ml_training.avatar_score` -- 学習元データを格納したテーブル
WHERE
 score IS NOT NULL

そして、BigQueryのデータセットにモデルができれば、これまたSQLっぽいのでデータを流し込み予測値を得ることができます。エクセレント。

SELECT
 *
FROM
ML.PREDICT(MODEL `ml_training.avatar_score`,
   (
     SELECT
       "F001" as base_body,
       "0000" as skin_color,
       0.7741219 as bust_size,
       0.8208225 as tall,
   )
)

画像12

※例は簡単化したものです

ML modelを手軽に作れて、これまた数行のSQLで利用できるBigQueryML恐るべし。。。

AutoML

一般には「AutoML」は機械学習モデルの作成を補助するサービスや、機械学習モデルの設計を自動化するための手法を指します。が、今回紹介するAutoMLは「GCPで提供されるサービスの一つであるAutoML」についてです。

AutoMLは機械学習の深い知識がなくとも、画像、動画、テキスト、音声などリソースを流し込み簡単な設定を行うだけで期待するML modelの生成をしてくれるサービスです。

AutoMLでの画像判別器生成の例は↓の紹介が非常に分かりやすかったです。コードを1行も書くことなく犬猫判別器が生成できる様子が解説されています。

とりあえずML modelを作っていきましょう。今回は画像のクラスタリングを行う目的でAutoMLを利用します。
・フォロワー数別のアイコンの特徴を探る
・可愛いとされるアイコンの特徴を探る
あたりを目標にやりました。

まずは、ユーザのアバターアイコンを学習リソースに突っ込んでラベル付けを行い、学習計画を設定します。あとはトレーニングを開始するだけ。

画像12

そして、待ちます。ひたすら待ちます。

ML modelの作成には時間がかかるんだなあなどとぼんやり思いながら、チームメンバーにちょっかいを出しつつ、むくどりんさんと足湯に浸かりつつ、時には外にお散歩しに行きML modelの完成を待ちます。

すると、Gmailで完了メールが来ました。さんきゅーGoogle

画像12

modelが完成すると、混同行列などによるmodelの評価をConsoleから確認できます。modelは割とたくさん作りましたが、紹介できる範囲で例を2つ紹介します。

まずは、簡単そうなので挑戦した
・アカウントを新規作成した時点でのアイコン画像
・トップ配信者のアイコン画像
を判別するML modelです。
超うまくいってアイコン画像だけで100%判別できるそうだ。

画像10

次はかわいいギフトをもらった順に
・上位 1-20%
・20-40%
・40-60%
・60-80%
・80-100%
それぞれ200名ずつピックして5段階で可愛さをクラスタリングするML modelです。一生懸命考えて作ったかわいいの指標ですがガバガバですね。ツッコミは聞きません。(かわいいギフトはアバターの他にも声などに対して投げられるものなのでうんぬんかんぬん)
そして全然うまく行きませんでした。

画像11

そして、この後紹介する成果物にはもうちょっと難しいことをやったML modelを採用しました。

Vertex AI

Vertex AIはGCPの統合AIプラットフォームで、前述のAutoMLなんかもこれに含まれるわけですが、ML modelをラッピングしたAPIサーバをボタンをポチポチのみでデプロイできる機能が備わっており、今回はその機能を利用しました。

今回はBigQueryMLとAutoMLで作成したML modelをVertex AIでHTTPでリクエスト可能なサーバとしてデプロイするところまでやります。
手順は
1. 機械学習モデルのアップロード
2. エンドポイントを作成しモデルをデプロイ
で、1行もコードを書くことはありません。

実際にモデルをデプロイしてみましょう。
BigQueryMLで用意したML modelをデプロイする手順を紹介します。

画像12

画像12

ね、すっごく簡単でしょう?これだけでデプロイは完了です。

もう、この時点でデプロイしたサーバにcurlでデータを流し込んでやればモデルによる予測を利用可能です!!

curl \
-X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
https://asia-northeast1-aiplatform.googleapis.com/v1/projects/hogehoge \
-d \
'{
	"instances": [{
	    "base_body": "F001",
	    "skin_color": "0000",
	    "bust_size": 0.7741219,
	    "parts_detail": "",
	    "tall": 0.8208225
   }]
}' 

ではどのようにREALITYのサービスからリクエストすれば良いのでしょう。これにはVertex AIのSDKを利用します。
SDKは現在
・Python
・Java
・Node.js
向けが配布されておりこれを利用します。REALITYで配信コメントを扱うサーバがNode.js製なので今回はこれにML modelによる予測を組み込むことにしました。配信コメントコマンドで利用することになります。

画像6

ざっと実装はこんな感じです。
下の例はアバターデータを突っ込んでその採点を行うML modelへのリクエスト例ですが、画像を突っ込む場合も大体同じです。

export async function scoreAvatar(base_body: string, skin_color: string): Promise<number> {
 // Vertex AIで公開した機械学習Modelのclientを作る
 const clientOptions = {
   apiEndpoint: 'asia-northeast1-aiplatform.googleapis.com',
 };
 const predictionServiceClient = new PredictionServiceClient(clientOptions);

 // パラメータを作る
 const endpoint = `projects/hogehoge`;
 const parameters = {
   structValue: {
     fields: {},
   },
 };
 const instances = [{
   structValue: {
     fields: {
       // ここに入力するパラメータを詰める
       base_body: { stringValue: base_body },
       skin_color: { stringValue: skin_color },
       hogehoge: "hogehoge",
       fugafuga: "fugafuga",
       ...
     },
   },
 }];
 const requestParams = {
   endpoint,
   instances,
   parameters,
 };

 // リクエスト
 const [response] = await predictionServiceClient.predict(requestParams);

 // 結果
 const predictions = response.predictions;
 const result = 0

 if (predictions[0].prediction.listValue.values[0].numberValue) {
   result = predictions[0].prediction.listValue.values[0].numberValue
 }

 return result
}

そして!!!
結果がこちら!!

画像12

画像13

※リリースはしません

まとめ

BigQueryMLすごい!!
使うだけであれば難しいことそんなにないのでPMさんにも使える機能です。

AutoMLもすごい!!!
完全にボタンポチポチ操作のみでML model作れることに感動。趣味でも使える。

所感としてはBigQueryML、AutoML共に非常に手軽に扱えるため機械学習習得への第一歩としては良い選択かと思いました。今回の合宿では機械学習で何ができるか、を学びましたが、正確な分析器構築のためにはさらなる知識が必要になり、合宿後にも機械学習のアルゴリズムの学習を続ける契機になりました。

また、合宿中はそれまでに用意されていたデータセットのみを使用して短時間で成果を出すことに集中しましたが、「ユーザアノテーションなどを利用すればもっと良い分析器が作れたな」「ユーザアバターデータをもっと抽象化すれば良い結果が得られたかもしれない」などと反省や今後も目標が得られて非常に有意義でした。

ということで、今回の記事は以上です!

明日の10日目は今年の営業日も残りわずかなので頑張って!営業終了大魔王による「Androidのカメラにアクセスできるか判定する」です!