Matrix Factorization

BigQuery ML に Matrix Factorization が来た#

日本時間 2020-04-18 に BigQuery ML の新モデル Matrix Factorization がベータリリースされました。

Matrix Factorization とは#

user と item を入力として、似た rating 傾向のある人を参考に未知の rating を予想するものです。併売しそうな商品を推薦する際に使ったりできます。

詳細な Matrix Factorization の方法論などは他のドキュメントを参照してください。

BigQuery ML で Matrix Factorization を使う際のハマりポイント#

オンデマンドユーザは訓練できません。 大半のユーザはオンデマンドクエリの利用者で、Reservations を設定していないと思いますのでハマります。 後述する手順を実行しようとすると、Training Matrix Factorization models is not available for on-demand usage. To train, please set up a reservation (flex or regular) based on instructions in BigQuery public docs. とエラーメッセージが表示されます。

実際に触ってみる#

BigQuery Reservations を設定する(オンデマンドユーザのみ)#

BigQuery Reservations とは#

BigQuery を秒、月、年単位で定額料金利用ができるものです。 Reservations の概要を見ると詳細に理解できます。

スロットを購入する#

  1. BigQuery の左メニューから「予約」をクリック
  2. 上メニューから「スロットを購入する」を選ぶ
  3. 「コミット期間」、「ロケーション」、「スロット」を選ぶ(お試しなら最小単位で、コミット期間は Flex、スロットは 500 がおすすめ)
  4. 「購入」ボタンをクリック

予約を作成する#

  1. 上メニューから予約を作成を選ぶ
  2. 「予約名」、「場所」、「スロット数」を入力する(お試しなら最小単位で、スロット数は 500 がおすすめ)
  3. 「保存」ボタンをクリック

割り当てを作成する#

  1. 画面中央から「割り当て」のタブをクリック
  2. 「組織、フォルダ、プロジェクトを選択」、「予約」を入力する(予約には作成したものを入力する)
  3. 「作成」ボタンをクリック

BigQuery ML クエリを実行する#

訓練#

基本的には、他の CREATE MODEL と同様にクエリを書くだけです。引数の名前を設定するオプションもありますが、設定しない場合には、user、item、rating の列が必須になります。 user、item は GROUPABLE な任意の型、rating は INT64、NUMERIC、FLOAT64 のみに対応しています。

オプションの詳細は The CREATE MODEL statement for Matrix Factorization を参照しましょう。

今回は、UNNEST で訓練データを作ってみました(他のモデルをオンデマンドで回す場合には、参照量が 0 になるため無料ですが、Reservations を使ってるため、お金はかかります。)

useritemrating
115
121
135
213
223
315
CREATE MODEL
`project.dataset.model` OPTIONS(MODEL_TYPE='MATRIX_FACTORIZATION') AS(
SELECT
*
FROM
UNNEST(ARRAY<STRUCT<user INT64,item INT64,rating INT64>>[(1,
1,
5),(1,
2,
1),(1,
3,
5),(2,
1,
3),(2,
2,
3),(3,
1,
5)]))

推論#

今回は、UNNEST で推論用データも作ります。 Reservations を利用していない場合、UNNEST で物理テーブルを一切参照しなければ無料でできます。 気になる方は、モデル作成完了後に Reservations の設定を削除しておきましょう。

useritem
23
41
SELECT
*
FROM
ML.PREDICT(MODEL `project.dataset.model`,
(
SELECT
*
FROM
UNNEST(ARRAY<STRUCT<user INT64,item INT64>>[(4,
1),(2,
3)])))

正しく推論できていれば、rating を含むテーブルが返ってきます。 ML.WEIGHTS を使うと分散表現も得られるので、word2vec の代わりに使えるかもしれません。

まとめ#

BigQuery ML に Matrix Factorization が来て、無事に利用することができました。 実行環境が分離され、データ(とコスト)のみに注力して Matrix Factorization が利用できるため、とても素晴らしいリリースだと思います。 ただ DNN のリリースも望まれる中、オンデマンド料金をサポート外にするビジネスモデルの変革とも取れるリリースになりました。 今後の BigQuery ML を含む BigQuery 全体の料金体系がどうなっていくのか気になるところです。

Last updated on