DL4US落ちたので、google翻訳でfast.aiをやるしかない①
【スポンサーリンク】
- 簡単なあらすじ
- DL4US落選→"終わりの始まり"
- 最大の不安要素:"英語トラブル"
- 無料GPU環境のgoogle colab上でfast.aiのノートブックを動かす
- まとめブログのgoogle翻訳の解説に従ってLesson1を進めていく
- はじめに[0:00]:
- Jupyter notebookと' Dogs vs Cats 'の紹介 [12:39 ]
- 最初に写真を見る [15:39]
- モデルを鍛えよう [20:21]
- 私たちはコードの3行で17秒で〜99%(2013年にKaggleのコンペに勝ったでしょう)を達成しました![ 21:49 ]
- fast.aiライブラリ [22:24 ]
- 結果の分析 [24:21]
- トップダウン式vsボトムアップ式 [30:52 ]
- コース構成[ 33:53]
- ディープラーニング≠機械学習 [44:26 ]
- より良い方法 [47:35]
- すべてを組み合わせると[ 53:40]
- 畳み込みニューラルネットワーク[59:13]
- 問題を解決するためにこれらのパラメータを設定する方法[01:04:25]
- ビジュアル化と畳み込みネットワークの理解[01:08:27]
- 再び'Dog vs. Cat'に戻って - 学習率の選択[ 01:11:41]
- エポック数の選択[ 1:18:49]
- ヒントと秘訣[ 1:21:40]
- Lesson1を終えて
DL4US落ちました...
スラムダンク より
簡単なあらすじ
- 近年やたら人工知能が流行っているので、新たな可能性を感じ、今年5月頃からprogateやaidemy、udemyでpython等の講座を受講し始めた。
- そんな折、twitter上で東大松尾研が第2回DL4US(ディープラーニングの国産の無料オンライン学習講座)の参加者を募集していた。
- 試しに応募したところ、選抜テストも受けることなく"サイレントお祈り"という結果に...(日本語で無料ということで前回以上に応募者が殺到し、twitter上には大量の落選者が...)
先日募集したディープラーニング教育プログラム DL4US第二期ですが、今回も定員を大幅に超える1900名以上の応募があり、多くの方に受講いただけませんでした。現状のリソースの限界で申し訳ありません。今後受講人数を拡大すべく努めますので、引き続きよろしくお願いします。https://t.co/aHT1DPxbOS
— 松尾 豊 (@ymatsuo) 2018年7月21日
DL4US落選→"終わりの始まり"
這い上がろう。「負けたことがある」というのが いつか、大きな財産になる。
スラムダンク 31巻より
今回の"サイレントお祈り"は、落選者に対し『自分で道を切り開け!』という東大松尾研からの激励ではないか...そう考えた私は、その直感を確かめるべく海外のディープラーニング無料オンライン講座 fast.aiへと向かった...
最大の不安要素:"英語トラブル"
スラムダンク 20巻より
- fast.aiは海外の講座なので、当然のことながら全て英語である。
講座が配信されるyoutubeの機能として、自動文字起こし機能を使った自動翻訳があるが、まだまだ精度が低い。(追記 : ロシア語→日本語訳だと比較的精度が高いとの情報がありました。)
そこで今回は、fast.aiの有名まとめブログ(fast.ai作製者にも認められている)のgoogle翻訳により、講座を消化できるか検討する。
- 必要があれば、fast.aiのフォーラムにあるyoutubeの文字起こしもgoogle翻訳にかける。
- (NEW) 7/11、初心者向けの強力な注釈付きのノートが外人さんから投稿がありました。こちらも随時google翻訳して利用します。
- (NEW) 8/1、まとめノートの日本語訳が投稿されました!google翻訳とは精度の次元が違い、素晴らしい日本語訳。今後もシリーズ化される可能性があり、要チェックです!
無料GPU環境のgoogle colab上でfast.aiのノートブックを動かす
これについては外人さんのブログと外人さんのyoutube動画を参考に。以下は外人さんのブログのgoogle翻訳。
Fast.aiをGoogle Colabで数分で使用する方法
- Google Colabに申し込み、アクセスをリクエストしてください。
- Clouderizerにサインアップしてください。デフォルトでは、個人ユーザー無料プランになります。
- Clouderizerコンソールにログインし、コミュニティプロジェクトに行きます。fast.aiテンプレートを検索し、それを複製します。
- プロジェクトウィザードの2番目のタブ(マシン設定)では、デフォルトでマシンタイプとしてAWS GPUスポットインスタンスが選択されています。ローカルマシンを代わりに選択してください。残りのすべての画面で、デフォルトオプションを選択して保存します。
Google ColabのGPU環境でfast.aiノートブックを起動するたびに、以下の3つの手順を行ってください
① google colabで新しい空のPython 3ノートブックを作成します。 [編集] - > [ノートブック設定]に移動し、[ハードウェアアクセラレータ]をGPUとして選択します。
ここですね。
②Clouderizerコンソールから、先に作成したfast.aiプロジェクトのStartを押します。これにより、任意の端末でプロジェクトを開始するためのスクリプトスニペットが表示されます。Linuxのスニペット(コード)をコピーします。
③コラボノートに戻って、新しいコードブロックを追加し、そこにスニペットを貼り付けてください(先頭に!をつけています)、ブロックを実行してください。
言われるがままにコードをコピーしてgoogle colabに貼り付け、!を先頭につけ加えてから実行します。
5分ほどで終了します。
Clouderizerに戻りページを再読み込みすると、jupyterボタンが選択できるようになっており、クリックするとjupyter labが開きます。
courses > dl1 > lesson1.ipynb の順にクリックしていくと、Lesson1のノートブックが開きます。ノート上部の▶ボタンかshift+enterを押していくと、上から順にセルが実行されます。
(追記)
外人さんの注釈付きブログによれば、_12時間_のセッションがタイムアウトした場合、最初からコードを再実行しないといけないとのこと。以下はgoogle翻訳。
Google Colab
まとめブログのgoogle翻訳の解説に従ってLesson1を進めていく
環境が整ったので、早速Lesson1を始めていきます。
はじめに[0:00]:
12分ぐらいまでは環境構築の話なので省略。
Jupyter notebookと' Dogs vs Cats 'の紹介 [12:39 ]
- セルを選択し、shift + enterキーを押すことでセルを実行することができます(シフトを押し続けて複数回Enterキーを押すと、セルを下り続けることができます)。または、上の▶[実行]ボタンをクリックします。セルには、コード、テキスト、画像、ビデオなどを含めることができます。
- Fast.aiにはPython 3が必要です。
Jupyter notebookの使い方説明。とりあえず上からポチポチ実行していきます。
拡張機能をリロードする
%reload_ext autoreload
- 使用しているモジュールが更新されるたびに、Jupyter IPythonの環境では、設定方法に応じてJupyterの環境を再ロードすることができます(次の設定や詳細を参照)
オートリロード構成
%autoreload 2
前述のリロード拡張機能と組み合わせて、この設定はモジュールのリロード方法を示します。これは3つの方法で設定できます。 - 0 - 自動リロードを無効にします。 - 1 - hte pythonコードが実行される前に、毎回%importでインポートされたすべてのモジュールをリロードします。 - 2 - タイプされたPythonコードを実行する前に、すべてのモジュール(%importで除外されたモジュールを除く)をリロードします。
MATPLOTLIBインライン
%matplotlib inline
- このオプションはJupyterノートブックの中で、それを生成したコード・セルの直下にプロット・コマンドをインラインで出力します。得られたプロットはノートブック文書にも保存されます。
- 詳細については、ここでドキュメントを読むことができます。
まずは環境設定の"おまじない"ですね。
続いてfast.aiライブラリのインポート。fast.aiライブラリについては後で説明が出てきます。
PATH : 使いたいデータにパスを通します sz : 早く処理するため、画像をリサイズする大きさを設定
処理のためサイズ変更を行っていると。今回使用するresnetは224×224のサイズの画像を扱うためsz=224で処理すると。ここらへんは後のレッスンで解説してくれるようです。
最初に写真を見る [15:39]
ここではdogscatsデータセットの構造を見ていると。
(追記)
外人さんの注釈付きブログにデータセットの構造が書いてありました。以下、google翻訳。
dogscatsデータセットは、 23000枚の訓練用画像(猫と犬は50:50の比率で)と2000枚の検証画像(同じく50:50)で構成されています。 以下は、データセットのフォルダ構造の写真です。 - "train"、 "valid"、 "test1"フォルダには訓練用、検証用、テスト用の各画像が含まれています。 - 訓練用フォルダと検証用フォルダには、訓練/分類したいラベルごとにサブフォルダがあり、それぞれにラベルに従って分類する必要がある画像が含まれています。 - 重要なことは、多くのデータセットがこのように構成されていることです。
- なぜデータはこのように分割されるのか?
- 私がディープラーニングを始めたとき、その3つの(サブ)データセットの違いがどういうものなのかが分かりませんでした。
ニューラルネットワークを訓練するときは、通常、そのニューラルネットワークの複数のパラメータ設定を試して、どの設定が最適かを確認します。これを行うには、訓練セットと検証セットが必要です。
訓練セット:ニューラルネットワークの特定の構成を訓練するために使用されるデータ。
- 検証セット:ニューラルネットワークのさまざまな構成を検証するために使用されるデータ。
より良いニューラルネットワークを見つけ、訓練したら、テストセットを使用します。
- テストセット:ニューラルネットワーク全体のパフォーマンスを評価するために使用されるデータ。 テストセットからの情報がニューラルネットワークの訓練/検証に使用されないことは重要です。
fast.aiサイトの良いブログ記事があります。ここのトピックで少し詳しく勉強したり、fast.ai 機械学習コースをご覧ください。
もう1つ興味深いフォルダは、保存するモデルのバージョンを保存する "model"フォルダです。これらの保存されたモデルは、ソリューションを本番環境に展開するために使用されます。
フォルダを訓練セットと検証セットに分けていると。ここがいまいちわからない人は、機械学習のコースを見るといいよ、とありがたいアドバイスがあります。
- このフォルダ構造は、画像分類データセットがどのように共有され提供されるかの最も一般的なアプローチです。各フォルダには、ラベル(たとえば、'dogs'または'cats')が表示されます。
ここでは検証セット(valid)の中身が'cats'と'dogs'の2種類でラベル付けされているのを確認し、試しに'cats'の上から5枚のファイル名を表示させていると。
まずは'cats'の[0]番目の生データの構造を例として確認。
- f '{PATH} valid / cats / {files [0]}' - これはPython 3.6形式の文字列で、文字列の書式設定に便利です。
画像の形状は_(高さ、幅、色チャネル)_で表記され、今回の例では(374 , 500 , 3)となっていると。下は画像の上から4×4ピクセルのスライスを表示。
以下は外人さんのまとめノートより。
画像データの構造の説明。8bitなので2の8乗で_0~255までの256通り_。2013年の最高正解率は80%だったと。
モデルを鍛えよう [20:21]
モデルを訓練するのに必要なコードは次の4行です:
4行のコードを実行すると、なんと99%の正解率!...えええ...
デスノート より
...なんだか凄いのはわかりますが、一体何が起こっているのか...
外人さんのまとめノートより、結果の見方のメモ。左からエポック数、訓練セットの損失値、検証セットの損失値、正解率の順に表示されると。
- 今回は、3つのエポックで行います。つまり、画像セット全体を3回見ることになります。
- 出力の最後の3つ目の数字は、正解率です。
- 最初の2つは、訓練セットと検証セットの損失関数(この場合はクロスエントロピー損失)の値です。
- 開始(例えば0.、1.)はエポック番号です。
私たちはコードの3行で17秒で〜99%(2013年にKaggleのコンペに勝ったでしょう)を達成しました![ 21:49 ]
- 多くの人々は、ディープラーニングには膨大な時間とリソースと多くのデータが必要であると想定しています。これは一般的に真実ではありません。
(追記)
外人さんの注釈付きブログにresnetなどの_アーキテクチャ_についての説明がありました。以下、google翻訳。
アーキテクチャ
ニューラルネットワークは様々な形状と大きさであり、どのように構造化されているかによってその結果は変化する傾向があります。幸いにも、構築したいすべてのソリューションのためにホイールを再開発する必要はありません。そこには、非常に成功していると証明されているいくつかのアーキテクチャがあります。したがって、それらを私たちの分類器に再利用することができます。fast.ai ライブラリを使用すれば、自分でニューラルネットワークを構築するのではなく、ネットワークを訓練するために使用するアーキテクチャを指定することができます。
ここでは、「resnet34」を使用しています。これにはいくつかの関連するアーキテクチャがあり、fast.aiに実装されているものもあります。
- resnet18
- resnet50
- resnet101
- resnet152
- 画像分類のための他のアーキテクチャ
- GoogleNet
- AlexNet
- VGG
- Inception v(1,2,3)
先人が既に分類器を構築してくれていて、今回は_resnet34_を採用していると。
DATA
“data”変数は、訓練データを構成するために使用されます。データが格納される場所(PATH)を指定し、選択したアーキテクチャ(tfms_from_model)に付属するデータ変換を適用します。これらの変換はアーキテクチャごとに異なる場合がありますが、通常は次のうちの1つまたは複数を伴います。
- サイズ変更:各画像は、ネットワークが期待する入力にリサイズされます。
- 正規化:データ値は0と1の間の値に再スケーリングされます。
- 標準化:データ値は平均値が0、標準偏差が1の標準分布に再スケーリングされます。
先ほどのモデルの訓練の4行の2行目(dataから始まる)は訓練データの処理で、_resnet_に必要な処理_、サイズ変更(sz = 224)_を行っていると。
LEARN
私たちは上で選択したアーキテクチャを使用して、ネットワーク上でデータを学習させる学習オブジェクトを作成します。既存のネットワーク・アーキテクチャを使用することのもう1つのメリットは、通常、事前にモデル化されたモデルが提供されていることです。つまり、アーキテクチャがすでに大規模なデータセット(例:ImageNet)にあらかじめ訓練されています。このようにして、ゼロ(またはランダムな初期化)からトレーニングを開始するのではなく、すでに良い結果を得ているモデルから始めて、特定のニーズに合わせて適応させます。この学習の方法は、転移学習と呼ばれます。
モデルの訓練の4行の3行目(learnから始まる)ではresnet34を適応させていると。これが__転移学習__であると。
自分も頭いい人の脳を転移学習したい...
LEARN.FIT()
データと学習オブジェクトをいったん準備したら、実際の訓練を開始することができます。これは、2つのパラメータを取る fit ( learning_rate , epochs ) メソッドによって実行されます。最初のものは学習率で、トレーニング中にモデルを更新するために使用されます。これは、モデルがどのくらい早く学習したいかを示す指標です。低い値を設定すると良い結果が得られますが、長いトレーニング時間を意味します。高い値を設定すると、はるかに早くトレーニングすることができますが、私たちは目標をオーバーシュートする可能性があります。学習率とfast.aiがあなたのモデルの良い学習率をどのように選ぶかは、後で詳しく説明します。 2番目のパラメータは、訓練する「エポック」の数です。我々のモデルがデータセット内のすべての画像を1回見るサイクルを1エポックとします。必要とするエポックの数は、検証セットの精度が向上し続ける限り「好きなだけ多く」です。非常に大きなモデルの場合は、時間がなければエポック数を制限することがあります。
モデルの訓練の4行の4行目(_fit.()_ のところ)では_学習率_と_エポック数_を設定し、分類器の訓練を実行に移すと。
fast.aiライブラリ [22:24 ]
- ライブラリはベストプラクティスとアプローチをすべて取り入れています。興味深い論文が出てくるたびにテストを行い、さまざまなデータセットでうまく機能するか確認し、fast.aiライブラリに実装します。
- fast.aiライブラリはすべてのベストプラクティスとパッケージを管理しており、ほとんどの場合、自動的に物事を処理する最良の方法を見つけ出します。
- fast.aiライブラリはPyTorchと呼ばれるライブラリの上に基づいています。PyTorchは、Facebookで書かれた本当に柔軟なディープラーニング、機械学習、GPU計算ライブラリです。
- ほとんどの人はPyTorchよりもTensorFlowに精通していますが、現在のところ、Jeremyが知っているトップ研究者の大部分がPyTorchに切り替えました。
- fast.aiライブラリは、これらのすべてのキュレーションされたベストプラクティスを必要に応じて多少使用することができる柔軟性があります。どの時点でもフックして、独自のデータ拡張、損失関数、ネットワークアーキテクチャなどを書くことは簡単です。このコースではすべてのことを学びます。
fast.aiライブラリについての説明(宣伝?)。最新の論文の知見を取り込み、機能を追加していると。フレームワークはPytorchを使っていると。
結果の分析 [24:21]
これは、検証データセットのラベル(正しい答えと考える)が次のようになっているものです。 これらの0と1は何を表していますか?
外人さんのまとめノートより。
ラベル0は’cats’でラベル1は’dogs'であるとのこと。
- data : 検証データと訓練データが含まれています
- learn :モデルを含む 検証セットを予測しましょう(予測はログスケールです)
- 出力は、猫の予測と犬の予測を表します
なんのこっちゃ??という部分でしたが、、
検証セットの中身は2000枚あって、それを先ほど訓練した学習オブジェクトlearnで検証セットを予測させると2000×2の行列(0列目は猫の確率、1列目は犬の確率)で、上から10枚くらいを表示させると全部猫という予測であったと。(値をe^xのxに当てはめると0列目≒1、1列目≒0となる)
- PyTorchとFast.aiライブラリでは、ほとんどのモデルが確率よりもむしろ予測のlogを返します(私たちはコースの後半の理由を学びます)。今のところ、確率を得るためには、np.exp() を用います。
- numpy(np)表記に馴染んでいることを確認してください。
PyTorchとFast.aiライブラリではlogスケールで結果が表示されるので、Pythonのnumpyで、logスケールを確率表記に戻すと。
- 画像の上の数字は犬の確率
まずは正しく分類された画像。犬はほぼ1で猫はほぼ0ですね。
次に間違って分類された画像。人が写ってたり、犬猫両方写ってたり、人が無理やり立たせた猫が写ってたりします。
最もモデルが正しく分類できた犬と猫。
最もモデルが分類できなかった犬と猫。広告の画像が混じっていたりします。
最も曖昧な(確率が0.5に近い)予測のもの。金網越しの犬など。
- これらの画像を見ることが重要なのはなぜですか?モデルを作成した後にまずJeremyがやったことは、どう分類したかを視覚化して見ることです。なぜなら、モデルをより良くしたいのであれば、うまくいっているところを利用して、うまくいっていないところを修正する必要があるからです。
- この例では、私たちはデータセットに、あるべきではない画像もいくつかあるということを学びました。しかし、このモデルには改善の余地があることもまた明らかです(例:データ拡張(水増し) - 後で学習します)。
- これで、自分の画像分類器を作製する準備が整いました(通常の写真用—CTスキャン画像用ではないかも)!例えば、一人の生徒が作った例がこちら。
- 結果を可視化するさまざまな方法について、このフォーラムの投稿をチェックしてください(たとえば、2つ以上のカテゴリがある場合など)
結果を視覚化して分析して、曖昧なものや自信あるのに間違っている画像を減らしていくよー、と。現状を分析し、_改善の努力_をするという、まさに学習の王道...!!
スラムダンク 22巻より
トップダウン式vsボトムアップ式 [30:52 ]
ボトムアップ式:必要な各ビルディングブロックを学習し、最終的にまとめます
- モチベーションを維持するのが難しい
- "全体図"がわかりにくい
- 実際に自分に必要な部分がわかりにくい
fast.ai:生徒にすぐにニューラルネットを使わせ、できるだけ早く結果を得る
- 徐々に層をはがし、理解が足りない穴を埋め、最終的に理解する
トップダウン式の利点。もちろん欠点は理論面が薄いことであるので、後々CourseraのAndrew Ng先生のボトムアップ式のディープラーニング講座で補っていけば良さそう!
コース構成[ 33:53]
Lesson7までいったら、Lesson1にまた戻って2,3周繰り返して復習すると理解が高まるよ、みたいな話。Jeremyさん簡単に言ってるけど、1Lessonにつき10hはかかるとか書いてあるので単純計算で70h、それを2,3周ってのはなかなか...
スラムダンク 21巻より
スラムダンクの桜木並の精神力が求められている...
画像分類の例:画像分類アルゴリズムは、たくさんのものに役立ちます。
- 例えば、AlphaGo [42:20 ]は、ありとあらゆる碁盤を学習して、それぞれの碁盤が勝者になるか敗者になるどうかを示すラベルを持っていました。そこで学んだ画像分類器は、碁盤を見てそれが良い局面か悪い局面かを判断できるようになりました。どの棋譜が良いかを知ることは、碁を上達する上で最も重要なステップです。
- 別の例は、昔教えていた生徒がマウスの動き画像の画像分類器を作製し不正な取引を検出したものです。
画像分類は色々と応用が利くと。
ディープラーニング≠機械学習 [44:26 ]
- ディープラーニングは、機械学習の一種です。
- 機械学習はアーサー・サミュエルによって考案されました。50年代後半には、機械学習を発明することによって、チェッカーをよりよく行うためのIBMメインフレームを手に入れました。彼はメインフレームを何度も繰り返し戦わせ、どのようなことが勝利に導いたかを把握させ、そのデータ使ってマシン自身でプログラムを書かせました。1962年、アーサー・サミュエルはいつか、コンピュータソフトウェアの大部分は人間がプログラミングするのではなく、機械学習を使って書かれるだろう、と語りました。
- C-Path(Computational Pathologist) [45:42 ]は、従来の機械学習アプローチの一例です。彼は乳癌生検の病理学スライドを取り上げ、多くの病理学者に、どのような種類のパターンまたは特徴が長期生存に関連するかについてのアイデアを検討しました。その後、これらの特徴を計算し、ロジスティック回帰を実行し、生存率を予測するための専門アルゴリズムを作成しました。それは病理学者よりも優れていましたが、ドメイン専門家やコンピュータ専門家が長年の作業に取り組む必要がありました。
機械学習の歴史の説明。従来の機械学習はアルゴリズムの作成に時間がかかって大変だったと。
より良い方法 [47:35]
そこで従来の機械学習の欠点を解決する技術、ディープラーニング登場。3つの特性があると。
1.無限に柔軟な関数:ニューラルネットワーク [48:43]
- ディープラーニングが使っている根底にある関数は、ニューラルネットワークと呼ばれます。 - 今のところあなたが知る必要があるのは、数多くのシンプルな線形レイヤーと、いくつかの単純な非線形レイヤーが散在していることだけです。これらの層を散在させると、普遍性定理と呼ばれるものが得られます。普遍性定理とは、十分なパラメータを追加しさえすれば、任意の連続関数を任意の精度で近似できるということです。 上に示したニューラルネットワークの例には、隠れ層が1つあります。過去数年間に私たちが学んだことは、もし複数の隠れ層を追加しなければ、ニューラルネットワークは高速でもスケーラブルでもないということです。 —だからこそ" ディープ "ラーニングなのです。
2.万能なパラメータフィッティング:勾配降下法 [49:39]
3.高速でスケーラブルなGPU [ 51:05 ]
GPUの発展により(今では_google colab_のように万人が無料でGPUが使える時代となり)、いよいよディープラーニングは万人が使える技術になってきたと。
すべてを組み合わせると[ 53:40]
ここからは具体例ですね。現在どのようにディープラーニングがビジネスに応用されているか。
芸術方面の応用は非常に興味深いです。Neural Doodleで作られた画像みせられても本物だと信じてしまいそう...
肺がんの診断[ 56:55]
JeremyさんはEnliticという画像診断スタートアップを立ち上げているそうです。一応医療に従事している身としては、今後こういった病気の診断や予防医療分野への応用等の発展には非常に期待しています。
その他の現在のアプリケーション:
あらゆる産業での応用が期待されています。
畳み込みニューラルネットワーク[59:13]
線形層 Neural networks and deep learning
なんかこういうピクセルの図を見せられると、子供の頃に遊んだマリオピクセルっていうゲームを思い出します...
CNNの説明用にこんなサイトがあるとは、わかりやすい...
非線形層[ 01:02:12 ]
Neural networks and deep learning
線形の層の後に要素ごとの非線形関数を組み合わせることで、任意の複雑な形を作成することができます。これが普遍性定理の本質です。
重みとバイアスを変え、さらに非線形関数により変換すると、どんな複雑な関数でも近似できる、と。
問題を解決するためにこれらのパラメータを設定する方法[01:04:25]
- 勾配降下法 - 勾配降下を使用して二次関数の最小値を求めたいとしましょう。ポイントxの値と傾きを計算することから始めます。次に、少し下に移動し、値を再度計算します。関数の値がもはや減少していないこと(傾きは0)がわかると、我々は最小であると結論づけることができます。
- 底を目指して丘を少しずつ下っていくボールのイメージ。下る勢いの大きさは学習率(Learning rate)と呼ばれます。下る勢いが大きすぎると底にたどり着かず発散する可能性がある。 Xn+1 = Xn + 傾き* l(学習率)
- 学習率が大きすぎると収束するのではなく発散する
- 学習率が小さすぎると、永遠に時間がかかるでしょう
適切な学習率の設定が重要であると。
ビジュアル化と畳み込みネットワークの理解[01:08:27]
私たちは信じられないほどシンプルなネットワークから始めましたが、普遍性定理とディープラーニングにおける複数の隠れ層の使用により、十分に大きなスケールのニューラルネットワークを構築すると、非常に強力な能力を得ることができます。実際に私たちが犬と猫の画像分類器を訓練したときに使用したのが、これです。
- ネットワークの最初のレイヤーは、画像全体の基本的なビルディングブロック(水平線、夕焼け、円の...)を学習し、後のレイヤーは前のレイヤーからのビルディングブロックの結合を開始し、3つでテキスト、顔の存在、そして後の層でさえ、我々は、bycicles、animals ...を認識することができます
再び'Dog vs. Cat'に戻って - 学習率の選択[ 01:11:41]
- 最初の数字0.01は学習率です。
- 学習率は重みまたはパラメータを、どのように迅速にまたはどのようにゆっくりと更新したいかを決定します。学習率は、モデルのパフォーマンスに重大な影響を及ぼすため、設定が難しいパラメータの1つです。
- そこでlr_find()が、最適な学習率を見つけるのに役立ちます。それは、2015年に作成された、ニューラルネットワークを学習するための周期的学習率で開発された技術を使用しています。バッチ全体の学習率をプロットすることで、これがどのように見えるかを確認できます。
学習率の選択について。ここではlr_findというスゴ技?が登場します。
今、モデルのトレーニングを開始するための「適切な」学習率を選択するにはどうすればよいですか?
- この質問はディープラーニング界隈で大きく議論されているもので、fast.aiではLeslie Smithの論文- Neural Networksのトレーニングのための周期的学習率に基づく解決策を提示しています。
この論文の考え方は非常に単純です。
- 小さな学習率で始め、損失値を計算する。
- 徐々に学習率nの増加を開始し、損失値を計算する。
- 損失値が再び上昇し始めると、それは停止する時間です。
- あなたが見つけることができる最も高い学習率を選択します。ここでは、損失値は依然として劇的に改善されています。
注:今年の初めに、彼は興味深いかもしれないハイパーパラメータの設定に関する別の論文を掲載しました:ニューラルネットワークハイパーパラメータへの規律あるアプローチ:パート1 - 学習率、バッチサイズ、運動量、および体重減少
fast.aiライブラリには、優れた学習率を選択する上で参考になる素晴らしいヘルパー機能があります。
...これは今まで苦労して学習率を見つけていた人からすると、な…なんだってー!!的な技術ではなかろうか。Lesson2でJeremyさんが言うには18ヵ月前まで誰も知らなかったが、現在では皆が使う技術になったと。
MMR マガジンミステリー調査班 より一部改変
実際にlr_findというメソッドを使ってみる。結果の360は23000枚の訓練用画像を64バッチに分けたうちの、1バッチ分(360枚)を示しており、損失率が100%を超えた298枚目でストップしていると。
以下は外人さんのまとめノートより。
- learnオブジェクトには、sched学習率スケジューラを含む属性が含まれており、以下のような便利なプロット機能があります。
Jeremyは現在、学習率を指数関数的に増加させるか、線形的に増加させるかを実験しています。
損失値 vs 学習率のプロットを見ると、損失率の減少がどこで止まるかを知ることができます。
今回は、損失値が明らかに改善されている学習率1e-2(この場合は0.01)を選択します。2つのグラフの上のグラフで、今回は学習率(LR : Learning Rate)を指数関数的に増加させたことを確認しています。
下のグラフでは学習率の変化と同時に損失値(Loss)の変化をプロットし、極小値0.1の一桁前の0.01を採用しました。 (詳しくはJeremyさんがLesson2で話す。極小値0.1は学習率が大きすぎ、損失値の改善がこれ以上は見られないので、0.01を採用している。)
エポック数の選択[ 1:18:49]
- あなたが望むほど多く、しかし、あなたがそれをあまりにも長く実行すれば、精度は悪化し始めるかもしれません。これは「過適合(オーバーフィッティング)」と呼ばれるもので、後で詳しく説明します。
- もう一つ考慮すべき点は、あなたが許容できる時間です。
今回のエポック数は2を採用していると。これについては次回話すとのこと。
ヒントと秘訣[ 1:21:40]
- Tab - 関数名を覚えていないときに自動的に選択肢を列挙します。
2. Shift + Tab - 関数の引数を表示します 。
Shift + Tab + Tab - ドキュメントが開きます。(すなわちdocstring)
Shift + Tab + Tab + Tab - 同じ情報を持つ別のウィンドウが開きます。
?に関数名を続けて入力して実行しても、shift + tab (3 times)と同様です。
2つの疑問符を入力すると、ソースコードが表示されます
HをJupyter Notebookに入力すると、キーボードショートカットのあるウィンドウが開きます。1日に4つまたは5つのショートカットを学習してみてください
最新の情報については、フォーラムとhttp://course.fast.ai/(各レッスンについて)を覚えておいてください。
最後にJupyter Notebookの使い方を軽く説明して、引き続きLesson2へ。
Lesson1を終えて
最後までやるんだ!! ゆっくりでもいい!! 自分の力でやり遂げろ!!
スラムダンク 19巻より
...自分の力ではなく完全に他力本願ですが、とりあえずgoogle翻訳で何となく意味は汲み取れる気がします。スローペースですが前に進めていきます...海外の偉大な先人たちに感謝しつつ...