Amazon Web Services ブログ

Amazon Personalize – すべてのユーザにリアルタイムパーソナライゼーションとレコメンデーションを

機械学習は、間違いなく広範囲にわたって取り組むべき魅力的なトピックを提供してきましたが、パーソナライゼーションやレコメンデーションほどのものはありません。

一見、ユーザーと好みのアイテムをマッチングするのは簡単な問題のように聞こえるかもしれません。しかしながら、効率的なレコメンデーションシステムを開発するのは難易度が高く、数年前にNetflix が 1 億円相当の懸賞金をかけて映画レコメンデーションコンクールを実施したほどです!事実、現時点でリアルタイムなパーソナライゼーションの仕組みを構築・最適化し、デプロイするには、分析・応用機械学習・ソフトウェアエンジニアリング・システム運用に特化したエキスパートが必要になります。ほとんどの組織はこれらの課題を克服するための知識・スキル、そして経験を持っておらず、レコメンデーションを利用するアイデアを諦めるか、パフォーマンスの低いモデルを構築するに留まっています。

20年以上もの間、 Amazon.com は、商品検索から決済まで購買経験のいたるところでパーソナライズされたレコメンデーションを統合しながら、大規模なレコメンデーションシステムを構築してきました (詳細な情報は次の文献を参照ください:”Two Decades of Recommender Systems at Amazon.com“)。

全ての AWS のお客様が同様のことをするお手伝いをするために、本日、Amazon Personalize を発表することができ幸せに思います。Amazon Personalize はパーソナライゼーションやレコメンデーションを機械学習の経験が殆ど無い開発者に委ねることが可能なフルマネージドサービスです!

Amazon Personalize の紹介

Amazon Personalize はどのようにパーソナライゼーションとレコメンデーションをシンプルにしたのでしょうか?過去に発行した Blog で説明されているように、Factorization Machines のようなアルゴリズムを利用すると、Amazon SageMaker 上にレコメンデーションモデルを構築するのはすでに可能でした。しかしながら、この方法で良い結果を得るためには、大量のデータの準備と専門家によるチューニングが必要になると言わざるを得ません。

Amazon Personalize でレコメンデーションモデルを作るのはもっと簡単です。複雑な機械学習のタスクを自動化する新しいプロセスである AutoML を使うことで、Personalize は機械学習モデルを設計し、トレーニングし、デプロイするのに要求される難しい作業を実行し、高速化します。

Amazon Personalize は Amazon S3 に保存されているデータセットとストリーミングデータセット (JavaScript トラッカーやサーバサイドからリアルタイムで送られてくるイベントなど) の両方をサポートします。大まかな流れは次のようになります:

  1. ユーザー ID や アイテム ID に対応する Personalize で予約されたキーワードを利用し、データセットを説明する「スキーマ」を作成する。
  2. モデル構築用と予測用のデータセットを含む「データセットグループ」を作成する。データセットは、誰は何が好きというようなユーザーとアイテムの相互関係、ユーザー、アイテムからなります。後述の例で示すように、後ろの2つは必ずしも必要ではありません。
  3. データを Personalize に送る。
  4. 「ソリューション」を作成する。つまりはレコメンデーションのための「レシピ」を選択し、「データセットグループ」上でそれを学習する。
  5. 新しいサンプルを予測するための「キャンペーン」を作成する。

Amazon S3 に保存されたデータを利用する場合、Personalize にデータを転送する手続きは単にデータセットグループにファイルを追加することを意味し、収集処理は自動的にトリガされます。

ストリーミングデータを利用する場合は異なります。イベントを送信する1つの方法は、AWS Amplify JavaScript ライブラリを使用する方法です。AWS Amplify JavaScript ライブラリは Personalize が提供するイベントトラッキングサービスと統合されています。もう一つの方法は、お好きな言語の AWS SDK を介してサーバサイドからイベントを送信する方法です。そのため、ソースコードが置かれているAWS 内(Amazon EC2 や AWS Lambda 等)や外部の任意の送信元からイベントを送信することができます。

早速、例を見ていきます。MovieLens データセットに基づくソリューションを構築してみましょう!

MovieLens データセット

MovieLens は映画のレコメンデーションを集めた有名なデータセットです。MovieLens はいろいろなデータサイズとフォーマットで構成されており、ここでは、”ml-20m” というデータセットを使うことにします。”ml-20m” は 27,000 本の映画を 138,000 人のユーザーがアンケート評価した 2,000 万件のレーティングデータで構成されています。
このデータセットには、ユーザーとアイテムの相互作用(どのユーザがどの映画にどれくらいのレートをつけたのか)を集めた “ratings.csv” という名前のファイルがあります。このファイルの先頭は次のようになっています。

userId,movieId,rating,timestamp
1,2,3.5,1112486027
1,29,3.5,1112484676
1,32,3.5,1112484819
1,47,3.5,1112484727
1,50,3.5,1112484580

この内容は次のように読むことができます: ユーザーID が 1 のユーザーは映画 ID が 2 の映画を 3.5 のレーティングで評価した。映画 ID が 29,32,47,50 の映画についても同じように 3.5 のレーティングで評価しています!これがまさにレコメンデーションモデルを構築するのに必要な作業となります。それでは作業にとりかかりましょう!

データセット用のスキーマを作成する

最初のステップは、データセット用の Avro スキーマを作成することです。Amazon Personalize で定義されたいくつかのキーワードを使うだけなので、これはかなり簡単です。

{"type": "record",
"name": "Interactions",
"namespace": "com.amazonaws.personalize.schema",
"fields":[
{"name": "ITEM_ID", "type": "string"},
{"name": "USER_ID", "type": "string"},
{"name": "TIMESTAMP", "type": "long"}
],
"version": "1.0"}

データセット準備する

データセットをダウンロードして解凍したら “ratings.csv” ファイルをロードし、以下の処理を適用しましょう。

  • レビュー(レーティングデータ)をシャッフルする。
  • 4 以上のレーティングの映画を残し、rating カラムを削除する: 今回のゴールはユーザが本当に好きな映画をレコメンドするモデルだからです。
  • カラムの名前をスキーマで定義した名前に変更する。
  • 今回はデモでしかないので、トレーニング時間を最小化するために、100,000 件のみ残します
  • カラムナデータを処理するのに最適な Pandas Python ライブラリを使うとこれら全てを簡単に実施することができます。

カラムナデータを処理するのに最適な Pandas Python ライブラリを使うとこれら全てを簡単に行うことができます。ついでに、処理したファイルを Amazon S3 バケットにアップロードしましょう。

import pandas, boto3 
from sklearn.utils import shuffle
ratings = pandas.read_csv('ratings.csv')
ratings = shuffle(ratings)
ratings = ratings[ratings['rating']>3.6]
ratings = ratings.drop(columns='rating')
ratings.columns = ['USER_ID','ITEM_ID','TIMESTAMP']
ratings = ratings[:100000]
ratings.to_csv('ratings.processed.csv',index=False)
s3 = boto3.client('s3')
s3.upload_file('ratings.processed.csv','jsimon-ml20m','ratings.processed.csv')

データセットグループを作成する

まず、スキーマと同じように user-item データセットを含むデータセットグループを作成する必要があります。これは、AWS CLI を利用して実施してみましょう: ご覧のように、CLI 操作の多くはそれよりも前の CLI 操作で出力された Amazon Resource Name (ARN) を必要とするので、CLI 操作を実行した内容全てを確実に追えるようにしてください。

$ aws personalize create-dataset-group --name jsimon-ml20m-dataset-group
$ aws personalize create-schema --name jsimon-ml20m-schema \
--schema file://jsimon-ml20m-schema.json
$ aws personalize create-dataset --schema-arn $SCHEMA_ARN \
--dataset-group-arn $DATASET_GROUP_ARN \
--dataset-type INTERACTIONS

データセットのインポート

このシンプルな例では、データをオンデマンドでインポートします。定期的に新しいデータをロードするためにインポートジョブをスケジュール設定することも可能です。Amazon S3 バケットからデータを読み出せるように権限を許可する必要があります。

$ aws personalize create-dataset-import-job --job-name jsimon-ml20m-
--role-arn $ROLE_ARN
--dataset-arn $DATASET_ARN \
--data-source dataLocation=s3://jsimon-ml20m/ratings.processed.csv

この処理には少し時間がかかります。作業が完了したのかを確認するために describe-dataset-import-job API を利用することができます。多くの情報が返されますが、読み込み状況を問い合わせるだけです。

$ aws personalize describe-dataset-import-job \
--dataset-import-job-arn $DATASET_IMPORT_JOB_ARN \
--query "datasetImportJob.latestDatasetImportJobRun.status"
"CREATE IN_PROGRESS"

全てをまとめ、ソリューションを作成する

データセットがインポートされると、レコメンデーションモデルを処理するためのレシピを選択します。レシピは単なるアルゴリズムではありません: レシピは事前定義された特徴変換やアルゴリズムの初期パラメータだけでなく、自動モデルチューニングも含んでいます。したがって、レシピによりパーソナライゼーションにおける専門知識が必要なくなるのです。

Amazon Personalize は様々なユースケースに適した複数のレシピを備えており、先進的なユーザは自作のレシピを追加することも可能です。

以下は、利用可能なレシピの一覧です。

arn:aws:personalize:::recipe/awspersonalizehrnnmodel
arn:aws:personalize:::recipe/awspersonalizehrnnmodel-for-coldstart
arn:aws:personalize:::recipe/awspersonalizehrnnmodel-for-metadata
arn:aws:personalize:::recipe/awspersonalizeffnnmodel
arn:aws:personalize:::recipe/awspersonalizedeepfmmodel
arn:aws:personalize:::recipe/awspersonalizesimsmodel
arn:aws:personalize:::recipe/search-personalization
arn:aws:personalize:::recipe/popularity-baseline

レコメンデーションの専門家はレシピがもたらす柔軟性を確実に楽しむことができるでしょう。一方で、レコメンデーションの世界に接したことのない開発者にとってはどうでしょうか?

上述したように、Amazon Personalize は 最も最適なレシピを自動的に探しだす新しい技術である AutoML をサポートします。それでは、AutoML を有効にしてみましょう。ハイパーパラメータ最適化(HPO)はデフォルトで有効になっています。大事なことを言い忘れていましたが、Amazon Personalize ソリューションは受け取るトラフィックに従い、自動的にスケールすることができます: 対応したい最小秒間トランザクション数を定義するだけです。

ゆえに、以下のようにソリューションを作成することができます。

$ aws personalize create-solution --name jsimon-ml20m-solution \
--minTPS 10 --perform-auto-ml \
--dataset-group-arn $DATASET_GROUP_ARN \
--query 'solution.status'
"CREATE IN_PROGRESS"

最適なレシピが選択され、学習と最適化が完了するまで少し時間がかかります。全ての処理が完了したら、ソリューションのメトリクスを調べることができます。

$ aws personalize get-metrics --solution-arn $SOLUTION_ARN

リアルタイムで新しいアイテムをレコメンデーションする

モデルに問題がなければ、デプロイするためにキャンペーンを作ることができます。キャンペーンはソリューションをデプロイする度に自動的に更新されます。

$ aws personalize create-campaign --name jsimon-ml20m-solution \
--solution-arn $SOLUTION_ARN --update-mode AUTO

さあ、映画をレコメンドしてみましょう!

$ aws personalize-rec get-recommendations --campaign-arn $CAMPAIGN_ARN
--user-id $USER_ID --query "itemList[*].itemId"
["1210", "260", "2571", "110", "296", "1193", ...]

以上です!これまで見てきたように、いくつかの API コールでレコメンデーションモデルを構築することに成功しました。実施する必要があったことは、スキーマ定義とデータのアップロードだけでした。AutoML を使ってベストなレシピを選択やレシピのハイパーパラメータを最適化を実施を Amazon Personalize に任せることができました。ソリューションはフルマネージドなインフラストラクチャ上でトレーニングされ、デプロイされたので、アプリケーションの開発に一層注力することができるようになるでしょう。

今すぐプレビューにサインアップしてください!

この Blog が皆様のお役に立てれば幸いです。Amazon Personalize ができることについて概要をまとめました。米国東部 (バージニア北部)と米国西部 (オレゴン)リージョンにて、プレビューで利用いただくことが可能です。プレビュー期間中はサービスの利用料は発生しません。プレビューが終わると Amazon Personalize で無料利用枠が利用できるようになります。サインアップ後 2ヶ月の間、以下の条件で利用することができます。

  1. データ利用(処理/保存): 1ヶ月あたり最大 20 GB
  2. トレーニング: 1ヶ月あたり最大 100 回
  3. 推論: 1ヶ月あたり最大 50 TPS / 時のリアルタイムレコメンデーション

さあ、皆様が Amazon Personalize を試す番です。そして、皆様が考えたことを教えて下さい。最初は https://aws.amazon.com/personalize/ を参照してください。

— Julian

Julien Simon

Julien Simon

ジュリアンは、EMEA の人工知能および機械学習エバンジェリストとして、開発者や企業が自分のアイデアを生き生きとさせる支援に焦点を当てています。

(この記事は SA 川村 / 石見が翻訳しました。原文はこちら)