ディープラーニングの学習結果が毎回変わる理由:初期値・ミニバッチ・ハードウェア要因の解説

こんにちは。ゆうせいです。

ディープラーニングのプログラムを実行する際、同一のデータと同一のモデル設計を用いているにもかかわらず、実行するたびに異なる計算結果や精度が得られる現象が生じます。規則正しく処理を行う計算機において結果が変動する背景には、アルゴリズム内部の確率的な仕組みや、計算を行うハードウェアの物理的な特性が存在します。

この記事では、ディープラーニングの学習結果にばらつきが生じる主な要因について、初心者の方に向けて順を追って解説します。

ニューラルネットワークにおける学習の基本構造
ディープラーニングの目的は、入力データに対して適切な予測を出力できるように、モデル内部のパラメータである重みを調整することです。重みとは、入力された情報の強弱を調節する調整弁のような役割を果たします。

モデルの学習は、目的関数(損失関数)と呼ばれる指標の値を最小化する作業です。目的関数の値は、モデルの予測と実際の正解データとの間にあるズレの大きさを示します。このズレを小さくするために、勾配降下法と呼ばれる計算手法が使われます。

勾配降下法は、霧に包まれた山道で最も低い谷底を目指す手順に例えられます。足元の地面の傾き(勾配)を手探りで確かめ、地面が低くなっている方向へ一歩ずつ進むことで、標高が最も低い場所を探します。

重みの初期値による開始位置の差異
モデルを作成した直後の段階では、各調整弁である重みに最初の数値を割り当てる必要があります。この数値を重みの初期値と呼びます。

すべての重みを0などの同一の数値に設定すると、入力データに対してすべての計算単位(ニューロン)が全く同じ反応を示し、複雑な特徴の学習が進まなくなります。そのため、初期値には乱数を用いて、わずかに異なる小さなばらつきを与えます。

初期値に乱数を用いる影響は、霧の山道探索において、探索の出発地点を毎回異なる場所に配置することに相当します。山の斜面には無数の窪地(局所的最適解)が存在するため、出発地点が異なると、全体の最も低い地点(大域的最適解)ではなく、近くにある別の窪地に滑り落ちて探索が終了することがあります。この出発位置の違いが、最終的なモデル性能の差につながります。

ミニバッチ学習による移動経路の揺らぎ
学習時にデータを処理する順序も、結果の変動に関与します。すべての学習データを一度にまとめて計算するのではなく、データを小さな塊に分割して計算を行う手法をミニバッチ学習と呼びます。

分割されたデータの塊をミニバッチと呼び、ミニバッチを抽出する際にも無作為な抽出(シャッフル)が行われます。

1回のパラメータ更新に使用される勾配の平均値は、ミニバッチに含まれるデータ数であるバッチサイズmを用いて表されます。

g = \frac{1}{m} \sum_{i=1}^{m} \nabla L_{i}

各データにおける損失関数の傾きを合算し、データ数で割ることで、その段階で進む方向を定めます。

全体データではなく一部のデータのみで勾配を算出するため、進むべき傾斜の向きにはわずかな偏りが生じます。霧の山道で例えると、足元を照らす明かりの向きが歩くたびに少しずつ揺れる状態です。進む方向が小刻みに揺れ動くことで浅い窪地を脱出できる利点がある一方、データの並び順が実行ごとに異なると、谷底へ向かう移動経路そのものが毎回変化します。

ネットワーク構造と入力データの無作為な変化
初期値やミニバッチの抽出順序以外にも、モデルの設計手法やデータの前処理によって確率的な要素が導入されます。

ドロップアウトによる構造の変化
モデルの性能を高める代表的な手法に、ドロップアウトがあります。ドロップアウトは、学習の各段階において、ニューロンの一部を無作為に無効化する仕組みです。

学校の合唱練習において、くじ引きで選ばれた一部の生徒に発声を休んでもらい、残りの生徒だけで歌の練習を行う場面に例えられます。特定の生徒だけに頼らず、生徒全員が均等に合唱の技術を高める効果を狙っています。学習のたびに無作為に選ばれた接続が切断されるため、モデルを通過する情報の経路が毎回変化し、パラメータの更新値に微小な差が生じます。

データ拡張による入力情報の変化
画像認識などの分野では、用意した学習データを加工してデータ量を増やすデータ拡張(データオーグメンテーション)が用いられます。

データ拡張では、元の画像に対して無作為に以下の変更を加えます。

わずかな角度の回転や傾きの付加


左右方向への反転


明度やコントラストの調整


画像の一部の切り取り


写真を見る際に、角度を少し変えたり照明の明るさを変えたりしながら確認する行為に似ています。学習のたびに生成される画像の加工状態が無作為に決定されるため、モデルへ入力されるデータ自体が毎回異なる状態になります。

ハードウェアの並列計算に伴う丸め誤差
プログラムを実行するハードウェアの仕組みも、計算結果の再現性に影響を与えます。ディープラーニングでは、計算処理を速めるためにGPUと呼ばれる装置が使用されます。

GPUは、多数の計算器を同時に動かして大量の計算を並列に処理します。複数の計算担当者が一斉に伝票の計算を行っている場面に相当します。どの計算が先に完了するかは、処理ごとのわずかな速度差によって毎回変化します。

コンピュータが小数を扱う際、浮動小数点数と呼ばれる形式が使われますが、この小数の足し算には、足す順序を変えると末尾の細かな桁の値がわずかに変化するという計算上の特性があります。

実数の数学においては、加算の順序を入れ替えても値は一致します。

(a + b) + c = a + (b + c)

しかし、コンピュータ内部の有限な桁数で計算を行う場合、加算の順序が前後することで微小な計算誤差(丸め誤差)が生じます。並列処理によって計算順序が毎回変動することで微小な誤差が蓄積し、最終的なパラメータの数値に差異が生じます。

確率的要素を取り入れる利点と課題
学習過程に乱数や無作為な処理を組み込むことには、明確な機能的利点と運用上の課題が存在します。

利点
過学習の防止:毎回異なる順序やデータ構成、ネットワーク構造で計算を行うことで、特定のデータ配置に過度に適合してしまう現象(過学習)を防ぎ、未知のデータに対する適応能力を高めます。


計算効率の向上:データセット全体を一度にメモリへ読み込む必要がなく、GPUの並列計算能力を順序の制約なく活用できるため、膨大なデータであっても短時間で処理できます。


停滞状態からの脱出:勾配が平坦になる領域に迷い込んだ場合でも、ミニバッチごとの偏りによってその領域から抜け出しやすくなります。


課題
検証の複雑化:モデルの設計を変更した際、性能の変化が設計の修正による成果なのか、無作為な処理の揺らぎによるものなのかを判断するために、複数回の試行が必要になります。


完全な再現の難しさ:ハードウェアの並列処理に起因する微小な誤差は、プログラム側で乱数の基準値を指定するだけでは完全に制御できない場合があります。


まとめ
ディープラーニングの学習結果が毎回変化する現象は、不具合によるものではなく、重みの初期値、ミニバッチの抽出、ドロップアウト、データ拡張、そしてハードウェアの並列演算処理といった複数の要素が組み合わさった結果です。

この現象を理解し、適切にモデル開発を進めるための学習ステップは以下の通りです。

乱数の発生パターンを決定する乱数シードの設定方法を学び、自身の実行環境で初期値やデータの並び順を固定する手順を確認する。


バッチサイズやドロップアウトの数値を調整し、パラメータの変更が学習の進行速度や正解率の推移に与える影響を観察する。


GPUの計算順序を固定する確定的動作の設定方法を調べ、ハードウェア側の揺らぎを抑制する手法を把握する。


乱数シードを変更しながら複数回の試行を行い、得られた結果の平均値やばらつきの幅をもとにモデルの性能を客観的に評価する手法を習得する。


個々の仕組みが持つ役割を整理することで、学習結果のばらつきを管理しながら、適切なモデル検証を行う準備が整います。

セイ・コンサルティング・グループでは新人エンジニア研修のアシスタント講師を募集しています。

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
海外放浪の末、2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。

学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。