多層パーセプトロン(MLP)
この章では、DeepLearningの基礎である多層パーセプトロン(MLP)について学ぶ。最小単位ニューロンの構造を紹介し、その具体的な利用法と、限界について触れることでのちの章で出現する様々な要素を導入するモチベーションを与える。
ニューロンの始まり
ニューロンは生物の神経細胞を模した情報処理の単位である。入力信号を受け取り、それに基づいて出力信号を生成する。
この際、入力の強さによって信号を出力するかどうかを決めることにしてみよう。これは生物的に行われていることであるが、これを数学的に表現するとステップ関数を用いることができる。
この関数では入力 が 以上で発火することになる。しかしこれでは、 か しか伝播しないため、帰納的にすべてのニューロンが発火してしまう。そこで、ニューロン同士の結合の強さ と、発火する閾値を調整する というパラメータを導入することでニューロンの結合は意味を持つ。また、複数の入力に対してもその結合を考慮することができるように、ニューロンの出力は以下のように定義される。
は 番目の入力 に対する結合強度を表す。このようにしてニューロンは複数の入力を受け取り,それらの結合強度と閾値を考慮して出力を決定することができる。これをパーセプトロンという。このパーセプトロンによる実例を見てみよう。
上のパーセプトロンはANDゲートを模している。 か しかとらない入力 と に対して、ともに のときのみ出力 が になり、それ以外のときは になる。このことは上の式からわかるだろう。
次にORゲートを模したパーセプトロンを見てみよう。
上のパーセプトロンはORゲートを模している。 か しかとらない入力 と に対して、少なくとも片方が のときのみ出力 が になり、それ以外のときは になる。同じように入力 に対して ならば 、 ならば を出力するNOTゲートを模したパーセプトロンを実装できる。
多層パーセプトロン
では,XORゲートはどうだろうか。XORゲートは か しかとらない入力 と に対して、片方が のときのみ出力 が になり、それ以外のときは になる関数である。しかし、XORゲートは上のようなパーセプトロンでは実装できない。以下のようなグラフを書いてみる。
二つの入力を 軸、 軸として、出力を色分けした。青色は 、赤色は を表している。ニューロンは
と表されるが、これは直線 を境界に 平面を分けることを意味する。 しかし、グラフを見ればわかるように直線1つで青と赤の点を分けることができない。これを、線形分離不可能という。XORゲートは線形分離不可能な関数である。 したがって、XORゲートは1つのニューロンでは実装できない。しかし、XORゲートはいくつかの他の論理ゲートを組み合わせることで実装できることが知られている。
このように、XORゲートはORゲートとANDゲートとNOTゲートを組み合わせることで実装できる。複数のパーセプトロンをまるで層を重ねるように組み合わせることで、より複雑な関数を実装することができる。これを多層パーセプトロン(MLP)とよぶ。データの入力を受け付ける層を入力層、出力を表す層を出力層とよぶ。その間にある層を隠れ層とよぶ。入力層と出力層をみればデータの入出力の形だけはわかる。
活性化関数
多層パーセプトロンは、複数のニューロンを組み合わせることでより複雑な関数を実装することができる。しかし、上のようなステップ関数 では、出力が離散的で値の表現が乏しい。そのため、連続的な値を出力する関数を用いる。これら、ニューロンの出力を決定する関数を活性化関数とよぶ。
また、のちに多層パーセプトロンはいわゆる深層学習に使われるが、その際、微分が大きな役割を果たす。そのため、微分可能であるような関数が現在の活性化関数として用いられている。活性化関数の進化によって、ニューロンの「発火」という性質は薄れていった。一方で、パラメータ は意味を変えつつもそのまま残っており、重み及びバイアスとよばれるようになった。
活性化関数には様々な種類があるが、ここでは代表的なものを紹介する。
シグモイド関数
シグモイド関数は、入力 に対して から の値を出力する微分可能な関数である。これは、ニューロンの出力を確率として解釈することができる。ステップ関数と形が似ているため、ステップ関数の滑らかな近似としてよく用いられていた。しかし、入力の絶対値が十分大きい場合に、微分係数が に近くなってしまうため、学習が進まなくなるという問題(この問題を勾配消失問題という。)がある。
ReLU関数
ReLU関数は、入力 に対して 以上の値を出力し、 を除いて微分可能な関数である。これは、入力が 以上のときはそのまま出力し、 未満のときは を出力する。シグモイド関数と比べて、勾配消失問題が起こりにくいという利点があるため、現在ではデフォルトで用いられている。面白いことに、ReLU関数はステップ関数を積分したものになっている。
Softmax関数
Softmax関数は、他の活性化関数とは異なり入力全体のベクトル を用いる. 番目の要素 に対して、 の全体に占める割合に似たものを出力する.出力は 以上の値を持ち、全体の和は になる。確率分布を表すために用いられる。
Softmax関数を実装する際の注意点として、入力 の値が大きいときに、 がオーバーフローしてしまうことがある。これを防ぐために、全体の最大値を引いてから計算する。値が小さくても は に近づくだけなので問題ない。入力を定数分だけ引いても出力は変わらないので、この操作で出力は変化しない。
行列表現とAffine層
ここでは、層構造をもつ多層パーセプトロンについて、効率的な計算をおこなうために行列計算に帰着できることを示す。
Affine層
Affine層は、入力 に対して、重み とバイアス を用いて出力 を計算する層である。活性化関数については一度目を瞑ることにする。最も基本的な形は以下の図で示されるようなものである。
いくつかのニューロンが並列に配置されており、これを層あるいはレイヤという。レイヤ内のニューロンの数を層の大きさとよび、上図ではサイズ のレイヤとサイズ のレイヤが結合されている。また、上図では省略されているが、各入力は個別の重みとバイアスを持つ。
注意すべきなのが、各ニューロンの各入力について重みがあるという点である。例えば、右側レイヤの1番目のニューロンは左側レイヤの1番目のニューロンからの入力に対して重み を持つ。加えて、右側レイヤの2番目のニューロンは左側レイヤの1番目のニューロンからの入力に先ほどとは異なる重み を持つのである。ただし、バイアスはニューロンごとに1つしか持たない。
今現在、右側レイヤに注目する。左側レイヤの 番目のニューロンの出力を 、右側レイヤの 番目がもつ に対する重みを と書くことにする。右側レイヤの 番目のニューロンのバイアスを 、出力を とすると、以下のように表すことができる。
ここで、以下のような重み行列 とバイアスベクトル を定義する。
の 成分 は に一致している.この行列とベクトルを用いると、左側レイヤの出力 に対して、右側レイヤの出力 は以下のように表すことができる。
簡単な行列計算で済むのである.
バッチ付きAffine層
機械学習では複数のデータを同時に扱うことで計算を効率化することが一般的である。ここでいう、データとは や を1単位としている。時に、何億というデータを扱うこともあるため、コンピュータの性能が許す限り、一度に多くのデータを扱いたいのである。これをバッチ処理とよび、いくつかのデータをまとめたものをバッチとよぶ。また、一度に扱うデータの数をバッチサイズとよび、 と書くことにする。
Affine層では、単に入出力をベクトルから行列に拡張するだけでバッチ処理を実現できる。次の に入出力を改める。またバイアスも に改める。ただし、バッチ内の 番目のデータを とする。
は成分がすべて で 次元列ベクトルである。このベクトルと、任意の行ベクトル のドット積は、 の成分を 行分だけコピーした行列になる。これをベクトルのブロードキャストとよぶ。さて、これは先ほどと同様に行列の積で計算できる。
これは以下のように正当化される。
行列表現での活性化関数の扱い
活性化関数はAffine層とは別と考えることができる。実際の深層学習フレームワークでは一緒に利用できるように実装されているが、ここでは別々に考えることにする。ReLUやシグモイドなどの関数は、行列の個々の要素に対して適用すれば良い。
Softmax関数などのデータ全体を用いる関数は、バッチ内のデータごとに適用すれば良い。行列表現では行ごとということになる。
ニューラルネットワーク
多層パーセプトロンを実装するだけでは、意図した出力を得ることはできない。適正なパラメータを与えなければならない。しかし、人間が正確なパラメータを与えることはおおよその場合、不可能である。このパラメータを自動的に調整する方法が必要である。深層学習とはつまるところ、パラメータを自動的に調整することである。
多層パーセプトロンに与えるデータを 、それを与えた場合に出力されるべきデータを 、実際に出力されたデータを とする。 と は大きさ のベクトルとする。
損失関数
損失関数 は、実際に出力されるデータ と与えられたデータ の差を表す関数である。これは、パラメータを調整するための指標となる。多層パーセプトロンは数学的には だけでなく、用いるパラメータ すべてを引数にとる多変数関数とみなせる。なので、その出力を引数に持つ、損失関数もそれらを引数に持つ多変数関数とみなせる。ここで、 は決められた定数とみなす。
いくつかの損失関数があるが、ここでは代表的なものを紹介する。
平均二乗誤差
平均二乗誤差は、 と の個々の差を二乗して足し合せて平均をとったものである。これは、出力の値が連続的な場合に用いられる。
クロスエントロピー誤差
クロスエントロピー誤差は、 と を確率分布とみなして、その確率分布の誤差を表すものである。分類問題において使われることが多い。Softmax関数と組み合わせて用いることが多い。
確率的勾配降下法(SGD)
損失を最小化することが、深層学習の目標である。あるパラメータ を更新することを考えよう。損失関数 は先述した通り, を引数に持つ。 についての のグラフを書くと以下のようになる。
実際は に対する の形はわからない。しかし、 での傾きを知ることはできる。これは後述する。 のように傾きが負のときは、 を増やすことで損失が減る。 のように傾きが正のときは、 を減らすことで損失が減る。したがって、 を更新する際には、傾きに応じて を増減させれば良い。これを勾配降下法という。つまり、 をの更新は以下のように行う。
ここで、 は学習率とよばれる定数である。これは、 の更新幅を決めるものである。 が大きすぎると、最適なパラメータを通り過ぎてしまうことがある。逆に小さすぎると、最適なパラメータにたどり着くまでに時間がかかる。この更新方法を確率的勾配降下法(SGD)とよぶ。
現在、パラメータの更新にはSGDに様々な工夫を加えたものが用いられている。しかし、偏微分を考えるという部分は変わらない。
誤差逆伝播法
さて、SGDを用いるためには、 の偏微分を計算する必要がある。 は多層パーセプトロンの出力を引数に持つ多変数関数である。したがって、 の偏微分は連鎖律を用いて計算できる。
数値微分
連鎖律を用いる以外には、数値微分を用いる方法がある。本書では、連鎖律を用いることを前提としているので、詳しくは述べないが紹介だけしておく。数値微分は、 の入力を少しだけ変えて、出力の変化をみることで偏微分を求める方法である。 に関しての偏微分は以下のように表される。そもそも、偏微分の定義は以下のようなものであった。
これを簡単に求められない、つまり四則演算を用いて計算することができないのは を に近づけるためである。そこで、 を極めて小さな値にし、
を計算することで、近似的に偏微分を求めることができる。このように、 を用いて偏微分を近似的に求める方法を数値微分とよぶ。上の式は、 が正なら前方差分、 が負なら後方差分とよばれる。しかし、求めたいのは における偏微分であるのでこれらの計算は誤差が大きい。したがって、以下のように を中心にした差分を計算することが多い。これを中心差分とよぶ。中心差分は前方差分や後方差分よりも精度がいいことは解析的に示すことができる。
すべてのパラメータに対して、 を用いて偏微分を近似的に求めることができればいいが、パラメータの数は膨大であるため、計算量が膨大になってしまう。また、より精度のいい5点公式や7点公式などもある。
逆伝播法における連鎖律
改めて、今の目的は のあるパラメータ に関する偏微分を求めることである。以下のような計算を考えてみる。
および は学習可能なパラメータで、 および は および で何かしらの計算が行われる。 は と同じである。 は と を用いて計算される。
たとえば、 による偏微分を求めることを考えてみよう。 は に影響を与えており(これを寄与しているという)、 は に寄与している。したがって、 の偏微分は連鎖律をもって以下のように表される。
ここで、 は と を用いて計算されているので、当然 に関する偏微分 は と を用いて計算可能であり、既知である。同様に、 は と を用いて計算されているので、 に関する偏微分 も既知である。したがって、 に関する偏微分 は求めることができる。
次に、 による偏微分を求める。 は に寄与しており、 は と同一である。 は に寄与しており、 は に寄与している。したがって、 の偏微分は連鎖律をもって以下のように表される。
これらはすべて既知であるので、 に関する偏微分 は求めることができる。ここで重要なのは、学習可能なパラメータではない に関する偏微分を用意しておく必要があるのである。それ自体は学習に使うわけではないが、より上位の層に伝播するために必要である。これを逆伝播とよぶ。
つまり、各層ではより下位(順伝播では次に値する層)からの偏微分係数を受け取り、連鎖律を用いて学習可能なパラメータの勾配を求め、上位の層に伝播するために順伝播では入力に値するものの偏微分係数を求めるように実装すれば、繰り返し行うことですべてのパラメータに関する偏微分を求めることができる。では、各層の逆伝播の計算を順伝播の計算を元に求めることを次に考える。
実数の逆伝播
行列で逆伝播を考える前に、実数の逆伝播法を考える。例えばある実数を返す関数 (ここでは損失関数を念頭に置いている。)に関してある出力 による偏微分係数 が既知であるとする。そして入力 に関して、
が成立するとする。 は更新対象のパラメータである。勾配降下法を用いるためにはこれらのパラメータに関する偏微分係数が必要である。そのためにまず、 の偏微分を求める。
次にこれらの関係をまとめると、
であるので、連鎖律を用いて以下のように表すことができる。
ここで、 は既知であるので,入力とパラメータに関する偏微分係数を求めることができた。 はこの前の層にとっては既知とされた に対応する。
Affine層の逆伝播
ある行列 について を次のように定義する。
自身も形式上は の行列であり、ドット積は形式的に行える。左側から行われた場合は、例えば のように書くことができるが、 を で偏微分するという意味になる。
これを踏まえて、バッチ付きAffine層の逆伝播を考える。Affine層の出力 についての実数関数 の偏微分 は既知であるとする。なお、要素を書き下すと以下のようになることに注意されたい。
Affine層は以下のような演算を行うことは既に述べた通りである。
について以下のように書き下せる。
つぎに、両辺を と で偏微分すると、
となる. の行と の列は固定されているので、式にそれらが出現しないと偏微分係数は になる。そして、 がどのように に依存しているかを示すと、
となっているので、
が成立する。これはまさに、行列のドット積の定義であるので
が成立する。同様に
も成立する。 は既知であるので、重みの偏微分係数を求めることができた。 さて、バイアスについては、以下のような依存関係がある。
したがって、 について偏微分すると
となる。 は に依存しているので、 番目の列の和をとることになる。したがって、逆伝播は以下のように表せる。
ReLU関数の逆伝播
ReLU関数は非常に簡単に逆伝播できる。ReLU関数は以下のように定義されていた。
これを について偏微分すれば
となる。よって、
となる。ReLU関数自体が、行列の各要素ごとに適応されるため、その逆伝播も行列の各要素ごとに適応される。したがって、ReLU関数の逆伝播は行列の計算を伴わず非常に簡単である。
Softmax関数の逆伝播
Softmax関数は、行列の各行ごとに適応される。したがって、Softmax関数の逆伝播も行列の各行ごとに考える。この節に限り、入力を 、出力を とする。ともに大きさ である。すると、Softmax関数は以下のように定義されていた。
右辺の分母を とすると、 を で偏微分すると
となる。ここで、 はKroneckerのデルタである。 のときは 、それ以外は である。依存関係は以下のように表せる。
連鎖律を用いれば以下のように求められる。
やや強引な式変形を行うと、簡単に求めることができる行列を用いることができる。以上から、
ここで、 は の対角行列を表す。numpyなどのライブラリにはdiagが実装されていることが多い。
クロスエントロピー誤差の逆伝播
レイヤと同じように損失関数にも逆伝播が必要である。逆伝播の開始位置ともいえるだろう。クロスエントロピー誤差は以下のように定義されていた。ただし、モデルの出力を 、教師データを とする。
Softmax関数と同様に行ごとに適応される。逆伝播はすぐに求めることができる。
Softmax関数とクロスエントロピー誤差の組み合わせ
Softmax関数とクロスエントロピー誤差は、組み合わせて用いることが多い。というのも、Softmax関数は確率分布を表し、クロスエントロピー誤差は確率分布の誤差を表すからである。Softmax関数とクロスエントロピー誤差を組み合わせて逆伝播を求めてみる。ただし、Softmax関数への入力を 、出力を 、クロスエントロピー誤差の教師データを とする。
ここで、 はクロスエントロピー誤差の教師データである。 は正規化されているので、 である。このように、Softmax関数とクロスエントロピー誤差を組み合わせることで、非常に簡単に逆伝播を求めることができる。加えて、Softmax関数もクロスエントロピー誤差も行列計算不可能にも関わらず、この逆伝播はバッチ付きの行列計算で表現できる。
ニューラルネットワークの工夫
ここまでで、ニューラルネットワークの基本的な部分を学んだ。ここからは、ニューラルネットワークをより効率的に学習させるための工夫を紹介する。
Optimizer
Optimizerは、パラメータを更新するためのアルゴリズムである。SGDはOptimizerの一つである。ここでは、SGDにさまざまな工夫を加えたOptimizerを紹介する。この節ではあるパラメータ を更新することを考える。
Momentum
Momentumは、SGDの更新に過去の更新を引き継いだ慣性のようなものを加えたものである。前回までの更新を に保存し、新たな更新では勾配と の両方を用いる。
RMSProp
RMSPropは、SGDの更新に対して学習率を調整する機能を付け加えたものである。更新分が一定だと、最小に近づくにつれ、更新幅が必要な幅より大きくなってしまう問題を解決するため、更新幅の分だけ学習率を割り引く。更新幅は指数移動平均を用いて計算し、ある程度過去の更新幅を引き継ぐ。
パラメータごとに学習率を調整するために、アダマール積とアダマール除算を用いている。
Adam
Adamは、MomentumとRMSPropを組み合わせたものである。
AdamW
AdamWは、AdamにL2正則化を加えたものである。L2正則化とAdamWの構造についてはペナルティ項の追加にて後述する。
レイヤ
Affine層や活性化関数層以外の、レイヤを追加することで学習を加速あるいは、精度を上げることができる。ここでは、代表的なレイヤを紹介する。
Batch Normalization層
順伝播
学習時はバッチを用いて複数のデータを同時に学習する。この際、バッチ内のデータに偏りが存在する場合があり、学習が進まないことがある。また、途中の層の出力が極端になってしまうことがある。これを防ぐために、バッチ内のデータについて、各特徴量を正規化する。その後、学習可能なパラメータを用いて、正規化したデータを変換する。これをBatch Normalization(以下、BN)とよぶ。入力が の行列である場合、正規化を行うのは列ごとであることに注意されたい。
ここでは の 行目ベクトルを とする。ここでは、要素 がどのように正規化されるかを考える。その際、 列目のことのみを考えればよい。 列目の平均を 、分散を とし、中間出力を 、最終出力を とする。すると、BNは以下のように行われる。
ここで、 と は学習可能なパラメータで、列ごとに別の値が適用される。正規化後のデータを適切にスケールするためのものである。 、 は学習時に列ごとに計算される。つまり、実際には はベクトルである。次に、推論時では平均と標準偏差はbatch内のデータを用いて計算されない。なぜなら、推論時には学習時にくらべて少ないデータが入力されるからである。したがって、学習時に平均と分散をある程度計算しておく必要がある。 毎ステップ、上で計算したバッチの平均と分散を用いて推論時に用いる平均 と分散 を更新する。 は係数である。
推論時には と の代わりに と を用いる。
逆伝播
次に、学習可能なパラメータである と と、 の逆伝播を考える。ここでも、 は既知とする。まずは、 から までの逆伝播を考える。まず、 の損失関数 に対する依存関係を整理しよう。
つまり、
である。つまり、ベクトル表現を用いると
となる。次に、 から までの逆伝播を考える。注意すべき点は が や に寄与しており、それがすべての に寄与していることである。計算しやすさのため、 を定義する。すると、 は
と表される。 を用いて関係をまとめると以下のようになる。ただしこの図で は を満たすすべての である。
に対しては、 が を介してだけではなく直接作用するので、 と を他の や と区別する必要がある。逆に、 までは区別する必要はないのでこれからは は も含めた任意の添字として扱う。まずは、 について考える。
次に、 について考えると、
である。また、 から、 の に対する依存を一旦無視すると
であるので、
となる。最後に に対する への逆伝播を考える。しかし、 がすべての に寄与していることを考慮する必要がある。
ここで、 について考えてみる。
したがって、
そして、 は直接 に寄与している他、 を通して に寄与している。つまり、
となる。第1項について詳しく考える。 を念頭に考えると、
つまり、以上をまとめると
となる。最後の等号は、 を用いている。さて、 や の勾配を思い出すと、
となる。この式はすべての 列に対して成立するのでベクトル表現を用いれば以下のように整理できる。
さらに成分がすべて で大きさ の列ベクトル を用いて行列表現に拡張すると以下のようになる。
Dropout層
Dropoutは、学習時にランダムにノードを無効化することで、過学習を防ぐ手法である。そもそも背景として、構造の異なる複数のモデルを学習させ、それらの結果を平均化することで、より精度の高いモデルを得るという方法がある。これをアンサンブル学習と呼ぶ。Dropoutはミニバッチごとにある一定確率でニューロン(ノード)を無効化することで、アンサンブル学習に似た効果を得る手法である。Dropoutは、学習時にのみ適応される。推論時はすべてのニューロンを有効化する。また、推論時と同様のスケールに保つため、学習時はDropoutを適応した後にスケールを合わせる必要がある。このDropoutをレイヤとして実装することを考える。
順伝播
全結合層の順伝播でニューロンを無効化するということは、ニューロンの出力を にするということである。無効化を行う層の単一の出力を とする。これはAffine層の出力に関して活性化関数を作用させたものである。もし、 番目のニューロンを無効化するならば とするということである。つまり、Dropout層はDropoutを適応する全結合層の後に適応するように設計するのが適当である。
まず一つのニューロンが無効化される確率を とする。すると全体で 個のニューロンがあった時に、 個のニューロンが無効化される確率 は
である。つまりその期待値は
つまり全体のうち、割合 だけのニューロンが無効化される。つまり、 の割合のニューロンが有効化される。推論時に比べ、 のスケールが学習時に出力される。これを推論時と同じスケールにするために で割る。また、無効化される成分を 、そうでない成分を とするベクトル を用いる。すると、 は の確率で 、 の確率で となる。これは の各成分がベルヌーイ分布に従うことを意味する。つまり、Dropout層の順伝播は以下のように表現できる。
さて、バッチ学習においてもこれらは基本的に同じである。どのニューロンを無効化するかは、バッチごとではなくデータごとに決定される。つまり、全結合層の出力 に対して、Dropoutを適応した出力 は
で計算される。
逆伝播
Dropout層には学習可能なパラメータは存在しない。つまり、 のみを考えればいい。
より、
となる。
ペナルティ項の追加
ペナルティ項とは過学習を防ぐために損失関数に追加する項である。過学習の状況ではパラメータが汎用性を失うため、重みといったパラメータが非常に複雑な値をとることがある。これを防ぐために、パラメータの「大きさ」をペナルティとして追加する。パラメータの「大きさ」を求める手法でいくつかの違いが存在する。ここでは、L1正則化とL2正則化を紹介する。一方で、実装においては損失関数にペナルティ項を追加するのではなく、Optimizerなどの更新時に用いる勾配を変更することで実装することがある。あるペナルティ項を とすると、ペナルティ項を追加した損失関数は
である。これを用いてパラメータ の勾配を考えると、
となる。 は元の損失関数を用いて今まで通り計算を行った勾配である。つまり、その元の勾配の代わりにそれに を加えてものを用いることでペナルティ項を追加することができる。
L1正則化(Lasso:Least Absolute Shrinkage and Selection Operator)
L1正則化は、パラメータの「大きさ」としてL1ノルムを用いる手法である。L1ノルムは、パラメータの絶対値の和である。つまり、新たな損失関数 は
となる。つまり、新たな勾配とのSGDにおける更新式は
となる。 は の符号を表す関数である。つまり、 が正ならば 、負ならば 、 ならば となる。L1正則化は、比較的強くパラメータを に近づける。なぜなら、パラメータが でなければ、そのスケールに関わらず勾配のペナルティ項の絶対値は である。すると、パラメータが でない限りそれを に近づけようとする力は常に一定で働く。これは結果として、必要最低限のパラメータを取捨選択することにつながり、必要最低限で非常に疎なパラメータを得ることができる。これをスパース性という。
L2正則化(Ridge)
L2正則化は、パラメータの「大きさ」としてL2ノルムを用いる手法である。しかし、諸々の理由でL2ノルムそのものではなく、その2乗を用いる。新たな損失関数 は
である。ここで、勾配計算の簡単さから を掛けている。つまり、新たな勾配とSGDにおける更新式は
となる。L2正則化は、すべてのパラメータを に近づけるように働く。しかし、一方でL1正則化とは異なり、パラメータを に近づける力はパラメータの大きさに依存しているので、 に近づけるにつれその力は弱まる。つまり、パラメータはそこまで にはならない。一方で、パラメータが複雑になることを防ぐことができる。
L1L2正則化(Elastic Net)
L1L2正則化は、L1正則化とL2正則化を純粋に足し合わせたものである。新たな損失関数 は
となる。つまり、新たな勾配とSGDにおける更新式は
となる。
L2正則化の問題点とAdamW
L2正則化をAdamと組み合わせて学習を行うと、置き換えたのちの勾配を用いてAdamの更新式を用いることになる。つまり、L2正則化を行うと、Adamの性質よりそのペナルティ項も含めて更新式を計算することになり、ペナルティ項がAdamでのスケーリングの影響を受けてしまう。これを防ぐために、AdamWという手法が提案された。AdamWは、L2正則化のペナルティ項を含めない勾配を用いてスケーリングを行ったのち、更新時にペナルティ項を加える手法である。つまり、L2正則化をOptimizerで担うのである。式は以下のようになる。
Adamと見比べてみると、 の更新式にペナルティ項が追加されていることがわかる。