ディープラーニングE資格

【意味をしっかり捉えよう】バッチ正規化を分かりやすく解説

今回はニューラルネットワークの学習時に用いられるテクニックであるバッチ正規化を取り上げていきます。

バッチ正規化

ニューラルネットワークの各層において、データを平均0、分散1の分布にスケール変換すること

基礎から始めていきたいと思いますので、まず「バッチ」や「正規化」といった言葉の説明を行ない、バッチ正規化のメリットまで言及していきます。

バッチとは?

バッチ(batch)とはもともと束や集団を意味する単語です。
この語源から分かるように、プログラミングでバッチ処理と言えば、あるまとまった量のデータを一気に処理するようなプログラムを意味します。

では、機械学習の領域における「バッチ」とは何を意味するのでしょうか?

機械学習において、バッチ学習とはあるまとまった量のデータを一度に学習することを意味します。

バッチ学習の定義は以上なのですが、ここではさらに理解を深めていただくため、一度の学習に用いるデータの量に着目した学習方法の分類をまとめておきます。

オンライン学習

これは1度の学習で1つのデータだけを用いる学習方法です。
従って、10000個のデータがあれば、10000回の学習を行なうことがあります。

オンライン学習のメリット・デメリットは以下の通りです。

メリット

  • データを1件処理すればよいので、学習の負荷が軽い
  • 1件のデータがあれば学習できるので、リアルタイムでのモデル(パラメータ)の更新を行ないやすい

デメリット

  • 異常なデータの影響を受けやすい

デメリットが少し分かりづらいからもしれないので補足します。
1件のデータに対して学習を行なうということは、1件のデータが入力されたら、それに合わせてモデルのパラメータが更新されるということです。


この時入力されたデータがたまたま異常値だったらどうでしょうか?
その異常値に合わせてモデルのパラメータが更新されてしまい、結果的に性能が落ちる方向に向かってしまいます。
これがオンライン学習のデメリットです。

バッチ学習

これはオンライン学習とは対極的で、1度の学習で全てのデータを使う方法です。
従って、10000個のデータがあれば1度で10000個のデータを学習します。

バッチ学習のメリット・デメリットは以下の通りです。

メリット

  • 異常なデータが含まれていても影響を受けにくい

デメリット

  • まとまった量のデータを処理するので、学習の負荷が重い
  • 学習にまとまった量のデータが必要なので、リアルタイムでのモデル(パラメータ)の更新を行ないにくい

見て分かるように、オンライン学習とは真逆のメリット・デメリットを持っています。

先ほどのオンライン学習では異常なデータの影響を受けやすかったですが、バッチ学習は大量のデータを用いるので、その中に異常なデータが多少混ざっていたとしても、全体に与える影響は大きくないということですね。

ミニバッチ学習

これはデータをいくつかのかたまり(バッチ)に分割して、1度の学習で1つのバッチを学習する方法です。従って、10000個のデータあれば、それを例えば1000個ずつに分割し、10回の学習(1000個×10回=10000個)を行なうような形になります。

学習方法から分かるように、オンライン学習とバッチ学習の中間のような位置づけなので、メリット・デメリットもこれら2つの学習方法の中間的なものとなります。

正規化とは?

正規化とはデータの大きさを扱いやすいように調整することを意味します。

具体的な手法はいくつかありますが、今回はデータの平均値を0、分散を1に調整する方法を紹介します。ちなみに、この方法は別名で標準化とも呼ばれます。

方法の説明に入る前に、言葉の意味を確認しておきましょう。
「平均」はすでにご存知かと思いますが、「分散」とは何でしょうか?

分散とは平均値からのずれ(の2乗)の平均のことです。

データが複数あれば必ずばらつきが生じるので、まずは代表的な値を知るために平均値を求めます。そして、次に知りたいのは「それぞれのデータは平均値からどのくらいずれているのだろう」ということです。各データは異なりますから、当然ながら平均値からのずれ具合も様々で、平均値に近いデータもあれば、遠いデータもあります。そこで、ずれ具合についても平均を取って代表的な値を把握します。これが分散です。

仮にデータが$x_1,x_2,x_3,……x_n$のようにn個あれば、平均と分散は以下の数式で求めることができます。

平均と分散

平均値 $\bar{x} = \frac{(x_1 + x_2 + x_3 + …… +x_n)}{n}$

分散 $\sigma^2 = \frac{(x_1-\bar{x})^2 + (x_2-\bar{x})^2 + (x_3-\bar{x})^2 + …… + (x_n-\bar{x})^2}{n}$

平均と分散が分かれば、$x_1,x_2,x_3,……x_n$を新たに以下のように定義すると、平均0、分散1のデータに変換することができます。

$x^{\prime}_i = \frac{x_i – \bar{x}}{\sigma}$

※証明は省略しますが、新たに定義した$x^{\prime}_i$を平均と分散の計算式に代入すると実際に平均0、分散1になっていることを確認できます。

バッチ正規化とは?

ここまで来ればもう理解していただけると思いますが、バッチ正規化とは学習に用いるバッチデータの間で正規化を行なうことです。

例えば、全てのデータの数が10000個で、それを100個ずつのバッチデータに分割したとします。その場合には、1度の学習で100個のデータを用いることになりますが、ニューラルネットワークの各層において、この100個のデータに対して正規化を実行します。

バッチ正規化の中身は以上なのですが、なぜバッチ正規化を行なうのでしょうか?

例えば、身長(cm)と体重(kg)のデータからその人の健康レベルを予測したいします。この時、身長と体重の組み合わせデータをニューラルネットワークに通して、まずは学習を行ないます。

ただ、それぞれの指標の値のスケールを見ると、身長は150cm、160cm、170cmのように3桁の数値が多いでしょう。一方、体重は50kg、60kg、70kgのように2桁の数値が多いでしょう。つまり、両者には数値のスケールに明らかな差異があります。

この場合にこれらの値をそのまま用いると、全体的に数値の大きな身長のデータが予測結果に影響を与えやすくなることがあります。

これはデータ間の大きさの差異が問題なので、用いるデータの大きさをバッチ正規化によって調整してやれば解決することができます。そうすれば、身長・体重共に平均0、分散1のデータになるので、どちらか一方のデータに不当に引っ張られることはありません。機械学習ではデータの大小が変わっても、データの特徴が変わらなければ問題ないので、正規化のように異なるデータ間のスケールを揃えるだけなら結果に影響を与えません。

バッチ正規化のもう1つの目的は内部共変量シフトの解消です。

ニューラルネットワークは学習が進むにつれて各層のパラメータが変化します。パラメータは各層の出力値を計算するのに使われますから、パラメータが変わると層の出力値も変化します。このような変化を内部共変量シフトと言います。

そして、ある層の出力は次の層への入力となります。次の層からすると、入力値が毎回変化するので、それに最適化するようにパラメータを学習しなければなりません。つまり、前の層の出力値の変化に次の層のパラメータが振り回されることになり、結果として学習を終えるのに時間がかかります。

ここでバッチ正規化を活用します。バッチ正規化を用いれば、数値を常に一定の範囲に保つことができるため、上記のように前の層からの出力値に振り回されて、パラメータ最適化の効率が下がる現象を防止することができます。

これがバッチ正規化のメリットです。

バッチ正規化の説明は以上となりますが、より詳しく学んでみたいという方はAIの基礎からAI搭載WEBアプリ開発まで学べるキカガク長期コースも活用してみてください!

ABOUT ME
keikesu
電気機メーカーのエンジニア、オフィス・工場向けIOTシステムエンジニアを経て、現在は大手のコンサルティングファームに在籍し、様々な組織のDXを支援するITコンサルタントをしています。 JDLA G検定・E資格を取得しているので、このブログではディープラーニング(主に資格試験関連)の基礎的な内容を投稿しています。