本書はGoogle Cloudのソリューションエンジニアチームが、数百の機械学習チームとの実務を通じて見出した30のデザインパターンをカタログ化したものです。ソフトウェア工学のGoF本がオブジェクト指向の再利用可能な解法を体系化したように、本書はMLエンジニアリングの文脈でよく起きる問題と解決策に名前をつけ、共通言語として提供することを目的としています。
コードはKeras/TensorFlow・scikit-learn・BigQuery MLで書かれており、GitHubリポジトリ(https://github.com/GoogleCloudPlatform/ml-design-patterns)で実際に動かせます。
1章 機械学習デザインパターンの必要性
本書全体の前提となる用語と背景を整理した章です。
デザインパターンとは何か
建築家クリストファー・アレグザンダーの「パタン・ランゲージ」に端を発し、GoFのソフトウェアデザインパターンへと発展した考え方をMLに適用しています。繰り返し発生する問題に名前をつけることで、チーム内の共通言語が生まれ、ベストプラクティスの再発見コストを下げます。
機械学習固有の課題
本書が扱うパターンはすべて、以下の5つの課題に対応するものとして位置づけられています。
- データ品質:正確性・完全性・一貫性・適時性の4要素。「ゴミを入れたらゴミが出る」はMLでも同じです。
- 再現性:重みのランダム初期化により、同一コード・同一データでも訓練結果が微妙にずれます。シードの固定とコンテナによるバージョン管理が基本対策です。
- データドリフト:1950年代のデータで訓練したモデルは「スマートフォン」を知りません。特徴量の統計的性質は時間とともに変化します。
- 規模:プロトタイプと本番では必要なインフラがまったく異なります。1秒あたり数百万リクエストを捌く基盤はデータサイエンティストのノートブックとは別物です。
- 複数の異なる目的:データサイエンティストは損失の最小化を、PMは不良品流出ゼロを、経営陣は収益30%増を目標とします。これらをどう整合させるかもMLシステム設計の課題です。
2章 データ表現のパターン
モデルへの入力をどう表現するかを扱う章です。数値・カテゴリ型データのシンプルなイディオムに加え、4つのデザインパターンが紹介されています。
数値・カテゴリ型データの基礎
数値入力は [-1, 1] の範囲にスケーリングすることで収束が速くなります(著者の実験では単一特徴量で約9%の高速化)。スケーリング手法の選択は分布に依存し、一様分布ならmin-max、正規分布ならZスコア正規化が適切です。
カテゴリ型入力には原則としてワンホットエンコーディングを用います。順序関係のない変数を整数にマッピングすると、モデルが存在しない順序関係を学習してしまうためです。
パターン1:特徴量ハッシュ(Hashed Feature)
問題:語彙が不完全・カーディナリティが高い・コールドスタートが起きるカテゴリ変数
解決:フィンガープリントハッシュ(FarmHash等)で文字列を整数化し、バケット数で剰余をとる
ABS(MOD(FARM_FINGERPRINT(airport), num_buckets))
バケット数は「語彙の要素数の約1/5」が経験則です。衝突は情報損失を招きますが、未知の空港でもモデルがエラーを返さないレジリエンシーと引き換えです。暗号化ハッシュ(MD5等)は非決定的なので使用不可です。
パターン2:埋め込み(Embeddings)
問題:高次元疎なカテゴリ変数・テキスト・画像
解決:学習可能な重みを持つ埋め込み層で低次元密ベクトルにマッピングする
埋め込みはワンホットエンコーディングと違い、「双子と三つ子は似ている」といったカテゴリ間の類似性を捉えられます。埋め込み次元の経験則は「ユニーク要素数の4乗根」です。
ラベルが少ない場合はオートエンコーダを補助タスクとして使うことで、大量のラベルなしデータから埋め込みを学習できます。BERT・Word2Vecもこの思想の延長線上にあります。
パターン3:特徴量クロス(Feature Cross)
問題:特徴量間の非線形な相互作用をモデルが学習するのに時間がかかる
解決:2つ以上のカテゴリ特徴量を連結して合成特徴量を生成する
曜日×時刻のクロスは168次元のワンホットベクトルになりますが、「月曜17時」と「金曜17時」を独立した特徴量として扱えるようになります。出生データセットの実験では、特徴量クロスを持つ線形モデルがDNNと同等の精度を出しつつ、訓練時間を100倍短縮しています。
値の種類が爆発するため、L2正則化や埋め込み層と組み合わせる必要があります。
パターン4:マルチモーダル入力(Multimodal Input)
問題:画像+メタデータ、テキスト+表形式データなど、異種の入力を扱いたい
解決:各入力形式を個別に処理してから連結(concatenate)する
Kerasの関数型APIで埋め込み層とDense層の出力を連結するのが基本パターンです。同一データを複数の方法で表現する(例:評価値を整数とカテゴリ型の両方で扱う)場合も同じパターンで対処できます。
3章 問題表現のパターン
モデルの出力形式・アーキテクチャの選択に関する6つのパターンです。
パターン5:問題再設定(Reframing)
問題:回帰でも分類でも、素直に定式化すると性能が出ない
解決:出力の形式を意図的に変える
降雨量予測を回帰ではなく512クラスの分類として定式化したGoogleの研究が好例です。分類への再定式化により、二峰性の分布や大きな分散を確率密度関数として表現できます。逆に、推薦を回帰として再定式化することでクリックベイトを促進するラベルバイアスを回避できます。
パターン6:マルチラベル(Multilabel)
問題:1つの入力に複数のラベルが同時に付く(タグ付け・医療診断等)
解決:出力層の活性化関数をソフトマックスではなくシグモイドにし、二値交差エントロピーで学習する
シグモイドの出力は各クラスが独立した確率なので、その合計が1にならなくても問題ありません。閾値はクラスごとに設定し、用途に応じてF値を最適化します。
パターン7:アンサンブル学習(Ensemble)
問題:単一モデルの偏り(underfitting)や分散(overfitting)を下げたい
解決:複数モデルを組み合わせる
- バギング(ランダムフォレスト等):分散が大きいモデルに有効。並列訓練したモデルの予測を平均・多数決で集約
- ブースティング(XGBoost等):偏りが大きいモデルに有効。直前のモデルの残差を次のモデルが学習
- スタッキング:バギングとブースティングの長所を組み合わせ、メタモデルで出力を最適統合
トレードオフとして、訓練・保守コストが倍増します。解釈可能性も低下します。
パターン8:カスケード(Cascade)
問題:通常のケースと例外的なケースで予測の性質がまったく異なり、単一モデルでは扱えない
解決:機械学習問題を直列に分割する
例として「小売業者か卸売業者かを分類するモデル → それぞれの返品確率を予測するモデル」というカスケード。重要なのは、下流のモデルは上流モデルの予測(真のラベルではない)に基づいて訓練する点です。Kubeflow PipelinesやTFXのようなパイプラインフレームワーク上での自動化を強く推奨しています。
パターン9:中立クラス(Neutral Class)
問題:専門家の意見が分かれるケースで二値分類器の精度が低い
解決:「どちらでもない」クラスを第3のクラスとして追加する
アプガースコア(新生児の健康状態スコア)での実験では、二値分類の正解率0.56が3クラス分類で0.79に向上しています。ラベルが恣意的に付与されているケースをモデルに「解かせない」ことで全体の精度が上がります。事後的に追加はできないため、データ収集設計の段階で検討する必要があります。
パターン10:リバランシング(Rebalancing)
問題:不正取引・製品欠陥など、少数クラスが非常に稀なデータセット
解決:評価指標の選択 → ダウンサンプリング / クラス重み付け / アップサンプリング(SMOTE法)
「95%の正解率」という数字は、多数クラスに全予測を偏らせただけのモデルでも達成できます。F値・PR曲線(平均適合率)を評価指標に使うことが第一歩です。テストデータは元の比率を保持したまま使う必要があります。
4章 モデル訓練のパターン
過学習・転移学習・公平なデータ分割など、訓練ループへの介入パターンを扱います。
代表的なパターンとして**価値ある過学習(Useful Overfitting)**があります。数値計算の近似や物理シミュレーションの加速など、汎化を必要としないユースケースでは意図的に過学習させる戦略が有効です。
**転移学習(Transfer Learning)**はImageNetで事前学習したResNetの重みを別の画像分類タスクに流用するパターンで、少量データでも高い精度が出せます。**多タスク学習(Multitask Learning)**では、複数の関連タスクを同時に学習させることで各タスクの汎化性能が向上します。
5章 対応性のある運用のパターン
本番システムのスケーラビリティ・可用性に関するパターンです。
**ステートレスサービング関数(Stateless Serving Function)**は、各リクエストを独立して処理することで、水平スケールを可能にします。1秒あたり数百万リクエストを捌くには必須の設計です。
**バッチサービング(Batch Serving)**は、事前計算で推薦スコアを格納しておくパターンです。レイテンシより処理量を優先する場面(夜間バッチ処理等)に適します。
**継続的モデル評価(Continued Model Evaluation)**は、本番データを使ってモデルの性能を継続監視し、劣化を検知したら再訓練をトリガーするパターンです。データドリフトへの対処として重要です。
6章 再現性のパターン
MLパイプラインの再現性を確保するためのパターンです。他のデザインパターンを適用する前提となる基盤として位置づけられています。
**変換パターン(Transform)**は、入力・特徴量・変換を分離して保存することで、訓練と運用での前処理を確実に一致させるパターンです。TFX(TensorFlow Extended)の tft.TransformFeaturesLayer が実装例です。
**特徴量ストア(Feature Store)**は、特徴量を事前計算・共有管理するインフラです。同じ特徴量を複数のモデルが再利用でき、訓練と運用でのスキュー(skew)を防ぎます。
ワークフローパイプラインは、データ取り込みから評価・デプロイまでを自動化・バージョン管理するパターンです。
7章 責任あるAIのパターン
モデルの公平性・説明可能性・プライバシーに関するパターンです。
**公平性レンズ(Fairness Lens)**は、モデルの性能評価を人口統計的グループ別に行い、特定グループへの不公平な影響を検出するパターンです。全体の精度が高くても、特定の属性グループで精度が著しく低い場合があります。
Explainable AIのSHAP値や特徴量の寄与度(attribution)を使って、モデルが何に基づいて予測しているかを確認することが、責任あるML開発の第一歩です。
8章 パターンのつながり
全30パターンの早見ガイドと相互関係を整理した章です。「どのパターンがどの課題に対応するか」「どのパターンを組み合わせて使うか」がマトリクスで整理されています。
例えば、問題再設定+カスケード+リバランシングの組み合わせは、不均衡で複雑な分布を持つ回帰問題への定番アプローチとして示されています。
総評
本書の強みは実装コードと設計上の理由が一体化している点です。「なぜその手法を選ぶのか」のトレードオフが丁寧に書かれており、パターンを丸ごと適用するのではなく文脈に応じて取捨選択できます。
対象読者は「機械学習の基礎知識はあるが、本番システムを設計・運用する上での引き出しを増やしたい」エンジニアです。特に特徴量エンジニアリングからMLOpsまで一気通貫で扱っている書籍は少なく、実務への直結度が高い一冊です。
TFX・Kubeflow・Vertex AIといったインフラ側の設計思想を理解する上で有益な内容だと感じます。