サポートベクターマシン|マージン最大化で高精度に分類する学習手法

サポートベクターマシン

サポートベクターマシン(Support Vector Machine:SVM)は、教師あり学習に分類される機械学習の手法で、データを2つのクラスに分ける境界を「マージン最大化」という基準で決める。理論の大部分は1990年代に整った。カーネル法と組み合わせることで、直線では分けられない非線形な問題も扱える。分類のほかに回帰や異常検知にも応用されており、製造業では外観検査や設備の状態監視などで今も使われている。

誕生の経緯とヴァプニクの統計的学習理論

原型は1963年にさかのぼる。旧ソ連のウラジーミル・ヴァプニクとアレクセイ・チェルヴォネンキスが提案した線形分類器で、当初は超平面で完全に分けられるデータしか扱えなかった。大きく変わったのは1992年である。AT&Tベル研究所のBoser、Guyon、Vapnikがカーネルトリックを取り入れ、非線形な分類ができるようになった。1995年にはCortesとVapnikが誤分類をある程度まで許すソフトマージンを発表し、現在の標準的な定式化はこの時点でほぼ固まった。その後、国立台湾大学のChih-Chung ChangとChih-Jen Linが開発したライブラリ「LIBSVM」が2000年代に公開され、研究者以外の技術者にも広く使われるようになった。

マージン最大化という発想

2クラスのデータを分ける直線は、何本でも引ける。サポートベクターマシンは、その中から境界に最も近いデータ点までの距離、つまりマージンが最大になる超平面を選ぶ。境界の位置を決めるのは、境界のすぐ近くにある一部の点だけである。この点をサポートベクターと呼び、手法の名前もここから来ている。境界から遠い点をいくら追加しても境界は動かない。そのため、マージンを大きく取った境界は未知のデータにもうまく当てはまりやすい(汎化性能が高い)とされる。

数式による表現

分離超平面は w・x + b = 0 で表す。wは重みベクトル、bはバイアスである。ラベルyi ∈ {−1, +1}を持つ各サンプルが yi(w・xi + b) ≥ 1 を満たすとき、マージン幅は 2 / ‖w‖ になる。マージンを最大にすることは ½‖w‖2 を最小にすることと同じ意味を持つ。ソフトマージンでは、誤分類をどれだけ許すかを表すスラック変数ξi ≥ 0 を導入する。そのうえで次の問題を二次計画法で解く。
最小化:½‖w‖2 + C Σi=1n ξi
制約:yi(w・xi + b) ≥ 1 − ξi

カーネルトリックによる非線形分類

実際のデータは、直線できれいに分けられないことのほうが多い。そこで、データをより高い次元の空間へ写してから線形に分ける。写した先の座標をそのまま計算すると計算量が膨大になる。ところが、学習の計算に出てくるのはデータ同士の内積だけである。この内積をカーネル関数K(x, x′)に置き換えれば、写した先の座標を求めなくても同じ結果が得られる。これがカーネルトリックで、主なカーネルは下表のとおりである。

カーネル 関数形 主なパラメータ 向いている場面
線形 x・x′ Cのみ 文書分類など特徴量の次元が高いデータ
多項式 (γ x・x′ + r)d 次数d、γ、r 特徴量の組み合わせが効く問題
RBF(ガウス) exp(−γ‖x − x′‖2) γ、C 最初に試す汎用カーネル
シグモイド tanh(γ x・x′ + r) γ、r ニューラルネットワークとの比較研究

ハイパーパラメータCとγの調整

実務で精度を大きく左右するのは、正則化パラメータCとRBFカーネルのγの2つである。Cを大きくすると誤分類を厳しく罰するため、境界が複雑になって過学習しやすい。γは1つのサンプルが影響を及ぼす範囲を決め、値が大きいほど境界は細かく入り組む。LIBSVMの開発者がまとめた実用ガイドでは、C = 2−5〜215、γ = 2−15〜23の範囲を2の累乗刻みでグリッドサーチし、5分割交差検証で評価する手順を勧めている。前処理も欠かせない。各特徴量を[−1, +1]や[0, 1]にスケーリングしておかないと、値の桁が大きい項目が距離の計算を支配してしまう。温度(数百℃)と変位(数µm)のように単位がまったく違うセンサ値を並べるときは、特に気をつけたい。

製造現場での使われ方

工場で集められる不良品のデータは、多くても数百件から数千件程度にとどまることが多い。こうした少ないデータでも安定した精度を出しやすい点が、サポートベクターマシンが選ばれる理由のひとつである。推論にGPUはいらず、産業用PCのCPUでもミリ秒単位で判定が終わるため、既存の検査ラインに後付けしやすい。主な用途を以下に挙げる。

  • 樹脂成形品や金属プレス品の外観検査(傷・打痕・異物の有無の判定)
  • 振動センサのFFTスペクトルを使った軸受・モータの劣化診断
  • 主軸の電流値や切削抵抗からの工具摩耗量の推定(回帰版のSVR)
  • 半導体ウェハの欠陥マップのパターン分類
  • スポット溶接の電流・電圧波形にもとづく溶接品質の判定

現場の導入で特に役立つのが、2001年にSchölkopfらが発表したOne-class SVMである。量産ラインでは不良品がめったに出ず、良品のデータしか集まらないことが珍しくない。One-class SVMは良品データだけで「正常な範囲」を学習し、その範囲から外れたものを異常として検出する。ただし、精度の大部分は入力する特徴量の作り方で決まる。画像ならHOG特徴やテクスチャ特徴を、振動なら特定の周波数帯のピーク値を、といった具合に、現場の知識にもとづいて特徴量を設計する工程に工数の多くを割くのが一般的である。

他の手法との比較と弱点

弱点としてよく挙げられるのが計算量である。学習時間はサンプル数nに対しておおよそO(n2)〜O(n3)のペースで増えるため、数十万件規模のデータでは現実的でなくなる。その場合は線形SVM専用のLIBLINEARや、ランダムフォレスト、ディープラーニングが候補になる。出力が確率ではなく境界からの距離である点も、ロジスティック回帰との違いである。確率値が必要なときは、Plattスケーリングで変換する。多クラス分類は本来の仕組みでは扱えず、kクラスであればk(k − 1)/2個の2クラス分類器を組み合わせる一対一方式で対応する。決定木のように判定の根拠を人が読み取ることは難しい。そのため、品質保証の場面で判定理由の説明を求められたときの対応は、あらかじめ考えておく必要がある。

実装環境

Pythonの機械学習ライブラリscikit-learnのSVCクラスは、内部でLIBSVMを使っている。RBFカーネルが標準設定で、γの初期値は「scale」(1 / (特徴量の数 × データの分散))である。次元が高いデータでは、事前に主成分分析で特徴量を数十次元程度まで減らしてから学習させると、学習時間を大幅に短くできる。

コメント(β版)