Console今回は過学習(オーバーフィッティング)について書いてみます。2017/12/01追記>以降の説明の画面は、Version1.00を使用しています。>Version1.10でアイコンのデザインなどが一部変更になっています。>しかし、見てわかる程度の変更なので画像の貼替えまではしてません。過学習が何故ダメだと言われるのか過学習は文字とおりにとれば、「勉強しすぎ」です。なんで勉強しすぎがダメなのかというと応用が利かなくなるからです。ディープラーニングの学習の目的は、学習データと完全に一致するものを識別できるようにすることではありません。同じカテゴリに属する学習データから、カテゴリを識別するための「特徴」を抜き出して、それを学習することで、学習データには存在していない「未知のもの」についても、同じカテゴリかどうかを判断できるようにしたいわけです。ところが、「過学習」がおきてしまうと、学習データと同じものがでてきたら100%判別できるのだけれど、「未知のもの」についての判断精度が落ちてしまいます。・・本末転倒ってことになるわけですね。過学習を発生させる理屈だけだとわかりにくいので、やってみます。過学習を発生させられるか・・です。一般的に過学習を発生する主な条件と言われているのは以下のものです。学習データが少ない非常に複雑なネットワークである学習のさせすぎなどなど。今回は、いちばん簡単な「学習データを少なくして、無理やり過学習を発生させる」やり方をとります。少ない学習データを用意する既存のものを加工して、「少ない学習データ」を作ります。エクスプローラで、{ニューラルネットワークコンソールフォルダ}\samples\sample_dataset\MNISTを開きます。ここから「small_mnist_4or9_training.csv」を、適当なフォルダにコピーします。コピーしたファイルの名前を「bad_mnist_4or9_training.csv」にします。(別に他の名前でもいいですよ。後でわかれば)ここで、コピーした「bad_mnist_4or9_training.csv」の方のファイルを開きます。この501行目から下のデータをスパッと消して、上書き保存します。これで、約三分の一に減った、少ない学習データができました。ニューラルネットワークコンソールでの作業ニューラルネットワークコンソールを起動します。DATASETタブまず、さっき作ったCSVファイルを「DATASET」に登録します。開いたファイル選択ダイアログで、さっき作成したデータ件数を減らしたCSVを選択します。EDITタブさて、プロジェクトの一覧に戻ります。Network)を組みます。前回(使い方7)で保存したプロジェクトを開けば、こうなっているはずです。新たに組む場合は、「使い方5」から「使い方7」で説明しているので、そちらを参照してください。arakan-pgm-ai.hatenablog.comarakan-pgm-ai.hatenablog.comarakan-pgm-ai.hatenablog.comこれを名前をつけて保存で、違う名前のプロジェクトとして保存します。新規プロジェクトのDATASETタブ次に、DATASETタブを開きます。Dataset」ボタンを押し、表示された一覧から、さきほど追加した「件数の少ないCSVファイル」を選択します。こんな感じで、NUM_DAT(データ件数)500件のtrainingデータが選択されていればOKです。Sizeを100に変更します。これは、まあ、念のためです。学習の実行さて学習をしてみます。データの多い時とくらべて、Epoch数50以下の収束の仕方が遅いですね。評価すると確かに精度は下がった精度はどうかというと。元データで学習・評価した99.2%から96.2%と、3%下がりました。約3%は大きいですね。学習データと同じものなら100%では、学習したのを同じデータを評価に使ったらどうなるかを確認します。DATASETタブをもう一度開きます。今度はValidationの方も、先程のtraining用と同じCSVファイルに変更してみます。これで上書きして、今度は評価だけを再実行します。正確さが「1」・・つまり、100%ですよね。学習したデータと同じデータに対しては100%の精度で一致する。学習データと異なるデータに対する精度は約3%低下した。これは、学習データに最適化しすぎて、学習データと異なるテスト用データでの認識精度が落ちてしまっているわけです。過学習をわざと発生させるのはできたっぽいです。過学習を抑制する技術をさわりだけ試す今度は、過学習が発生しているときに、それをどうやって解消していくか?です。これを防ぐ一番簡単な方法は、学習データを増やすことだというのはわかってます。適切な学習データをたくさん作ることは大変です。それに、複雑なネットワークを組んだことが原因で「過学習」が起きているケースは、それでは対処できません。するか?これも、すでに頭の良い人達が、過学習を抑制する手法を考えてます。ニューラルネットワークコンソールにも、「過学習」を抑制するために使える技術(レイヤー)がすでに用意されています。過学習を抑制する効果のある技術で有名なものが2種類あります。この2つは異なるアプローチで、過学習を抑制します。アプローチの違いを整理すると。DropOutDropOutは、ランダムに計算対象とするデータを間引いて処理をすることで、同じ学習データでもバリエーションを生み出して、過学習を抑制します。データを間引くわけですから、普通に考えれば、DropOutは、計算の前ですよね。BatchNormalizasionBatchNormalizasionは、計算結果のバラ付きを補正して、きれいな分布に修正することで、過学習の抑制効果をもちます。計算結果のバラつきを補正するわけですから、置き場所は計算の後でしょうね。この2つは、どちらか一方しか使えないわけではありません。複雑なネットワークを見てると、両方とも適用しているだけでなく、やたらとDropOutをはさみまくってるモデルも結構見ます。BatchNormalizasionを試しに使ってみるどのくらい効果があるんでしょうか?やってみます。ニューラルネットワークコンソールを起動して、「過学習の疑いのある」プロジェクトを開きます。上記の例にならって、ConvolutionとAffineの下に、「BatchNormalization」を挿入していきます。間をつないでいる線を事前に消すのを忘れないようにしましょう。同様に、一つ目のMaxPoolingの下に「DropOut」をはさみこみます。配置できたら、Shift+クリックで線をつなぎます。できあがりは、こんな感じです。設定はデフォルトのままにします。ちなみに、DropOutの設定で重要なのは、「P」の項目です。これは0.5・・つまり、半分に間引くよ・・ということです。ここの数字を変更すると、結果が動いたりしますので、興味があったら、適当に変更して試してみるのも面白いとは思います。MaxEpochを増やすのは必須ただ、これだけだとダメで、もう少し設定変更が必要です。CONFIGタブを開いて、Epochを、100から、とりあえず、700くらいにしておく必要があります。使うと、どちらも、学習をなだらかにすすめる方向に働くからです。DropOutを使うと学習の収束に時間がかかるようになります。すると少ないEpoch数だと途中で学習が終わってしまうので、数を増やすわけです。試すなら、学習ボタンを押してから、お風呂にでもゆっくりつかってでてくることをおすすめします(笑)。学習結果はこんな感じです。DropOutやBatchNormalizerを適用していない時の学習曲線の例を下におきますので比較してみてください。上の図の学習曲線がすごくなだらかになっているのがわかると思います。肝心の評価(正確さ)です。98,2%・・、対策前の96.2%から約2%改善しました。学習用データが1500件あった時の99.2%には、ちょっと足りない。まとめ対策をうつことで、学習曲線がなだらかになって、過学習の傾向を抑制する動きになっているのは間違いなさそうです。学習曲線がなだらかになるということは、学習用データ件数と学習単位・時間のトレードオフ関係になってしまうことも、感覚的によくわかりますね。本を読んでるだけでは、この辺のイメージがよくわかりません。それを気楽にやってみることができるニューラルネットワークコンソールは、やはり、素敵です。2017/12/01追記Version1.10でこの部分のアイコンデザインが主に変わってます。見てわかる範囲と思ってます。検索スポンサーリンク最近のアクセスTOP5ブクマ数TOP3IT的なTIPS・ノウハウイベントログから抽出したログオン・オフ時刻を見やすいように整形するEXCELのVBAマクロなど。Google検索は利用するけど、アクティビティを保存させたくない時もある文字コードで悩まされるなんて久しぶり/JIS7(ISO-2022-JP)とJIS8の話もっと見る作業時によく参照する「まとめ」djangoテンプレート内でforループで回す時の整理とデフォルト辞書利用時の注意など。djangoテンプレート内ので条件分岐(IF文)で注意することなどをまとめておくdjangoテンプレート/変数の値の参照の仕方が、Pythonと違う所があるので整理しておく。service」とサーバーレスコンピューティング関係をまとめてみる。PWA・SPA・・など「最近のWEBアプリケーションの種類」をざっくりまとめる。文系的まとめディープラーニング(ニューラルネットワーク)の「学習」の肝は「微分」らしいよ。Consoleもっと見るディープラーニングのデモをやってみるWord2Vecで「単語の足し算・引き算の結果(単語)を取得する」デモをやってみる。API」で入力文の疑わしい部分をAIが指摘するデモを作る。classで事前学習済のVGG16モデルを使った画像識別クラス/tensorflow2.0(tf.keras)ランダムフォレストで回帰してみる/気象情報と電力データその2もっと見るPythonでWebアプリやってみるviews.py(python)からデータを渡して、Chart.jsでRaderチャートを描く/Chart.js+djangoWEBブラウザ上にドラッグ&ドロップした画像ファイルをBase64に変換して表示するWEBブラウザで手描きしたイメージをJPEG・PNG変換後Base64エンコードするもっと見るPythonで自動化やってみるWebアプリケーションで自動的に値を参照、スクロール他Tips/Selenium&pythonWebアプリケーションで自動的に何かをクリックするTips/Selenium&pythonWebアプリケーションへの自動入力・選択のTipsあれこれ/Selenium&pythonもっと見るPythonで数学・グラフィックスやってみるモンティ・ホール問題で、ちょっと暇つぶし。最近、台風が怖すぎる!!!生産性向上しろと言いながら、片方で足をひっぱるなんて・・と呆れてます。/軽減税率のニュースを見てもっと見るBOKU62歳の文系SE”BOKU”です。<arakan_no_boku@yahoo.co.jp>興味の向いたものを、つまみ食い的に勉強してます。自分が消化した内容を、頭の整理と備忘を兼ねてブログに書いてます。IT系・・特に機械学習・プログラムネタが中心ですが、IT以外のネタになる時もあります。(43)スポンサーリンクはてなブログをはじめよう!arakan_no_bokuさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。