【tensorflow】Adamの使い方が分かる【Kaggle Course – Intro to Deep Learning 3】Stochastic Gradient Descent

Kaggle

アメリカのデータ分析コンペKaggleでは、世界中の優秀なデータサイエンティストによって作成された様々なeラーニング教材が無料で公開されています。

中でも、この記事では以下の講座について解説します。

Intro to Deep Learning
3.Stochastic Gradient Descent

全編英語ですし、ところどころ説明を省略しているところもあるので、私なりにかみ砕いて解説していきます。

この記事で取り扱うライブラリ、モジュール、クラスは以下の通りです。

Method
tf.keras.Model.compile

Stochastic Gradient Descent(確率的勾配降下法)

Introduction(イントロダクション)

前回までの講座では、ニューラルネットワークのモデルを構築する方法を学びました。

今回は、構築したモデルに訓練データを学習させ、ネットワークのパラメータを最適化する方法を学びます。

この学習によって、初めて未知のデータを予測可能なモデルができあがります。

モデルの構築 前回まで
モデルの学習 ←イマココ
モデルの評価
予測

とはいえ、モデルの学習といっても、具体的にどうすればいいのでしょうか?

ニューラルネットワークの学習を進めるには、3つのものを用意する必要があります。

  • 訓練データ
  • 損失関数(Loss Function)
  • 最適化アルゴリズム(Optimizer)

訓練データは、他の機械学習と同じように、入力(Features)と出力(Target)からなるデータのことです。

それでは、損失関数と最適化アルゴリズムとはなんでしょうか?

1つずつ、見ていきましょう。

The Loss Function(損失関数)

損失関数とは、ニューラルネットワークで何を解決したいか、その目的を決めるための関数です。

そのため、損失関数は目的関数とも呼ばれます。

実際には、訓練データの正解値ニューラルネットワークによる予測値の平均絶対誤差(MAE)などが使われます。

MAEを最小化することで、予測の誤差をなるべく小さくしようとします。

View post on imgur.com

平均絶対誤差(MAE)とは、「学習によって算出した曲線」と「各データ」との距離の平均のことです。

The Optimizer – Stochastic Gradient Descent(最適化アルゴリズムー確率的勾配降下法)

損失関数では、ネットワークの目的を定義しました。

次に、最適化アルゴリズム(Optimizer)で、その目的をどのように解決するかを定義します

実際にディープラーニングで使われる代表的な最適化アルゴリズムは、確率的勾配降下法と呼ばれるもので、次のような手順を踏みます。

  1. 訓練データからデータをサンプリングし、ネットワークから予測を行う
  2. 得られた予測値と訓練データの正解値から、損失関数で損失を計算する
  3. 損失が小さくなるようにネットワークの重みを調整する
  4. 損失がこれ以上小さくならないようになるまで、1~3を繰り返す

1でデータのサンプリングをするところが、確率的勾配降下法と呼ばれる理由です。サンプリングせずにすべてのデータを使用する場合は、(バッチ)勾配降下法と呼ばれます。

下の動画は、ネットワークによる学習の軌跡です。

 

  • 左の図の点滅する赤い点は、サンプリングしたデータ(ミニバッチ)です。また、動いている直線は、学習がすすむにつれて、訓練データに適合していく様子です。
  • 真ん中の図は、損失の値が徐々に小さくなっていく様子を示しています。
  • 右の図は、ニューラルネットワークの重みが最適化されていく様子です。

Learning Rate and Batch Size(学習率とバッチサイズ)

先ほどの動画では、1つのフレームが1回の学習を表していました。

1つのフレームでは、ほんの少しづつ学習が進んでいるのが分かると思いますが、この学習の程度を決めるのが「学習率」です

学習率を上げると、一つのフレームで大きく学習が進みますが、学習が収束しないなどのデメリットもあるので、注意が必要です。

Adding the Loss and Optimizer(損失関数と最適化アルゴリズムの適用)

損失関数maeと最適化アルゴリズムadamは、以下のようにcompileメソッドで指定します。

model.compile(
    optimizer="adam",
    loss="mae",
)

Example – Red Wine Quality(例題 ー 赤ワインの品質評価)

それでは、ここまで学んできたことを、赤ワインの品質評価のデータセットを使って試してみましょう。

このデータセットには、約1,600種類のポルトガル産赤ワインの化学的データと、ブラインド・テイスト・テストによるワインの品質評価の結果が格納されています。化学的なデータから、どの程度ワインの品質が推測できるか、試してみることにします。

赤ワインの品質評価(Red Wine Quality)のデータセット

まずは、モデルの定義です。

各層のニューロンの数は512を、活性化関数activationにはreluを指定します。

また、このデータセットには11個の特徴量があるため、input_shapeには11を指定しました。

from tensorflow import keras
from tensorflow.keras import layers

model = keras.Sequential([
    layers.Dense(512, activation='relu', input_shape=[11]),
    layers.Dense(512, activation='relu'),
    layers.Dense(512, activation='relu'),
    layers.Dense(1),
])

モデルを定義した後は、最適化アルゴリズムadamと損失関数maeを設定します。

model.compile(
    optimizer='adam',
    loss='mae',
)

最後に、最適化アルゴリズムadamには一度に256行の学習データを与え(batch_size)、それを10回繰り返すように指定(epochs)して、学習の開始です。

history = model.fit(
    X_train, y_train,
    validation_data=(X_valid, y_valid),
    batch_size=256,
    epochs=10,
)
Epoch 1/10
5/5 [==============================] - 1s 147ms/step - loss: 0.3181 - val_loss: 0.1427
Epoch 2/10
5/5 [==============================] - 0s 24ms/step - loss: 0.1440 - val_loss: 0.1279
Epoch 3/10
5/5 [==============================] - 0s 24ms/step - loss: 0.1309 - val_loss: 0.1194
Epoch 4/10
5/5 [==============================] - 0s 24ms/step - loss: 0.1169 - val_loss: 0.1085
Epoch 5/10
5/5 [==============================] - 0s 24ms/step - loss: 0.1108 - val_loss: 0.1086
Epoch 6/10
5/5 [==============================] - 0s 25ms/step - loss: 0.1051 - val_loss: 0.1007
Epoch 7/10
5/5 [==============================] - 0s 25ms/step - loss: 0.1048 - val_loss: 0.1015
Epoch 8/10
5/5 [==============================] - 0s 24ms/step - loss: 0.1001 - val_loss: 0.1020
Epoch 9/10
5/5 [==============================] - 0s 25ms/step - loss: 0.1002 - val_loss: 0.1009
Epoch 10/10
5/5 [==============================] - 0s 24ms/step - loss: 0.0988 - val_loss: 0.1074

モデルの学習が進む(10回)につれて、損失lossの値が小さくなっていくのが分かると思います。

もう少し見やすくするため、結果をグラフにプロットしてみましょう。

fitメソッドは学習の記録をhistoryオブジェクトに保存してくれるため、このデータをデータフレームに変換することで、グラフにプロットすることができます。

import pandas as pd

# convert the training history to a dataframe
history_df = pd.DataFrame(history.history)
# use Pandas native plot method
history_df['loss'].plot();

損失の減少が見やすくなりました。

Your Turn(練習問題)

Kaggle Courseでは、学んできたことを実践するための練習問題が用意されています。読んだり見たりするだけでなく、実際に手を動かすことは大切ですので、ぜひチャレンジしてみて下さい。

今回はKaggle Courseで確率的勾配降下法について学びました。次回はオーバーフィット、アンダーフィットについて学んでいきます。

以上、最後までお読みいただきありがとうございました。

コメント

タイトルとURLをコピーしました