vmin style

DL4US落ちたので、google翻訳でfast.aiをやるしかない①

【スポンサーリンク】

DL4US落ちました...

f:id:stillalive0304:20180724115350p:plain:w200

スラムダンク より 

  

簡単なあらすじ

  • 近年やたら人工知能が流行っているので、新たな可能性を感じ、今年5月頃からprogateやaidemy、udemyでpython等の講座を受講し始めた。
  • そんな折、twitter上で東大松尾研が第2回DL4US(ディープラーニングの国産の無料オンライン学習講座)の参加者を募集していた。
  • 試しに応募したところ、選抜テストも受けることなく"サイレントお祈り"という結果に...(日本語無料ということで前回以上に応募者が殺到し、twitter上には大量の落選者が...)

  

DL4US落選→"終わりの始まり"

這い上がろう。「負けたことがある」というのが いつか、大きな財産になる。

f:id:stillalive0304:20180724115626p:plain

スラムダンク 31巻より 

今回の"サイレントお祈り"は、落選者に対し『自分で道を切り開け!』という東大松尾研からの激励ではないか...そう考えた私は、その直感を確かめるべく海外のディープラーニング無料オンライン講座 fast.aiへと向かった...

  

最大の不安要素:"英語トラブル"

f:id:stillalive0304:20180724115838p:plain

スラムダンク 20巻より

無料GPU環境のgoogle colab上でfast.aiのノートブックを動かす 

これについては外人さんのブログ外人さんのyoutube動画を参考に。以下は外人さんのブログのgoogle翻訳

Fast.aiをGoogle Colabで数分で使用する方法

  1. Google Colabに申し込み、アクセスをリクエストしてください。
  2. Clouderizerにサインアップしてください。デフォルトでは、個人ユーザー無料プランになります。
  3. Clouderizerコンソールにログインし、コミュニティプロジェクトに行きます。fast.aiテンプレートを検索し、それを複製します。
  4. プロジェクトウィザードの2番目のタブ(マシン設定)では、デフォルトでマシンタイプとしてAWS GPUスポットインスタンスが選択されています。ローカルマシンを代わりに選択してください。残りのすべての画面で、デフォルトオプションを選択して保存します。

Google ColabのGPU環境でfast.aiノートブックを起動するたびに、以下の3つの手順を行ってください

google colabで新しい空のPython 3ノートブックを作成します。 [編集] - > [ノートブック設定]に移動し、[ハードウェアアクセラレータ]をGPUとして選択します。

f:id:stillalive0304:20180724121436p:plain:w400

ここですね。

②Clouderizerコンソールから、先に作成したfast.aiプロジェクトのStartを押します。これにより、任意の端末でプロジェクトを開始するためのスクリプトスニペットが表示されます。Linuxスニペット(コード)をコピーします。

③コラボノートに戻って、新しいコードブロックを追加し、そこにスニペットを貼り付けてください(先頭に!をつけています)、ブロックを実行してください。

f:id:stillalive0304:20180724122841p:plain

言われるがままにコードをコピーしてgoogle colabに貼り付け、!を先頭につけ加えてから実行します。

f:id:stillalive0304:20180724122858p:plain

5分ほどで終了します。

  • 以上!これにより、自動fast.aiコース環境のセットアップ、最新のコードダウンロード、dogscatsデータセットのダウンロードがトリガーされます。
  • Clouderizerコンソールに戻り、この設定の進捗状況を追跡できます。
  • セットアップが完了すると、プロジェクトのステータスは[実行中]になり、Jupyterボタンが使用可能になります。
  • Jupyterボタンをクリックすると、Jupyterノートブックがfast.ai githubコードで開きます。 

f:id:stillalive0304:20180724123024p:plain:w400

Clouderizerに戻りページを再読み込みすると、jupyterボタンが選択できるようになっており、クリックするとjupyter labが開きます。

f:id:stillalive0304:20180724123107p:plain

courses > dl1 > lesson1.ipynb の順にクリックしていくと、Lesson1のノートブックが開きます。ノート上部の▶ボタンかshift+enterを押していくと、上から順にセルが実行されます。

  

追記)

外人さんの注釈付きブログによれば、_12時間_のセッションがタイムアウトした場合、最初からコードを再実行しないといけないとのこと。以下はgoogle翻訳

Google Colab

  • GithubGoogleドライブ、その他環境からノートブックを起動することができます。無料の練習時間は12時間です。
  • 私が経験した欠点は、GPUメモリが12GBのRAM(ymmv)を持っていても、セッションが終了したときに(インストールとデータのダウンロードを含む)コードを再実行しなければならなかったこと。まぁ、でも、無料だからね!

  

まとめブログのgoogle翻訳の解説に従ってLesson1を進めていく

環境が整ったので、早速Lesson1を始めていきます。

はじめに[0:00]

  • ニューラルネットワークを訓練するためには、CUDA(徹底的に学習するライブラリや実践者のほとんどが使用する言語とフレームワーク)をサポートする唯一のものであるため、GPU(特にGPU)、特にNVIDIA GPUが必要です。
  • GPUをレンタルするにはいくつかの方法があります:Crestle [ 04:06 ]、Paperspace [ 06:10 ]     

12分ぐらいまでは環境構築の話なので省略。

Jupyter notebookと' Dogs vs Cats 'の紹介 [12:39 ]

  • セルを選択し、shift + enterキーを押すことでセルを実行することができます(シフトを押し続けて複数回Enterキーを押すと、セルを下り続けることができます)。または、上の▶[実行]ボタンをクリックします。セルには、コード、テキスト、画像、ビデオなどを含めることができます。
  • Fast.aiにはPython 3が必要です。

Jupyter notebookの使い方説明。とりあえず上からポチポチ実行していきます。

f:id:stillalive0304:20180724123833p:plain

拡張機能をリロードする

 %reload_ext autoreload
  • 使用しているモジュールが更新されるたびに、Jupyter IPythonの環境では、設定方法に応じてJupyterの環境を再ロードすることができます(次の設定や詳細を参照)

オートリロード構成

%autoreload 2

前述のリロード拡張機能と組み合わせて、この設定はモジュールのリロード方法を示します。これは3つの方法で設定できます。 - 0 - 自動リロードを無効にします。 - 1 - hte pythonコードが実行される前に、毎回%importでインポートされたすべてのモジュールをリロードします。 - 2 - タイプされたPythonコードを実行する前に、すべてのモジュール(%importで除外されたモジュールを除く)をリロードします。

MATPLOTLIBインライン

%matplotlib inline
  • このオプションはJupyterノートブックの中で、それを生成したコード・セルの直下にプロット・コマンドをインラインで出力します。得られたプロットはノートブック文書にも保存されます。
  • 詳細については、ここでドキュメントを読むことができます。

まずは環境設定の"おまじない"ですね。

  

f:id:stillalive0304:20180724125201p:plain

続いてfast.aiライブラリのインポート。fast.aiライブラリについては後で説明が出てきます。

  

f:id:stillalive0304:20180724125227p:plain

PATH : 使いたいデータにパスを通します sz : 早く処理するため、画像をリサイズする大きさを設定

処理のためサイズ変更を行っていると。今回使用するresnetは224×224のサイズの画像を扱うためsz=224で処理すると。ここらへんは後のレッスンで解説してくれるようです。

  

最初に写真を見る [15:39]

f:id:stillalive0304:20180724131225p:plain

ここではdogscatsデータセットの構造を見ていると。

(追記)

外人さんの注釈付きブログにデータセットの構造が書いてありました。以下、google翻訳

dogscatsデータセットは、 23000枚の訓練用画像(猫と犬は50:50の比率で)と2000枚の検証画像(同じく50:50)で構成されています。 以下は、データセットのフォルダ構造の写真です。 f:id:stillalive0304:20180724125624p:plain - "train"、 "valid"、 "test1"フォルダには訓練用、検証用、テスト用の各画像が含まれています。 - 訓練用フォルダと検証用フォルダには、訓練/分類したいラベルごとにサブフォルダがあり、それぞれにラベルに従って分類する必要がある画像が含まれています。 - 重要なことは、多くのデータセットがこのように構成されていることです。

より良いニューラルネットワークを見つけ、訓練したら、テストセットを使用します。

fast.aiサイトの良いブログ記事があります。ここのトピックで少し詳しく勉強したり、fast.ai 機械学習コースをご覧ください。

もう1つ興味深いフォルダは、保存するモデルのバージョンを保存する "model"フォルダです。これらの保存されたモデルは、ソリューションを本番環境に展開するために使用されます。

フォルダを訓練セットと検証セットに分けていると。ここがいまいちわからない人は、機械学習のコースを見るといいよ、とありがたいアドバイスがあります。

  

f:id:stillalive0304:20180724130242p:plain

  • このフォルダ構造は、画像分類データセットがどのように共有され提供されるかの最も一般的なアプローチです。各フォルダには、ラベル(たとえば、'dogs'または'cats')が表示されます。

ここでは検証セット(valid)の中身が'cats'と'dogs'の2種類でラベル付けされているのを確認し、試しに'cats'の上から5枚のファイル名を表示させていると。

  

f:id:stillalive0304:20180724130456p:plain

まずは'cats'の[0]番目の生データの構造を例として確認。

  • f '{PATH} valid / cats / {files [0]}' - これはPython 3.6形式の文字列で、文字列の書式設定に便利です。

  

f:id:stillalive0304:20180724130536p:plain

画像の形状は_(高さ、幅、色チャネル)_で表記され、今回の例では(374 , 500 , 3)となっていると。下は画像の上から4×4ピクセルのスライスを表示。

以下は外人さんのまとめノートより。

f:id:stillalive0304:20180724130648p:plain f:id:stillalive0304:20180724130635p:plain

  • コンピュータは私たちと同じように画像を認識しません。画像の形状を見ると、3次元、つまり「3」があり、これは赤 - 緑 - 青(RGB)の次元を表しています。したがって、各ピクセルごとに、赤、緑、青の3つの値があります。したがって、画像配列は、374×500の画像領域内の各ピクセルの3つの値(RGB)で構成されます。上の図の一番下には、画像の上位4x4ピクセルが表示されています。これらの数字はすべて0〜255です。後でこれらの数値を使用してネットワークを訓練します。
  • このデータセットはKaggleのコンペに由来し、2013年にリリースされた時点で最先端技術は80%正確でした。

画像データの構造の説明。8bitなので2の8乗で_0~255までの256通り_。2013年の最高正解率は80%だったと。

 

モデルを鍛えよう [20:21]

モデルを訓練するのに必要なコードは次の4行です:

f:id:stillalive0304:20180724131501p:plain

4行のコードを実行すると、なんと99%の正解率!...えええ...

f:id:stillalive0304:20180724131525p:plain:w200 デスノート より

...なんだか凄いのはわかりますが、一体何が起こっているのか...

f:id:stillalive0304:20180724131604p:plain 外人さんのまとめノートより、結果の見方のメモ。左からエポック数、訓練セットの損失値、検証セットの損失値、正解率の順に表示されると。

  • 今回は、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] 

これは、検証データセットのラベル(正しい答えと考える)が次のようになっているものです。 f:id:stillalive0304:20180724134643p:plain これらの0と1は何を表していますか? f:id:stillalive0304:20180724134715p:plain

外人さんのまとめノートより。

ラベル0は’cats’でラベル1は’dogs'であるとのこと。

  • data : 検証データと訓練データが含まれています
  • learn :モデルを含む 検証セットを予測しましょう(予測はログスケールです)  f:id:stillalive0304:20180724134833p:plain
  • 出力は、猫の予測と犬の予測を表します

なんのこっちゃ??という部分でしたが、、

検証セットの中身は2000枚あって、それを先ほど訓練した学習オブジェクトlearnで検証セットを予測させると2000×2の行列(0列目は猫の確率、1列目は犬の確率)で、上から10枚くらいを表示させると全部猫という予測であったと。(値をe^xのxに当てはめると0列目≒1、1列目≒0となる)

  

f:id:stillalive0304:20180724134900p:plain

  • PyTorchとFast.aiライブラリでは、ほとんどのモデルが確率よりもむしろ予測のlogを返します(私たちはコースの後半の理由を学びます)。今のところ、確率を得るためには、np.exp() を用います。 f:id:stillalive0304:20180724134933p:plain
  • numpy(np)表記に馴染んでいることを確認してください。

PyTorchとFast.aiライブラリではlogスケールで結果が表示されるので、Pythonのnumpyで、logスケールを確率表記に戻すと。

  

f:id:stillalive0304:20180724135124p:plain

  • 画像の上の数字は犬の確率

まずは正しく分類された画像。犬はほぼ1で猫はほぼ0ですね。

  

f:id:stillalive0304:20180724135238p:plain

次に間違って分類された画像。人が写ってたり、犬猫両方写ってたり、人が無理やり立たせた猫が写ってたりします。

  

f:id:stillalive0304:20180724135040p:plain

最もモデルが正しく分類できた犬と猫。

  

f:id:stillalive0304:20180724135754p:plain

最もモデルが分類できなかった犬と猫。広告の画像が混じっていたりします。

  

f:id:stillalive0304:20180724135825p:plain

最も曖昧な(確率が0.5に近い)予測のもの。金網越しの犬など。

  • これらの画像を見ることが重要なのはなぜですか?モデルを作成した後にまずJeremyがやったことは、どう分類したかを視覚化して見ることです。なぜなら、モデルをより良くしたいのであれば、うまくいっているところを利用して、うまくいっていないところを修正する必要があるからです。
  • この例では、私たちはデータセットに、あるべきではない画像もいくつかあるということを学びました。しかし、このモデルには改善の余地があることもまた明らかです(例:データ拡張(水増し) - 後で学習します)。
  • これで、自分の画像分類器を作製する準備が整いました(通常の写真用CTスキャン画像用ではないかも)!例えば、一人の生徒が作った例がこちら。
  • 結果を可視化するさまざまな方法について、このフォーラムの投稿をチェックしてください(たとえば、2つ以上のカテゴリがある場合など)

結果を視覚化して分析して、曖昧なものや自信あるのに間違っている画像を減らしていくよー、と。現状を分析し、_改善の努力_をするという、まさに学習の王道...!!

 

f:id:stillalive0304:20180724140020p:plain:w400

スラムダンク 22巻より

  

トップダウン式vsボトムアップ [30:52 ]

ボトムアップ:必要な各ビルディングブロックを学習し、最終的にまとめます

  • モチベーションを維持するのが難しい
  • "全体図"がわかりにくい
  • 実際に自分に必要な部分がわかりにくい

fast.ai:生徒にすぐにニューラルネットを使わせ、できるだけ早く結果を得る

  • 徐々に層をはがし、理解が足りない穴を埋め、最終的に理解する

トップダウン式の利点。もちろん欠点は理論面が薄いことであるので、後々CourseraのAndrew Ng先生のボトムアップ式のディープラーニング講座で補っていけば良さそう!

 

  

コース構成[ 33:53]

f:id:stillalive0304:20180724140708p:plain

  1. ディープラーニングによる画像分類(コードの行数が最小)
  2. 多ラベル分類と異なる種類の画像(例えば、衛星画像)
  3. 構造化データ(売上予測など) - データベースまたはスプレッドシートからの構造化データ
  4. 言語:自然言語処理(例えば、映画レビュー分類)
  5. 協調フィルタリング(推奨エンジンなど)
  6. 生成言語モデル:自分のニーチェの哲学を1字1句ごとにゼロから書く方法
  7. 画像分類に戻る - 猫の写真を分類するだけでなく、猫が写真のどこにいるかを見つける(ヒートマップ)、自分でコードを最初から書く方法を学ぶ(ResNet)

Lesson7までいったら、Lesson1にまた戻って2,3周繰り返して復習すると理解が高まるよ、みたいな話。Jeremyさん簡単に言ってるけど、1Lessonにつき10hはかかるとか書いてあるので単純計算で70h、それを2,3周ってのはなかなか...

  

f:id:stillalive0304:20180724140921p:plain:w400

スラムダンク 21巻より

 スラムダンクの桜木並の精神力が求められている...

  

画像分類の例:画像分類アルゴリズムは、たくさんのものに役立ちます。

  • 例えば、AlphaGo  [42:20 ]は、ありとあらゆる碁盤を学習して、それぞれの碁盤が勝者になるか敗者になるどうかを示すラベルを持っていました。そこで学んだ画像分類器は、碁盤を見てそれが良い局面か悪い局面かを判断できるようになりました。どの棋譜が良いかを知ることは、碁を上達する上で最も重要なステップです。
  • 別の例は、昔教えていた生徒がマウスの動き画像の画像分類器を作製し不正な取引を検出したものです。

画像分類は色々と応用が利くと。

  

ディープラーニング機械学習 [44:26 ]

  • ディープラーニングは、機械学習の一種です。
  • 機械学習アーサー・サミュエルによって考案されました。50年代後半には、機械学習を発明することによって、チェッカーをよりよく行うためのIBMメインフレームを手に入れました。彼はメインフレームを何度も繰り返し戦わせ、どのようなことが勝利に導いたかを把握させ、そのデータ使ってマシン自身でプログラムを書かせました。1962年、アーサー・サミュエルはいつか、コンピュータソフトウェアの大部分は人間がプログラミングするのではなく、機械学習を使って書かれるだろう、と語りました。
  • C-Path(Computational Pathologist) [45:42 ]は、従来の機械学習アプローチの一例です。彼は乳癌生検の病理学スライドを取り上げ、多くの病理学者に、どのような種類のパターンまたは特徴が長期生存に関連するかについてのアイデアを検討しました。その後、これらの特徴を計算し、ロジスティック回帰を実行し、生存率を予測するための専門アルゴリズムを作成しました。それは病理学者よりも優れていましたが、ドメイン専門家やコンピュータ専門家が長年の作業に取り組む必要がありました。

機械学習の歴史の説明。従来の機械学習アルゴリズムの作成に時間がかかって大変だったと。

  

より良い方法 [47:35] 

f:id:stillalive0304:20180724141323p:plain - これらの3つの特性を持つアルゴリズムディープラーニングです。

そこで従来の機械学習の欠点を解決する技術、ディープラーニング登場。3つの特性があると。

  

1.無限に柔軟な関数:ニューラルネットワーク [48:43] 

f:id:stillalive0304:20180724141432p:plain - ディープラーニングが使っている根底にある関数は、ニューラルネットワークと呼ばれます。 - 今のところあなたが知る必要があるのは、数多くのシンプルな線形レイヤーと、いくつかの単純な非線形レイヤーが散在していることだけです。これらの層を散在させると、普遍性定理と呼ばれるものが得られます。普遍性定理とは、十分なパラメータを追加しさえすれば、任意の連続関数を任意の精度で近似できるということです。 上に示したニューラルネットワークの例には、隠れ層が1つあります。過去数年間に私たちが学んだことは、もし複数の隠れ層を追加しなければ、ニューラルネットワークは高速でもスケーラブルでもないということです。 —だからこそ" ディープ "ラーニングなのです。

2.万能なパラメータフィッティング:勾配降下法 [49:39] 

f:id:stillalive0304:20180724141900p:plain

3.高速でスケーラブルなGPU [ 51:05 ]

f:id:stillalive0304:20180724141949p:plain

GPUの発展により(今では_google colab_のように万人が無料でGPUが使える時代となり)、いよいよディープラーニングは万人が使える技術になってきたと。

  

すべてを組み合わせると[ 53:40]

f:id:stillalive0304:20180724142037p:plain

ここからは具体例ですね。現在どのようにディープラーニングがビジネスに応用されているか。

f:id:stillalive0304:20180724142107p:plain

芸術方面の応用は非常に興味深いです。Neural Doodleで作られた画像みせられても本物だと信じてしまいそう...

肺がんの診断[ 56:55]

f:id:stillalive0304:20180724142155p:plain

JeremyさんはEnliticという画像診断スタートアップを立ち上げているそうです。一応医療に従事している身としては、今後こういった病気の診断や予防医療分野への応用等の発展には非常に期待しています。

その他の現在のアプリケーション:

f:id:stillalive0304:20180724142238p:plain

あらゆる産業での応用が期待されています。

  

畳み込みニューラルネットワーク[59:13]

線形層 Neural networks and deep learning

f:id:stillalive0304:20180724142400p:plain

  • 畳み込みレイヤーの線形部分は、「畳み込み」(またはカーネル)と呼ばれます。上の図は、畳み込みステップがどのように機能するかの例を示しています。
  • 左の入力画像は、次のようにして右の画像に変換されます。

なんかこういうピクセルの図を見せられると、子供の頃に遊んだマリオピクセルっていうゲームを思い出します...

CNNの説明用にこんなサイトがあるとは、わかりやすい...

  

非線形[ 01:02:12 ]

Neural networks and deep learning

線形の層の後に要素ごとの非線形関数を組み合わせることで、任意の複雑な形を作成することができます。これが普遍性定理の本質です。

重みとバイアスを変え、さらに非線形関数により変換すると、どんな複雑な関数でも近似できる、と。

  

問題を解決するためにこれらのパラメータを設定する方法[01:04:25]

  • 勾配降下法 - 勾配降下を使用して二次関数の最小値を求めたいとしましょう。ポイントxの値と傾きを計算することから始めます。次に、少し下に移動し、値を再度計算します。関数の値がもはや減少していないこと(傾きは0)がわかると、我々は最小であると結論づけることができます。
  • 底を目指して丘を少しずつ下っていくボールのイメージ。下る勢いの大きさは学習率(Learning rate)と呼ばれます。下る勢いが大きすぎると底にたどり着かず発散する可能性がある。 f:id:stillalive0304:20180724143350p:plain Xn+1 = Xn + 傾き* l(学習率) f:id:stillalive0304:20180724143417p:plain f:id:stillalive0304:20180724143436p:plain
  • 学習率が大きすぎると収束するのではなく発散する
  • 学習率が小さすぎると、永遠に時間がかかるでしょう

適切な学習率の設定が重要であると。

  

ビジュアル化と畳み込みネットワークの理解[01:08:27]

私たちは信じられないほどシンプルなネットワークから始めましたが、普遍性定理ディープラーニングにおける複数の隠れ層の使用により、十分に大きなスケールのニューラルネットワークを構築すると、非常に強力な能力を得ることができます。実際に私たちが犬と猫の画像分類器を訓練したときに使用したのが、これです。

  • ネットワークの最初のレイヤーは、画像全体の基本的なビルディングブロック(水平線、夕焼け、円の...)を学習し、後のレイヤーは前のレイヤーからのビルディングブロックの結合を開始し、3つでテキスト、顔の存在、そして後の層でさえ、我々は、bycicles、animals ...を認識することができます

  

再び'Dog vs. Cat'に戻って - 学習率の選択[ 01:11:41]

f:id:stillalive0304:20180724143654p:plain

  • 最初の数字0.01学習率です。
  • 学習率は重みまたはパラメータを、どのように迅速にまたはどのようにゆっくりと更新したいかを決定します。学習率は、モデルのパフォーマンスに重大な影響を及ぼすため、設定が難しいパラメータの1つです。
  • そこでlr_find()が、最適な学習率を見つけるのに役立ちます。それは、2015年に作成された、ニューラルネットワークを学習するための周期的学習率で開発された技術を使用しています。バッチ全体の学習率をプロットすることで、これがどのように見えるかを確認できます。

学習率の選択について。ここではlr_findというスゴ技?が登場します。

 

  

今、モデルのトレーニングを開始するための「適切な」学習率を選択するにはどうすればよいですか?

この論文の考え方は非常に単純です。

  • 小さな学習率で始め、損失値を計算する。
  • 徐々に学習率nの増加を開始し、損失値を計算する。
  • 損失値が再び上昇し始めると、それは停止する時間です。
  • あなたが見つけることができる最も高い学習率を選択します。ここでは、損失値は依然として劇的に改善されています。

:今年の初めに、彼は興味深いかもしれないハイパーパラメータの設定に関する別の論文を掲載しました:ニューラルネットワークハイパーパラメータへの規律あるアプローチ:パート1 - 学習率、バッチサイズ、運動量、および体重減少

fast.aiライブラリには、優れた学習率を選択する上で参考になる素晴らしいヘルパー機能があります。

...これは今まで苦労して学習率を見つけていた人からすると、な…なんだってー!!的な技術ではなかろうか。Lesson2でJeremyさんが言うには18ヵ月前まで誰も知らなかったが、現在では皆が使う技術になったと。

f:id:stillalive0304:20180724153532p:plain:w400

MMR マガジンミステリー調査班 より一部改変

  

f:id:stillalive0304:20180724153556p:plain

実際にlr_findというメソッドを使ってみる。結果の360は23000枚の訓練用画像を64バッチに分けたうちの、1バッチ分(360枚)を示しており、損失率が100%を超えた298枚目でストップしていると。

以下は外人さんのまとめノートより。

f:id:stillalive0304:20180724153632p:plain

  • learnオブジェクトには、sched学習率スケジューラを含む属性が含まれており、以下のような便利なプロット機能があります。 f:id:stillalive0304:20180724153956p:plain
  • 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] 

  1. Tab - 関数名を覚えていないときに自動的に選択肢を列挙します。 f:id:stillalive0304:20180724154317p:plain:w400

2. Shift + Tab  - 関数の引数を表示します 。 f:id:stillalive0304:20180724154356p:plain:w400

  1. Shift + Tab + Tab  - ドキュメントが開きます。(すなわちdocstring)  f:id:stillalive0304:20180724160347p:plain:w400

  2. Shift + Tab + Tab + Tab  - 同じ情報を持つ別のウィンドウが開きます。 f:id:stillalive0304:20180724160508p:plain:w400

  3. ?に関数名を続けて入力して実行しても、shift + tab (3 times)と同様です。 f:id:stillalive0304:20180724160635p:plain:w400

  4. 2つの疑問符を入力すると、ソースコードが表示されます f:id:stillalive0304:20180724160710p:plain:w400

  5. HをJupyter Notebookに入力すると、キーボードショートカットのあるウィンドウが開きます。1日に4つまたは5つのショートカットを学習してみてください f:id:stillalive0304:20180724160737p:plain:w400

  6. 最新の情報については、フォーラムとhttp://course.fast.ai/(各レッスンについて)を覚えておいてください。

最後にJupyter Notebookの使い方を軽く説明して、引き続きLesson2へ。

    

Lesson1を終えて

最後までやるんだ!! ゆっくりでもいい!! 自分の力でやり遂げろ!! f:id:stillalive0304:20180724160909p:plain:w400

スラムダンク 19巻より

...自分の力ではなく完全に他力本願ですが、とりあえずgoogle翻訳で何となく意味は汲み取れる気がします。スローペースですが前に進めていきます...海外の偉大な先人たちに感謝しつつ...