.. _sec_generalization_basics: 汎化 ==== 2人の大学生が、期末試験に向けて 熱心に勉強しているとする。 一般に、この準備は 過去年度の試験を解いて 自分の実力を試すことから成る。 しかし、過去の試験で良い成績を取れたからといって、 本番でも優秀な成績を収められる保証はない。 たとえば、Extraordinary Ellie という学生がいて、 彼女の勉強は過去年度の試験問題の答えを ひたすら暗記することだけだったとしよう。 Ellie が並外れた記憶力を持っていたとして、 *これまでに見たことのある*\ どんな問題の答えでも 完全に思い出せたとしても、 *これまでに見たことのない*\ 新しい問題に直面すると、 彼女は途方に暮れてしまうかもしれない。 これに対して、Inductive Irene という別の学生を考える。 彼女の暗記能力は同程度に低いものの、 パターンを見つけるのが得意だとする。 もし試験が本当に前年の問題の焼き直しで構成されているなら、 Ellie は Irene を難なく上回るだろう。 Irene の推論したパターンが 90% の精度で予測できたとしても、 100% 思い出せる Ellie には到底かなわない。 しかし、試験が完全に新しい問題だけで構成されているなら、 Irene は平均 90% を維持できるかもしれない。 機械学習研究者として、私たちの目標は *パターン*\ を発見することである。 しかし、どうすれば単にデータを暗記しただけではなく、 本当に\ *一般的な*\ パターンを発見したと確信できるのだろうか。 たいていの場合、私たちの予測が役に立つのは、 モデルがそのようなパターンを発見したときだけである。 昨日の株価を予測したいのではなく、明日の株価を予測したいのである。 すでに診断済みの患者について、 すでに診断された病気を認識する必要はない。 むしろ、これまで見たことのない患者における、 これまで未診断の病気を認識したいのである。 この問題――\ *汎化*\ するパターンをどう発見するか――は、 機械学習の根本問題であり、 おそらく統計学全体の根本問題でもある。 さらに言えば、これは科学全体を包み込む より大きな問いの一部にすぎないとみなすこともできる。 すなわち、個別の観測から より一般的な主張へ飛躍することが、 いつ正当化されるのか、という問いである。 現実には、有限個のデータを用いて モデルを適合させなければならない。 そのデータの規模は分野によって大きく異なる。 多くの重要な医療問題では、 利用できるデータ点は数千個程度に限られる。 希少疾患を研究する場合には、 数百個得られれば幸運かもしれない。 対照的に、ラベル付き写真からなる最大級の公開データセット、 たとえば ImageNet :cite:`Deng.Dong.Socher.ea.2009` には、 数百万枚の画像が含まれている。 また、Flickr YFC100M データセットのような ラベルなし画像コレクションはさらに大規模で、 1億枚を超える画像を含む :cite:`thomee2016yfcc100m`\ 。 しかし、このような極端な規模であっても、 利用可能なデータ点の数は、 メガピクセル解像度で考えられる あらゆる画像の空間と比べれば、 ごくわずかにすぎない。 有限サンプルを扱う以上、 訓練データにはうまく適合したものの、 汎化可能なパターンの発見には失敗した、 というリスクを常に念頭に置かなければならない。 訓練データへの適合が、 背後にある真の分布への適合よりも良くなってしまう現象を *過学習*\ と呼び、 過学習に対処する技法はしばしば *正則化*\ 手法と呼ばれる。 これは統計的学習理論への適切な入門の代わりにはならないが (:cite:t:`Vapnik98,boucheron2005theory` を参照)、 ここでは出発点として十分な直感を与える。 本書では、さまざまな章で汎化を何度も取り上げ、 さまざまなモデルにおける汎化の原理について 何が分かっているかを探るとともに、 実用上関心のあるタスクで (経験的に)汎化性能の向上につながることが 見いだされているヒューリスティックな技法も紹介する。 訓練誤差と汎化誤差 ------------------ 標準的な教師あり学習の設定では、 訓練データとテストデータは *同一*\ の分布から\ *独立に*\ 抽出されると仮定する。 これは一般に *IID 仮定* と呼ばれる。 この仮定は強いものであるが、 そのような仮定がなければ、 私たちはまったく立ち往生してしまうことに注意すべきである。 分布 :math:`P(X,Y)` からサンプルされた訓練データが、 *異なる分布* :math:`Q(X,Y)` から生成されたテストデータに対する 予測方法を教えてくれると、 なぜ信じられるのだろうか。 このような飛躍には、 :math:`P` と :math:`Q` がどのように関係しているかについての 強い仮定が必要になる。 後ほど、分布の変化を許すいくつかの仮定を議論するが、 まずは :math:`P(\cdot) = Q(\cdot)` である IID の場合を理解する必要がある。 まず、\ *訓練誤差* :math:`R_\textrm{emp}` と *汎化誤差* :math:`R` を区別する必要がある。 前者は訓練データセット上で計算される\ *統計量*\ であり、 後者は基礎となる分布に関する\ *期待値*\ である。 汎化誤差は、同じ基礎データ分布から抽出された 追加のデータ例が無限に続く流れに対して モデルを適用したときに見えるものだと考えることができる。 形式的には、訓練誤差は(:numref:`sec_linear_regression` と同じ記法で)\ *和*\ として表される。 .. math:: R_\textrm{emp}[\mathbf{X}, \mathbf{y}, f] = \frac{1}{n} \sum_{i=1}^n l(\mathbf{x}^{(i)}, y^{(i)}, f(\mathbf{x}^{(i)})), 一方、汎化誤差は積分として表される。 .. math:: R[p, f] = E_{(\mathbf{x}, y) \sim P} [l(\mathbf{x}, y, f(\mathbf{x}))] = \int \int l(\mathbf{x}, y, f(\mathbf{x})) p(\mathbf{x}, y) \;d\mathbf{x} dy. 問題なのは、汎化誤差 :math:`R` を正確に計算することは決してできないということである。 密度関数 :math:`p(\mathbf{x}, y)` の正確な形を誰も教えてはくれない。 さらに、無限に続くデータ点の流れをサンプルすることもできない。 したがって実際には、訓練集合から取り分けておいた ランダムに選ばれた例 :math:`\mathbf{X}'` とラベル :math:`\mathbf{y}'` からなる独立なテスト集合にモデルを適用することで、 汎化誤差を\ *推定*\ しなければならない。 これは、経験的訓練誤差を計算するときに使ったのと 同じ式を、テスト集合 :math:`\mathbf{X}', \mathbf{y}'` に対して適用することに相当する。 重要なのは、テスト集合で分類器を評価するとき、 私たちは\ *固定された*\ 分類器を扱っているということです (その分類器はテスト集合のサンプルに依存しない)。 したがって、その誤差の推定は単なる平均値の推定問題である。 しかし、訓練集合については同じことは言えない。 最終的に得られるモデルは訓練集合の選び方に明示的に依存するため、 訓練誤差は一般に、母集団における真の誤差の 偏った推定値になる。 したがって汎化の中心的な問いは、 訓練誤差がいつ母集団誤差 (したがって汎化誤差)に近くなると期待できるか、 ということである。 モデルの複雑さ ~~~~~~~~~~~~~~ 古典的理論では、単純なモデルと十分なデータがあるとき、 訓練誤差と汎化誤差は近くなりがちである。 しかし、より複雑なモデルや/あるいは より少ない例で作業するときには、 訓練誤差は下がる一方で 汎化ギャップは大きくなると予想される。 これは驚くことではない。 任意の :math:`n` 個のデータからなるデータセットに対して、 ランダムに割り当てられたラベルであっても 完全に当てはめられるパラメータ集合を見つけられるほど 表現力の高いモデルクラスを想像してみよ。 この場合、訓練データに完全に適合したとしても、 汎化誤差について何が言えるだろうか。 分かっている限りでは、汎化誤差は ランダム推測と大差ないかもしれない。 一般に、モデルクラスに何の制約もなければ、 訓練データに適合したという事実だけから、 モデルが汎化可能なパターンを発見したとは 結論できない :cite:`vapnik1994measuring`\ 。 一方で、もしモデルクラスが 任意のラベルに適合できないなら、 そこには何らかのパターンが発見されているはずである。 モデルの複雑さに関する学習理論的な考え方は、 科学哲学者カール・ポパーの考え方から いくらか着想を得ている。 彼は反証可能性の基準を定式化した。 ポパーによれば、あらゆる観測を説明できる理論は、 そもそも科学理論ではない。 結局のところ、あらゆる可能性を排除していないなら、 その理論は世界について何を教えてくれるのだろうか。 要するに、私たちが欲しいのは、 考えうるどんな観測も説明できないはずなのに、 実際に得られた観測とは たまたま整合している仮説なのである。 では、何が適切なモデル複雑度の概念を構成するのかは、 複雑な問題である。 しばしば、パラメータ数が多いモデルほど、 より多くの任意に割り当てられたラベルに 適合できる。 しかし、これは必ずしも真ではない。 たとえば、カーネル法は無限個のパラメータを持つ空間で動作するが、 その複雑さは別の方法で制御される :cite:`Scholkopf.Smola.2002`\ 。 しばしば有用な複雑度の概念の一つは、 パラメータが取りうる値の範囲である。 この観点では、パラメータが任意の値を取れることを許されたモデルの方が、 より複雑だと言える。 この考え方は次節で、 最初の実用的な正則化手法である *重み減衰* を導入するときに再び取り上げる。 なお、著しく異なるモデルクラス同士 (たとえば決定木とニューラルネットワーク)で 複雑さを比較するのは難しいことがある。 ここで、深層ニューラルネットワークを導入するときに 再び取り上げる重要な点を強調しておきる。 モデルが任意のラベルに適合できる場合、 訓練誤差が小さいことは必ずしも 汎化誤差が小さいことを意味しない。 *しかし、汎化誤差が高いことを意味するわけでもない!* 確実に言えるのは、 訓練誤差が小さいだけでは 汎化誤差が小さいことの証明にはならない、 ということだけである。 深層ニューラルネットワークはまさにそのようなモデルである。 実際にはよく汎化するが、 訓練誤差だけを根拠に多くを結論づけるには 強力すぎる。 このような場合には、事後的に汎化を証明するために、 ホールドアウトデータにより強く依存しなければならない。 ホールドアウトデータ、すなわち検証集合での誤差は、 *検証誤差* と呼ばれる。 過少適合か過学習か? -------------------- 訓練誤差と検証誤差を比較するときには、 2つの典型的な状況に注意する必要がある。 まず、訓練誤差と検証誤差の両方が大きいのに、 その差が小さい場合に注意したいである。 モデルが訓練誤差を下げられないなら、 それはモデルが単純すぎる (すなわち表現力が不十分である)ために、 モデル化しようとしているパターンを捉えられていないのかもしれない。 さらに、訓練誤差と汎化誤差の間の *汎化ギャップ*\ (\ :math:`R_\textrm{emp} - R`\ )が小さいので、 もっと複雑なモデルを使ってもよいと考える理由がある。 この現象は\ *過少適合*\ として知られている。 一方、上で述べたように、 訓練誤差が検証誤差よりもかなり小さい場合、 深刻な\ *過学習*\ を示している。 過学習が常に悪いわけではないことに注意されたい。 とくに深層学習では、 最良の予測モデルがしばしば ホールドアウトデータよりも訓練データで はるかに良い性能を示す。 最終的には、私たちが通常気にするのは 汎化誤差を下げることであり、 ギャップはその目的の妨げになる限りにおいてのみ 問題になる。 訓練誤差がゼロなら、 汎化ギャップは汎化誤差そのものに等しくなり、 ギャップを減らすことによってのみ前進できる。 .. _subsec_polynomial-curve-fitting: 多項式曲線当てはめ ~~~~~~~~~~~~~~~~~~ 過学習とモデル複雑度に関する 古典的な直感を示すために、 次のことを考える。 単一の特徴量 :math:`x` とそれに対応する実数値ラベル :math:`y` からなる 訓練データが与えられたとき、 次数 :math:`d` の多項式 .. math:: \hat{y}= \sum_{i=0}^d x^i w_i を見つけてラベル :math:`y` を推定しようとする。 これは単なる線形回帰問題であり、 特徴量は :math:`x` のべき乗で与えられ、 モデルの重みは :math:`w_i` で与えられ、 バイアスは :math:`w_0` で与えられる。なぜなら、すべての :math:`x` について :math:`x^0 = 1` だからである。 これは単なる線形回帰問題なので、 損失関数として二乗誤差を使える。 高次の多項式関数は低次の多項式関数よりも複雑である。 なぜなら、高次多項式の方がパラメータ数が多く、 モデル関数の選択範囲も広いからである。 訓練データセットを固定すると、 高次の多項式関数は低次の多項式よりも 常に低い(少なくとも同等の)訓練誤差を達成すべきである。 実際、各データ例が異なる :math:`x` の値を持つなら、 データ例の数に等しい次数の多項式関数は 訓練集合に完全に適合できる。 多項式の次数(モデル複雑度)と 過少適合・過学習の関係は :numref:`fig_capacity_vs_error` に示す。 .. _fig_capacity_vs_error: .. figure:: ../img/capacity-vs-error.svg モデル複雑度が過少適合と過学習に与える影響。 データセットサイズ ~~~~~~~~~~~~~~~~~~ 上の境界がすでに示しているように、 もう一つ大きな考慮事項はデータセットサイズである。 モデルを固定すると、訓練データセットに含まれるサンプルが少ないほど、 過学習が起こりやすく(またより深刻に)なる。 訓練データの量を増やすと、 通常、汎化誤差は減少する。 さらに一般に、データが多いことは決して損にならない。 固定されたタスクとデータ分布に対しては、 モデル複雑度はデータ量よりも 急速に増加すべきではない。 より多くのデータがあれば、 より複雑なモデルを当てはめようとするかもしれない。 十分なデータがなければ、単純なモデルの方が 打ち負かしにくい場合がある。 多くのタスクでは、深層学習が線形モデルを上回るのは、 数千件以上の訓練例が利用できる場合に限られる。 現在の深層学習の成功の一因は、 インターネット企業、安価なストレージ、接続されたデバイス、 そして経済の広範なデジタル化から生じる 巨大データセットの豊富さに大きく支えられている。 .. _subsec_generalization-model-selection: モデル選択 ---------- 通常、最終的なモデルは、 さまざまな点で異なる複数のモデル (異なるアーキテクチャ、学習目的、 選択した特徴量、データ前処理、 学習率など)を評価した後にのみ選ぶ。 多くのモデルの中から選ぶことは、 適切にも *モデル選択* と呼ばれる。 原則として、すべてのハイパーパラメータを選び終えるまでは テスト集合に触れるべきではない。 モデル選択の過程でテストデータを使ってしまうと、 テストデータに過学習してしまう危険がある。 そうなると大変である。 訓練データに過学習したとしても、 テストデータでの評価があるので 不正を防げる。 しかし、テストデータに過学習したら、 どうやってそれに気づけるだろうか。 複雑さを厳密に制御できるモデルでさえ、 これがいかにばかげた結果につながるかについては :cite:t:`ong2005learning` を参照されたい。 したがって、モデル選択にテストデータを 決して頼るべきではない。 とはいえ、モデルを訓練するのに使った まさにそのデータ上で汎化誤差を推定することはできないので、 モデル選択に訓練データだけを頼ることもできない。 実際の応用では、状況はもっと曖昧になる。 理想的にはテストデータには一度だけ触れ、 最良のモデルを評価したり、 少数のモデル同士を比較したりするだけにしたいのであるが、 現実のテストデータは一度使っただけで捨てられることはめったにない。 実験のたびに新しいテスト集合を用意する余裕は、まずない。 実際、ベンチマークデータを何十年も再利用することは、 たとえば `画像分類 `__ や `光学文字認識 `__ の アルゴリズム発展に大きな影響を与えている。 *テスト集合で学習してしまう*\ 問題に対処する一般的な方法は、 データを3分割し、 訓練データセットとテストデータセットに加えて *検証集合* を組み込むことである。 その結果、検証データとテストデータの境界が 気がかりなほど曖昧になる、という厄介な状況になる。 特に断りがない限り、本書の実験では実際には、 真のテスト集合ではなく、 正しくは訓練データと検証データと呼ぶべきものを扱っている。 したがって、本書の各実験で報告される精度は、 真のテスト集合精度ではなく、 実際には検証精度である。 交差検証 ~~~~~~~~ 訓練データが乏しい場合には、 適切な検証集合を構成するのに十分なデータを 取り分ける余裕すらないかもしれない。 この問題に対する人気のある解決策の一つが、 :math:`K`\ *分割交差検証*\ を用いることである。 ここでは、元の訓練データを 重ならない :math:`K` 個の部分集合に分割する。 その後、モデルの訓練と検証を :math:`K` 回実行し、 毎回 :math:`K-1` 個の部分集合で訓練し、 別の1つの部分集合(その回の訓練には使わなかったもの)で検証する。 最後に、\ :math:`K` 回の実験結果を平均することで、 訓練誤差と検証誤差を推定する。 まとめ ------ この節では、機械学習における 汎化の基礎となる考え方をいくつか見てきた。 これらの考え方のいくつかは、 より深いモデルに進むと複雑で直感に反するものになる。 ここでは、モデルはデータにひどく過学習しうる一方で、 関連する複雑度の概念は 暗黙的で直感に反することがあり (たとえば、より多くのパラメータを持つ大きなアーキテクチャの方が よりよく汎化するなど)る。 最後に、いくつかの経験則を挙げておきる。 1. モデル選択には検証集合(または :math:`K`\ *分割交差検証*\ )を使う。 2. より複雑なモデルには、しばしばより多くのデータが必要である。 3. 関連する複雑度の概念には、パラメータ数と、それらが取りうる値の範囲の両方が含まれる。 4. 他の条件が同じなら、データが多いほど汎化はほぼ常に良くなる。 5. 汎化に関するこの議論全体は、IID 仮定を前提としている。訓練期間とテスト期間の間で分布が変化することを許すなら、さらに別の(おそらくより弱い)仮定がない限り、汎化については何も言えない。 演習 ---- 1. 多項式回帰の問題を正確に解けるのはいつですか。 2. 依存した確率変数があるために、問題を IID データとして扱うのが不適切になる例を少なくとも5つ挙げよ。 3. 訓練誤差がゼロになることはあるか。どのような状況で汎化誤差がゼロになるか。 4. :math:`K` 分割交差検証の計算コストが非常に高いのはなぜですか。 5. :math:`K` 分割交差検証の誤差推定値に偏りがあるのはなぜですか。 6. VC 次元は、関数クラスの関数によって任意のラベル :math:`\{\pm 1\}` で分類できる点の最大数として定義される。なぜこれは関数クラスの複雑さを測るのに適切でないのだろうか。ヒント:関数の大きさを考えよ。 7. 上司から、現在のアルゴリズムの性能があまり良くない難しいデータセットを渡されたとする。もっとデータが必要だと上司にどう説明するか。ヒント:データを増やすことはできないが、減らすことはできる。