PyTorchで画像分類(その3)

前回はディープラーニングの魂であるモデルの作成をしましたが、今回はモデル以外に学習で必要な損失関数と最適化アルゴリズムを作成します。

題材は前回までと同じkaggleの犬/猫の画像分類コンペを使います。

損失関数の定義

そもそも損失関数は何かと言うと、ディープラーニングに限らず機械学習全般で登場するもので、モデルの出力値と正解の値との間の解離がどの程度か表すものです。機械学習の学習では、これを極力0に近づけるようにします。

損失関数には色々な種類が存在していますが、ここでは主要な2つを紹介します。

二乗和誤差(Sum of Squared Error)

$$E = \frac{1}{2}\sum_{k} (y_{k} – t_{k})^2$$

$𝑦_𝑘$はモデルの出力値、$𝑡_𝑘$は正解の値を表します。特徴としては、二乗していることの影響で、モデルの出力値と正解の値の差が大きいほど損失がより大きくなるようになっています。そのため、分類問題ではなく回帰問題で使われることが多いです。

交差エントロピー誤差(Cross Entropy Error)

$$E = -\sum_{k} (t_{k}\,log(y_{k}))$$

先に結論を書いてしまうとこちらは分類問題で使われることが多いです。$𝑦_𝑘$はモデルが出力した$k$番目のラベルである確率、$𝑡_𝑘$は$k$番目が実際に正解であるかどうか(正解なら1、不正解なら0)を表します。特徴としては正解のデータをより正しく(確率が1に近い)判定するほと損失が小さく評価されます。

損失関数の実装

では損失関数を実装します。

今回の題材は分類問題ですので、交差エントロピー誤差を使います。一から損失関数を実装しようとするとそれなりに大変ですが、PyTorchには既に実装されたものが用意されています。

criterion = nn.CrossEntropyLoss()

公式ドキュメントを見ればわかりますが、PyTorchには約20種類の損失関数が予め用意されており、興味がある方はぜひ確認してみると良いかと思います(機会があればこのブログでも紹介します)。

最適化アルゴリズムの定義

ディープラーニングは革新的な技術ですが、詰まるところパラメータ探索であり、いかに損失関数を最小にするようなパラメータを見つけ出すかです。

最初は適当なパラメータから開始しますが、それをいかに最適なパラメータに近付けるか、その時に重要になるのが最適化アルゴリズムです。

こちらも公式ドキュメントを見るとわかりますが、結構な種類が存在しています。最近ではAdamがよく使われているようですが、どんな場面でもAdamがベストというわけではなく、ケースバイケースですので色々なアルゴリズムを試してみるのがいいかと思います。

最適化アルゴリズムの実装

では最適化アルゴリズムを実装します。

損失関数と同様に一から実装することはせず、PyTorchで予め用意されているものを使います。

optimizer = optim.Adam(params=params_to_update, weight_decay=1e-4)

引数にはどのパラメータをどの学習率で最適化するかを渡します。学習率とは学習する度にパラメータを調整(最適化)する度合いです。

学習率が大きいほど最適化のスピードが速くなりますが、最適解に至るまでに無駄な動きが出てしまったり、そもそも発散してしまい最適解にならなくなってしまいます。逆に学習率が小さいほど確実に最適化に近づきますが、スピードが遅くなってしまい、全然最適解になりません。

ですので、学習率をどの値にするかはディープラーニングでの重要なチューニングポイントになります。

次回

ここまでで学習に必要なものは揃ったので、次回は学習します!