肉球でキーボード

MLエンジニアの技術ブログです

機械学習システムデザインを読みました

機械学習システムデザイン」を読んだので、感想・各章の内容についてまとめます

www.oreilly.co.jp

全体を通しての感想

原本は Designing Machine Learning Systems で本書は日本語訳版となります。

原本の著者である Chip Huyen氏が書籍に関する情報をまとめたGitHubレポジトリを公開しています。https://github.com/chiphuyen/dmls-book

著者が現場の機械学習エンジニアということもあり、書かれている内容は実際の現場に即した内容に徹していました。実環境の機械学習システムで直面する課題やユースケースをまとめていて、機械学習エンジニアが普段感じてる課題をうまく言語化しています。

特に筆者の経験に基づいて現場で直面した問題や手堅い手法が書かれているのは、実務家として目から鱗の内容でした。

本書は概念的な内容が書かれていて、具体的なプログラムやライブラリの使い方を紹介するチュートリアル本ではないです。

MLOpsの背景にある機械学習システムの難しさや、対応方法について体型的に学ぶのにちょうどいい本だと思います。

前提知識として要求されてるソフトウェアエンジニア知識がそこまで多くないので、分析業務がメインのデータサイエンティストの方にも取っ付きやすい内容だと思います。

oreily本は機械翻訳にかけたような日本語訳の本がたまにありますが、本書は機械翻訳っぽさがなく、人の手で丁寧に訳された文章で読みやすい日本語訳となってます。

各章の内容

1. 機械学習システムの概要

1.1 機械学習を使うとき
    1.1.1 機械学習のユースケース
1.2 機械学習システムの理解
    1.2.1 研究分野での機械学習と実現場での機械学習
    1.2.2 機械学習システム vs. 従来のソフトウェア
1.3 まとめ

どういう状況下で機械学習が役に立つのか・役に立たないのかを、実例を交えながら紹介しています。機械学習エンジニアをやっていると、機械学習を使ってサービスに応用できないか?という相談を受ける場面があると思います。ToC, ToBの両方で機械学習ユースケースをまとめているので、実務者が書いてる本で流石だなと感じます。

研究分野と対比して、実際の機械学習システムではさまざまな利害関係者が存在し、ソフトスキルが求められる点だったり、実サービスで使うため推論レイテンシー要件や予測値によってユーザーが不公平を被らないようにする必要がある特徴を話をしてます。

機械学習はソフトウェアエンジニアの一部と思えば、ソフトウェアエンジニアのベストプラクティスを機械学習に適用すればいいのではないか?という疑問に対して、コートとデータが密に関わっている観点から、従来のソフトウェアエンジニアと機械学習システムの違いを論じてます。

2. 機械学習システム設計の概要

2.1 ビジネスと機械学習の目標
2.2 機械学習システムの要件
    2.2.1 信頼性
    2.2.2 拡張性
    2.2.3 保守性
    2.2.4 適応性
2.3 反復型プロセス
2.4 機械学習の問題の組み立て
    2.4.1 機械学習のタスクタイプ
    2.4.2 目的関数
2.5 マインド vs. データ
2.6 まとめ

システム設計を行うために、ビジネス要件とシステム要件の両方を整理してます。ビジネスゴールと機械学習のメトリクスが結びついている必要性を強調しています。システム設計の技術的な部分だけを切り取らずに、あくまで実務者向けの本という気概を感じます。

3.データエンジニアリングの基礎知識

3.1 データソース
3.2 データフォーマット
    3.2.1 JSON
    3.2.2 行優先フォーマット vs. 列優先フォーマット
    3.2.3 テキスト形式 vs. バイナリ形式
3.3 データモデル
    3.3.1 リレーショナルモデル
    3.3.2 NoSQL
    3.3.3 構造化データ vs. 非構造化データ
3.4 データストレージエンジンと処理
    3.4.1 トランザクション型処理と分析型処理
    3.4.2 ETL:抽出(extract)、変換(transform)、格納(load)
3.5 データフローの形態
    3.5.1 データベース経由のデータの受け渡し
    3.5.2 サービス経由のデータの受け渡し
    3.5.3 リアルタイム伝送経由のデータの受け渡し
3.6 バッチ処理 vs. ストリーム処理
3.7 まとめ

こういった機械学習システム本には珍しく、データエンジニアリングを取り上げています。

本書全体を通して、機械学習システムがデータに密接に関わっている点を強調してるため、機械学習システムを開発する者ならデータ基盤にも目を向けないといけないという意図を感じます。

扱っている内容はデータ基盤を作るためのツール説明というよりは、背後にある概念の説明となっています。

4.訓練データ

4.1 サンプリング
    4.1.1 非確率サンプリング
    4.1.2 シンプルなランダムサンプリング
    4.1.3 層化サンプリング
    4.1.4 重み付きサンプリング
    4.1.5 リザーバーサンプリング
    4.1.6 重点サンプリング
4.2 ラベル付け
    4.2.1 手作業によるラベル
    4.2.2 天然のラベル
    4.2.3 欠損ラベルへの対処
4.3 クラスの不均衡
    4.3.1 クラスの不均衡という問題
    4.3.2 クラスの不均衡への対処
4.4 データオーグメンテーション
    4.4.1 ラベルを保ったシンプルな変換
    4.4.2 摂動
    4.4.3 データの合成
4.5 まとめ

現場での訓練データ作成の課題に対するアプローチを扱っています。不均衡データに対してサンプリング、評価指標、データ水増しという異なる視点での取り扱い方法が書かれているのはありがたいです。

アノテーションで起きる課題と対応策について詳細に書かれている文献は珍しいなと思います。

5.特徴量エンジニアリング

5.1 特徴の学習と特徴エンジニアリング
5.2 一般的な特徴エンジニアリングの活動
    5.2.1 欠損値の処理
    5.2.2 スケーリング
    5.2.3 離散化
    5.2.4 カテゴリー特徴のエンコード
    5.2.5 特徴交差
    5.2.6 離散的および連続的な位置埋め込み
5.3 データリーク
    5.3.1 データリークの主な原因
    5.3.2 データリークの検出
5.4 優れた特徴の設計
    5.4.1 特徴重要度
    5.4.2 特徴の汎化
5.5 まとめ

深層学習モデルは特徴を自動的に学習するため、特徴量作成の手間をかける必要がありませんが、実運用されるモデルが深層学習モデルのケースはまだまだ多くないと指摘しています。

カテゴリ特徴の扱いにhasing trickの有効性を推しています。Booking.com のhasing trickに関する論文が取り上げられていたので後で読んでみようと思います。

筆者は特徴の設計についてのキャッチアップはkaggleのコンペ解法を読むことが役立ったと述べています。本書全体を通じてkaggleに関する文献の引用が多いです。

6.モデル開発とオフライン評価

6.1 モデルの開発と訓練
    6.1.1 機械学習モデルの評価
    6.1.2 アンサンブル
    6.1.3 実験管理とバージョン管理
    6.1.4 分散訓練
    6.1.5 AutoML
6.2 モデルのオフライン評価
    6.2.1 ベースライン
    6.2.2 評価手法
6.3 まとめ

実運用されるモデルを作成する際のTips的な内容が紹介されてます。バージョン管理の節で、データのバージョン管理をデンタルフロスに例え、取り組んだ方がいいと多くの人は賛同するが、実際に取り組んでいる出る人はほとんどいないことを指摘してました。身に覚えがあるので、皆んな頭で分かってはいても後回しになってる状態なんだなと同情します。

機械学習モデルのデバッグ」というコラムがあり、MLに問題が起きた時の原因究明の難しさをうまく言語化していて面白かったです。

評価指標にキャリブレーションの重要性を取り上げています。自分がいる広告業界では取り上げられることが多い指標ですが、MLの評価指標として取り上げられる例を見たことがなかったので目新しさがありました。

7.モデルのデプロイと予測サービス

7.1 機械学習におけるデプロイの誤解
    7.1.1 誤解1:一度にデプロイする機械学習モデルはひとつか2つしかない
    7.1.2 誤解2:何もしなければモデルのパフォーマンスは変わらない
    7.1.3 誤解3:モデルを頻繁に更新する必要はない
    7.1.4 誤解4:大抵の機械学習エンジニアはスケールを気にする必要がない
7.2 バッチ予測 vs. オンライン予測
    7.2.1 バッチ予測からオンライン予測へ
    7.2.2 バッチパイプラインとストリームパイプラインの統合
7.3 モデル圧縮
    7.3.1 低ランク分解
    7.3.2 知識蒸留
    7.3.3 枝刈り
    7.3.4 量子化
7.4 クラウドとエッジでの機械学習
    7.4.1 エッジデバイス向けのモデルのコンパイルと最適化
    7.4.2 Webブラウザでの機械学習
7.5 まとめ

本書を通じてこの章がもっともエンジニアリング色が強い内容です。その理由を機械学習モデルのデプロイが機械学習の課題ではなく、エンジニアリングの課題として扱っているからと述べてます。

エッジデバイス上でのモデル最適化につい書かれていて、計算グラフの話が登場します。最適手法の詳細部分までには触れていませんが、どういった手法があるのか全体像を把握するのにちょうどいい内容でした。

筆者は今後ハードウェア性能が向上し、機械学習向けに最適化されればエッジデバイス上でのオンライン予測に移行するとだろうと述べてます。

エッジデバイス上でのMLOpsが今後は注目される、もしくは既にされてるのかもしれません。

8.データ分布のシフトと監視

8.1 機械学習システムの障害の原因
    8.1.1 ソフトウェアシステムの障害
    8.1.2 機械学習特有の障害
8.2 データ分布のシフト
    8.2.1 データ分布のシフトの種類
    8.2.2 一般的なデータ分布シフト
    8.2.3 データ分布シフトの検出
    8.2.4 データ分布シフトへの対処
8.3 監視と可観測性
    8.3.1 機械学習特有の指標
    8.3.2 監視ツールボックス
    8.3.3 可観測性
8.4 まとめ

機械学習システムで起きる障害の原因を、ソフトウェアシステムとしての障害と機械学習特有の障害に分け、機械学習特有の問題について深ぼっています。

MLOpsの文脈で機械学習特有の問題は様々挙げられますが、本章では主にデータに関わる問題を取り上げています。

エッジケースやフィードバックループの問題という、取り上げられることが少ない問題にもスポットライトを当てています。

特にデータドリフトについて非常に詳しく書かれています。データドリフトとして有名どころの共変量シフト、ラベルシフト、コンセプトドリフトや、現実世界でよく起きる特徴の変化、ラベルスキーマの変化について取り上げています。

監視の節では機械学習特有の指標をモデル精度、予測、特徴、生の入力の4項目に分けています。

9.実現場での継続学習とテスト

9.1 継続学習
    9.1.1 ステートレス再学習 vs. ステートフル学習
    9.1.2 継続学習の必要性
    9.1.3 継続学習の課題
    9.1.4 継続学習の4つのステージ
    9.1.5 モデルを更新する頻度
    9.1.6 データの鮮度の価値
9.2 実環境でのテスト
    9.2.1 シャドウデプロイ
    9.2.2 A/Bテスト
    9.2.3 カナリアリリース
    9.2.4 インターリービング試験
    9.2.5 バンディット
9.3 まとめ

データドリフトの検知については前節の監視部分で紹介されました。この節ではデータドリフトにモデルをどう対応させるか?の答えとして継続学習について触れている内容です。

モデルを毎回ゼロから訓練するステートレス再学習に対比して、前回のモデル状態から少量のデータで学習を行う方法をステートフル学習としています。多くの企業ではステートレス再学習を行なっている中、筆者はステートフル学習の有効性を取り上げています。

モデルをどれくらいの頻度で更新すべきか?という機械学習エンジニアなら誰しも思ったことがある疑問に対して、本節ではデータ鮮度の価値を定量化することの重要性を説いてます。

一方、現場でそのような理想論は通じないことも述べていて、「可能な限り頻繁に」と言い切っているのは共感を覚えました。

10.MLOpsにおけるインフラとツール

10.1 ストレージとコンピューティング
    10.1.1 パブリッククラウド vs. プライベートデータセンター
10.2 開発環境
    10.2.1 開発環境の構築
    10.2.2 開発環境の標準化
    10.2.3 コンテナ:開発環境から本番環境へ
10.3 リソース管理
    10.3.1 cron、スケジューラー、オーケストレーター
    10.3.2 データサイエンスのワークフロー管理
10.4 機械学習プラットフォーム
    10.4.1 モデル開発
    10.4.2 モデルストア
    10.4.3 特徴ストア
10.5 構築するか購入するか
10.6 まとめ

本書全体の中で唯一具体的なツールの名前が多く登場する節になっています。

各ツールの詳細というよりは、MLOpsを取り組む中で出てくる考慮すべき点や、それに対して各ツールがどのような機能を備わっているのかがメインに書かれています。

データサイエンティストの開発環境について1節も使って書かれているのは、開発生産性を上げることの意義をデータサイエンティストに認知してもらいたい筆者の熱量を感じました。

自分はなんとなくModel StoreやFeature Storeの機能やメリットを理解していましたが、この節を読んで認識の甘さを反省しました。

自分はModel Storeをモデルの再現に必要な実験条件がわかるメタデータを管理するものとしてふわっと理解してましたが、本書の中では以下の情報を管理すると述べてます。

  • モデル定義
  • モデルのパラメーター
  • 特徴抽出関数と予測関数
  • 依存関係
  • データ
  • モデル生成に関するコード
  • 実験のアーティファクト
  • タグ

Feature Storeについて具体的なツール名と使い勝手と共に書かれているのは目新しさを感じました。

自分がFeature Storeの重要性を理解できていなかったので、これを気にFeastを触ってみようと思います。

11.機械学習の人的側面

11.1 ユーザー体験
    11.1.1 ユーザー体験の一貫性の確保
    11.1.2 「ほぼ正しい」予測との戦い
    11.1.3 スムーズな失敗
11.2 チーム構成
    11.2.1 機能横断的なチームのコラボレーション
    11.2.2 エンド・ツー・エンドなデータサイエンティスト
11.3 責任あるAI
    11.3.1 無責任なAI:ケーススタディ
    11.3.2 責任あるAIのフレームワーク
11.4 まとめ

人的側面という章タイトルですが、社内コミュニケーションなどの政治的な話ではありません。

ユーザー体験とチーム構成の節は、技術的な内容というよりは、ビジネス理解やチームビルディングについての話となっています。

チーム構成の節の中にデータサイエンティストがエンドツーエンドで機械学習システムの面倒を見るべきか論争があります。フルスタックのデータサイエンティストが成功を収めるかは、ツールとインフラに依存すると述べられています。NetflixUberが自前の機械学習プラットフォームを作成してる理由がこういった思想の元にあるそうです。

XAI(Explainable AI)についての節を筆者は本書の最も重要なトピックとしています。XAIは概念的な説明にとどまる書籍が多い中、バイアス発見方法やモデルカードの作成など実践的な内容にまで触れられています。

付録.機械学習システムを外部に提供する

株式会社JDSCの宮川大輔氏が書いた、日本語版オリジナルの内容となっています。

付録として扱われていますが、26ページというボリュームで読み応えのある節です。「AI」を通じて業務改善したい企業の要求に対して、外部委託のデータサイエンティストとして取り組む事例の話です。

書かれているモデルケースが妙にリアルで、現場データサイエンティストの苦労を知ってる人が書いてる文章だなというのがヒシヒシと伝わってきました。

機械学習システムデザインという技術色が強い本の付録がソフトスキルに関わる内容で、データサイエンティストという職業に求められるスキルの幅広さを感じました。