はじめに
「AI をやる」と言うと、いまはほとんど反射的にディープラーニングの話になります。しかし実務で解きたい問題の多くは、もっと軽い手法で十分に、しかも安く速く解けることがあります。
本記事では、その「軽い手法」を 15 章にわたって並べた一冊、『PythonによるAIプログラミング入門 ―ディープラーニングを始める前に身につけておくべき15の基礎技術』を読んだ内容をまとめます。設計・アーキテクチャに関心のあるエンジニア向けに、アルゴリズムの列挙ではなく「どこで技術選定の判断が発生するのか」という視点で整理しました。
書籍情報
| 項目 | 内容 |
|---|---|
| 書名 | PythonによるAIプログラミング入門 ―ディープラーニングを始める前に身につけておくべき15の基礎技術 |
| 著者 | Prateek Joshi |
| 訳者 | 相川 愛三 |
| 出版社 | オライリー・ジャパン |
| 原書 | Artificial Intelligence with Python(Packt Publishing, 2017) |
| 邦訳 | 2019年 |
| 構成 | 全16章 + 日本語版オリジナル付録A |
著者は南カリフォルニア大学で人工知能の修士号を取得した研究者で、シリコンバレーで水資源管理の分析基盤を手がけるスタートアップを創業した経歴を持ちます。技術ブログの運営者としても知られる方です。
本書の立ち位置
訳者まえがきに、この本の性格がはっきり書かれています。要約すると次のような主張です。
- 人工知能の手法はディープラーニングだけではない
- ディープラーニングにはデータ収集と計算のコストがかかる
- 古典的な手法を基礎として身につけ、適材適所で選べるようになるべきである
「鶏を割くに焉んぞ牛刀を用いん」という諺が引かれていて、この一文が本書全体の姿勢を表しています。つまり本書は、ディープラーニングの入門書ではなく、ディープラーニングを選ばないという判断ができるようになるための本です。
扱う範囲は、回帰・分類・クラスタリングといった定番から、解空間の探索や最適化、テキスト・音声・画像といったメディア固有の処理、そして最後にニューラルネットと CNN まで、かなり横断的です。
もう一点、翻訳にあたって原書の問題をかなり修正したと明記されており、説明不足の補足、冗長な記述の削除、わかりにくいコードの大幅な修正が行われています。さらにサンプルコードは Jupyter Notebook で編集・実行する形に改変されています。読み込みに時間がかかる大規模ライブラリを扱う以上、エディタとコンソールを往復する手順では学習効率が上がらない、という理由です。この判断は妥当だと感じました。
全体構成
15 の基礎技術がどう配置されているかを一覧にします。
| 章 | テーマ | 主に使うライブラリ | 題材 |
|---|---|---|---|
| 1章 | 人工知能の概要 | (環境構築) | チューリングテスト、一般問題解決器 |
| 2章 | 教師あり学習(分類・回帰) | scikit-learn | 所得分類、住宅費推定 |
| 3章 | アンサンブル学習 | scikit-learn | 交通量予測 |
| 4章 | 教師なし学習 | scikit-learn | 株式市場、顧客セグメント |
| 5章 | 推薦エンジン | scikit-learn | 映画推薦 |
| 6章 | 論理プログラミング | kanren | 家系図、パズル |
| 7章 | ヒューリスティック探索 | simpleai | 4色問題、8パズル、迷路 |
| 8章 | 遺伝的アルゴリズム | DEAP | 関数同定、ロボット制御 |
| 9章 | ゲームAI | easyAI | 三目並べ、Connect Four |
| 10章 | 自然言語処理 | NLTK、gensim | 感情分析、トピックモデル |
| 11章 | 連続データの確率的推論 | pandas、hmmlearn、pystruct | 株式市場分析 |
| 12章 | 音声認識 | python_speech_features | 発話語認識 |
| 13章 | 物体検出と追跡 | OpenCV | 顔検出、オプティカルフロー |
| 14章 | 人工ニューラルネットワーク | neurolab | OCRエンジン |
| 15章 | 強化学習 | OpenAI Gym | 学習エージェント |
| 16章 | CNNとディープラーニング | TensorFlow | 画像分類器 |
| 付録A | 4色問題の自動化 | OpenCV、simpleai | 白地図の塗り分け |
章ごとに使うライブラリがほぼ入れ替わるのが本書の特徴です。これは裏を返すと、「この問題領域では、この界隈のデファクトはこれ」というマップを一冊で得られるということでもあります。
各章のポイント
1章:人工知能の概要
AI の定義、応用例、分派、チューリングテスト、合理的なエージェント、一般問題解決器(GPS)、知的エージェントのモデル種別といった概念が並びます。加えて Python 3 と各種パッケージのインストール手順まで含まれています。
概念の章ですが、後半の「知的エージェント」と「モデルの種類」の整理は、15 章以降の強化学習の伏線として効いてきます。
2章:教師あり学習を用いた分類と回帰
本書で最も基礎的な章です。
- 前処理:二値化、平均値を引く、スケーリング、正規化
- ラベルのエンコーディング
- ロジスティック回帰、単純ベイズ、SVM による分類
- 混同行列による評価
- 単変数・多変数・多項式回帰、サポートベクター回帰
前処理の 4 手法を「何のためにやるのか」から説明しているのが良いところです。たとえば平均値を引くのは、特徴ベクトルからバイアスを除去して特徴量の中心を原点に持ってくるため、という具合に目的が明示されます。
過学習についても、サンプル数が足りないと教師データのパターンに適合しすぎて未知のデータに効かなくなる、と早い段階で釘を刺しています。
3章:アンサンブル学習を用いた予測分析
決定木からランダムフォレスト、Extremely Randomized Trees(ERT)へ進み、最後に交通量予測へ応用します。
アンサンブル学習を「テレビを買うときに複数の専門家に意見を聞く」という比喩で導入していて、なぜ多様性が必要なのかが直感的に入ってきます。個々のモデルが多様であればデータの揺れを吸収でき、不適切なモデル選択による過剰適合のリスクが下がる、という説明です。
実務寄りのトピックとして、クラス不均衡への対処、グリッドサーチによるパラメータ最適化、特徴量の相対重要度が入っているのが有り難い構成でした。この 3 つは実データを触ると必ずぶつかります。
4章:教師なし学習を用いたパターン検出
k-平均法、Mean Shift、シルエットスコア、混合ガウスモデル、Affinity Propagation という流れです。
k-平均法の説明では、中心点の初期位置が結果に大きく影響すること、k-means++ が初期中心点を互いに離して配置することで収束を速めること、といった実装上の勘所に踏み込んでいます。
「すべての場合に有効な万能の類似度はなく、問題に応じて類似度を考える」という一文があり、ここは設計判断そのものです。距離関数の選択がドメイン知識の埋め込み点になります。
5章:推薦エンジンを作る
訓練パイプラインの組み方から入り、最近傍点の抽出、k-近傍分類器、類似度計算、協調フィルタリング、映画推薦システムへと進みます。
パイプラインという概念を最初に置いているのが特徴で、前処理・モデル・評価をどう繋ぐかという構造の話が先に来ます。
6章:論理プログラミング
kanren を使って、数式の照合、素数判定、家系図の解析、地理の解析、パズルの解法を扱います。
機械学習の章に挟まれて論理プログラミングが出てくるのは今どき珍しい構成ですが、**「ルールが明示できる問題に統計的手法を持ち込む必要はない」**という本書の主張と整合しています。家系図の推論はまさにその代表例です。
7章:ヒューリスティック探索
simpleai を使い、情報あり探索と情報なし探索の違い、制約充足問題(CSP)、局所探索、焼きなまし法、貪欲法、4色問題、8パズル、迷路と展開します。
制約充足問題の枠組みに落とし込めれば、学習を一切使わずに解ける問題群がある、という感覚が得られます。
8章:遺伝的アルゴリズム
DEAP を用いて、交叉・突然変異・適応度関数といった基本概念から、ビットパターン生成、進化の可視化、関数同定問題、知的ロボット制御まで進みます。本書で最もページ数が多い章です。
勾配が使えない、目的関数が微分不可能、といった状況での選択肢として押さえておく価値があります。
9章:人工知能を使ったゲーム
easyAI を使い、組み合わせ探索、ミニマックス法、アルファ・ベータ法、ネガマックス法を学び、コイン取りゲーム、三目並べ、Connect Four、Hexapawn を実装します。
探索アルゴリズムの枝刈りが実際にどう効くかを、動くゲームで確認できるのは理解に効きます。
10章:自然言語処理
NLTK と gensim を用いて、トークン化、ステミング、レンマ化、チャンク分割、Bag of Words、カテゴリ推定、名前からの性別判定、感情分析、LDA によるトピックモデルまで扱います。
大規模言語モデル以前の古典的 NLP パイプラインが一通り揃っています。前処理の各段階が何を捨てて何を残すのかを手を動かして確認できるので、いま LLM を使う立場でも、テキスト正規化の設計を考えるときの土台になります。
11章:連続データの確率的推論
pandas による時系列処理、スライス、演算、統計量抽出という基礎を固めてから、隠れマルコフモデル(hmmlearn)と CRF(pystruct)に進み、株式市場分析へ応用します。
系列ラベリングを「生成モデル vs 識別モデル」という対比で押さえられる構成です。
12章:音声認識
音声信号の扱い方、可視化、周波数領域への変換、音声の生成、音階合成、特徴量抽出(MFCC)、発話語の認識という順で進みます。
音を「波形 → スペクトル → 特徴量 → 系列モデル」という段階に分解する考え方が身につきます。この分解の仕方自体は、現代の音声処理でも変わっていません。
13章:物体検出と追跡
OpenCV を用いて、フレーム差分、色空間による物体検出、背景差分、CAMShift、オプティカルフロー、Haar カスケードによる顔検出、目の検出を扱います。
積分画像を使った特徴量抽出の説明があるので、なぜ Haar カスケードが当時としては高速だったのかまで踏み込めます。
14章:人工ニューラルネットワーク
neurolab を使って、パーセプトロン、単層ニューラルネット、多層ニューラルネット、ベクトル量子化、RNN と積み上げ、最後に OCR エンジンを作ります。
TensorFlow を使う 16 章より前に、あえて軽量ライブラリで手を動かす構成になっています。ネットワークの構築と訓練を分けて説明するので、学習ループの構造が見えやすいです。
15章:強化学習
OpenAI Gym を用いて、強化学習の前提条件、教師あり学習との違い、構成要素、環境の構築、学習エージェントの構築を扱います。
短い章ですが、「エージェントと環境の境界をどこに引くか」という設計上の問いが明確に出てきます。
16章:畳み込みニューラルネットを用いたディープラーニング
CNN の構造と層の種類を説明し、TensorFlow でパーセプトロンによる線形回帰、単層ニューラルネットによる画像分類、そして CNN による画像分類器を作ります。
15 章分の助走を経てここに到達すると、CNN が「特別なもの」ではなく、それまでの手法と同じ土俵に乗った選択肢のひとつとして見えてきます。この読後感こそが本書の設計意図でしょう。
付録A:退屈なことはPythonにやらせよう —— 4色問題篇
日本語版オリジナルの付録です。7章で 4色問題を解く際、地図から領域の隣接関係を手作業で洗い出す必要があり、原書には隣接関係の記述に誤りがあったとのことです。
そこで付録では、白地図の画像から OpenCV で領域を抽出し、隣接関係を自動的に求め、そのうえで CSP を解いて塗り分けます。
処理の流れは次のとおりです。
- グレースケール変換後、
cv2.erode()で領域を縮めて境界線を太くする -
cv2.findContours()で輪郭を抽出し、cv2.drawContours()で領域ごとに識別番号を画素値として塗りつぶす - 輪郭上の点の周辺画素を調べ、隣接する領域 ID の集合を構築する
- 得られた隣接情報を CSP に渡して塗り分ける
画像処理で入力データを作り、探索アルゴリズムで解くという二段構えになっていて、章をまたいだ道具の組み合わせ方の実例になっています。個人的には本書で一番おもしろい箇所でした。
設計・アーキテクチャの観点から
1. 手法選択そのものが設計判断である
本書を通読して最も強く残るのは、アルゴリズムの選択がアーキテクチャ上の意思決定であるという感覚です。
ディープラーニングを選べば、データ収集コスト、計算コスト、推論レイテンシ、解釈性の低下がまとめてついてきます。ルールが明示できるなら論理プログラミング、制約が書き下せるなら CSP、勾配が使えないなら遺伝的アルゴリズム、というように選択肢を持っていること自体が、システム全体のコスト構造を左右します。
2. パイプラインの層構造は共通している
章ごとに扱う対象は違っても、構造はほぼ共通しています。
生データ
↓ 前処理(正規化・トークン化・フレーム差分 …)
特徴量
↓ モデル(分類器・探索・系列モデル …)
出力
↓ 評価(混同行列・シルエットスコア …)
判断
テキストでも音声でも画像でも同じ層が現れるので、この層構造を境界として設計しておけば、モデルの差し替えが局所的な変更で済むことがわかります。前処理をモデルの内側に埋め込まない、という原則の根拠になります。
3. 評価指標の選定を後回しにしない
混同行列、予測の確信度の推定、シルエットスコア、クラス不均衡への対処と、評価まわりの話題が各所に散りばめられています。
精度という単一の数値だけを見ていると、クラス不均衡なデータで簡単に嘘をつかれます。何をもって「良い」とするかを先に決めておくのは、設計の一部です。
4. サンプルコードの共通化
2章で作った utilities.ipynb を 3章以降で読み込んで再利用する構成になっています。ノートブックであっても共通部分を切り出すという姿勢は、写経する側にとっても良い習慣づけになります。
注意点
原書が 2017 年、邦訳が 2019 年ということもあり、そのままでは動かない箇所があります。読む際は次の点を織り込んでおくと安全です。
- TensorFlow の世代:16章のコードは 1.x 系の API を前提としています。現在の 2.x 系や Keras の書き方とは異なります。
-
OpenCV の API:付録の
cv2.findContours()は戻り値が 3 つの前提で書かれています。バージョンによって戻り値の個数が異なります。 -
周辺ライブラリのメンテナンス状況:
neurolab、pystructあたりは現在では選択肢として一般的とは言えません。OpenAI Gym も後継への移行が進んでいます。 - 深層学習部分の分量:16章は入口の紹介にとどまります。深層学習そのものを学びたい場合は別の書籍が必要です。
ただしこれらは、本書の価値をあまり損ないません。この本の主題はライブラリの使い方ではなく、問題の種類と手法の対応関係だからです。API は変わっても、k-平均法の初期値問題も、クラス不均衡の厄介さも、CSP に落とせる問題の見分け方も変わりません。
写経しながら読むなら、ライブラリのバージョンを固定した環境を用意しておくとストレスが減ります。
こんな方におすすめ
向いている方
- 機械学習の全体像を、実装を伴いながら一望したい方
- ディープラーニング以外の選択肢を体系的に持っておきたい方
- 探索、最適化、論理プログラミングといった「AI の古典」に触れたことがない方
- 手法選択の判断材料を増やしたい設計寄りのエンジニア
向いていない方
- 深層学習の理論やモデル実装を深く学びたい方
- 最新のライブラリ API に沿ったハンズオンを求めている方
- 数学的な導出を追いたい方(本書は数式より動くコード寄りです)
前提としては Python の基礎知識が必要とされていますが、Python に習熟していなくても読み進められる書き方になっています。
まとめ
本書のタイトルにある「ディープラーニングを始める前に身につけておくべき」という言い回しは、単なる前振りではなく、はっきりした主張だと読めました。
15 の基礎技術を一通り経験すると、目の前の問題に対して「これは分類問題か、クラスタリングか、探索か、それとも制約充足か」という切り分けが自然にできるようになります。この切り分けの精度こそが、後工程のコストを決めます。
そして最後に CNN までたどり着いたとき、ディープラーニングは万能の解ではなく、道具箱に並ぶ 16 番目の道具として位置づけられます。牛刀を持つ前に、まず包丁の種類を知っておく。本書はそのための一冊です。