行列分解の CREATE MODEL ステートメント

行列分解の CREATE MODEL ステートメント

BigQuery で行列分解モデルを作成するには、BigQuery ML の CREATE MODEL ステートメントを使用し、MODEL_TYPE'MATRIX_FACTORIZATION' に指定します。

CREATE MODEL の構文

{CREATE MODEL | CREATE MODEL IF NOT EXISTS | CREATE OR REPLACE MODEL}
model_name
OPTIONS(MODEL_TYPE = 'MATRIX_FACTORIZATION'
  [, FEEDBACK_TYPE = {'EXPLICIT' | 'IMPLICIT'} ]
  [, NUM_FACTORS = int64_value ]
  [, USER_COL = string_value ]
  [, ITEM_COL = string_value ]
  [, RATING_COL = string_value ]
  [, WALS_ALPHA = float64_value ]
  [, L2_REG = float64_value ]
  [, MAX_ITERATIONS = int64_value ]
  [, EARLY_STOP = { TRUE | FALSE } ]
  [, MIN_REL_PROGRESS = float64_value ]
  [, DATA_SPLIT_METHOD = { 'AUTO_SPLIT' | 'RANDOM' | 'CUSTOM' | 'SEQ' | 'NO_SPLIT' } ]
  [, DATA_SPLIT_EVAL_FRACTION = float64_value ]
  [, DATA_SPLIT_COL = string_value ])
AS query_statement

CREATE MODEL

指定したデータセットに新しい BigQuery ML モデルを作成します。モデル名が存在する場合、CREATE MODEL はエラーを返します。

CREATE MODEL IF NOT EXISTS

指定されたデータセットにモデルが存在しない場合にのみ、新しい BigQuery ML モデルを作成します。

CREATE OR REPLACE MODEL

新しい BigQuery ML モデルを作成し、指定されたデータセット内で同じ名前の既存のモデルをすべて置き換えます。

model_name

model_name は、作成または置き換える BigQuery ML モデルの名前です。モデル名は、データセットごとに一意である必要があります。他のモデルやテーブルに同じ名前を付けることはできません。モデル名は、BigQuery テーブルと同じ命名規則に従う必要があります。モデル名に使用できるものは次のとおりです。

  • 1,024 文字まで
  • 大文字、数字、アンダースコアのいずれかの文字

model_name では、大文字と小文字は区別されません。

デフォルトのプロジェクトを構成していない場合は、バッククォートを含め、次の形式でプロジェクト ID をモデル名の前に追加します。

`[PROJECT_ID].[DATASET].[MODEL]`

次に例を示します。

`myproject.mydataset.mymodel`

CREATE MODEL は、次のオプションをサポートします。

MODEL_TYPE

構文

MODEL_TYPE = 'MATRIX_FACTORIZATION'

説明

モデルタイプを指定します。行列分解モデルを作成するには、model_type'MATRIX_FACTORIZATION' に設定します。

model_option_list

model_option_list において、model_type オプションが必要です。他はすべて省略可能です。

行列分解モデルは、次のオプションをサポートしています。

FEEDBACK_TYPE

構文

FEEDBACK_TYPE = { 'EXPLICIT' | 'IMPLICIT' }

説明

行列分解モデルのフィードバック タイプを指定します。フィードバック タイプによって、トレーニング中に使用されるアルゴリズムが決まります。

評価(ユーザー フィードバック)には、'EXPLICIT''IMPLICIT' の 2 種類があります。ユースケースに応じて、モデル作成オプションで必要なフィードバック タイプを使用します。

  • ユーザーが映画のおすすめなどのアイテムに評価(1~5 など)を明示している場合は、FEEDBACK_TYPE='EXPLICIT' を指定します。これにより、交互最小二乗アルゴリズムを使用してモデルがトレーニングされます。

  • プロダクトのレコメンデーションの問題の大部分には、ユーザーからの明示的なフィードバックがありません。代わりに、評価値は、ユーザーによるアイテムの操作(クリック、ページビュー、購入など)に基づいて人為的に構築される必要があります。この場合、FEEDBACK_TYPE='IMPLICIT' を指定します。これにより、加重交互最小二乗アルゴリズムを使用してモデルがトレーニングされます。

2 つのフィードバック タイプの違いと、どのような場合にどのタイプを使用するかについては、フィードバック タイプに関する追加情報をご覧ください。

引数

デフォルト値は 'EXPLICIT' です。

NUM_FACTORS

構文

NUM_FACTORS = int64_value

説明

行列分解モデルに使用する潜在的要素の数を指定します。

引数

int64_value'INT64' です。指定できる値は 2~200 です。デフォルト値は log2(n) です。ここで、n はトレーニング例の数です。

USER_COL

構文

USER_COL = string_value

説明

行列分解モデルのユーザー列名。

引数 string_value'STRING' です。デフォルト値は 'user' です。

ITEM_COL

構文

ITEM_COL = string_value

説明

行列分解モデルの項目列名。

引数 string_value'STRING' です。デフォルト値は 'item' です。

RATING_COL

構文

RATING_COL = string_value

説明

行列分解モデルの評価列名。

引数 string_value'STRING' です。デフォルト値は 'rating' です。

WALS_ALPHA

構文

WALS_ALPHA = float64_value

説明

'IMPLICIT' 行列分解モデルのハイパーパラメータ。

詳細については、フィードバック タイプに関する追加情報をご覧ください。

引数 float64_value'FLOAT64' です。デフォルト値は 40 です。

L2_REG

構文

L2_REG = float64_value

説明

適用する L2 正規化の量。

引数

float64_valueFLOAT64 です。デフォルト値は 1.0 です。

MAX_ITERATIONS

構文

MAX_ITERATIONS = int64_value

説明

トレーニングの最大繰り返し回数またはステップ数。

引数

int64_valueINT64 です。デフォルト値は 20 です。

EARLY_STOP

構文

EARLY_STOP = { TRUE | FALSE }

説明

最初の繰り返しで、相対損失改善値が MIN_REL_PROGRESS に指定された値より小さい場合、トレーニングを停止するかどうか。

引数

値は BOOL です。デフォルト値は TRUE です。

MIN_REL_PROGRESS

構文

MIN_REL_PROGRESS = float64_value

説明

EARLY_STOP が true に設定されている場合に、トレーニングの継続に最低限必要な相対損失改善値。たとえば、値を 0.01 に設定した場合、繰り返しごとに損失が 1% 減少すると、トレーニングが継続します。

引数

float64_valueFLOAT64 です。デフォルト値は 0.01 です。

DATA_SPLIT_METHOD

構文

DATA_SPLIT_METHOD = { 'AUTO_SPLIT' | 'RANDOM' | 'CUSTOM' | 'SEQ' | 'NO_SPLIT' }

説明

入力データをトレーニング セットと評価セットに分割する方法。トレーニング データは、モデルのトレーニングに使用されます。評価データは、早期停止により過学習を避けるために使用されます。

引数

次の値を受け入れます。

'AUTO_SPLIT' - 自動分割戦略は次のとおりです。

  • 入力データが 500 行未満の場合、すべての行がトレーニング データとして使用されます。
  • 入力データが 500~50,000 行の場合、データの 20% が RANDOM 分割で処理され、評価データとして使用されます。
  • 入力データが 50,000 行を超える場合、10,000 行が RANDOM 分割で処理され、評価データとして使用されます。

'RANDOM' - データをランダムに分割します。ランダムな分割は確定的です。基となるトレーニング データが同じであれば、別のトレーニングを行っても同じ分割結果が生成されます。

'CUSTOM' - お客様提供の BOOL 型の列を使用してデータを分割します。値が TRUE の行は、評価データとして使用されます。値が FALSE の行は、トレーニング データとして使用されます。

'SEQ' - お客様提供の列を使用してデータを順番に分割します。列には、順序付け可能なデータ型(NUMERICSTRINGTIMESTAMP)が使用できます。分割値がしきい値を下回る行は、トレーニング データとして使用されます。残りの行(NULLs を含む)は、評価データとして使用されます。

'NO_SPLIT' - すべてのデータをトレーニング データとして使用します。

DATA_SPLIT_EVAL_FRACTION

構文

DATA_SPLIT_EVAL_FRACTION = float64_value

説明

このオプションは、'RANDOM''SEQ' 分割で使用します。評価に使用するデータの割合を、小数点以下 2 桁までの精度で指定します。

引数

float64_valueFLOAT64 です。デフォルト値は 0.2 です。

DATA_SPLIT_COL

構文

DATA_SPLIT_COL = string_value

説明

データの分割に使用する列を識別します。この列は特徴やラベルとして使用できません。特徴からは自動的に除外されます。

  • DATA_SPLIT_METHOD の値が 'CUSTOM' の場合、対応する列は BOOL 型になります。値が TRUENULL の行は、評価データとして使用されます。値が FALSE の行は、トレーニング データとして使用されます。

  • DATA_SPLIT_METHOD の値が 'SEQ' の場合、対応する列の最後の n 行(最小から最大)が評価データとして使用されます。ここで、nDATA_SPLIT_EVAL_FRACTION に指定された値です。最初の行はトレーニング データとして使用されます。

サポートされている入力タイプについては、DATA_SPLIT_COL でサポートされている入力タイプをご覧ください。

引数

string_valueSTRING です。

query_statement

AS query_statement 句は、トレーニング データの生成に使用する標準 SQL クエリを指定します。query_statement 句でサポートされる SQL 構文については、標準 SQL クエリ構文をご覧ください。

行列分解モデルの場合、DATA_SPLIT_COL を使う必要がある DATA_SPLIT_METHOD をユーザーが指定しない限り、query_statement には必ず 3 つの列(useritemrating)が含まれます。

サポートされている入力

CREATE MODEL ステートメントは、ユーザー、アイテム、評価の各列について次のデータ型をサポートしています。

行列分解モデル入力でサポートされているデータ型

BigQuery ML は、行列分解の入力列にさまざまな標準 SQL データ型をサポートしています。各列でサポートされているデータ型は次のとおりです。

Matrix factorization input column Supported types
user 任意の Groupable(グループ分け可能)データ型
item 任意の Groupable(グループ分け可能)データ型
rating INT64
NUMERIC
FLOAT64

フィードバック タイプに関する追加情報

レコメンデーション用の優れた行列分解モデルを作成するために重要な点は、最適なアルゴリズムでデータをトレーニングすることです。行列分解モデルの場合、ユーザー - アイテム ペアの評価を取得する方法は 2 つあります。

ユーザーによる入力と設定が必要な評価は、明示的なフィードバックと見なされます。明示的な評価が低い場合はユーザーがアイテムについて非常に否定的に感じたことを意味し、明示的な評価が高い場合はユーザーがアイテムを気に入ったことを意味します。ユーザーが評価を付ける映画ストリーミング サイトは、明示的にラベル付けされたデータセットの例です。明示的なフィードバックの問題では、交互最小二乗アルゴリズム(一般に ALS と呼ばれます)を使用します。ALS は、次の損失関数を最小限に抑えようとします。

$$ Loss = \sum_{u, i \in \text{observed ratings}} (r_{ui} - x^T_uy_i)^2 + \lambda(\sum_u||x_u||^2 + \sum_i||y_i||^2)$$

ここで

\(r_{ui} = \) ユーザー \(u\) がアイテム \(i\) に付けた評価
\(x_u = \) ユーザー \(u\) の潜在因子重みベクトル。長さは NUM_FACTORS です。
\(y_i = \) アイテム \(i\) の潜在因子重みベクトル。長さは NUM_FACTORS です。
\(\lambda = \) L2_REG

ただし、ほとんどの時間データはユーザーによってラベル付けされることはほとんどありません。多くの場合、ユーザーがアイテムや映画を高く評価したかどうかを企業側が判断する指標は、クリック率やエンゲージメント時間に限られます。多くの場合、これは代替評価として使用できますが、必ずしもユーザーが何かを好きかどうかを明確に示すものではありません。これらのデータセット内のデータは、暗黙的なフィードバックと見なされます。暗黙的なフィードバックの問題では、このアルゴリズムの別のパターンの加重交互最小二乗(WALS)を使用します。詳細については、http://yifanhu.net/PUB/cf.pdf をご覧ください。このアプローチでは、これらの代替評価を使用して、ユーザーのアイテムに対する信頼度の観測値として扱います。WALS は、次の損失関数を最小限に抑えようとします。

$$ Loss = \sum_{u, i} c_{ui}(p_{ui} - x^T_uy_i)^2 + \lambda(\sum_u||x_u||^2 + \sum_i||y_i||^2) $$

ここで、上記で定義した変数に加えて、この関数は次の変数も導入します。

\(r_{ui} > 0\) ここで \(p_{ui} = 1\) および \(r_{ui} < 0\) ここで \(p_{ui} = 0\)
\(c_{ui} = 1 + \alpha r_{ui}\)
\(\alpha = \) WALS_ALPHA

明示的な行列分解の場合、入力は通常、既知の固定範囲内の整数です。暗黙的な行列分解の場合、入力評価は倍数またはより広い範囲の整数になる可能性があります。モデルのパフォーマンスが低い場合は、入力評価に外れ値がないことを確認し、入力評価をスケーリングすることをおすすめします。

既知の制限事項

行列分解モデルの CREATE MODEL ステートメントは、以下の規則に従う必要があります。

  • 「モデルが大きすぎます(100 MB 超)」というエラーが発生した場合は、入力データを確認します。これは、1 人のユーザーまたは 1 つのアイテムに対する評価が多すぎることが原因です。ユーザー列またはアイテム列を INT64 値にハッシュ化するか、データサイズを小さくすることで解決できます。この問題が発生するかどうかを判断する一般的な数式は次のとおりです。

    max(num_rated_user, num_rated_item) < 100 million

    ここで、num_rated_user は 1 人のユーザーが入力した項目の最大評価で、num_rated_items は特定のアイテムの最大ユーザー評価です。

CREATE MODEL の例

次の例では、デフォルト プロジェクトにある mydataset 内に mymodel という名前のモデルを作成します。

明示的なフィードバックを使用して行列分解モデルをトレーニングする

この例では、明示的なフィードバック行列分解モデルを作成します。

CREATE MODEL `project_id.mydataset.mymodel`
 OPTIONS(MODEL_TYPE='MATRIX_FACTORIZATION') AS
SELECT
  user,
  item,
  rating
FROM
  `mydataset.mytable`

暗黙的なフィードバックを使用して行列分解モデルをトレーニングする

この例では、暗黙的なフィードバック行列分解モデルを作成します。

CREATE MODEL `project_id.mydataset.mymodel`
 OPTIONS(MODEL_TYPE='MATRIX_FACTORIZATION',
         FEEDBACK_TYPE='IMPLICIT') AS
SELECT
  user,
  item,
  rating
FROM
  `mydataset.mytable`

次のステップ