Path: blob/master/site/ja/guide/basic_training_loops.ipynb
25115 views
Copyright 2020 The TensorFlow Authors.
基本的なトレーニングループ
以前のガイドでは、テンソル、変数、勾配テープ、モジュールについて学習しました。このガイドでは、これらをすべて組み合わせてモデルをトレーニングします。
TensorFlow には、tf.Keras API という、抽象化によってボイラープレートを削減する高度なニューラルネットワーク API も含まれていますが、このガイドでは基本的なクラスを使用します。
セットアップ
機械学習問題を解決する
機械学習問題を解決する場合、一般的には次の手順を実行します。
トレーニングデータを取得する。
モデルを定義する。
損失関数を定義する。
トレーニングデータを読み込み、理想値から損失を計算する。
その損失の勾配を計算し、オプティマイザを使用してデータに適合するように変数を調整します。
結果を評価する。
説明のため、このガイドでは (重み)と (バイアス)の 2 つの変数を持つ単純な線形モデルである を開発します。
これは最も基本的な機械学習問題です。 と が与えられている前提で 単純線形回帰を使用して直線の傾きとオフセットを求めてみます。
データ
教師あり学習では、入力(通常は x と表記)と出力(y と表記され、ラベルと呼ばれることが多い)を使用します。目標は、入力と出力のペアから学習し、入力から出力の値を予測できるようにすることです。
TensorFlow での各データ入力はほぼ必ずテンソルで表現され、多くの場合はベクトルです。教師ありトレーニングの場合は出力(または予測したい値)もテンソルになります。
以下は、直線上の点にガウス(正規)ノイズを付加することによって合成されたデータです。
テンソルは一般的にバッチか、入力と出力のグループにまとめられます。バッチにはいくつかのトレーニング上のメリットがあり、アクセラレーターやベクトル化計算でうまく機能します。このデータセットの小ささを考慮すると、データセット全体を単一のバッチとして扱うことができます。
モデルを定義する
モデル内のすべての重みを表現するには tf.Variable
を使用します。tf.Variable
は値を格納し、必要に応じてこれをテンソル形式で提供します。詳細については、変数ガイドを参照してください。
変数と計算のカプセル化には tf.Module
を使用します。任意の Python オブジェクトを使用することもできますが、この方法ではより簡単に保存できます。
ここでは w と b の両方を変数として定義しています。
ここでは初期変数が固定されていますが、Keras には他の Keras の有無にかかわらず使用できる多くの初期化子があります。
損失関数を定義する
損失関数は、特定の入力に対するモデルの出力と目標出力との一致度を評価します。目標は、トレーニング中のこの差を最小限に抑えることです。 「平均二乗」誤差としても知られる標準 L2 損失を定義します。
モデルをトレーニングする前に、モデルの予測を赤でプロットし、トレーニングデータを青でプロットすることにより、損失の値を視覚化できます。
トレーニングループを定義する
トレーニングループは、次の 3 つを順番に繰り返し実行するタスクで構成されます。
モデル経由で入力のバッチを送信して出力を生成する
出力を出力(またはラベル)と比較して損失を計算する
勾配テープを使用して勾配を検出する
これらの勾配を使用して変数を最適化する
この例では、最急降下法を使用してモデルをトレーニングできます。
tf.keras.optimizers
でキャプチャされる勾配降下法のスキームには多くのバリエーションがありますが、ここでは基本原理から構築するという姿勢で自動微分を行う tf.GradientTape
と値を減少させる tf.assign_sub
(tf.assign
と tf.sub
の組み合わせ)を使用して基本的な計算を自分で実装してみましょう。
トレーニングを観察するため、トレーニングループを介して x と y の同じバッチを送信し、W
と b
がどのように変化するかを見ることができます。
Do the training。
経時的な重みの変化をプロットします。
トレーニングされたモデルのパフォーマンスを視覚化します。
Keras を使用した場合の同じ方法
上記のコードを Keras で書いたコードと対比すると参考になります。
tf.keras.Model
をサブクラス化すると、モデルの定義はまったく同じように見えます。Keras モデルは最終的にモジュールから継承するということを覚えておいてください。
モデルを作成するたびに新しいトレーニングループを作成する代わりに、Keras の組み込み機能をショートカットとして使用できます。これは、Python トレーニングループを作成またはデバッグしたくない場合に便利です。
その場合は model.compile()
を使用してパラメーターを設定し、model.fit()
でトレーニングする必要があります。L2 損失と最急降下法の Keras 実装を再びショートカットとして使用するとコード量を少なくすることができます。Keras の損失とオプティマイザーはこれらの便利な関数の外でも使用できます。また、前の例ではこれらを使用できた可能性があります。
Keras fit
は、バッチ処理されたデータまたは完全なデータセットを NumPy 配列として想定しています。NumPy 配列はバッチに分割され、デフォルトでバッチサイズは 32 になります。
この場合は手書きループの動作に一致させるため、x
をサイズ 1000 の単一バッチとして渡す必要があります。
Keras はトレーニング前ではなくトレーニング後に損失を出力するため、最初の損失は低く表示されますが、それ以外の場合は基本的に同じトレーニングパフォーマンスを示します。
次のステップ
このガイドでは、テンソル、変数、モジュール、勾配テープの基本的なクラスを使用してモデルを構築およびトレーニングする方法と、それらの概念を Keras にマッピングする方法について説明しました。
ただし、これはごく単純な問題です。より実践的な説明については、カスタムトレーニングのウォークスルーをご覧ください。
組み込みの Keras トレーニングループを使用する方法の詳細は、こちらのガイドを参照してください。トレーニングループと Keras の詳細は、こちらのガイドを参照してください。独自の分散トレーニングループを書く方法については、こちらのガイドを参照してください。