Consoleディープラーニングの学習精度向上に影響がある、重み(W)の初期値の与え方と、Optimizerの変更について、今回は書いてみます。2017/12/01追記>以降の説明の画像はVersion1.00のものです。>Version1.10で一部アイコンのデザイン等が変わっています。>ですが、見たらわかる範囲と考えて特に画像の張替えはしていません。Network)を例にして、重み(W)の初期値の与え方と、Optimizerの変更によって、どのくらい学習精度が変わっていくのかを試します。ニューラルネットワークコンソールを起動します。Network)を組みます。これは、前回「使い方5」で組み方を説明したものと同じです。前回保存したものを再利用するか、作る場合はこちらを参考にしてください。表記されている)初期値のチューニングをやってみます。この図の左下の部分に「重み」とある・・この部分ですね。重みの初期値が学習の精度に影響するかを考えてみます。ニューラルネットワークの学習とは、ざっくり言えば重み等のパラメータを調整することです。調整は、学習前の重みで計算した結果と正解を比較して、どのくらい差異があるか(損失率といいます)を求めて、その差異が小さくなる方向に重みの値を更新していくことで行います。調整するといっても、いきなり正解にズバッと変更できるわけはありません。ずらしながら正解に近づけていくという地道な作業が必要です。その出発点になる「重みの初期値」の値によって、調整に非常に時間がかかったりする可能性があるのは、なんとなくイメージできます。重みの初期値ニューラルネットワークコンソールで「重みの初期値」にどういう数値を与えるかを決めるのは、ConvolutionとAffineの各レイヤーにある、「W.Initializer」という設定項目です。初期値の与え方にどのような種類があるかを、ニューラルネットワークコンソールのレイヤーリファレンスから引用します。convolutionの方です。係数をかけて初期化します(デフォルト)Constant:全ての要素を一定値(1.0)で初期化します続いて、Affineの方です。係数をかけて初期化します(デフォルト)Constant:全ての要素を一定値(1.0)で初期化します平均0.0、分散1.0であるガウス乱数とか、数学が苦手な文系人間には、頭がクラクラきそうな言葉がでてきます。この中で、どのネットワーク構成の時に、どの初期値を選ぶのが適切か・・ということを、まともに考えるととても難しいです。ありがたいことに、すでに頭の良い人が考えた「効率的な初期値の規則」があります。我々凡人は、ありがたく使わせていただきましょう。Xavierの初期値まず「Xavierの初期値」と呼ばれるものがあります。Glorot提案」と書かれている種類が「Xavierの初期値」と呼ばれるものです。この「Xavierの初期値」は「Sigmoid」か「Tanh」に適している初期値として知られています。Heの初期値もうひとつ。Heの初期値と呼ばれるものがあります。He提案」と書かれているのが「Heの初期値」になります。上の説明で「Xavierの初期値」は「Sigmoid」と「Tanh」に適していると書きましたが、「Heの初期値」は、「ReLU」に適していると知られてます。重みのデフォルトは、Convolutionの場合は「NormalConvolutionGlorot」で、Affineの場合は「NormalAffineGlorot」・・つまり、どちらも「Xavierの初期値」になってます。後ろに「Sigmoid」か「Tanh」が来るときは、デフォルトでよい。後ろに「ReLu」が来るときは「Heの初期値」に変更したほうが、よりよくなる可能性がある・・と考えればよいですかね。ところが、困ったことがひとつ。Heの初期値を選ぼうとすると「Forward」と「Backward」の二種類があります。どちらが良いのか・・について明確に書いたものがないので、自分で試してみた感じでは「・・Forward」の方が結果が良かったので、一旦、おススメは以下にします。使う時:「NormalConvolutionHeForward」または「NormalAffineHeForward」に変更する。ケースによって「もう一方の方が良かったじゃないか!」という事もあるかもしれませんが、そのへんはご容赦くださいね。UniformとNormalについてちなみに・・ですが、補足です。初期値の名前に「Uniform・・」と「Normal・・」と書かれているものがあります。これは元になる分布の種類を表しています。Uniformは「一様分布」のことで、簡単に言うと「サイコロの目のでる確率みたいに、すべての事象の発生確率が等しい分布」になります。Normalは「ガウス分布」つまり「正規分布」です。こちらはすべての事象の発生確率は同じではなくて、よく見る以下のグラフになるような感じで分布することになります。初期値を変更して試してみるさて、やってみます。Convolutionレイヤーを選択し、左側の設定リストから「W.Initializer」を選んで、表示される選択肢から「NormalConvolutionHeForward」を選びます。Convolutionレイヤーに続くのが、「ReLU」だからですね。同様に、その下のConvolutionレイヤーでも同じように、「W.Initializer」を変更します。その下のAffineについては、後続が「Sigmoid」なので、デフォルトのままでいいです。上書き保存して学習をやってみます。学習結果のグラフはこんな感じです。評価結果は、99.2%になりました。初期値を変更しただけで、0.02%とはいえ、改善の方向に数字がうごきました。実は、99%を超えてからの0.2%の改善は、狙ってやろうとすると結構大変なんですよ。ちなみに、初期値を「NormalConvolutionHeBackward」に、変更すると結果は元の99%のままに戻ります。初期値だけで結果が動くのが確認できます。他にも、色々、初期値を変えてやってみると、面白いと思います。今度はOptimizerをチューニングする次のチューニングポイントは「Optimizer」です。前の方で、学習とは「重み」のパラメータを「正解との差が小さくなる方向に、重みの数値を少しだけ増やすか減らす」ことで調整します。この「増やすか減らす幅」は学習係数で指定するのですけど、その方向や実際の幅を調節するのが「Optimizer」だと、ざっくり理解すればいいと思います。Optimizerのざっくりした種類ひとくちに「Optimizer」と言っても、色々種類があります。その種類によって、正解にたどり着くまでの試行錯誤の効率が違う・・と、考えてもれればいいんじゃないかと思います。単純なのが、SGD(確率的勾配降下法)です。これは単純に一定の値を増やしたり、減らしたりするだけです。シンプルですけど、効率はよいとは言えない場合があります。上へ下へジグザグが大きくなる時があるわけですね。それを改善して、ジグザグが小さくなる方向に幅を調整する「Momentum」。学習の進むにつれて、学習係数を減衰させていく考え方で収束しやすくする考え方の「AdaGrad」。その両方を融合させた「Adam」。工夫してあみだされてきました。他にも色々ありますが、上記の「SGD」「Momentum」「AdaGrad」「Adam」の4つが代表的な「Optimizer」ですから、まあ、この4つを知ってれば、お勉強レベルなら大丈夫なはずです。場合、一番すぐれているのは「Adam」です。ニューラルネットワークコンソールも、デフォルトは「Adam」です。チューニングのためにあえて変更する必要はないのですけど、遊び感覚で、Optimizerを変更して、学習の結果グラフがどう変わって、正解率がどう変わるか?これを見るのは面白いと思って、とりあげてます。Optimizerの変更で影響があるかを試すやってみましょう。変更は、COFIGタブで行います。左側のOptimizerを選択して、プルダウンで変更し、上書き保存するだけです。今回、試しに「AdaGrad」を選んでやってみました。Adamの時に比べて、若干前半部分の凸凹が大きいのがわかりますか。そんな大きな差ではありませんけどね。正解率は98.4%と、0.6%下がりました。意外と微妙なものだということがわかりますね。適切な設定には地道な作業が必要だったりしますこんな感じで「input」のデータにあわせて、最適なレイヤーの組み合わせや階層の深さ、与える初期値、Optimizerの種類など、様々な要素で試行錯誤して、もっともよい結果が得られるパラメータを模索する。いう地道な作業が、ニューラルネットワークのチューニングには必要なのです。このあたりの感覚は、いくら本を読んでも、実際にやってみないとわからないものなんですね。このニューラルネットワークコンソールみたいに気軽に試して、結果をグラフィカルに確認できる環境があるってすごいことです。ありがたいですねえではでは。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さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。