Deep Learningの基礎を殴り書きしてみた
初めまして。2017年度入学の「こ」です。
福岡県で就職したのになぜか東京に飛ばされてます!
メイン機種はsdvx、iidx(SP)です。他には、太鼓の達人、jubeat、スマホ版だとcytus、OverRapid、Dynamixなどです。インペⅡ皆伝です。
過去にはカービィの話をしてきたんですけど、ゲーム攻略について書けることもなく、グッズに関しては引っ越しの時にビニール袋に詰めまくったので、紹介もできないです...
なので、今回はDeep Learningを手軽に学べる、「A Neural Network Playground」で遊んでいきましょう。
※Deep Learningに関する説明は他サイトに任せることにしましたので、細かい内容に興味を持った方は自分で調べてみてね
主旨としては、大学時代の専攻が機械学習だったのでそれについて書いちゃえっていうことと、今度この内容に関して会社の勉強会で話すのでその練習です(8割これ)。
(社会の闇)
というのは半分冗談で、復習も兼ねてまとめてみようってところです。みなさんも遊んでみて、大学時代の専攻は機械学習にしようね。
Deep Learningに関してですけど、みなさん知ってますよね、ということで本題に入っていきましょう。
機械学習は特徴量選択を人の手で行います。Deep Learningは特徴量選択までおこなってくれるものです。ただし内部でどのような処理をしているかがわからないといった欠点があります(どうしてその特徴量が選ばれたか説明できない)。
まず、このサイトの遊び方に関して、
① データを準備します
② 問題種別を選択します
③ 前処理を行います
④ 入力層の値、出力層の層の数とニューロンの数を選びます
手法の選択(活性化関数、正則化手法)をします
⑤ 学習方法を選びます
⑥ 適当に学習させます
⑦ 損失が表示されるので、低くなることを祈ります
⑧ よくわかりませんけど、自動でテストします
1つずつみていきます。
① データを準備します
「座標点」しかないので、素直に選択してください。
Deep Learningでは基本的にデータは点で与えられるので、問題ないです。
例えば、分類問題で画像ラベルが「犬」の場合でも、ベクトル化するためデータは数値化されます。
② 問題種別を選択します
「回帰」か「分類」を選択します。
回帰:連続値を使い、ある数値から別の数値を予測すること
分類:離散的な入力値を、事前に定義された複数のクラスに分類すること
https://ainow.ai/2022/02/11/263089/
③ 前処理を行います
データを何%を訓練に用いるのか、ノイズをどれくらい入れるか決めます。
ノイズを入れることで綺麗なデータではなくなります。分離境界を引くのが難しくなります。
④ 入力層の値、出力層の層の数とニューロンの数を選びます
手法の選択(活性化関数、正則化手法)をします。
活性化関数(隠れ層、出力層)を選択します。
目的としては、非線形関数を挟むことにより分離曲線を引くため(線形関数ではない)です。
非線形関数を用いることで複雑なデータにも対応できるようになります。
https://atmarkit.itmedia.co.jp/ait/articles/2003/26/news012.html
⑤ 学習方法を選びます
損失関数、最適化アルゴリズムの選択(バッチサイズ)、学習率を選択します
損失関数は、回帰だと平均二乗誤差か絶対二乗誤差、分類だと交差エントロピーを使います。
まず、損失関数とは、機械学習モデルが算出した予測値と、実際の正解値のズレを計算するための関数です。ズレなので、小さければ小さいほど良いです。どういった関数を使うかは回帰と分類で大体決まっています。
最適化アルゴリズムは、損失関数を最小にするために用いられる手法です。Deep Learningだと1000万次元とかそれくらいの関数になるので、微分して...と計算していたら一生計算が終わりません。そこで、全体を見るのではなく、パラメータごとに最適に(損失関数を最小にする)値を更新するといったことをします。
SGDとかRMSPropとかAdamとか選べます。この辺りを詳しく知りたい方は以下のサイトを参考にするとよいかもしれません。
学習率はパラメータの更新値を調整します。値が大きすぎればいいということでもなく、小さければいいということでもありません。局所解問題やPathological Curvature問題があります。
こういった、人の手で最適な値を決めないといけないような変数をハイパーパラメータと言います。ハイパーパラメータを最適にする手法としてはグリッドサーチなどがありますが、ここでは省略します。
損失関数:https://rightcode.co.jp/blog/information-technology/loss-function-neural-network-learning-theory
最適化アルゴリズム:https://qiita.com/omiita/items/1735c1d048fe5f611f80
⑥ 適当に学習させます
再生ボタンを押してね(エポック数)
学習が進みます。エポック数は学習回数みたいなものです。
エポック数やバッチサイズの解説は、以下のサイトに委ねます。
https://arakan-pgm-ai.hatenablog.com/entry/2017/09/03/080000
⑦ 損失が表示されるので、低くなることを祈ります
TrainLossとValidationLossが表示されます。
まず、データには大きく2つ(厳密には3つ)あります。
学習データ:モデルの学習のために使います。パラメータの更新とか
テストデータ:モデルの精度検証のために使います。
2つに分けている理由は、学習データとして使ったデータを用いてテストしたら、暗記みたいなことになって精度はあがっちゃうよねということです。
それがなんで問題かというと、上の場合だとテストして精度も保証されています!といっても運用時にポンコツ性能を発揮してしまわないようにするためです。
損失については、training lossとtest loss(validation loss)がありまして
training loss:学習データに対しての損失
test loss:テストデータに対しての損失
があります。training loss < test loss の時を過学習と言います。機械学習でかなり厄介な問題です。
⑧ よくわかりませんけど、自動でテストします
1つの点を生成して、テストします。
運用時の精度検証だと思います。
ここまでがちょっとしたDeep Learningの解説ですね。
ここからは少し動かしてみて、先ほどの内容を復習しましょう。
以下の①〜③について考えてみます。
①学習率をいじってみる
②活性化関数をいじってみる
③正則化項をいじってみる
①学習率をいじってみる
学習率=1, 0.01 の2パターンで動かしてみました。
エポック数の差はあれど、OUTPUTのところを見ると、学習率=0.01の方が安定していますね。この差はどこからきているのでしょうか。
学習率とは、最適化アルゴリズムでの、パラメータの更新幅に寄与している値のことでした。学習率=1だと、更新幅が大きすぎて最小値の窪みを通り過ぎてしまい、中々安定しないということです。
このように、学習率とは何か、学習率がどのフローに関係しているかが理解できていれば、どうしてこの挙動になったのかがわかります。
②活性化関数をいじってみる
Linear(線形)、ReLU、Tanhの3パターンで学習してみました。
・Linear
・ReLU
・Tanh
・Linear
活性化関数として、線形関数を用いた場合の実行結果になります。
分離曲線を引きたいのですが、線形関数を活性化関数としている場合は分離"直線"しか引くことができません。なので、画像のような分類問題の場合はどんなに学習を進めても精度が上がることはありません。
・ReLU
活性化関数として、ReLU関数を用いた場合の実行結果になります。
まずReLU関数とは、0以下の時は0、0以上の時はxを出力する非線形関数です。非線形関数を挟むことで複雑な分離問題に対応できるようになり、画像のような問題でも対応できるようになりました。
余談ですが、ReLU関数は部分的に見れば線形関数なので、分離曲線は直線をいくつか組み合わせた形になっています。
・Tanh
活性化関数として、Tanh関数を用いた場合の実行結果になります。
Linear関数の時に発生していた問題を解消できました。モデル側で用いられる活性化関数として一般的なものがTanhと、先ほど説明したReLU関数になります。
せっかくなのでSigmoid関数についても見ていきます。
・Sigmoid
hidden layersの層の数を変えてみました。こうすると学習が全く進まない状態になります。
これはSigmoid関数を使用したときに起こる勾配消失問題になります。
最適化アルゴリズムで最適なパラメータを計算するために勾配を用いており、Sigmoid関数の微分した関数は最大値が0.25ということに注意します。微分値を計算するためにBack Propagation(誤差逆伝播法)を使用しますが、Sigmoid関数の勾配がいくつも重なり、層の数が増えれば増えるほど小さくなり、学習が進まなくなります。
層の数を先ほどの別の活性化関数の時と同様にすると学習が進むようになります。
③正則化項をいじってみる
正則化項としてL1、L2が選べます。L1正則化はlassoとも呼ばれ、正則化と同時に次元削減もおこなってくれる正則化になります。ただ、再現ができていないのでここでは割愛します...
・正則化パラメータ=0.01
・正則化パラメータ=0.1
過学習の抑制のために用いるのが正則化なのですが、こちらも再現できず...
以下では正則化パラメータを大きくしすぎるとよくないよ、ということを解説します。
上の画像では正則化パラメータが0.01の時は学習が進んでいるのですが、0.1の時は学習が全く進んでいないことがわかります。
L2正則化における正則化項の役割は、通常の損失関数に加えて正則化項を加えた関数の最小化を考えます。そうすることで、罰則・ペナルティを加えることで、パラメータによる影響を小さくし、過学習を抑制するといったものです。
ここで注意しないといけないのが、罰則を大きくしすぎるとパラメータ全体が潰れてしまい、学習が進まなくなります。
こちらもハイパーパラメータになりますので、人の手で最適な値を入れる必要があります。
実際にモデルを扱う際には、ハイパーパラメータが複数ある場合がほとんどです。その時に適当に動かしては学習して...を繰り返していると時間がかかりすぎて現実的ではありません。
ハイパーパラメータの選択手法として、グリッドサーチ、ランダムサーチなどがあります。今回は解説を省略します。
--------------------------------------------------------------------------------
機械学習の理論を勉強すると、出力結果が良くなかった場合、どうしてその結果になってしまったのか判断ができるようになります。こういった人材は企業では、研究を行う部署(ビジネスにおける新規手法を考案する)、業務側ではモデルの裏側を知っている有識者・レビューを行う有識者のような立ち位置になると思います。
また、機械学習の分野は他の数学分野と比較しても新しい手法が次々と出てきている分野になります。新しい手法・概念が次々に出てくるため、日々情報収集することが大切です。
内容は以上になります。
機械学習エンジニアは世界的に不足してるらしく、論文の内容を読んで新規性を理解して...といった高度なことができるエンジニアはさらに希少らしいです。ということは給料も良いということですね(知らんけど)。
ちなみに今回はモデルの解説をしましたが、ビジネスではデータ準備に一番時間をかけます。
精度評価までにかかる時間(全体)のうち、8割程度はデータ準備に使います。
--------------------------------------------------------------------------------------
もう資格の勉強したくない
福岡の金融系の会社に就職したんですけどね、なぜか今はこういうことやってます