線形?非線形?
2016-11-09
サイボウズラボ 西尾泰和
ver. 2 2016-12-05 末尾に加筆
このスライドの目的
機械学習に関して「線形な学習機より非線形な学
習機の方がよい」という誤解が根強い。
モデルの表現力は確かに非線形版の方が高い。
が、トレードオフとして必要なデータ量も多い。
実際に少ないデータ量で非線形版を使うと何が起
こるのか回帰を題材に実験して確認する。
2
参考
データが10万件なければ線形版、あってもまずは線形版を
試してうまく行かない場合だけ非線形版、という提案
3
http://peekaboo-vision.blogspot.jp/2013/01/machine-learning-cheat-sheet-for-scikit.html
学習モデル
SGD Regressor: 与えられた損失関数を確率的勾
配降下法(SGD)で最小化する。デフォルトの二乗
誤差の最小化を使った。線形モデル。以下SGD
SVR: Support Vector Regression。性能を出すた
めにカーネル選択やパラメータの調整が必要 * だ
が今回はデフォルト値で使った。非線形。
GPR: Gaussian Process Regression。デフォルト
ではノイズにover fitして比較対象にすらならな
いのでnugget=0.001した。非線形。
4
* http://www.slideshare.net/sleepy_yoshi/svm-13435949
実験の概要
学習データを生成し、SGD、SVR、GPRの3つを
学習。別途生成した1000件のデータで性能を測
り、10回繰り返して平均と2SDを表示する。
5
ソースはこちら: https://github.com/nishio/linear/blob/master/t.py
実験結果はこちら: https://github.com/nishio/linear/blob/master/result3.txt
性能の測り方
性能は回帰の評価によく使われる R2
決定係数で
測った。完全に正解した時は 1.0、常にYの平均
値を返した時に 0.0 になる大きい方が良い値。
負の値になるのは「平均を返す方がマシ」という
酷い状態で、以下では赤字で表示する。
6
データ分布の概要
入力XはD次元の標準正規分布に従う。サンプル
数はN件。
予測すべき真の値は sum(X) で、
これに正規分布に従うノイズが乗ったものを
観測された正解データYとする。
ノイズの標準偏差はS。
7
結果考察1
入力が3次元の時、データ数30~1000のいずれで
もSGDが一番性能が良い。
SVRはデータが増えるにしたがって徐々に良くな
るが、N=300の時の性能がSGDのN=100の時の性
能と同程度。
8
N=30 D=3 S=1.0
SGD 0.80(+-0.01), SVR 0.74(+-0.04), GPR -1.96(+-0.64)
N=100 D=3 S=1.0
SGD 0.91(+-0.01), SVR 0.76(+-0.02), GPR -0.35(+-0.35)
N=300 D=3 S=1.0
SGD 1.00(+-0.00), SVR 0.91(+-0.02), GPR 0.85(+-0.08)
N=1000 D=3 S=1.0
SGD 1.00(+-0.00), SVR 0.96(+-0.01), GPR 0.94(+-0.02)
結果考察2
入力が10次元でも、SVRがSGDと同程度の性能に
なるには3倍程度のデータ量が必要という傾向は
同じ。
N=30の際にGPRがSGDに勝っている。興味深い。
9
N=30 D=10 S=1.0
SGD 0.66(+-0.01), SVR 0.20(+-0.04), GPR 0.75(+-0.02)
N=100 D=10 S=1.0
SGD 0.86(+-0.00), SVR 0.65(+-0.01), GPR 0.77(+-0.01)
N=300 D=10 S=1.0
SGD 0.99(+-0.00), SVR 0.83(+-0.02), GPR 0.83(+-0.02)
N=1000 D=10 S=1.0
SGD 1.00(+-0.00), SVR 0.90(+-0.01), GPR 0.76(+-0.04)
結果考察3
入力が30次元になると、N=30ではSVRやGPRだ
とスコアがほとんど0、つまり「回帰しないで平
均値を返すのと大差ない」という状態。
SVRはSGDの10倍程度のデータが必要。
10
N=30 D=30 S=1.0
SGD 0.54(+-0.02), SVR 0.06(+-0.01), GPR 0.02(+-0.01)
N=100 D=30 S=1.0
SGD 0.81(+-0.01), SVR 0.20(+-0.01), GPR 0.10(+-0.01)
N=300 D=30 S=1.0
SGD 0.99(+-0.00), SVR 0.57(+-0.02), GPR 0.29(+-0.02)
N=1000 D=30 S=1.0
SGD 1.00(+-0.00), SVR 0.89(+-0.01), GPR 0.59(+-0.02)
結果考察4
入力が100次元だとSVRはN=300でもSGDのN=30
に勝てない。GPRはN=1000まで全滅。
11
N=30 D=100 S=1.0
SGD 0.24(+-0.03), SVR -0.01(+-0.02), GPR -0.05(+-0.03)
N=100 D=100 S=1.0
SGD 0.69(+-0.02), SVR 0.02(+-0.01), GPR -0.01(+-0.01)
N=300 D=100 S=1.0
SGD 0.96(+-0.01), SVR 0.12(+-0.01), GPR -0.01(+-0.01)
N=1000 D=100 S=1.0
SGD 1.00(+-0.00), SVR 0.38(+-0.01), GPR -0.00(+-0.00)
ここまでのまとめ
全般的にSGDがよい(1件GPRが勝ったのは謎)
SVRはSGDと同程度の性能を出すのに3~10倍の
データ量が必要。
GPRは高次元になった時の性能劣化が激しい。
なお、ノイズが強い(S=3.0)時も傾向は同じなの
で説明を割愛する。
12
結果考察5
ノイズが小さい(S=0.1)時、
入力次元が小さいなら、GPRが少ないデータ量で
もよい性能を出しチャンピオンになる。
13
N=30 D=3 S=0.1
SGD 0.65(+-0.01), SVR 0.73(+-0.05), GPR 0.97(+-0.01)
N=100 D=3 S=0.1
SGD 0.93(+-0.01), SVR 0.90(+-0.02), GPR 0.99(+-0.01)
N=300 D=3 S=0.1
SGD 1.00(+-0.00), SVR 0.95(+-0.02), GPR 1.00(+-0.00)
N=1000 D=3 S=0.1
SGD 1.00(+-0.00), SVR 0.99(+-0.01), GPR 1.00(+-0.00)
結果考察6
ただし、GPRはDが増えるとSGDに負ける。
14
N=30 D=10 S=0.1
SGD 0.62(+-0.02), SVR 0.29(+-0.02), GPR 0.68(+-0.03)
N=100 D=10 S=0.1
SGD 0.91(+-0.00), SVR 0.76(+-0.02), GPR 0.83(+-0.02)
N=300 D=10 S=0.1
SGD 1.00(+-0.00), SVR 0.87(+-0.02), GPR 0.94(+-0.01)
N=1000 D=10 S=0.1
SGD 1.00(+-0.00), SVR 0.94(+-0.02), GPR 0.98(+-0.01)
N=30 D=30 S=0.1
SGD 0.44(+-0.03), SVR -0.06(+-0.05), GPR -0.15(+-0.06)
N=100 D=30 S=0.1
SGD 0.93(+-0.01), SVR 0.26(+-0.01), GPR 0.15(+-0.01)
N=300 D=30 S=0.1
SGD 0.99(+-0.00), SVR 0.61(+-0.02), GPR 0.32(+-0.02)
N=1000 D=30 S=0.1
SGD 1.00(+-0.00), SVR 0.91(+-0.01), GPR 0.58(+-0.02)
ここまでのまとめ
ノイズが少なくて入力の次元が小さいときには
GPRがSGDを上回る性能を出す。D=10でN=30の
時にGPRが勝つのはS=1.0の時にも観測された結
果ので、これくらいの規模の問題はGPRが有利な
のかも。ただ、スムージングパラメータ
nugget=0.001が適当かどうか本当はパラメータ
を変えて繰り返し実験すべき。
次元が大きくなるとSGDが安定して強い。
15
まとめ
同じデータ量ならSGDが強い。GPRが意外と有効
なケースもある。SVRはデータが3~10倍くらい
あればSGDに並ぶ。
データ量が少なくて「非線形な関係もあるかも」
という状況ならまずは線形でやってみるのがよさ
そう。
16
以下付録
17
真の関数
今回の実験では、回帰したい真の関数が
sumという線形な関数なのでSGDに有利。
「X1とX2がともに大きいときだけYが大きくな
る」のような非線形な項がたくさんあるとSGDが
不利になってくるだろう。
そういう場合は「X1とX2がともに大きい」を入
力に追加すればいい。線形学習機は学習後に係数
を観察することでどの特徴量がどれくらいの重み
で効いているのか観察できるのが長所。
18
線形学習機の力
線形学習機は複雑な課題に使えないという誤解が
あるかもしれないが、単語の分かち書きみたいな
複雑そうな課題でも十分な性能を出している * 。
新しい手法に比べて歴史が長いので、各種ライブ
ラリの高速化が進んでいるのも長所の一つ。
19
* http://www.phontron.com/kytea/index-ja.html
publication bias
コンペや機械学習の手法に関する論文で使われる
既存データセットは、そもそも線形学習機で解き
にくいことを確認済みのものが用いられているの
で「線形で十分」と目にすることが少ない。
機械学習を新規データセットに使った応用系の論
文は、手段ではなく結果の有用性の方にフォーカ
スされがち。
枯れた手法より目新しい手法の方が話題になって
SNSでシェアされやすい。などなど枯れた手法に
不利なバイアスが強いのではないだろうか……。
20
テストデータ
今回の実験では、テストで1000件を10回、
つまり10000件のデータをテストに使っている。
実問題では貴重な学習データの一部をテストに回
すことになる。データが乏しいと今回の実験より
も結果の分散が大きくなって「改善したのかどう
かよくわからない」「どちらの手法が良いのかよ
くわからない」という事態が多くなる。その意味
でも「データが少ないならまずは線形」がよいと
思う。
21
加筆(2016-12-05)
「線形/非線形」について
非線形な問題について
Feature Engineereingについて
SGDがGPRに負ける謎の解明
22
線形/非線形について
Q: そもそも「モデルが線形かどうか」を
意識していない人が多いのでは
A: 確かに。線形かどうかより下記が重要:
• モデルがシンプルで振る舞いを理解できる
• 少ないデータ量でまともな学習をする
• 学習結果を人間が観察できる
線形回帰はこの条件を満たしているので
データが少ない状況で試行錯誤する際に
適している。
23
タイトルの選択はミスったかも
非線形な問題について
Q: この実験は真の関数が線形で、線形モデルが
良い性能を出す、という結果だった。真の関数が
非線形の場合は非線形が勝つのでは。
A: もちろんその可能性はある。例えば手書き文
字認識を各ピクセルを入力として線形識別しても
良い成果が出ないはず。 *
「線形モデルでどの程度表現できるか」は問題依
存なので、読者のみなさんが自分のデータで試し
てみると良いと思う。まずは線形を試して、それ
から非線形で精度が向上するのかどうかを実験す
るイメージ。
24
* これもどれくらいのデータでどの程度の精度になるのか実験すると面白そう
Feature Engineeringについて
もし「X1とX2がともに大きいときだけYが大きく
なる」という非線形な関係があるかもと思うので
あれば「X1とX2がともに大きい」という特徴量
を入力に追加すれば、線形モデルでもその関係を
扱えるようになる。
この「特徴量の工夫」は「feature engineering」
と呼ばれていて、機械学習のコンペではこれが時
間の大半を占める、という意見がある。優勝者イ
ンタビュー:
>I spent 50% on feature engineering, 40% on
feature selection plus model ensembling, and less
than 10% on model selection and tuning.
25
http://blog.kaggle.com/2015/12/21/rossmann-store-sales-winners-interview-1st-place-gert/
SGDがGPRに負ける謎
まずお詫びと訂正
この図のここの分岐を「データが100Kなければ
線形な方法で」と紹介したけど、これは誤読で、
「データが100K超えてたら、SGDぐらいしか現
実的な速度で動かないよ」
という趣旨でした。
26
SGD Regressor
SGD Regressorと普通の線形回帰*の違い:
普通の線形回帰はデータ全部を使って最適化問題
を解くが、SGD Regressorは「データが多すぎて
全部一度には無理」という状況を想定して、ラン
ダムにデータを選んで逐次的に最適化する。
これは選ばれた順による影響がある。最後のデー
タにより強く影響される。
27
* sklearn.linear_model.LinearRegression
仮説
データが少ないときにSGD RegressorがGPRに負
けたのは、データが少ないことによってSGDの
「データ順の影響」のデメリットが強く出てし
まったからではないか?
検証実験:
データ全体を使う線形回帰(以下LIN)を追加
28
コードと結果はこちら:
https://github.com/nishio/linear/commit/64dff8f715a585fcaff856488351ce8c2cad5e34
Linear Regressorの頭文字を取るとLRだけど、
これはLogistic Regressionを指すことが多いから避けた
結果1
前回GPRが強かったノイズ少なめの問題設定で
普通の線形回帰(LIN)はN=30でもスコア1.00。
(余談: 線形SVR*も同様の結果)
データ量の少ないときにSGDの性能が悪いだけ。
29
N=30 D=3 S=0.1
LIN 1.00(+-0.00), SGD 0.62(+-0.01), SVR 0.74(+-0.02), LSVR 1.00(+-0.00) GPR 0.95(+-0.01)
N=100 D=3 S=0.1
LIN 1.00(+-0.00), SGD 0.95(+-0.00), SVR 0.90(+-0.02), LSVR 1.00(+-0.00) GPR 1.00(+-0.00)
N=300 D=3 S=0.1
LIN 1.00(+-0.00), SGD 1.00(+-0.00), SVR 0.96(+-0.02), LSVR 1.00(+-0.00) GPR 1.00(+-0.00)
N=1000 D=3 S=0.1
LIN 1.00(+-0.00), SGD 1.00(+-0.00), SVR 0.98(+-0.01), LSVR 1.00(+-0.00) GPR 1.00(+-0.00)
* sklearn.svm.LinearSVR
結果2
普通の線形回帰はだいたいどのシチュエーション
でも一番性能が良い。(例外は次ページ)
今回の問題設定ではN=30の時の普通の線形回帰
の性能にSVRやGPRはN=1000でも追いつけない。
30
N=30 D=10 S=1.0
LIN 0.92(+-0.01), SGD 0.60(+-0.02), SVR 0.30(+-0.02), LSVR 0.87(+-0.02) GPR 0.72(+-0.03)
N=100 D=10 S=1.0
LIN 0.99(+-0.00), SGD 0.95(+-0.00), SVR 0.71(+-0.02), LSVR 0.99(+-0.00) GPR 0.77(+-0.03)
N=300 D=10 S=1.0
LIN 1.00(+-0.00), SGD 0.99(+-0.00), SVR 0.82(+-0.01), LSVR 0.99(+-0.00) GPR 0.82(+-0.01)
N=1000 D=10 S=1.0
LIN 1.00(+-0.00), SGD 1.00(+-0.00), SVR 0.90(+-0.02), LSVR 1.00(+-0.00) GPR 0.77(+-0.03)
結果3
普通の線形回帰の性能が悪いのは D ≧ N の時。
D次元の係数を決定するのにデータが足りない。
一方、そういうシチュエーションでも線形SVRは
悪くない性能を出している。
31
N=30 D=30 S=1.0
LIN 0.02(+-0.13), SGD 0.67(+-0.02), SVR 0.09(+-0.00), LSVR 0.79(+-0.03) GPR 0.04(+-0.01)
N=30 D=100 S=1.0
LIN 0.15(+-0.04), SGD 0.22(+-0.04), SVR -0.18(+-0.03), LSVR 0.23(+-0.04) GPR -0.08(+-0.02
N=100 D=100 S=1.0
LIN -19.66(+-2.39), SGD 0.71(+-0.02), SVR 0.03(+-0.02), LSVR 0.87(+-0.01) GPR -0.01(+-0.0
まとめ
今回の問題設定に関しては全データを使った線形
回帰が圧倒的に強い。
ただしD ≧ N の状況では使えない。線形SVRはこ
の状況でも悪くない性能を出した。
非線形なGPRがSGDに勝つことがあるが、これは
SGDがデータの少ない状況に弱いだけだった。今
回の問題設定ではGPRやSVRに良いところはない
緩募:よさげな非線形データセット
32

線形?非線形?