Aidemy 2020/10/1
#はじめに
こんにちは、んがょぺです!バリバリの文系ですが、AIの可能性に興味を持ったのがきっかけで、AI特化型スクール「Aidemy」に通い、勉強しています。ここで得られた知識を皆さんと共有したいと思い、Qiitaでまとめています。以前のまとめ記事も多くの方に読んでいただけてとても嬉しいです。ありがとうございます!
今回は、ディープランニングの2つ目の投稿になります。どうぞよろしくお願いします。
*本記事は「Aidemy」での学習内容を「自分の言葉で」まとめたものになります。表現の間違いや勘違いを含む可能性があります。ご了承ください。
今回学ぶこと
・深層学習のハイパーパラメータについて
#深層学習のハイパーパラメータ
##深層学習のハイパーパラメータの種類
・addのハイパーパラメータ
・ドロップアウトの割合:Dropout(rate=)
・隠れ層のユニット数:Dense()
・活性化関数:Activation()
・compileのハイパーパラメータ
・損失関数:loss
・最適化関数:optimizer
・学習率:optimizers.SGD(lr=)
・fitのハイパーパラメータ
・バッチサイズ:batch_size
・エポック数:epochs
##隠れ層の数と予測精度(ドロップアウト)
・隠れ層の数やユニット数は自由に決めることができるが、数が多すぎると学習が遅くなる、過学習を起こしやすくなる、といったリスクがあるので注意が必要である。
・先述の__Dropout(rate=削除するユニットの割合)__をハイパーパラメータとして指定すると、決められた割合のユニット(ニューロン)を削除しながら学習するようになる。ドロップアウトによって特定のニューロンに依存しない学習を行うので、過学習を防ぎ、モデルの精度を上げられる。
##活性化関数
・活性化関数(Activation)は__全結合層の出力(ニューロンの発火)__のために適用する関数である。活性化関数を指定しないとデータを直線で分離できなくなり、データを分類できない。
・逆に、活性化関数を指定すれば線形分離不可能なモデルでも、適切に学習できれば必ず分類できるようになる。
・活性化関数には、入力された値を「0〜1」の範囲で出力する__「シグモイド関数(sigmoid)」や、入力値が0未満なら0を出力し、0以上なら入力値のまま出力する「ReLU関数(relu)」__がある。
##損失関数
・出力データと教師データの差を示す関数を__損失(誤差)関数(loss)という。
・機械学習で使われる損失関数は「(平均)二乗誤差」や「クロスエントロピー誤差」__がある。詳しくは後述。
・(復習)ディープラーニングでは、この損失関数を最小化するように各層の重みを更新する(誤差逆伝播法)。
##平均二乗誤差
・それぞれの出力データと教師データの差を二乗して平均する損失関数。
・平均二乗誤差は連続値の評価に向いているため、主に回帰モデルに適用される。
##クロスエントロピー誤差(categorical_crossentropy)
・正解ラベルの出力が1であることを使って、正解ラベルの教師データと出力データとの誤差を0〜1で表した損失関数。(0に近づくほど誤差が小さい)
・クロスエントロピー誤差は__主に分類モデル(二値分類)に適用される__。
##最適化関数
・先述の通り、損失関数が最小となるように重みを更新して学習していくが、この時、__学習率、エポック数、過去の重みの更新量などをどのように重みの更新に反映するか__を定めるために使用するのが最適化関数(optimizer)である。optimizerに設定するのは、後述の学習率を設定した「optimizers」である。
##学習率
・学習率(lr)とは、各層の重みを__一度にどのくらい変更するか__を決めるハイパーパラメータである。
・学習率が低すぎると更新がほとんど進まず、高すぎると値がばらけて更新に無駄が出たり、場合によっては収束しなかったりするので、適切な値に設定する必要がある。
##バッチサイズ
・バッチサイズとは、モデルに一度に入力するデータの数__である。一度に複数のデータを渡すと、各データの損失と損失関数の勾配の平均値を取って重みを更新するので、偏ったデータの影響が減らせる__他、データごとに並列計算を行うこともできるので、計算時間も短縮できる。
・一方、複数のデータを渡すと大きな重みの更新が行われにくく、一部のデータのみに最適化されてしまう__局所解__を発生させる可能性がある。
・このため、イレギュラーなデータが多い時はバッチサイズを大きくして偏ったデータの影響を減らし、少ない時は局所解を避けるためにバッチサイズを小さくすることが多い。
・バッチサイズを1にする、すなわちデータを1度に1つずつ入力する学習を__オンライン学習、バッチサイズを全データ数にする学習を__バッチ学習(batch_size)、その中間ぐらいに設定することを__ミニバッチ学習__という。
##反復学習(エポック数)
・一般にディープラーニングでは同じトレーニングデータで何回か学習を繰り返して精度を上げる。このときの学習の回数を__エポック数(epochs)__という。学習回数が多くてもある程度以降は精度が伸びなくなるが、必要以上に学習させると過学習を引き起こしてしまうため、エポック数も適切な値に設定する必要がある。
#まとめ
・深層学習のハイパーパラメータには、addに設定するものとして、ドロップアウトの割合を示す__Dropout(rate=)、隠れ層のユニット数を示す__Dense()、活性化関数を示す__Activation()・がある。
・ドロップアウトや隠れ層のユニット数は過学習の発生に関わり、活性化関数は設定しなければデータの分類そのものができなくなるので、適切な値を設定する必要がある。
・compileに設定するものとして、損失関数を示す__loss、最適化関数を示す__optimizer__がある。
・損失関数は、分類モデルでは__「クロスエントロピー誤差(categorical_crossentropy)」__を使う。最適化関数は重みの更新の仕方に関わり、学習率を示す__optimizers.SGD(lr=)を設定する。
・学習率とは、一度に変える重みの大きさであり、これも適切に設定しないと、学習に無駄が生じたり、進行が遅くなったりする。
・fitに設定するものとして、バッチサイズを示す__batch_size、エポック数を示す__epochs__がある。バッチサイズはモデルに一度に入力するデータ数を表し、エポック数は学習の回数を表す。これらの値はモデルによって適切な度合いが異なる。
今回は以上です。最後まで読んでいただき、ありがとうございました。