はじめに
今回は、Laurence Moroney 著・菊池彰 訳『動かして学ぶAI・機械学習の基礎』を読んだ感想と、全20章の要点をまとめます。
原題は AI and Machine Learning for Coders で、日本語版は2022年にオライリー・ジャパンから刊行されています。序文を寄せているのは Andrew Ng 氏です。著者は Google の AI アドボカシーを率いる人物で、Coursera の TensorFlow 講座でも知られています。
この記事は、設計やアーキテクチャに関心のあるエンジニア向けに「この本は何を教えてくれて、どこまで届くのか」を整理したものです。数式の導出ではなく、コードと実験結果で理解したい方を想定しています。
この本の一言まとめ
**「Keras で最小のモデルを書くところから始め、画像・自然言語・時系列を扱い、最後はモバイル・ブラウザ・サーバへ届けるまでを一本の線で通す本」**です。
特徴は次の3点です。
- 数式よりコードを先に動かす構成になっている
- 学習だけでなく、デプロイ先ごとの作法まで扱っている
- 最終章で AI 倫理・公平性・プライバシーに触れている
全体構成
本書は大きく2部構成です。
| 部 | 章 | テーマ |
|---|---|---|
| 第I部 モデルの構築 | 1〜11章 | 基礎、画像、データセット、自然言語、時系列 |
| 第II部 モデルの使用 | 12〜20章 | TFLite、Android、iOS、TF.js、Serving、倫理 |
第I部 モデルの構築
1章 TensorFlowの概要
機械学習を「ルールとデータから答えを出す従来のプログラミング」の逆、つまり「答えとデータからルールを導く手法」として説明するところから始まります。
題材は Y = 2X - 1 の関係を1つのニューロンに学習させる「Hello World」です。学習後に重みを取り出すと約 1.99 とバイアス約 -0.99 になり、「完全には一致しないが十分近い」ことを体験できます。
この章のコードの型は、後の複雑なモデルでもそのまま使われます。
model = Sequential([Dense(units=1, input_shape=[1])])
model.compile(optimizer='sgd', loss='mean_squared_error')
model.fit(xs, ys, epochs=500)
2章 コンピュータビジョン入門
Fashion MNIST を使い、28×28 のグレースケール画像を10種類の衣類に分類する最初のネットワークを作ります。
-
Flatten→Dense→softmaxという基本形 - 学習データとテストデータを分ける意味
- コールバックによる学習の早期終了(正解率が目標に達したら止める)
「単純な構成でも、制御された条件ならここまで当たる」ことと、「条件が崩れると弱い」ことの両方が見えるのが良い構成です。
3章 基礎からの発展: 画像の特徴量検出
最も分量の多い章で、畳み込みニューラルネットワーク(CNN)を扱います。
- 畳み込みとプーリングで特徴を抽出する考え方
- 馬と人間、犬と猫といった、より実世界に近い画像の分類
- 画像拡張(Augmentation)による汎化性能の改善
- 転移学習による既存モデルの再利用
- ドロップアウトで過剰適合を抑える
印象的だったのは、ドロップアウトを入れると学習セットの正解率は下がる一方、検証セットとの差が縮まる点です。**「学習データでの高スコアは必ずしも良い結果ではない」**という姿勢が、以降の章でも一貫しています。
4章 TensorFlow Datasetsを使った公開データセットの利用
データの取得方法がバラバラな問題を、TFDS の共通 API で解決する章です。
注目したのは、データ読み込みを ETL(Extract / Transform / Load)として捉え、並列化で学習を速くする部分です。shuffle、batch、prefetch を組み合わせることで、1エポックあたりの時間が約75秒から約40秒へ短縮される例が示されています。
設計者の視点では、モデルの精度だけでなくデータパイプラインの設計が学習時間を左右することを確認できる章です。
5章 自然言語処理入門
テキストを数値に変換する工程を扱います。
-
Tokenizerで単語をトークン化する - 文をトークンの列(シーケンス)に変換する
-
pad_sequencesで長さを揃える - 語彙外の単語は
<OOV>として扱う
また、ニュース見出しの皮肉検出(Sarcasm)データセットを読み込み、不要な情報を取り除く前処理も紹介されます。画像と違い、テキストは構造が揃っていないぶん前処理の比重が大きいという点が実感できます。
6章 埋め込みによる感情のプログラム化
単語を高次元のベクトルで表現する「埋め込み(Embedding)」の章です。
最初に「皮肉な見出しの単語にはプラス、普通の見出しにはマイナスを加える」という素朴な例で、方向に意味を持たせる発想を説明します。そこから Embedding 層を使った皮肉検出器へ進みます。
過剰適合への対処が具体的で、実験の順序も参考になります。
| 施策 | 結果の傾向 |
|---|---|
| 学習率を下げる | 立ち上がりは遅いが、損失は低く抑えられる |
| 語彙サイズを 10,000 → 2,000 に縮小 | 低頻度語への過剰適合が緩和される |
| 埋め込み次元を 16 → 7 に縮小 | 精度はほぼ同等で、学習が速くなる |
| Dense 層のニューロンを減らす | 曲線が滑らかになる |
| ドロップアウト | このモデルでは効果が薄い |
| L2 正則化 | 損失曲線がやや滑らかになる |
埋め込み次元の目安として「語彙サイズの4乗根」という経験則が紹介されています。2,000 の4乗根は約 6.7 なので、7 を選んでいます。
さらに、Embedding Projector で学習した単語ベクトルを可視化する手順と、TensorFlow Hub の事前学習済み埋め込み(Swivel)の利用も扱います。後者は過剰適合しにくい反面、文全体を1つのベクトルにまとめるため、このタスクでは正解率が約67%にとどまりました。**「便利な部品でも、タスクに合うかは別問題」**という教訓です。
7章 自然言語処理のための回帰型ニューラルネットワーク
埋め込みは単語の「順序」を考慮できません。「blue」と「sky」を並べた「blue sky」には、単語ごとの足し算では出せない意味が生まれます。そこで、順序を扱う RNN と、文脈を長く保持する LSTM を導入します。
- 基本的な RNN の動作
- LSTM による長期の文脈保持
- 双方向(Bidirectional)LSTM
- 過剰適合への対処と、事前学習済み埋め込みを使った転移学習
最後に同じ皮肉検出モデルで見出しを判定し、天気の話題は低スコア、風刺記事由来の見出しは高スコアになることを確認します。
8章 TensorFlowによるテキストの生成
次の単語を予測するモデルを作り、シード文から詩のようなテキストを生成する章です。
- 文章を特徴量(途中までの単語列)とラベル(次の単語)に分割する
- LSTM で次の単語を予測する
- アイルランド民謡の歌詞で学習し、改良を重ねる
- 文字ベースの生成にも触れる
生成結果は長くなるほど意味が崩れていきます。それでも、予測を繰り返すとテキストになるという仕組みを、手を動かして理解できる章です。
9章 シーケンスと時系列データの理解
分量は短めですが、時系列予測の土台になる章です。
- トレンド、季節性、自己相関、ノイズという4つの属性
- 合成した時系列の作成
- 平均二乗誤差(MSE)と平均絶対誤差(MAE)による評価
- ナイーブ予測、移動平均、差分法(365日前との差)
機械学習を使う前に統計的な基準値を作る流れがよくできています。差分法と移動平均の組み合わせで、MAE は 5.13 になります。後の章の改善を測る比較対象がここで固まります。
10章 シーケンスを予測するモデルの作成
時系列を「過去の窓(ウィンドウ)を特徴量、次の値をラベル」とする形に変換し、通常の教師あり学習として扱います。
dataset = dataset.window(window_size + 1, shift=1, drop_remainder=True)
dataset = dataset.flat_map(lambda w: w.batch(window_size + 1))
dataset = dataset.map(lambda w: (w[:-1], w[-1]))
単純な DNN で予測した結果は MAE 4.51 で、統計的手法の 5.13 から改善しました。さらに Keras Tuner でハイパーパラメータを探索すると 4.47 になります。
11章 畳み込みと回帰によるシーケンスモデルの構築
時系列に Conv1D、SimpleRNN、GRU、LSTM を適用します。
-
padding="causal"で、未来のデータを参照しないようにする - 素朴な Conv1D は MAE 4.89 とやや悪化し、Keras Tuner でカーネルサイズ 9 を選ぶと 4.39 に改善
- NASA の気象データと、約9万点の気温データで実データを扱う
-
dropoutとrecurrent_dropoutの違い - 双方向 GRU とウィンドウサイズの調整
正規化したデータの損失は小さく見えるため、実際の値に戻して評価しないと誤った安心感につながるという注意も書かれています。
第II部 モデルの使用
12章 TensorFlow Liteの紹介
モバイルや組み込み機器向けに、モデルを小さく軽くして動かす仕組みです。
- モデルを
.tflite形式へ変換する - 量子化によるサイズ削減(転移学習の例で約3分の1の2.8MBに縮小し、正解率は約99%を維持)
- マイクロコントローラ向けの TFLite for Microcontrollers(TinyML)への言及
「小さくするほど精度が落ちる」という単純な話ではなく、手順次第で精度を保てることが示されています。
13章 AndroidアプリでTensorFlow Lite
Android Studio と Kotlin を使い、TFLite モデルをアプリに組み込む章です。
- モデルを assets として配置し、インタープリタへ読み込む
- アプリ側のデータ(数値や画像)を、モデルが期待する入力配列へ変換する
- 出力を
ByteBufferから解析する
ここで繰り返し出てくるのは、アプリ側の型とモデル側のテンソルの橋渡しが実装の中心だという点です。画像分類、物体検出、感情分析などのサンプルアプリも紹介されます。
14章 iOSアプリでTensorFlow Lite
Xcode と Swift で同じことを行います。
- CocoaPods で
TensorFlowLiteSwiftを依存関係に追加する - Storyboard で UI を作り、outlet と action を接続する
- UI と推論ロジックを
ModelParserクラスに分離する - 入力値を低レベルのメモリとして渡し、出力を配列に読み戻す
UI と推論処理を別クラスに切り分ける構成は、設計の観点でも素直で読みやすいです。
15章 TensorFlow.jsの紹介
JavaScript でモデルを学習・実行するための章です。ブラウザ上でも Node.js でも動かせます。
- 無料のオープンソース IDE(Brackets)とローカルサーバでの開発
-
Y = 2X - 1の線形回帰を JS で再現 - Iris データセットの分類
-
tf.argMaxとdataSyncによる結果の取り出し(dataSyncは UI をブロックするため注意)
16章 TensorFlow.jsによるコンピュータビジョンのためのコーディング技法
ブラウザ上で手書き数字の認識器を作ります。ブラウザならではの制約が丁寧に説明されます。
| 課題 | 対処 |
|---|---|
| 画像1枚ごとに HTTP 接続が発生する | 全画像を1枚のスプライトシートにまとめる |
| 学習の進み具合が見えない |
tfjs-vis で別タブに可視化する |
| UI スレッドがロックされる | Promise と await で非同期化する |
| メモリが溢れる |
tf.tidy で不要なテンソルを解放する |
| ラベルのデコードが重い | 疎な符号化(ワンホット)を ArrayBuffer で扱う |
ラベルを効率の悪いワンホット形式で持つのは、処理を単純にするための意図的なトレードオフです。この説明は設計の話として面白く読めます。
17章 Pythonモデルの再利用とJavaScriptへの変換
Python で学習したモデルを JS へ変換する tensorflowjs_converter を扱います。
- 変換結果は、構造を記した JSON と、重みを収めたバイナリ(
.bin)に分かれる - 1ニューロンのモデルでは
.binが 8 バイト(重みとバイアスで float32 が2つ)で、中身を16進数で確認できる - 事前変換済みモデルとして、攻撃的テキストの分類、MobileNet の画像分類、PoseNet の姿勢推定を使う
バイナリの中身まで追う説明のおかげで、「変換とは何をしているのか」が腹落ちします。
18章 JavaScriptでの転移学習
転移学習の方法を3種類に整理します。
- レイヤーベースのモデル(
model.json)から途中の層を選んで使う - TensorFlow Hub のグラフベースモデルから、特徴ベクトルを取り出して使う
- TensorFlow.org が提供するラップ済みの JS モデルを使う
題材はWebカメラで撮影したじゃんけん(グー・チョキ・パー)の分類です。MobileNet の conv_pw_13_relu 層までを特徴抽出器として使い、その後ろに小さな Dense 層を付けて3クラスを学習します。
著者は、特徴ベクトルが用意されている TensorFlow Hub のアプローチを基本的に勧めています。
19章 TensorFlow Servingへのデプロイ
サーバ側でモデルを提供する章です。モデルのコードは、設定、データ検証、監視、リソース管理などを含む実運用システムの一部にすぎない、という説明から始まります。
- TensorFlow Serving のインストールと起動(REST は 8501 番ポート)
- HTTP POST による推論リクエスト
- 設定ファイルによる複数モデル・複数バージョンの管理
- ポーリングによる、再起動なしの設定反映
バージョンごとにURLでアクセスできるため、モデルのバージョン管理を運用の仕組みとして扱える点が実務的です。
20章 AI倫理、公平性、プライバシー
最終章は、技術から視点を引いた話です。
従来のプログラムはソースコードを読めば挙動を追えますが、機械学習モデルは重みやバイアスの塊であり、解釈が難しくなります。だからこそ、透明性と公平性の確保が重要になります。
- 学習データに潜むバイアスの問題と、それを検出するためのツール
- 連合学習(Federated Learning)によるプライバシー保護
- 責任ある AI の原則を、開発者だけでなく利用者側にも用意する考え方
本書から得られた学び
1. 「型」を覚えれば応用が利く
どの章でも、データ準備 → モデル定義 → コンパイル → 学習 → 評価という流れは変わりません。入力と出力の形だけが変わるため、新しい題材に出会っても迷いにくくなります。
2. 精度の数字を疑う姿勢
- 学習精度が高くても、検証精度が下がれば過剰適合を疑う
- 正規化後の損失は小さく見えるため、実際の値で評価する
- 事前学習済みの部品が常に最適とは限らない
3. 実装先の制約が設計を決める
ブラウザなら HTTP 接続数とメモリ、モバイルならモデルサイズと型変換、サーバならバージョン管理と運用。デプロイ先の制約が、モデルの作り方まで影響することを、章ごとに具体例で示してくれます。
気になった点
- 本書は TensorFlow 2.x 系を前提にしており、コードや API は版が進むと変わる可能性があります。コードをそのまま写すより、考え方を掴む使い方が向いています
- 第II部は、Android、iOS、JavaScript、サーバと対象が広いぶん、各プラットフォームの深掘りは入口までです
- 数学的な背景(誤差逆伝播など)の詳しい解説は少なく、理論面は別の資料で補う必要があります
こんな人におすすめ
| 読者像 | おすすめ度 |
|---|---|
| 機械学習の実装を最短で一通り体験したい | ★★★★★ |
| 学習済みモデルをアプリやWebに組み込みたい | ★★★★★ |
| 設計・アーキテクチャの観点で全体像を知りたい | ★★★★☆ |
| 理論や数式を厳密に学びたい | ★★☆☆☆ |
まとめ
『動かして学ぶAI・機械学習の基礎』は、「作る」だけでなく「届ける」までを1冊で通して体験できる本です。
- 第I部で、画像・自然言語・時系列の3領域のモデルを実際に動かせる
- 第II部で、モバイル・ブラウザ・サーバへのデプロイの作法を押さえられる
- 最終章で、モデルを使う責任についても考える機会が得られる
機械学習の全体像を、コードを動かしながら掴みたい方に向いた1冊です。ここで得た「型」をもとに、自分のデータや用途で試してみるのが、次の一歩として良さそうです。
参考
- 書籍: Laurence Moroney 著、菊池彰 訳『動かして学ぶAI・機械学習の基礎』オライリー・ジャパン
- 原書: AI and Machine Learning for Coders (O'Reilly Media)
- 書籍サポート用リポジトリ: https://github.com/lmoroney/tfbook