雑記: 学習し過ぎてほしくない話

お気付きの点がありましたらご指摘いただけますと幸いです。

まとめ

  • そのデータの真のメカニズムに比してモデルの表現力が過剰だと過学習が起きうる。つまり、学習してほしくない訓練データ上のノイズまで学び取られることで汎化性能が損なわれてしまう。
  • 必要十分な表現力のモデルを選択するには、モデルの自由度が明確であれば情報量規準が有効である。
  • ディープニューラルネットでは情報量規準が有効でないが、以下のようなプラクティスが知られる。つまり、表現力が過剰であることは前提に、訓練データを学習し切ってしまうことを妨げるアプローチといえる。
    1. 重みが取りうる値を制約する ― L2正則化(weight decay)、L1正則化(sparse DNNs)、活性化関数の出力に対する正則化、重みのL2ノルムの上限を直接制約、……。
    2. (ミニバッチごとに)訓練する重みを一部に絞る ― ドロップアウト
    3. その他の方法で訓練を妨げる ― 訓練を早めに切り上げる、訓練データにノイズを添加する、……。
  • 上記のプラクティスとは別に、確率的勾配降下法自体に暗黙裡に過学習らしい解を避ける仕組みがあるともいえる。他方、明示的に過学習らしい解を避けようとする最適化アルゴリズムも存在する。
そもそも過学習とは & 理論的な対処法

そもそも過学習(overfitting)とは何ですか? どうも望ましくない状態のようですが、モデルを学習しておいて「学習し過ぎだ」とは随分勝手な物言いなのではないでしょうか。

ウィキペディア [1] の冒頭によると、モデルの過学習とは、モデルが本当にモデリングしたいデータの特定の部分集合に適合し過ぎていて、それ以外の部分に適合できていない状態のことだね。訓練データへの予測精度の割に本番データへの予測精度が出ていない状態を思い浮かべればいいよ。

なるほど。しかしその「適合し過ぎ」とは何なのでしょう? 本番データ上で思った予測精度が出なかったとして、それはただただ上手くいかなかっただけですよね? 「やり過ぎ」であったことになるんですか?

それについてウィキペディアの続きだけど、過学習といったときはモデルが過剰な表現力をもつことを含意しているね。パラメータ数が over というわけだ。

例えば、とある A 県では「マンションの家賃」の真のモデルが「築年数」の2次関数とホワイトノイズのみでできているとしよう。このとき、家賃を予測するモデルを築年数の3次関数にすると過学習が起きうる。築年数の3次の係数が過剰なパラメータになるからね。この過剰な係数はもっぱら訓練データ上のノイズを学ぶだろう。そしてそれは本番データの予測に害をなすことになる。次数の過剰に限らず、予測モデルに「床面積」や「駅からの徒歩分数」といった過剰な変数が入っているときも同様だね。

いやいや家賃が床面積や駅からの徒歩分数などに依存しないんですか!? どれだけ築年数しかみない県民性なんですか……しかし、過学習とはモデルに過剰な表現力があることで予測に寄与しないノイズまで学び取られてしまうことに起因しているのですね。であれば、表現力が必要十分なモデルを採用すれば……いえ、最初から必要な表現力がわかっていることなどほとんどないでしょうね。真のマンションの家賃が何次関数で決まるとわかっていたら苦労しません。ではいったいどのようなモデルを用意すべきなのか……訓練データから知るすべなどないのでは……?

例えば、先の家賃予測モデルを A 県のマンションの家賃データから 100 件抽出した訓練データで学習するとするよ。モデルを築年数の1次関数、2次関数、3次関数……とするにつけ訓練データ上での予測精度は向上するだろう。でも表現力が過剰なモデルは訓練データ外の予測精度がむしろ劣化していく。だから、A 県内のあらゆるマンションに対する予測精度を出してその期待値を計算すればいい。

おお、それはよいアイデアです……とでもいうと思ったのですか? それでは A 県内のあらゆるマンションに対する正解が手に入っているでしょう。それが手に入っているなら予測する必要がありません。

その通り、本当に期待値を計算するんじゃないよ。訓練データだけから見積もるんだ。そしてその見積もった値は見積もり方によって赤池情報量規準AIC)とかベイズ情報量規準(BIC)とかよばれる。これらの情報量規準は、複雑なモデルに対してはそのぶん「訓練データ上にたまたま出たノイズまで学んで精度が高めに出ているだろう」としてペナルティを課す。このペナルティを課されても精度が上がっていくなら複雑にしていけばよい、という判断ができる [詳しくは関連記事参照]。

ディープニューラルネットへの実践的な対処法

なるほど……でしたら、過学習を防ぐには、情報量規準によって表現力が必要十分なモデルを選択すればよいのですね? 過剰な表現力がなければ過学習は起きないのですから。

常にそうするというわけでもない。例えば多項式モデルの次数を AIC で決定するのはよくみるというか、AIC が紹介されている文献に使用例として載っていることが多いと思う。これは多項式モデルは「自由度」が明確だからだろう。3次多項式は定数項含め自由度4というように。でも、一般のモデルは必ずしも自由度が明確ではない。見かけのパラメータ数とモデルの自由度が一致するとは限らない。自由度が明確でなければ情報量規準によるモデル選択は有効でなくなってしまう [詳しくは関連記事参照]。

ディープニューラルネットで情報量規準によるモデル選択がなされない主な要因もこれだと思う。参考文献 [2] [3] でも趣旨としてはそう回答されていたし。いや、調べたらニューラルネットに情報量規準を適用する例をみかけないこともなかったんだけど、浅い限定的なアーキテクチャなんじゃないかな(みつけたのは古い文献だったからリンクしていないけど)。そもそも一般にディープニューラルネットってネットワークのすべてのパラメータがフル活用されてはいないと思うしね。何にせよ、ディープニューラルネットでは情報量規準を論じづらいと思う。

えっと、要するに、情報量規準によるモデル選択はディープニューラルネットには向かない、ですか。それでは、ディープニューラルネット過学習を防ぐ方法はないのでしょうか?

そんなことはないよ。そもそもクロスバリデーションでモデル選択ができるし。これはディープニューラルネットに限らないね。A 県内のあらゆるマンションに対する正解がないなら、手元のデータの一部を評価用に取り分けておけばいいだけだ。

でそれとは別に、一般のディープニューラルネット過学習を防ぐプラクティスとして、「もう表現力が過剰なんだろうから学習を妨害しておこう」、といったものたちがあるね。[4] 及び [5] の 13.5 節に紹介されている手法を以下の 3 タイプに整理したよ。まあ3タイプ目が「その他」って感じだけど……。

  1. 重みが取りうる値を制約する ― L2正則化(weight decay)、L1正則化(sparse DNNs)、活性化関数の出力に対する正則化、重みのL2ノルムの上限を直接制約 [6]……。
  2. (ミニバッチごとに)訓練する重みを一部に絞る ― ドロップアウト
  3. その他の方法で訓練を妨げる ― 訓練を早めに切り上げる、訓練データにノイズを添加する、……。
これらとは別に [5] の 13.5 節にはベイジアンニューラルネットも紹介されているけど、こうなるともうモデルが別物って感じがするね。[4] の最後の方には「じゃあ過学習の防ぎ方の最近のトレンドは?」という話があるね。この記事自体が 3 年前の記事ではあるけど……。

ディープニューラルネットでは学習を妨害することで過学習を防ぐのですか? おいそれと妨害してよいものなのでしょうか。1. の重みの制約からみていくと、正則化というのは損失にペナルティを課すということですよね。全体的に、重みが大きいときはペナルティを課すということになるのでしょうか。重みが大きくなりづらくなると。そのような制約が正当化されるのですか?

[4] の Reduce Overfitting by Constraining Model Complexity という節の後半あたりにあるけど、重みが大きいということはそれだけ入力の小さな変化に対して出力が大きく変動するモデルということだ。でも私たちはモデルにあまりそのような挙動を期待しない。例えば、マンション B とマンション C の築年月が1ヶ月しか違わなかったとする。きっと両マンションの家賃は近いだろう。逆に、両マンションの家賃がかけ離れていたとしたら、どちらかがノイズを含んでいる可能性が高い。重みを制約することで、そのようなデータに適合しづらくなる効果が見込めるんじゃないか。重みや活性化関数の出力値の正則化は、「入力空間内で出力は急激に変化しないはずだ」という信念で正当化されると思う。

出力を大きく変動させるにはペナルティを乗り越えられるだけたくさんのデータによる証拠が必要ということですか。

ちなみに参考文献 [5] にはL1正則化はあまり用いられないとあるね。L1正則化はパラメータを疎にする効果があるけど、近年の GPU ではそれで計算量低減効果が得にくいかららしい。ただ代わりにブロックスパースというやり方はみられるというようにある。

あれ、いつから計算量の話に……。

適切な正則化は学習を高速化する期待があるから計算量と話がセットになっているんじゃないか。次のプラクティスはドロップアウトだね。参考文献 [5] によると、一定割合のニューロンが欠落しても機能するように学習させることで、複雑すぎる学習を抑制する効果があるとある。ドロップアウトによって学習したモデルは混合モデルとみなせるとかベイズ推測とみなせるとかの研究もあるよね。

ドロップアウトは、重みに対してベルヌーイ分布にしたがって(つまりコイン投げの要領で)ゼロになるノイズがのっているとみなせるともありますね。例えば訓練時に 0.8 の割合のニューロンのみ生かして予測時にドロップアウトしないならば重みにその 0.8 を乗じなければならないとも。それはそうですが。

ベルヌーイ分布のくだりは、じゃあ連続分布のドロップアウトも考えられるという布石かと思ったけどそんな話もないか。続きには、望むなら予測時にだってドロップアウトしていいとあるね。例えば10パターンのドロップアウトで10パターンの出力を得る。それぞれに 0.1 倍をかけて足し合わせる、と。ここまですると最早モデルとして別物だよね。計算もなんか面倒そうだし……でもこれがベイズ推測のよい近似になるのか。

最適化アルゴリズムによる暗黙裡な対処法

参考文献 [5] の 453 ページの 13.5.6 節は何を言わんとしているのでしょうか。ページの上部に広い谷と狭い谷のイラストがありますが。

パラメータ平面上に、訓練データにおける損失をプロットした絵だろうね。それで、左側の広い谷を目指せということだね。左側の広い谷は、底が広がっているからどこが最小点か不確かだ。不確かということは、このあたりのパラメータは訓練データに特有のノイズを拾っていない可能性が高い、という論法だね。じゃあどれくらい広ければいいのかって話になるけど、ここでいいたいのは、確率的勾配降下法SGD)はノイズを利用することで暗に狭い谷に陥ることを避けていると。でも明示的に広い谷を目指す方法もあるみたいでそこに列挙されているね。

では、次の 454 ページのイラストは……?

フルバッチに対する損失で広い谷になっているところが、個々のミニバッチでは狭い谷になっているかもしれないという絵だね。これについての考察が ICLR 2021 で発表されていたみたいだね [7]。式 (13.100) のように、ミニバッチに対する確率的勾配降下法はミニバッチごとで勾配が異なるような箇所の損失を上げ底する効果がある、つまり、ミニバッチごとで勾配が異なるような箇所はよい解と認めない効果があることを示したと。ただ式 (13.100) は少なくともナブラ記号が抜けている誤植があるし原論文とノーテーションが違うから式は原論文をみた方がいいと思う。

終わり