Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ モデルのトレーニング | ニューラルネットワークをゼロから構築
Pythonによるニューラルネットワーク入門

モデルのトレーニング

メニューを表示するにはスワイプしてください

ニューラルネットワークのトレーニングは、反復的なプロセスであり、モデルが重みとバイアスを調整して損失関数を最小化することで徐々に改善される。 このプロセスは勾配に基づく最適化と呼ばれ、体系的なアルゴリズムに従う。

一般的なアルゴリズム

データセットはネットワークに複数回ループで入力され、それぞれの完全な通過をエポックと呼ぶ。各エポックでは、モデルが訓練例の順序に基づくパターンを学習しないように、データがシャッフルされる。シャッフルによってランダム性が導入され、より堅牢なモデルにつながる。

各訓練例ごとに、モデルは順伝播を行い、入力がネットワークを層ごとに通過して出力を生成する。この出力は実際のターゲット値と比較され、損失が計算される。

シャッフルと順伝播

次に、モデルはバックプロパゲーションを適用し、各層の重みとバイアスを更新して損失を減少させます。

このプロセスは複数エポックにわたって繰り返され、ネットワークは徐々にパラメータを洗練させます。トレーニングが進むにつれて、ネットワークはより正確な予測を行うように学習します。ただし、学習率などのハイパーパラメータの慎重な調整が、安定かつ効率的なトレーニングには不可欠です。

エポック

学習率 (α\alpha) は重み更新時のステップサイズを決定します。値が大きすぎると、モデルは最適値を飛び越えて収束しない可能性があります。逆に小さすぎると、トレーニングが遅くなり、最適でない解に陥ることがあります。適切な学習率の選択は、トレーニングの速度安定性のバランスを取る上で重要です。一般的な値は0.001から0.1の範囲で、問題やネットワークの規模によって異なります。

下のグラフは、適切な学習率が損失を最適なペースで着実に減少させる様子を示しています。

異なる学習率

最後に、確率的勾配降下法(SGD)は学習効率において重要な役割を果たす。データセット全体を処理した後に重みを更新するのではなく、SGDは各サンプルごとにパラメータを更新する。この方法により学習が高速化され、更新にわずかな変動が生じるため、モデルが局所的最小値から抜け出し、より良い全体解に到達しやすくなる。

fit() メソッド

fit() クラスの Perceptron メソッドは、確率的勾配降下法を用いてモデルを学習する役割を担う。

def fit(self, training_data, labels, epochs, learning_rate):
    # Iterating over multiple epochs
    for epoch in range(epochs):
        # Shuffling the data  
        indices = np.random.permutation(training_data.shape[0])
        training_data = training_data[indices]
        labels = labels[indices]
        # Iterating through each training example
        for i in range(training_data.shape[0]):
            inputs = training_data[i, :].reshape(-1, 1)
            target = labels[i, :].reshape(-1, 1)

            # Forward propagation
            output = ...

            # Computing the gradient of the loss function w.r.t. output
            da = ...

            # Backward propagation through all layers
            for layer in self.layers[::-1]:
                da = ...
コードの説明
expand arrow
for epoch in range(epochs):

指定されたエポック数だけトレーニング処理を繰り返す。各エポックはデータセット全体を1回通過することを表す。

indices = np.random.permutation(training_data.shape[0])
training_data = training_data[indices]
labels = labels[indices]

各エポックの前にトレーニングデータと対応するラベルをシャッフルする。これにより、モデルがデータの順序に基づくパターンを学習するのを防ぐ。

for i in range(training_data.shape[0]):

各トレーニングサンプルを順に処理する。SGD(確率的勾配降下法)が使用されているため、各サンプルごとに重みが更新される。

inputs = training_data[i, :].reshape(-1, 1)
target = labels[i, :].reshape(-1, 1)

i番目のトレーニングサンプルとそのラベルを抽出する。行列演算が正しく動作するようにn x 1行列にリシェイプする。

output = ...

順伝播を実行し、予測出力を計算する。

da = ...

損失関数の出力活性化に対する勾配を計算する。これは逆伝播の開始点となる勾配。

for layer in self.layers[::-1]:
    da = ...

すべての層を逆順で逆伝播する。各層は勾配降下法を用いて重みとバイアスを更新する。

question mark

トレーニングデータセット全体を1回通過することを何と呼ぶか?

正しい答えを選んでください

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 2.  9

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 2.  9
some-alt