29 古典的分類器
認識編はここまで進んできたが、実はずっと分類を行ってきた。ただ、その形式がますます自由になっただけである。バーコード認識は本質的に「表引き」である——シンボル体系が答えをあらかじめ白黒のバーとスペースにエンコードしており、アルゴリズムは復号するだけでよい。OCRは範囲を数十の文字クラスまで広げるが、文字セットは既知かつ閉じている。本章が直面するのは、一般的な分類問題そのものである——ある対象が与えられたとき、あらかじめ定義されたクラスのどれに属するかを判定する。錠剤上の汚点は黒い点なのか、繊維なのか、それとも砕屑の塊なのか?このような問題には依拠すべきエンコード規則がなく、サンプルから統計的規則性を学習するしかない。ディープラーニングがビジョン分野を席巻する前、k近傍法(k-nearest neighbors, KNN)、多層パーセプトロン(multilayer perceptron, MLP)、サポートベクターマシン(support vector machine, SVM)はパターン認識の「三種の神器」であった。今日に至っても、特徴量の次元が低く、サンプル数が少なく、解釈可能性が求められる工業タスクにおいて、これらは依然としてコストパフォーマンスの王である——訓練は秒単位、予測はマイクロ秒単位、GPUは不要であり、誤判定時にはその原因を追跡できる。本章では、異物選別タスクを用いて3つの分類器を貫く——明るい背景上で3種類の暗色対象——円点(dot)、細長い繊維(fiber)、不規則な塊(cluster)——を区別する。図 29.1 の最初の3行に示す通りである。第4行のあの「太いカプセル」は意図的に作成された境界サンプルであり、後ほど厄介なことを起こすためにとっておく。
29.1 特徴空間と分離性
分類器は画像を直接扱わない。最初のステップは、各画像を1つの特徴ベクトル(feature vector)に変換することである。閾値処理により対象領域を取得した後、チャプター 23 で紹介した領域特徴量を用いて、それを4つの数値——面積(area)、異方性(anisometry)、円形度(circularity)、コンパクト性(compactness)——に圧縮する。こうして各サンプルは4次元特徴空間(feature space)内の1点となり、「分類」はこの空間で領域を分割する幾何学的問題へと変わる。
実際の生産ラインの異物はどのようなものか?図 29.2 は奥普特(OPT)Smart3ディープラーニングサンプルプロジェクトの1フレームから取得した——半透明のチューブ表面に複数の暗色異物粒子が散在している。上記と全く同じパイプラインでこれを処理する。異物が密集する領域にROIを設定し、閾値処理(チューブ本体は明るく、異物はほぼ黒)を行い、blob分析で印刷の網点を除去した後、各異物粒子に対して同じ4次元の領域特徴量を抽出する。セグメンテーションされた6個の異物とその実際の測定値は以下の通りである。
| 異物 | 面積 | 異方性 | 円形度 | コンパクト性 | 形態 |
|---|---|---|---|---|---|
| P1 | 1143 | 1.67 | 0.500 | 1.40 | 塊状チップ(塊形) |
| P2 | 902 | 1.64 | 0.478 | 2.14 | 塊状チップ(塊形) |
| P3 | 1180 | 2.29 | 0.358 | 2.21 | 塊状チップ(塊形) |
| P4 | 562 | 1.14 | 0.753 | 1.09 | コンパクトな暗点(円点形) |
| P5 | 294 | 1.33 | 0.571 | 1.20 | コンパクトな暗点(円点形) |
| P6 | 322 | 3.28 | 0.280 | 1.73 | 細長い切片(繊維形) |
この実際の測定結果は、合成タスクの設定が架空のものではないことを裏付けている。P4、P5はコンパクトな暗点(円形度0.57~0.75、異方性はほぼ1)であり、「円点」に対応する。P1~P3は面積がより大きく、エッジが砕けた塊状チップ(円形度0.36~0.50)であり、「塊」に対応する。P6は細長い切片(異方性3.28、円形度わずか0.28)であり、形態は「繊維」に偏っている。実際の異物は円点—繊維—塊という同じ形態スペクトル上に分布していることが確かめられ、本章の特徴量設計には確固たる根拠がある。
しかし、まさにそれが「実際の」ものであるがゆえに、分類器の訓練と評価をそれに基づいて行うことはできない。理由は3つある。第一に、1フレームにはわずか6個の異物しかなく、かつ個別のクラス正解ラベルがないため、クラスごとに40/20の訓練—テスト分割を作ることができない。第二に、実際の異物の形態スペクトルは連続的である——P6の異方性3.28は、後ほど意図的に合成する「太いカプセル」境界サンプル区間(3.33~5.16)の下限にちょうど接しており、クラス間に明確な隙間がなく、3つの分類器の境界挙動を公平に比較するために用いることができない。第三に、制御された合成セットにより、分離性、サンプル数、境界の難易度を正確に調整できるが、これはまさに後続の実験で必要とされる「実験台」である。したがって本章の役割分担は次の通りである。実際のサンプル画像は特徴抽出と形態スペクトルの妥当性を検証し、分類器の訓練と比較実験はラベル付け可能、分割可能、難易度調整可能な制御された合成セット上で行う(合成サンプルは 図 29.1 を参照)。
図 29.3 は、この制御された合成データセットを異方性×円形度平面に投影したものである。3つのクラスの配置は一目瞭然である。繊維(十字)は右下に孤立している——異方性7.15~18.0、円形度はわずか0.07~0.15で、どのクラスとも離れている。一方、円点(塗りつぶし円盤)と塊(中空四角)は左上に密集している——円点の異方性1.00~1.48と塊の1.09~2.17はほぼ重なり、円形度の区間(0.50~0.79対0.41~0.68)も広範囲でオーバーラップしている。この2次元だけでは、いかなる分類器もそれらを分離することはできない。救いは他の2次元にある。円点の面積は54~340、塊の面積は373~807であり、一刀両断できる。コンパクト性(0.90~1.09対1.17~1.66)も同様に明確に分かれている。灰色の菱形はあの10個の境界カプセルであり、異方性3.33~5.16で、ちょうど円点と繊維の間の真空地帯に位置している。
この図は、本章の最初の、そしておそらく最も重要な結論を示している。分離性(separability)は、まず特徴量選択に依存し、その次になってようやく分類器の番である。特徴量を正しく選べば、3つのクラスのサンプルは4次元空間で互いに遠く離れ、最も素朴な分類器でさえ完全に正解できる。特徴量を誤れば——例えば最初の2次元だけを与えれば——どんなに精巧なモデルもお手上げである。エンジニアリングにおいて分類性能の不良をトラブルシューティングする際は、モデルを交換したりパラメータを調整したりと焦る前に、まず特徴量の散布図を描いて分離性を確認すべきである。
特徴エンジニアリングとエンドツーエンド学習の役割分担:ディープネットワークは「特徴抽出」も学習に委ねるが、その代償として大量のラベル付きサンプルを必要とする。古典的分類器は特徴量をドメイン知識(形状、テクスチャ、色の統計量)に委ね、学習は低次元空間での境界引きのみを担う。工業タスクはサンプルが少なくメカニズムが明確なことが多く、まさに後者の得意領域に位置する。
29.2 3つの分類器の幾何学
3つの分類器はすべて、特徴空間においてベクトルからクラスへの写像 \(f:\mathbb{R}^4 \to \{\text{dot},\text{fiber},\text{cluster}\}\) を学習するが、その「世界観」は全く異なる。
KNNは学習せず、記憶する。訓練段階は単に全サンプルを保存するだけである(実践ではkd木を構築して検索を高速化する)。予測時にはクエリ点に最も近い \(K\) 個の訓練サンプルを見つけ出し、それらに投票させる。その意思決定は完全に局所的である。境界は少数のサンプルの位置によって決まり、サンプルにノイズが含まれていれば、境界もそれに伴ってまだらに起伏する。長所も同じ源泉から生じる——訓練コストゼロ、サンプルの追加・削除が即座に反映される、そして各判定において「どの隣接サンプルが投票したか」を指し示すことができる。各特徴量のスケールが大きく異なるため(面積は数百、円形度は1未満)、距離計算の前に正規化を行わなければならない。さもなければ、面積の次元だけが距離を独占してしまう。
MLPは滑らかな関数を学習する。入力層の4つのノードが特徴量に対応し、隠れ層が非線形変換を行い、出力層の3つのノードが正規化後に各クラスのソフトスコア(soft score)を与え、その最大値を判定とする。訓練は誤差逆伝播によって反復的にフィッティングを行い、3つのうちで唯一「ゆっくりと学習する」必要がある。その意思決定は大域的である。すべての訓練サンプルが共同で1つの連続曲面を形作り、個別のノイズサンプルは平均化されて打ち消され、境界は滑らかになる。その代償として、訓練にランダム性があること、隠れ層のノード数を人為的に指定する必要があること、そしてソフトスコアは単なるフィッティングの副産物であり、校正された確率ではないこと——この点については後で具体例を挙げる。
SVMは境界の付近のみを気にする。これは2つのクラスを分離し、かつマージン(margin)が最大となる超平面を探す。超平面はマージンに寄り添う少数のサポートベクトル(support vector)のみによって決まり、遠くにあるサンプルがいくらあっても関与しない。カーネルトリック(kernel trick)——本章では動径基底関数(radial basis function, RBF)カーネルを使用——と組み合わせることで、暗黙の高次元空間において線形な境界を描くことができ、元の空間に戻すと曲がった境界となる。決定関数は次の形をとる。
\[ f(\mathbf{x}) = \operatorname{sign}\Big(\sum_{i} \alpha_i y_i\, k(\mathbf{x}_i, \mathbf{x}) + b\Big), \]
ここで和はサポートベクトルのみにわたって走る。多クラス分類は複数の2クラス判定の組み合わせによって構成される。
\(K\) の選択はKNNの唯一のハイパーパラメータである。\(K=1\) は境界が最も細分化され、ノイズに対して最も敏感になる。\(K\) が大きくなると境界は滑らかになるが、少数クラスが多数クラスに「飲み込まれる」。本章では \(K=3\) を用いる——実際の投票が可能であり(単一のノイズ隣接サンプルによる独断を防ぐ)、かつ40サンプル/クラスという規模で局所構造を潰すほど大きくない。
3つの世界観を平面上に投影したものが 図 29.4 である。面積とコンパクト性を訓練セットの平均値(301.5と2.15)に固定し、異方性×円形度平面上で72×72のグリッドにより各点で3つの訓練済みモデルに問い合わせる。KNN(左)の上半分はまだらになっている——固定された面積値がたまたま円点と塊の間に落ちており、この領域はどちらのクラスのサンプルからも近くなく、判定が隣接サンプルの綱引きの中で行ったり来たりと反転し、右側には孤立した「飛地」も散在している。MLP(中央)は教科書のように綺麗な滑らかな境界を示している。SVM(右)の境界は、ほぼ直線に近い弧をいくつか繋ぎ合わせたものである——それぞれの弧は、いくつかのサポートベクトルのRBF影響範囲の境界線である。3つの図は同じデータを分類し、精度もほぼ同等であるが、境界の形状はそれぞれの帰納的バイアス(inductive bias)を忠実に露呈している。局所的記憶、大域的フィッティング、最大マージン。
29.3 実験:精度とサンプル数
クラスごとに 60 個のサンプルを 40/20 で訓練セットとテストセットに分割し、さらに訓練セットをクラスごとに 5 個、さらには 2 個まで削減して、サンプル数の影響を検証する。全結果を以下に示す(テストセットは常に 3×20 で固定)。
| 分類器 | 訓練 120(40/クラス) | 訓練 15(5/クラス) | 訓練 6(2/クラス) |
|---|---|---|---|
| KNN(\(K=3\),z-score,kd 木) | 100% | 98.3%1 | 100% |
| MLP(4-6-3,500 イテレーション) | 100% | 100% | 100% |
| SVM(NU-SVC,RBF カーネル) | 100% | 100% | 100% |
率直な結論は、誰も崩壊しないということである。クラスごとの訓練サンプルがわずか 2 個になっても、3 つの分類器は依然としてほぼ完璧に正解する——特徴空間においてそもそも 3 クラスが遠く離れており、2 点でもそれぞれの領域を確保するのに十分だからである。これは前節の主張の裏付けとなる:分離性の良いタスクは、分類器の選択にもサンプル数にも鈍感である;分類器間の差異は、境界領域や本物の小サンプル難題において初めて顕在化する。「分離しやすい」検収データセットで 3 つの分類器の優劣を競わせようとするのは、産線のモデル選型においてよく見られる方法論的誤りである。
表中の結果について一つ正直に注記しておく:KNN の精度は実行ごとに安定しない——SDK の kd 木構築には非決定性があり、同じデータで再実行すると KNN の判定に偶発的な反転が生じる——5 回の再実行で精度は 91.7%~100% の間で変動し、1 回の実行で最大 5 サンプルが反転し、しかも特定の訓練規模の段階に固定して現れるわけではない。一方、MLP と SVM の結果は完全に再現可能である。
29.4 曖昧領域:信頼度の 3 つの意味
ここで、4 行目の 10 個の太いカプセルを取り上げる。それらの異方性は 3.33~5.16 であり、ドット(≤1.48)とファイバ(≥7.15)の間の無人地帯に位置し、正解はない——我々が関心があるのは「正誤」ではなく、同じデータで訓練された 3 つの分類器がどのように判定するか、そしてそれぞれが「どの程度確信しているか」をどう表現するかである。
結果は真の三者間対立となった:KNN は 8 個をファイバ、2 個をドットと判定;MLP は 10 個すべてをドットと判定;SVM は 9 個をファイバ、1 個をクラスタと判定。同じ訓練セット、同じクエリ点に対し、3 つの帰納バイアスが 3 つの答えを出す:KNN は局所を見る——カプセルはファイバのサンプル群により近く、近傍投票はファイバに傾く;MLP の大域的に滑らかな曲面はドットの領域を無人地帯の向こう側まで外挿する;SVM のマージン中間線は大半のカプセルをファイバ側に割り当てるが、最も円形に近いもの(異方性 3.33)は第三勢力のクラスタに追いやられる。境界における分類器の不一致が露呈するのは、誰が正しく誰が間違っているかではなく、それぞれの帰納バイアスである——訓練データがカバーしていない領域では、モデルは自身の世界観に従って空白を埋めるしかない。
より工学的価値が高いのは、3 つが信頼度を表現する方法である。KNN は近傍の投票数と類似度を出力する:ファイバと判定された 8 サンプルは 3 票の満票であるが、ドットと判定されたあるサンプルは「dot 得票 0.667(類似度 0.613)、fiber 得票 0.333(類似度 0.635)」を出力する——票数と類似度は互いに矛盾すらしており、躊躇が顔に書いてある。MLP はソフトスコアを出力する:半数近いカプセルが dot=1.000 の満点を獲得し、残りの大半も 0.95 以上である(最低は 0.703)——ソフトスコアは曲面外挿の副産物であることを改めて念押ししておく:高スコアは高信頼性を意味しない、訓練データから遠ざかるほど割り引く必要がある。本 SDK の SVM は最も断固としている:ハードラベルのみを与え、スコアもマージン距離もなく、「躊躇」を表現する経路すらない。
拒識(rejection)は産業分類の標準的な要件である:誤判定を流出させるより、疑わしいサンプルを抽出して人工再検査に回す方がよい。拒識を実現する前提は、分類器が比較可能な信頼度を出力し、閾値処理をサポートすることである——これは チャプター 28 で minScore を用いて低スコア文字を弾くのと同じ仕組みである。
ここから選型の鉄則が導かれる:拒識や人工再検査のセーフティネットを必要とする産線は、信頼度出力が利用可能な分類器を選ばなければならない。本 SDK の SVM はハードラベルを出力するため、この産線において「低信頼度は人工へ」というワークフローをサポートできない——精度がどれほど優れていてもである。
29.5 SciVision の実装
3 つの分類器はそれぞれ SciSvKNNClassifier、SciSvMLPClassifier、SciSvSVMClassifier として提供されており、呼び出しの骨組みは共通している:初期化 → サンプルごとに AddSample → Train → Classify。
// KNN:学習過程なし、Train はインデックス構築のみ
SCIMV::SciSvKNNClassifier knn;
knn.InitializeModel(4, featNames); // 特徴量次元数 + 特徴量名配列
knn.AddSample(featVec, className); // サンプルを1件ずつ追加(4次元 SciVarArray + クラス名)
knn.Train(SCI_KNN_Z_SCORE, SCI_KNN_KDTREE); // z-score 正規化, kd ツリーインデックス
knn.Classify(3, SCI_KNN_MAX_COUNT, fv, // K=3, 多数決
&cls, &score, &names, &votes, &sims); // 近傍の投票数と類似度を出力
// MLP:4-6-3 の全結合ネットワーク
SCIMV::SciSvMLPClassifier mlp;
mlp.LoadModel(path); // 必ず最初に呼ぶこと!ファイルが存在しなくても可(後述)
mlp.InitializeModel(0, 4, 6, 3); // モード 0=特徴量分類; 入力/隠れ/出力ノード数
mlp.SetNames(featNames, classNames);
mlp.Train(500, 1e-6f, 0.0f, 1, 0); // 最大反復回数, 誤差許容値, 正則化なし, 標準化
mlp.Classify(fv, &cls, &score, &names, &scores); // 全クラスのソフトスコアを出力
// SVM:NU-SVC + RBF カーネル
SCIMV::SciSvSVMClassifier svm;
svm.LoadModel(path); // 同様に必ず最初に呼ぶこと
svm.InitializeModel(featNames, 4, SCI_SVM_NU_SVC, 0.01, SCI_SVM_RBF, 1.0, 1.0, 0.0);
svm.Train(1000, 1e-6f, 1); // min-max 標準化
svm.Classify(fv, &cls, &names); // ハードラベルのみ、スコア/マージン出力なしAPI 自体はすべて実行可能だが、このモジュール群には本書で遭遇した最も深刻な一連の SDK 欠陥が潜んでいる——複数のモジュール間にまたがるプロセスレベルの状態汚染であり、すべて繰り返し実験を通じて特定し、ありのままに記録したものである:
ManualThreshold後に KNN のTrainを呼ぶと必ずクラッシュする(0xC0000005):同一プロセス内で一度でも閾値処理を呼び出した後は、後続の KNN 学習で必ずアクセス違反が発生する。これにより、本章のサンプルは 2 つのプロセス実行に分割せざるを得なかった:demo.exe extractがデータ合成、閾値処理、特徴抽出を担当してfeatures.csvを書き出し、demo.exe classifyが別プロセスを起動して CSV を読み込み、学習と評価を行う。特徴抽出と分類の間をプレーンテキストファイルで受け渡すのが、現在唯一の確実な隔離方法である。- MLP と SVM の両方を学習させた後で KNN を学習させると、サイレントに壊れたモデルができる:エラーもクラッシュも発生しないが、クラスタークラスのテストが 0/20 で全問不正解となる。回避策は、コードを「KNN ブロック → MLP ブロック → SVM ブロック」として構成し、ある分類器の学習と予測をすべて完了してから次に進むことである。
- 約 100 回の KNN
Classify呼び出し後、同一プロセス内での次回の KNNTrainがクラッシュまたは壊れたモデルを生成する(実測:10 回は安全、100 回でクラッシュ):各ブロック内では、すべてのモデルの学習を先に完了してから、バッチ予測を開始しなければならない。 - KNN
Trainの treeType=1(総当たり探索)で学習した後、Classifyがクラッシュする——kd ツリー(0)しか使用できない;そして kd ツリーには実行間の非決定性がある(前節の ±1 反転の根源)。 - MLP/SVM の
InitializeModelの前に、必ずLoadModelを 1 回呼ぶ必要がある、さもなくばエラー 122706011/122707003 が発生する——存在しないファイルパスを渡してもよい、「空の新規モデルを作成した」ことを示すコードが返ってくれば先に進める。 - KNN の正規化モード 0/1 では、
Classifyが返すクラス名文字列が時折化ける——z-score(モード 2)ではこの問題は観察されていない。
このリストの方法論的意義は、その内容に決して劣らない:商用ライブラリの安定性境界はマニュアルには書かれておらず、体系的な実験によってのみ明らかにできる——他の変数を固定し、モジュールを一つずつ導入し、プローブプログラムを用いてクラッシュ閾値を特定する。これは チャプター 5 でゴールデン実験によりインターフェースの真の挙動を逆推論したのと同じ考え方である。回避策をその経緯とともにコードコメントに書き残しておけば(code/classical_classifiers/main.cpp のファイルヘッダを参照)、後続の者は同じ罠を踏み直す必要がない。
産業事例:人工皮革テクスチャ選別における特徴量論争
ある人工皮革生産ラインでは、テクスチャの粗さに応じて製品を 3 つの等級に分類する必要があった。初版のソリューションでは、画像全体を縮小してそのまま MLP に入力した:「エンドツーエンド」の精度は辛うじて 8 割を超える程度であり、照明ドリフトに対して極めて敏感で、ランプを交換するたびに再学習が必要だった。事後レビューの後、古典的なアプローチに切り替えた:各画像について、まず GLCM のエネルギー、コントラスト、相関、均質性の 4 つのテクスチャ特徴量を計算し(チャプター 25 を参照)、次に KNN を用いてこの 4 次元空間で分類を行う。精度は元のソリューションを 10 ポイント以上上回り、照明ドリフト下でも安定していた——テクスチャ統計量は全体の輝度変化に対して本質的に鈍感である。品質検査員にさらに歓迎されたのは解釈性だった:誤分類されたサンプルごとに、その 3 つの最近傍画像を呼び出して目視比較でき、境界等級の皮革表面が「どれに似ているか」が一目で明らかになった。教訓:小規模データの産業タスクでは、良い特徴量 + 単純な分類器が生データ + 複雑なモデルに勝るのが通例である。
29.6 小まとめ
- 分離可能性は分類器に先行する:分類問題の成否は大半が特徴選択の段階で決まる。本章のタスクでは、異方性 × 円形度の投影空間においてドットとクラスタは完全に重なり、面積とコンパクト度によってのみ分離される——分類問題のトラブルシューティングでは、まず特徴量の散布図を描くこと。
- 3種類の帰納バイアス:KNN は局所記憶(境界はまだら、判定は近傍にまで追跡可能)、MLP は大域的平滑関数(ソフトスコア、反復学習が必要)、SVM は最大マージン + カーネルトリック(境界は支持ベクトルのみで決定)。分離容易なタスクでは3者を区別するのは難しい——クラスあたり2個の学習サンプルでもほぼ完璧な精度が得られる。差異が現れるのは境界領域においてのみである。
- 確信度の意味は三者三様である:近傍の投票 + 類似度、ソフトスコア、ハードラベル——10個の境界カプセルに対し、いずれも100%精度の3つの分類器が 8:2、10:0、9:1 という3つの異なる判定を下した。棄却と人工審査を必要とする生産ラインでは、確信度出力が利用可能かつ閾値化できる分類器を選ばなければならない。
- 商用ライブラリの安定性境界は実験によって明らかにする必要がある:本章のSDK分類器モジュールにはモジュール間のメモリ破壊が存在し、その回避策(特徴抽出と分類を2つのプロセスに分離、すべて学習してから一括予測)は、マニュアルではなく体系的なクラッシュ位置特定実験から得られた。
- より体系的な分類器理論(ベイズ決定理論、特徴選択、新規性検出)については、Steger らの著書の分類章 (Steger, Ulrich, と Wiedemann 2018) およびパターン認識の2つの標準的教科書 (Duda, Hart, と Stork 2001; Bishop 2006) を参照されたい。本章の3つの分類器それぞれの基礎文献は原文に戻る価値がある:KNN の漸近誤差限界は Cover と Hart によって与えられ (Cover と Hart 1967)、MLP 学習が依存する誤差逆伝播は Rumelhart、Hinton、Williams によって確立され (Rumelhart, Hinton, と Williams 1986)、SVM(最大マージンとカーネルトリックを含む)は Cortes と Vapnik のサポートベクトルネットワークに由来する (Cortes と Vapnik 1995)。
認識編はここで幕を閉じる。バーコードの決定的デコーディングから、OCR の閉集合文字分類、さらに本章の開放特徴空間における統計的決定へと——3章にわたり「参照から学習へ」のスペクトラムを踏破してきた。符号化規則で統御できるものはデコーダに、規則で統御できないものは特徴量と分類器に、そして分類器でも統御できない境界領域は、確信度と人工審査に委ねられる。
単発の代表値;5 回の再実行で 91.7%~100% の範囲を確認、非決定性はこの訓練規模の段階に限定されない↩︎



