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翻訳で何となく意味は汲み取れる気がします。スローペースですが前に進めていきます...海外の偉大な先人たちに感謝しつつ...

DL4US落ちたので、書籍『ゼロから作るDeeplearning②―自然言語処理編』をやるしかない

ゼロつく②やるしかない...!!

「ゼロから作るDeep Learning②」とは

ゼロから作るDeep Learning ? ―自然言語処理編

ゼロから作るDeep Learning ? ―自然言語処理編

10万部も売れているベストセラー本『ゼロから作るDeep Learningの第2段。 "できるだけ優しい言葉と図解を多用する"というのをモットーとして書かれていて、 数式だらけで難解な本が多い中、初学者にとってはヒジョーにありがたい"神シリーズ"である。

最近、待望の続編である自然言語処理が満を持して登場した。 元ネタはスタンフォード大の授業CS231n(画像認識のためのCNN)CS224d(自然言語処理のためのディープラーニングである。

今作もロングセラー間違いなしっすね!!

準備 : 無料GPUgoogle colab上で実行する

こちらのエントリを参考に。 qiita.com forhighlow0.hatenablog.com

  1. 本書GitHubサイト からdeep-learning-from-scratch-2-master をフォルダーごとダウンロードし、zipファイル解凍後、google driveにアップロードします。
  2. google colabのノートブックを新規作成して、「Python3」のノートブックを作成します。
  3. 編集 > ノートブックの設定 > ハードウェア アクセラレータ でGPUに設定。 f:id:stillalive0304:20180731132618p:plain:w200

エントリ通り、下のコードをコピペして実行します。

!apt-get install -y -qq software-properties-common python-software-properties module-init-tools
!add-apt-repository -y ppa:alessandro-strada/ppa 2>&1 > /dev/null
!apt-get update -qq 2>&1 > /dev/null
!apt-get -y install -qq google-drive-ocamlfuse fuse
from google.colab import auth
auth.authenticate_user()
from oauth2client.client import GoogleCredentials
creds = GoogleCredentials.get_application_default()
import getpass
!google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret} < /dev/null 2>&1 | grep URL
vcode = getpass.getpass()
!echo {vcode} | google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret}

上記の実行が終わると、URLと認証コード入力フォームが表示されるのでリンクをクリックしてコピペして認証をします。二回行います。認証したあと、さらに下のコードをコピペし、実行します。

!mkdir -p drive
!google-drive-ocamlfuse drive

!lsを実行して、driveディレクトリがあればマウントは成功です。

!ls

f:id:stillalive0304:20180731134630p:plain:w100

誰でも無料でディープラーニングできる時代...凄すぎる!!

「ゼロから作るDeep Learning②」のコード(ch01/show_spiral_dataset.py)を試しに動かす(p.41)

エントリを参考に、ch01/show_spiral_dataset.pyのコードのsys.path.append('..') sys.path.append('/content/drive/deep-learning-from-scratch-2-master')に変更し、実行して、printが正しく出力されれば成功です。 f:id:stillalive0304:20180731142306p:plain f:id:stillalive0304:20180731142322p:plain

以降、pyファイルを同様に変更してから実行します。

追記

  • 4章のch04/eval.pyでエラー
    • pkl_file = '/content/drive/deep-learning-from-scratch-2-master/ch04/cbow_params.pkl'とするとOK
  • 5章のch05/train_custom_loop.pyでエラー
    • sys.path.append('content/drive/deep-learning-from-scratch-2-master/ch05')とするとOK
  • 6章のch06/train_rnnlm.pyでエラー
    • sys.path.append('content/drive/deep-learning-from-scratch-2-master/ch06')とするとOK
  • 7章のch07/train_seq2seq.pyでエラー
    • sys.path.append('/content/drive/deep-learning-from-scratch-2-master/ch07')とするとOK
  • 8章のch07/train.pyでエラー
    • sys.path.append('/content/drive/deep-learning-from-scratch-2-master/ch07')とするとOK

ちょこちょこコードの変更が必要っすね...!!

  

第1章 ニューラルネットワークの復習(P1~P55)

まずは前作の復習から。さらっと流し読み。

ニューラルネットワークを用いると複雑な表現が可能になり、例え「渦巻き」のような複雑なパターンでも分離することができると。

f:id:stillalive0304:20180730142255p:plain

本章で学んだこと

とりあえず、ニューラルネットワークは凄いと...φ(。。)

  

第2章 自然言語と単語の分散表現(P57~P92)

ここから本題の"自然言語処理"に入っていきます...!!

ここからはAmazonのレビューのKyleさんのメモを参考に。感謝!

自然言語処理

  • 『単語の意味』をコンピュータに理解させることがテーマ
  • 本章と次章では次の3つの手法を見ていく
    • シソーラスによる手法 : 人の手によって作られた類語辞書を利用
    • カウントベースの手法 : 統計情報から単語を表現(コーパスを利用)
    • 推論ベースの手法 : ニューラルネットワークによる推論(word2vecと呼ばれる)

シソーラスによる手法

f:id:stillalive0304:20180731150143p:plain:w400

IBM Knowledge Center より引用

  • 単語の上位/下位関係、部分/全体関係などによって単語を分類し、体系づけた類語辞書。
WordNet

f:id:stillalive0304:20180801142747p:plain:w300

Word2Vec:発明した本人も驚く単語ベクトルの驚異的な力 - DeepAge より引用

シソーラスの問題点
  • 時代の変化に対応するのが困難
  • 人の作業コストが高い
  • 単語の細かなニュアンスを表現できない

②カウントベースの手法

  • 「単語の意味は、周囲の単語によって形成される」という仮説に基づき、着目した単語の周囲の単語の頻度カウントし、集計する手法。

f:id:stillalive0304:20180731185232p:plain:w400

CS224d Lecture2スライド より引用

カウントベースの手法の改善
相互情報量(PMI)の調整
  • 例えば、英語の特性で冠詞(the)単語(car)の頻度が高い場合、他の単語(driveなど)の方を優先させる調整
特異値分解(SVD)による次元削減
  • ベクトルの次元を("重要な情報"をできるだけ残すように)削減して、ロバスト(頑健性)を高める。

f:id:stillalive0304:20180731205501p:plain:w400

30分でわかる機械学習用語「次元削減(Dimensionality Reduction)」 より引用

各改善点などの実装(PTBデータセットを例に)
  • cos_similarity() : ベクトル間の類似度(コサイン類似度)を計測するための関数
  • most_similar() : 類似単語のランキングを表示する関数

f:id:stillalive0304:20180731204648p:plain:w200

SVDは結構時間がかかっていました... ここでは"時間がかかる"というのを体験させる意味合いなのカモ。

本章で学んだこと

  • WordNetなどのシソーラスを利用して、類義語の取得や単語間の類似度の計測など有用なタスクを行うことができる
  • シソーラスを用いる手法には、シソーラス作製する人の作業量新しい単語への対応などの問題がある
  • 現在では、コーパスを利用して単語をベクトル化するアプローチが主流である
  • 近年の単語ベクトル化の手法では、「単語の意味は、周囲の単語によって形成される」という分布仮説に基づくものがほとんどである
  • カウントベースの手法は、コーパス内の各単語に対して、その単語の周囲の単語の頻度をカウントし集計する(=共起行列)
  • 共起行列PPMI行列に変換し、それを次元削減することで、巨大な疎のベクトルを小さな「密なベクトル」へ変換することができる
  • 単語のベクトル空間では、意味的に近い単語はその距離が近くなることが期待される

2章は次のword2vecへの"前振り"っすね。

    

第3章 Word2Vec(P93~P129)

名前の通り、word(単語)をvector(ベクトル)にします。

推論ベースの手法(Word2Vec)の利点

カウントベース(SVD)の手法の問題点
  • 大規模なコーパスを使う場合、語彙数*語彙数の巨大な行列を作る必要がある。計算量的に現実的でない
推論ベース(Word2Vecニューラルネットワークによる推論)の利点
  • 推論ベースでは、少量(ミニバッチ)ごとに重みを繰り返し更新して学習が出来る。(逐次学習が可能)
  • 推論ベースでは、単語の意味を的確にとらえたベクトル表現=単語の「分散表現」を可能にする。

f:id:stillalive0304:20180731233507p:plain:w600

Word2Vecを用いた類義語の抽出が上手く行ったので、分析をまとめてみた より引用

  • 分散表現 : 単語の意味を的確にとらえた"密な"ベクトル表現

f:id:stillalive0304:20180802114343p:plain:w400

Word2Vec - Speaker Deck より引用

イメージ図:単語の分散表現により抽象的な意味を表現できる

f:id:stillalive0304:20180801130939p:plain:w400

Word2Vec:発明した本人も驚く単語ベクトルの驚異的な力 - DeepAge より引用

例:「king -man + woman=queen」の問題が解ける!

f:id:stillalive0304:20180801125024p:plain:w400

word2vec King-Queen composition | the morning paper より引用

参考:自然言語処理を学ぼう #3 word2vec 理論編(田中TOMさんのyoutube動画)

www.youtube.com

Word2VecのアルゴリズムCBOWモデル、skip-gramモデル)

  • CBOWモデル
    • 前後の単語(文脈)から、現在の単語を推測する。

f:id:stillalive0304:20180801130418p:plain:w400

Word2Vec:発明した本人も驚く単語ベクトルの驚異的な力 - DeepAge より引用

  • skip-gramモデル
    • 現在の単語から、前後の単語(文脈)を推測する。

f:id:stillalive0304:20180801131836p:plain:w400

Word2Vec:発明した本人も驚く単語ベクトルの驚異的な力 - DeepAge より引用

  • イメージ図:CBOWモデルとskip-gramモデルは逆の関係

f:id:stillalive0304:20180802111951p:plain:w400

Word Embeddings - word2vec - Mubaris' Blog より引用

  • CBOWモデル vs skip-gramモデル

f:id:stillalive0304:20180804151832p:plain:w400

言語と画像の表現学習 より引用

シンプルなWord2Vecの実装と学習と評価

  • 学習回数(~1000 epoch)を重ねるごとに損失が減少しているのを確認

f:id:stillalive0304:20180802123509p:plain:w400

  • 単語の分散表現を確認

f:id:stillalive0304:20180802123736p:plain:w400

本章で学んだこと

  • 推論ベースの手法は、推測することを目的として、その副産物として単語の分散表現を得られる
  • Word2Vec推論ベースの手法であり、シンプルな2層ニューラルネットワークで構成される
  • Word2Vecには、skip-gramモデルCBOWモデルがある
  • CBOWモデルは複数の単語(コンテキスト)からひとつの単語(ターゲット)を推測する
  • skip-gramモデルに、ひとつの単語(ターゲット)から複数の単語(コンテキスト)を推測する
  • Word2Vec重みの再学習ができるため、単語の分散表現更新追加効率的に行える

引き続き4章では、Word2Vecの問題点を指摘し、"使える"モデルに改善していきます...!!

  

第4章 Word2Vecの高速化(P131~P174)

問題点

  • 大きなコーパスを扱うときに、次の①②の部分で計算量が増える

① 入力層のone-hot表現重み行列の積による計算が重すぎる

対策:重みパラメータから「単語IDに該当する行(ベクトル)」をだけを抜き出すようにする ( = Embeddingレイヤの導入)
  • つまり、Embeddingレイヤに単語の"密な"ベクトル表現(分散表現)が格納される

f:id:stillalive0304:20180802144424p:plain:w400

Lab 06 Recurrent Neural Networks - GPUComputing Sheffield より引用

② 中間層と重み行列の積、およびSoftmaxレイヤの計算が重すぎる

対策多値分類2値分類で近似して計算量を軽くする ( = Negative Samplingの導入)
  • 例) コンテキストが『you』と『goodbye』のとき、
    • ターゲットとなる単語はですか?→『多値分類』
    • ターゲットとなる単語は『say』ですか?→『二値分類』
Negative Samplingの流れ
  • ① 正例をターゲットとした場合の損失を求める
    • Sigmoid with Lossレイヤに正解ラベルとして「1」を入力する
  • ② ①と同時に負例をいくつか(5個とか)サンプリングし、同様に損失を求める
    • Sigmoid with Lossレイヤに正解ラベルとして「0」を入力する
  • ③ 正例と負例の損失を足し合わせ最終的な損失を出力する

f:id:stillalive0304:20180804114049p:plain:w400

Notes from Coursera Deep Learning courses by Andrew Ng より引用

Negative Samplingのサンプリング手法
  • 負の例として多くの単語をカバーするため、高頻出な単語を抜き出す
    • レアな単語はほとんど出現しないため
  • とは言え、レアな単語を"見捨てない”ように、単語の確率分布を0.75乗(3/4乗)する
    • 0.75乗することで、レアな単語の出現確率が少しだけ高くなる
      • =サンプリングされやすくなる

f:id:stillalive0304:20180804115624j:plain:w400

Distributed Representations of Words and Phrases and their Compositio… より引用

問題点対策①②の実装と、改良版での学習と評価

  • CBOWモデルの評価

f:id:stillalive0304:20180804135417p:plain:w200

  • 4題目のbadに対するworseは答えられなかったのは、PTBデータセットが小さかったため
    • 大きなコーパスを対象として学習すれば、より精度が高く、よりロバストな単語の分散表現が得られ、類推問題の正解率も向上する

本章で学んだこと

  • Embeddingレイヤは単語の分散表現を格納し、順伝搬において該当する単語IDのベクトルを抽出する
  • Word2Vecでは語彙数の増加に比例して計算量が増加するので、近似計算を行う高速な手法を使うとよい
  • Negative Sampling負例をいくつかサンプリングする手法であり、これを利用すれば多値分類二値分類として扱うことができる
  • Word2Vecによって得られた単語の分散表現は、単語の意味が埋め込まれたものであり、似たコンテキストで使われる単語は単語ベクトルの空間上で近い位置に位置するようになる
  • Word2Vecの単語の分散表現は、類似問題をベクトルの加算と減算によって解ける性質を持つ
  • Word2Vecは転移学習の点で重要であり、その単語の分散表現は_さまざまな自然処理言語のタスクに利用できる

分散表現すげぇ....発案者のMikolov氏は天才や...。

Word2Vecは革新的技術ですが、まだ"ディープ"ではない。『今のはメラゾーマではない、メラだ』的な*1。ここからいよいよ本題の"ディープ"な技術へ...。

 

第5章 リカレントニューラルネットワーク(RNN)(P175~P221)

ついに、かの有名なRNN登場!キタコレ感。

前章までのフィードフォワード(流れが一方向)タイプのネットワークの問題点

  • 時系列データの性質を十分に学習できない

    • 例)Tom was wathing TV in his room. Mary came into the room. Mary said hi to ??? .
      • 18個のコンテキストを使う学習で、CBOWモデルのコンテキストが10個までだったら、正しく答えられない。
    • CBOWモデルは、単語の並び無視されてしまう

f:id:stillalive0304:20180804143519p:plain:w400

ニューラルネットワークについて より引用

循環するニューラルネットワーク(RNN)

f:id:stillalive0304:20180807120937p:plain:w400

MIRU2018 tutorial より引用

  • ループする経路(閉じた経路)を持ち、隠れ状態を内部に記憶できる

f:id:stillalive0304:20180807121103p:plain:w400

MIRU2018 tutorial より引用

RNNレイヤに対する誤差逆伝播法も行える:BPTT

  • BPTT (Backpropagation Through Time): 時間軸上の逆伝播

f:id:stillalive0304:20180806162148p:plain:w400

【Day-18】時系列のディープラーニング、RNNのまとめとKeras実装 - プロクラシスト より引用

弱点:時間サイズが長くなると逆伝播時の勾配が不安定になる

f:id:stillalive0304:20180804150656p:plain:w400

最近の自然言語処理 より引用

f:id:stillalive0304:20180806163043p:plain:w400

http://akimacho.hatenablog.com より引用

Truncated BPTTで解決!

  • truncatedは「切り取られた」という意味。途中で断ち切る逆伝搬。

f:id:stillalive0304:20180804151409p:plain:w400

Chainerの使い方と自然言語処理への応用 より引用

  • 逆伝播のつながりを一定間隔で断ち切る
    • 順伝播はそのまま変えない

Truncated BPTTのミニバッチ学習

  • 注意点
    • ①データをシーケンシャルに与えること
      • 例)[0~9][500~509] > [10~19][510~519] > ....
    • ②各バッチでデータを与える開始位置をズラすこと

RNNLM(Language Model)の実装、学習と評価

  • RNNLMはWord2Vecの提案者であるMikolov氏によって発案されたもの。

f:id:stillalive0304:20180806170919p:plain:w400

MeCabより高精度?RNNLMの形態素解析器JUMAN++ - DeepAge より引用

またMikolov氏...まさに自然言語処理界の界王....。

パープレキシティ(予測性能の良さ)の評価

  • パープレキシティ:言語モデルの予測性能の良さを評価する指標。最小値は1.0で、1に近いほど性能が良い。

f:id:stillalive0304:20180806172927p:plain:w400 f:id:stillalive0304:20180806173228p:plain:w400 f:id:stillalive0304:20180806173249p:plain:w400

最近の自然言語処理 より引用

PTBデータセット(1000個の単語)を利用したRNNLMの学習

f:id:stillalive0304:20180804152508p:plain:w400

  • 最初は300を超えていたパープレキシティが、最後の方では(最小値の)1に近づいている!

とはいえ、今回は小さい(1000個の)データセットだったので上手くいったにすぎず、現状のモデルでは大きいコーパスだと全く歯が立たないとのこと。

そこで次章ではRNNの改良版として...ついに...かの有名なLSTM登場!wktk

本章で学んだこと

  • RNNはループする経路があり、それによって「隠れ状態」を内部に記憶することができる
  • RNNのループ経路を展開することで、複数のRNNレイヤがつながったネットワークと解釈することができ、通常の逆誤差伝搬法によって学習することができる(=BPTT)
  • 長い時系列データを学習する場合は、適当な長さでデータのまとまりを作りーーこれを「ブロックと言う」ーー、ブロック単位でBPTTによる学習を行う(=Truncated BPTT)
  • Truncated BPTT では逆伝搬のつながりのみを切断する
  • Truncated BPTTでは順伝搬のつながりは維持するため、データは”シーケンシャル”に与える必要がある
  • 言語モデルは、単語の羅列を確率として解釈する
  • RNNレイヤを利用した条件付き言語モデルは、(理論的には)それまで登場した単語の情報を記憶することができる

  

第6章 ゲート付きRNN( LSTM ) (P223~P275)

あの複雑そうなLSTMが果たして理解できるのか...!? いよいよゼロつく②も後半戦...!!

 前章RNNの問題点

f:id:stillalive0304:20180806184748p:plain:w400

Recurrent Neural Networks により引用

時系列データの長期の依存関係をうまく学習できない

  • 勾配消失、または勾配爆発がおきてしまう
    • 理由:重み行列Whの値を規定回数分乗算しているため、データが大きいと乗算回数が多くなり、1より大きいと指数的に増加し、1より小さいと指数的に減少するため。

勾配爆発対策

  • 勾配クリッピング
    • 単純に勾配の最大値を制限する技。例えば、勾配は100は大きすぎるから5にしましょうという超単純な考え。

DeepLearning勉強会 - 講義ノート6 より引用

f:id:stillalive0304:20180806203329p:plain:w400

第2回 メドレー読書会 より引用

勾配消失対策

ゲート付きRNN:LSTM

f:id:stillalive0304:20180807121345p:plain:w400

f:id:stillalive0304:20180807120108p:plain:w400

MIRU2018 tutorial より引用

 LSTMレイヤのインタフェース

情報を保存する記憶セル

f:id:stillalive0304:20180806210322p:plain:w400

Understanding LSTM Networks -- colah's blog より引用

  • RNNで1つだった前セルからの情報伝搬が、隠れ状態ベクトルhのほかに記憶セルcが追加されて2ラインになっている。

f:id:stillalive0304:20180810150836p:plain:w400

ディープラーニングブログ より引用

  • 隠れ状態ベクトルhの方が短期記憶で、記憶セルcが長期記憶だと考える。LSTM(Long short-term memory)は、その名の通り、短期長期を関連させながらも別々のラインで記憶保持している。

LSTM 〜Long Short-Term Memory〜(Vol.18) より引用

  • LSTMレイヤ内だけで完結し、他レイヤへは出力しない。
  • 記憶セルと隠れ状態のセル数は同じ。 (記憶セルの要素数が100なら、隠れ状態の要素数も100)

LSTMで使用するゲート:開くか閉じるかだけでなく、どの割合(0.0~1.0)で開くかをコントロールする

f:id:stillalive0304:20180806215305p:plain

LSTM -- Gateを持つRNN より引用

  • 学習データから自動的にゲートの開き具合を学ばせる
    • LSTMにある3つのゲートでは、ゲートの開き具合をコントロールするための、専用の重みパラメータがあり、学習データによって更新される

f:id:stillalive0304:20180806215406p:plain:w400

LSTM -- Gateを持つRNN より引用

  • ゲートの開き具合を求めるときにsigmoid関数を利用する
    • シグモイド関数σによって、1が全開、0が閉め切りで、例えば0.5なら半開きというゲートで信号の重みコントロールを行っている。

f:id:stillalive0304:20180806215759p:plain:w400

LSTM -- Gateを持つRNN より引用

ゲート① outputゲート

f:id:stillalive0304:20180807121457p:plain:w400

MIRU2018 tutorial より引用

  • 情報を出力するかどうかを制御する
    • 0.0のとき、何も出力しない
    • 1.0のとき、全部出力する
    • 0.0~1.0の間、一部出力する

ゲート② forgetゲート

f:id:stillalive0304:20180807121601p:plain:w400

MIRU2018 tutorial より引用

  • 情報を削除かどうかを制御する
    • 0.0のとき、全部削除する
    • 1.0のとき、何も削除しない
    • 0.0~1.0の間、一部削除する

ゲート③ inputゲート

f:id:stillalive0304:20180807121715p:plain:w400

MIRU2018 tutorial より引用

  • 情報を書き込むかどうかを制御する
    • 0.0のとき、何も書き込まない
    • 1.0のとき、全部書き込む
    • 0.0~1.0の間、一部書き込む

LSTMが勾配消失を起こさない理由

  • LSTMの逆伝播は、記憶セルの「行列の積」ではなく、「要素ごとの積(アダマール積)」であるため、勾配爆発・消失を起こしにくい

f:id:stillalive0304:20180806225346p:plain:w400

LSTM -- Gateを持つRNN より引用

LSTM難しい…、ぐぬぬ...。

参考 : LSTM 〜Long Short-Term Memory〜(Vol.18) のわかりやすい説明

  • 上記ブログでわかりやすくまとめられていました。感謝!

f:id:stillalive0304:20180806222952p:plain

LSTM 〜Long Short-Term Memory〜(Vol.18) より引用

①前セルの出力に記憶ラインが追加(ht-1とCt-1)

②前セルの出力(Recurrent)と入力の合流(ht-1とXt)

  • 前セルの出力ht-1(短期記憶)と今セルの入力Xtが合流する。合流された信号は4つのラインに分岐同一情報コピー)される。

忘却ゲート(ftの出力)

  • 一番上のラインは忘却ゲート。これは、前セルからの長期記憶1つずつに対して、σ(シグモイド関数からでた0~1までの値ft情報取捨選択を行うもの。1は”全て残す”で、0は”全部捨てる”
  • 忘却ゲートにより不要と思われる情報を捨てることで勾配爆発を防ぐ

入力ゲート(Ct'it)

  • 短期記憶ht-1と入力Xtで合算された入力データを長期保存用に変換した上で、どの信号をどのくらいの重みで長期記憶に保存するか制御する。ここは2つのステップで処理。
4-1. tanhによる変換(Ct'を出力)
  • 入ってきた情報をそのまま流すのではなく、要点を絞った端的な形にし、情報量を削減して利用しやすくする。
4-2. 入力ゲート(it)による取捨選択
  • 何も考えずに新しい情報を追加するのではなく、追加する情報の取捨選択を行う。これは別の見方をすると、inputゲートによって重み付けされた情報が新たに追加されるということ。

出力ゲート(otを出力)

  • htは短期記憶の出力。上記のような処理により長期記憶短期記憶が加わって取捨選択された値(長期記憶の出力Ct)の中で、短期記憶に関する部分のみを出力する。
5-1. tanhによる変換
  • tanhの入力は、前セルからの長期記憶Ct-1に入力Xtを変換した短期記憶Ct'を加えたもの。それぞれ忘却ゲートおよび入力ゲートで取捨選択済み。これをそのまま長期記憶として出力するのがCtだが、そこに含まれる短期記憶部分も長期記憶と合わせることによって、短期記憶のみの時より端的で利用しやすいものに変換。
5-2. 短期記憶の取捨選択
  • 次のセルへの悪い情報伝搬を防止する。出力ゲートのσ(シグモイド関数により0から1の範囲でOtが出力され、短期記憶出力htに必要な信号だけを適切に伝搬するように制御。

"長期記憶"、"短期記憶"という言葉で例えるとと、人間っぽくてイメージが湧きやすいっすね!しかし複雑...

参考2: 下ブログでもわかりやすい図でまとめられています。

f:id:stillalive0304:20180807143634p:plain

NIPS2017論文読みメモ: Tensorized LSTM(その1) - クッキーの日記 より引用

あーそーゆーことね、LSTM完全に理解した...(棒)

f:id:stillalive0304:20180807013841p:plain:w200

LINEスタンプ ポプテピピックより引用

ぐぬぬ...使っているうちに理解できる日が来ると信じ...先へ...

LSTMの実装

  • PTBデータセットの訓練データ全てを使ったLSTMによる学習

f:id:stillalive0304:20180807135330p:plain:w400

20分程の学習で、パープテキシティは100を下回る結果に。

これは全然良い結果ではないので、さらなる匠の技を追加すると...!!

LSTMのさらなる改善

  • LSTMレイヤの多層化
  • Dropoutベースの正則化(変分DropoutやDropConnect*2 )
  • 重み共有

LSTMレイヤの多層化

f:id:stillalive0304:20180807141558p:plain:w400

最近の自然言語処理 より引用

Dropoutによる過学習の抑制

f:id:stillalive0304:20180807142546p:plain:w400

  • 時系列方向のDropout(右)では、時間が進むにつれて情報が失われる(ノイズが蓄積する)ため、深さ方向のDropout(左)を考える。

f:id:stillalive0304:20180807142139p:plain:w400

最近の自然言語処理 より引用

  • 変分Dropoutなら深さ方向に加えて時間方向へも適応でき、言語モデルの精度向上をさらに押し上げる。

重み共有

  • EmbeddingレイヤとAffineレイヤの重み共有するテクニック
    • 学習するパラメータを大きく減らすことができ、それでいて精度向上させることができる、一石二鳥のテクニック!

より良いRNNLMの実装

GPUで5時間かかるとのことで、今回はパス

6章むずい~...7章はRNN(LSTM)の実践編..."文章生成"、"seq2seq"へ...!!

本章で学んだこと

  • 単純なRNNの学習では、勾配消失・勾配爆発が問題になる
  • 勾配爆発には勾配クリッピング、勾配消失にはLSTMGRUなどのゲート付きRNNが有効である
  • ゲートには専用の重みがあり、sigmoid関数を使って0.0から1.0までの実数を出力する
  • 言語モデルの改善には、LSTMレイヤの多層化Dropout重み共有などのテクニックが有効である
  • RNNの正則化は重要なテーマであり、Dropoutベースのさまざまな手法が提案されている

   

第7章 RNN( LSTM ) による文章生成(P277~P324)

 RNN( LSTM ) による文章生成

f:id:stillalive0304:20180808123237p:plain:w400

Show and Tell: A Neural Image Caption Generatorの紹介 より引用

前章で改良した『より良いRNNLM』モデルにより文章を生成させる

  • https://www.oreilly.co.jp/pub/9784873118369/BetterRnnlm.pklからpklファイルをダウンロードし、google driveにアップロードしているゼロつく②フォルダ内のch07フォルダにアップロード
  • ch07/generate_better_text.pyをpklファイルのパスを変更して実行
    • → model.load_params('/content/drive/deep-learning-from-scratch-2-master/ch07/BetterRnnlm.pkl') と設定

f:id:stillalive0304:20180808135338p:plain

最初の言葉"you"とor"the meaning of life"から、なんかそれっぽい文章が生成されてきました...これがLSTMのチカラ...

時系列データを別の時系列データに変換するモデルとしてのseq2seq

f:id:stillalive0304:20180810123256p:plain:w400

ディープラーニング入門 ~ 画像処理・自然言語処理について ~ より引用

ここから"seq2seq"、google翻訳やチャットボット*3で使われている技術、を学んでいくと...!!

  • "seq2seq"は時系列データ(sequence)を別の時系列データへ変換する、という意味
  • RNN(LSTM や「シンプルなRNN」やGRU )を2つ組み合わせたもの

f:id:stillalive0304:20180808121746p:plain:w400

Seq2Seqで小説自動生成の学習を失敗した話 - にほんごのれんしゅう より引用

確かに、LSTMが2つつながっていますね...!!

f:id:stillalive0304:20180808143909p:plain:w400

Attention? Attention! より引用

  • エンコーダーは、任意の長さの文章を固定長のベクトルhに変換する
  • デコーダ固定長のベクトルhを受け取り、目的とする文章を生成する(上は英語→中国語翻訳の例)

参考:Ryobotさんのブログ

f:id:stillalive0304:20180810151228p:plain:w400

推論は次のように実行する.

  • 入力文 (one-hot ベクトルの配列) を埋め込み層の行列で埋め込み,エンコーダ LSTM で内部状態 S (最終タイムステップの LSTM 内の cell state と hidden state) に縮約する.
  • S デコーダ LSTM の内部状態にセットし,SOS (Start of Sentence) の埋め込みベクトルをデコーダ LSTM に入力し,予測単語ベクトルを出力する.
  • 予測単語ベクトルとソフトマックス層の行列 (単語ベクトルの配列) の内積から確率分布を生成し,最大確率に対応する単語出力する.
  • 出力した単語を埋め込み,次のタイムステップのデコーダ LSTM に入力し,予測単語ベクトルを出力する.
  • デコーダ LSTM が EOS (End of Sentence) を出力するまでステップ 3 と 4 を繰り返す

ディープラーニングブログ より引用

seq2seqの実装と学習と評価

  • 今回はトイ・プロブレムとして*4、50000個の足し算学習データ例(dataset/addition.txt)を使用する
  • 入力されるデータ系列の長さがバッチ内で異なるので、バッチ内での長さを揃えるためのパディングと、パディングした部分が学習の邪魔にならないようにするマスキングを実装して対処する必要がある

PyTorchのSeq2Seqをミニバッチ化するときに気をつけたこと - 人工知能とか犬とか より引用

パディングとマスキング...CNNで学んだ技術が再び...そして足し算学習データを実際に学習させてみます!

f:id:stillalive0304:20180810124140p:plain:w400

ぐぬぬ...かなり低いですが、seq2seqの正答率は徐々に上昇していますね...このように「昨日より今日、今日より明日」の前進が大事であると感じます...

seq2seqの改良

  • ① 入力データを反転させて学習させる(Reverse)と学習効率が格段にあがる

f:id:stillalive0304:20180810131856p:plain:w400

うおっ、Reverse学習でseq2seqが急に50%正解し始めました...学習の仕方はやはり...コツがある...と!!

f:id:stillalive0304:20180810140535p:plain:w400

ゼロから深層学習を学ぶ方法 - CMS大阪夏祭り2017 より引用

  

  • ② 覗き見(Peeky):重要な情報を複数レイヤで共有させる f:id:stillalive0304:20180810152640p:plain:w400

GitHub - farizrahman4u/seq2seq: Sequence to Sequence Learning with Keras より引用

f:id:stillalive0304:20180810134707p:plain:w400

すげぇ...Peekyを身につけたseq2seqは完全に足し算をマスターしています...!! なんか育成ゲームみたいな楽しさ...!!

f:id:stillalive0304:20180810134446p:plain:w400

スラムダンク 22巻 より引用

seq2seqを用いたアプリケーション

f:id:stillalive0304:20180810144417p:plain:w400

ディープラーニング入門 ~ 画像処理・自然言語処理について ~ より引用

  • 自動要約

f:id:stillalive0304:20180810144532p:plain:w400

ディープラーニング入門 ~ 画像処理・自然言語処理について ~ より引用

  • 画像キャプション

f:id:stillalive0304:20180810144718p:plain:w400 f:id:stillalive0304:20180810144755p:plain:w400

ディープラーニング入門 ~ 画像処理・自然言語処理について ~ より引用

本章で学んだこと

  • RNNを用いた言語モデル新しい文章を生成することができる
  • 文章生成を行う際には、ひとつの単語(もしくは文字)を与え、モデルの出力(確率分布)からサンプリングするという手順を繰り返し行う
  • RNNを2つ組み合わせることで、時系列データを別の時系列データに変換することができる(seq2seq)
  • seq2seqは、Encoderが入力文をエンコードし、そのエンコード情報Decoderが受け取り、デコードして目的の出力文を得る
  • 入力文を反転させること(Reverse)、またエンコード情報をDecoderの複数レイヤに与えること(Peeky)は、seq2seqの精度向上に有効である
  • 機械翻訳チャットボットイメージキャプションなど、seq2seqはさまざまなアプリケーションに利用できる

  

第8章 Attention (P325~P379)

最後はseq2seqを更なる高みへと押し上げる究極奥義..."Attention"...を学びます...!!

seq2seqを更に強力にする「注意機構(attention mechanism)」

f:id:stillalive0304:20180810135905p:plain:w400

[最新版] JSAI2018 チュートリアル「"深層学習時代の" ゼロから始める自然言語処理」 より引用

f:id:stillalive0304:20180810144904p:plain:w400

ディープラーニング入門 ~ 画像処理・自然言語処理について ~ より引用

  • seq2seqには問題点があり、入力分の長さに関わらず、出力が固定長のベクトルである。そのため、必要な情報が収まり切れなくなって溢れちゃう....
  • そこで重要な情報注意(Attention)を向けさせる!

f:id:stillalive0304:20180811184806p:plain:w400

NLP2017 NMT Tutorial より引用

f:id:stillalive0304:20180811213209p:plain

Attentionで拡張されたRecurrent Neural Networks - DeepAge より引用

Attention付きseq2seqへ改良

f:id:stillalive0304:20180811193144p:plain:w400

A Brief Overview of Attention Mechanism – SyncedReview – Medium より引用

f:id:stillalive0304:20180811195111p:plain:w400

最近のDeep Learning (NLP) 界隈におけるAttention事情 より引用

  • Encoderの改良:LSTMレイヤの隠れ状態のベクトルすべて利用する
  • Decoderの改良:
    • Weight Sumレイヤ:Encoderから出力されたhsをすべて活用できるようにする
    • Attention Weightレイヤ:各単語の重要度を表す重み付き和を計算し、コンテキストベクトルを得る

f:id:stillalive0304:20180811190716p:plain:w400 f:id:stillalive0304:20180811191501p:plain:w400

NLP2017 NMT Tutorial より引用

ぐぬぬ...さすが最終章...わけがわからなくなってきました...!! ここでも、使っているうちに理解できると信じて、先へ...

Attention付きseq2seqの実装、学習と評価

それではAttentionつきseq2seqを早速使っていきます...!!

お題:日付フォーマットの変換問題

f:id:stillalive0304:20180811182946p:plain:w400

How to Visualize Your Recurrent Neural Network with Attention in Keras より引用

f:id:stillalive0304:20180811233037p:plain:w400

2エポック目でほとんどすべての問題に正解という驚異の結果...!Attentionつよい...!!(確信)

Attentionの可視化

  • 単語と単語の関連性を見ることができ、モデルの処理ロジックが人間のそれに従っているかを判断することができる

f:id:stillalive0304:20180811234318p:plain:w400 f:id:stillalive0304:20180811234813p:plain:w400

おぉ...キレイに対応関係を結べていますね...Attentionすごい...!!

Attentionに関する残りのテーマ

双方向RNN

f:id:stillalive0304:20180811215128p:plain:w400

論文解説 Google's Neural Machine Translation System: Bridging the Gap between Human and Machine Translation (GNMT) - ディープラーニングブログ より引用

  • 双方向から処理することで、各単語に対する隠れベクトルはバランスのとれた情報がエンコードされる。
  • 実装は簡単

seq2seqの深層化とskipコネクション

  • 層を深くすることで、表現力の高いモデルを作ることができる。
  • skipコネクションを用いることで、層を深くしても勾配が消失(or爆発)せず、良い学習が期待できる

f:id:stillalive0304:20180811215329p:plain:w600

論文解説 Google's Neural Machine Translation System: Bridging the Gap between Human and Machine Translation (GNMT) - ディープラーニングブログ より引用

Attentionの応用

Google Neural Machine Translation (GNMT)

f:id:stillalive0304:20180811215809p:plain:w400

論文解説 Google's Neural Machine Translation System: Bridging the Gap between Human and Machine Translation (GNMT) - ディープラーニングブログ より引用

いつもお世話になっているgoogle翻訳。LSTMレイヤの多層化、skipコネクションなどが見られると...!!

Transformer (機械翻訳の現王者)

f:id:stillalive0304:20180811220338p:plain:w400

論文解説 Attention Is All You Need (Transformer) - ディープラーニングブログ より引用

名前からして怪物ですが、RNNの代わりにSelf-Attentionという技術が使われていると...!!

Neural Turing Machine (NTM)

f:id:stillalive0304:20180811222519p:plain:w400

最近のDeep Learning (NLP) 界隈におけるAttention事情 より引用

人間で言う「紙とペンによる計算」を、Attentionを使って必要な情報をメモリに読み書きさせることで実現してしまう技術...!!

本章で学んだこと

  • 翻訳や音声認識など、ある時系列のデータを別の時系列データに変換するタスクでは、時系列データ間に対応関係が存在することが多くある
  • Attentionは2つの時系列データ間の対応関係をデータから学習する
  • Attentionでは、(ひとつの方法として)ベクトルの内積を使ってベクトル間の類似度を算出し、その類似度を用いた重み付き和ベクトルがAttentionの出力となる
  • Attentionで使用する演算は微分可能であるため、誤差逆伝搬法によって学習ができる
  • Attentionが算出する重み(確率)を可視化することで、入出力の対応関係を見ることができる
  • 外部メモリによるニューラルネットワークの拡張の研究例では、メモリの読み書きAttentionが用いられる

*1:ダイの大冒険 22巻で大魔王バーンが放った台詞。

*2:重み自体をランダムに無視する手法

*3:近年よく見る人工知能を活用した「自動会話プログラム」のこと

*4:機械学習を評価するために作られた簡単な問題

DL4US落ちたので、書籍『ゼロから作るDeeplearning』をやるしかない

はじめに:「ゼロから作るDeep Learning」とは

10万部も売れているディープラーニング界隈では大人気本。 "できるだけ優しい言葉と図解を多用する"というのをモットーとして書かれていて、 数式だらけで難解な本が多い中、初学者にとってはヒジョーにありがたい"神シリーズ"である。 最近、待望の続編である自然言語処理編も満を持して登場した。 元ネタはスタンフォード大の授業CS231n(画像認識のためのCNN)CS224d(自然言語処理のためのディープラーニング)である。

 

利点:ベストセラー本なので先達のまとめブログが多い

ベストセラー本だけあってやはり、ネットを検索するとQiitaやはてなブログ等で多数の実践ブログが上がってくる。 今回は、こうした先人の知恵をパク...『転移学習』することで、自分の知見を深めることを目的とした。

qiita.com yusuke-ujitoko.hatenablog.com

今回は上記の2エントリを参考にさせて頂きました。感謝!

 

第1章 Python入門(P1~P20 : 10分)

まずはpython入門みたいな感じ。流し読み。

本章で学んだこと

 

第2章 パーセプトロン(P21~P37 : 15分)

シグモイド関数のような__非線形関数__で変換すれば、任意の関数を表現できると。 これも導入でよくある内容で流し読み。

f:id:stillalive0304:20180728125106p:plain https://qiita.com/ruka38/items/2f2f958c1d45728ea577 パーセプトロンからはじめる分類問題より引用

本章で学んだこと

 

第3章 ニューラルネットワーク(P39~p82 : 31分)

まずは順伝搬の説明。よく見るMNISTデータセットを用いた画像認識の例。 aidemyや石川氏の本で読んだ気がするので流し読み。

人工知能プログラミングのための数学がわかる本

人工知能プログラミングのための数学がわかる本

本章で学んだこと

  • ニューラルネットワークでは,活性化関数としてシグモイド関数ReLU関数のような滑らかに変化する関数を利用する
  • NumPyの多次元配列をうまく使うことで,ニューラルネットワークを効率よく実装することができる
  • 機械学習の問題は,回帰問題分類問題に大別できる
  • 出力層で使用する活性化関数は,回帰問題では恒等関数分類問題ではソフトマックス関数を一般的に利用する
  • 分類問題では,出力層のニューロンの数分類するクラス数に設定する
  • 入力データのまとまりをバッチと言い,バッチ単位で推論処理を行うことで計算を高速に行うことができる.

  

第4章 ニューラルネットワークの学習(P83~P122 : 30分) 

ここら辺も導入でよくある概念の説明で流し読み。pythonコードの説明が詳しい。

ニューラルネットワークの学習アルゴリズム

  • 前提
    • ニューラルネットワークには適応可能な重みとバイアスがあり,この重みとバイアスを訓練データに適応するように調整することを学習と呼ぶ.
  • ①ミニバッチ
    • 訓練データの中からランダムに一部のデータを選び出す
  • ②勾配の算出
    • ミニバッチの損失関数を減らすために,各重みパラメータの勾配を求める
  • ③パラメータの算出
    • 重みパラメータを勾配方向に微小量だけ更新する
  • ①~③を繰り返す

    確率的勾配降下法(stochastic gradient descent)

    • 確率的に無作為に選びだしたデータ(ミニバッチ)を使って,パラメータを更新する
    • SGDと略される

本章で学んだこと

  • 機械学習で使用するデータセットは,訓練データテストデータに分けて使用する
  • 訓練データ学習を行い,学習したモデルの汎化能力テストデータで評価する
  • ニューラルネットワークの学習は,損失関数を指標として,損失関数の値が小さくなるように,重みパラメータを更新する
  • 重みパラメータを更新する際には,重みパラメータの勾配を利用して,勾配方向に重みの値を更新する作業を繰り返す
  • 微小な値を与えたときの差分によって微分を求めることを数値微分という
  • 数値微分によって,重みパラメータの勾配を求めることができる
  • 数値微分による計算には時間がかかるが,その実装は簡単である.一方,次章で実装するやや複雑な誤差逆伝播は,高速に勾配を求めることができる.

  

第5章 誤差逆伝播法(P123~P164 : 40分)

この章の内容は、p.123に言及があるスタンフォードのCS231n授業や、また本シリーズ②の第1章でも再度説明がある。

ゼロから作るDeep Learning ? ―自然言語処理編

ゼロから作るDeep Learning ? ―自然言語処理編

本章で学んだこと

  • 計算グラフを用いれば,計算過程を視覚的に把握することができる
  • 計算グラフのノードは局所的な計算によって構成される.局所的な計算が全体の計算を構成する.
  • 計算グラフの順伝播は,通常の計算を行う.一方,計算グラフの逆伝播によって,各ノードの微分を求めることができる.
  • ニューラルネットワークの構成要素をレイヤとして実装することで,勾配の計算を効率的に求めることができる.
  • 数値微分誤差逆伝播法の結果を比較することで,誤差逆伝播法の実装に誤りがないことを確認できる.

 

第6章 学習に関するテクニック(P165~P203 : 121分)

f:id:stillalive0304:20180728171803p:plain

冒頭で、冒険家のたとえ話から。

目隠しをした冒険家が最も『深き場所』へたどり着くための手段=最適化手法について。 今いる場所で一番傾斜がきつい方向へ進もうとする、前章の確率的勾配法(SGD)には欠点があった。

  • SGDの欠点
    • ジグザグな動きで、問題によっては非効率
    • 関数の形状が等方的でないと,勾配が最小値を指さない.

そこで、SGDの欠点を改善する手法として,_Momentum, AdaGrad, RMSProp, Adam_といった手法が開発されていると。

f:id:stillalive0304:20180728170204p:plain:w400

パラメータ更新手法の選択

f:id:stillalive0304:20180728195203p:plain

Momentum

  • Momentum : 運動量のこと
  • 前の更新を保存し,慣性力が働くようにする
  • ボールがお椀を転がるような動きでなめらか

AdaGrad

  • Adaptive(適応的)のAda、つまり『適応的』勾配
  • パラメータの要素ごとに、学習係数を過去のすべての勾配の2乗和で割って減衰させていく
  • 無限の学習を行うと更新量が0になってしまう欠点がある
    • そこで開発されたのがRMSProp
      • AdaGradにおいて,過去の更新における勾配を徐々に忘れるようにするもの

Adam

  • MomentumAdaGrad融合(フュージョン
    • Momentum -ボールがお椀を転がるように物理法則に準じる動きを再現
    • AdaGrad
      • パラメータの要素ごとに,『適応的』に更新ステップを調整

AdamW

ドラゴンボール世代がフュージョンと聞くと_最強_のイメージですが、 やはり更なる上(スーパーAdam的なAdamW)があるようですね...

f:id:stillalive0304:20180728171640j:plain:w200

ドラゴンボール より

  

初期パラメータの選択

Weight decay

  • 重みの値を小さくすることで、過学習を抑え、汎化性能を高めるテクニック
  • 重みを小さくしたいのであれば、初期値もできるだけ小さい値でスタートしたいと思うのが当然

とはいえ、重みの初期値を0にしてはいけない

  • 重みが均一になってしまうと,重みを持つ意味がなくなるため

重みの初期値のベストプラクティス

  • 活性化関数にReLUを使う場合は「Heの初期値」
    • 前層のノード数がnのとき,sqrt(1/n)の標準偏差を持つ分布を使用する
  • sigmoidtanhなどのS字カーブの時は「Xavierの初期値」
    • 前奏のノード数がnのとき,sqrt(2/n)の標準偏差を持つ分布を使用する

f:id:stillalive0304:20180728200652p:plain:w400

  • std=0.01の場合は全く学習が進んでいおらず、He、Xavierの際にスムーズに学習が進んでいる
    • 重みの初期値はとても重要

  

Batch Normalization

各層のアクティベーションの分布が適度な広がりを持つように”強制的”アクティベーションの調整を行う

Batch Normalizationの利点
  • 学習を早く進行させることができる(学習係数大きくすることができる)
  • 初期値にそれほど依存しない(初期値に対してそこまで神経質にならなくて良い)
  • 過学習を抑制する(Dropoutなどの必要性を減らす)

f:id:stillalive0304:20180728201912p:plain

  • データ分布の正規化(平均が0、分散が1の分布)を行うレイヤ(Batch Normalizationレイヤ) をニューラルネットワークに挿入し、各ミニバッチごとに正規化する

  

正則化

過学習が起きる原因

  • パラメータ大量に持ち,表現力の高いモデルであること
  • 訓練データ少ないこと

Weight decay

  • 大きな重みを持つことにペナルティを課す

dropout

  • ニューロンをランダムに消去ながら学習する
    • 訓練時
      • データが流れるたびに,消去するニューロンをランダムに選択する
    • テスト時
      • すべてのニューロンの信号を伝達するが,ニューロンの出力に対して,訓練時に消去した割合を乗算して出力する

f:id:stillalive0304:20180728203952p:plain:w300

  

ハイパーパラメータの検証

  • ハイパーパラメータの例

    • ニューロンの数
    • バッチサイズ
    • パラメータ更新の学習係数
    • Weight decay
  • ハイパーパラメータの性能をテストデータを使って評価してはいけない

    • テストデータに対して過学習してしまう
    • ハイパーパラメータ専用の検証データ(validation data)が必要
  • ハイパーパラメータの最適化のステップ

    1. ハイパーパラメータの範囲を設定する
    2. 設定されたハイパーパラメータの範囲から,ランダムにサンプリングする
    3. ハイパーパラメータの値を使用して学習を行い,検証データで認識精度を評価する
    4. 2と3を繰り返し,認識精度の結果からハイパーパラメータの範囲を狭める

6章からが本番だと前述のQiitaの記事に書いてありました。

6章~7章が本書の核のようで、内容が濃く充実していますね!

本章で学んだこと

  • パラメータの更新方法には,SGDの他に有名なものとして,MomentumやAdaGrad,Adamなどの手法がある.
  • 重みの初期値の与え方は,正しい学習を行う上で非常に重要である.
  • 重みの初期値として,「Xavierの初期値」「Heの初期値」などが重要である.
  • Batch Normalizationを用いることで,学習を速く進めることができ,また,初期値に対してロバストになる.
  • 過学習を抑制するための正則化の技術として,Weight decayDropoutがある.
  • ハイパーパラメータの探索は,良い値が存在する範囲を徐々に絞りながら進めるのが効率の良い方法である.

  

第7章 第7章 畳み込みニューラルネットワーク(P205~P239 : 120分)

この章は下エントリに、図解ありで非常に詳しくまとまっていました。以下抜粋。

qiita.com

全体の構造

f:id:stillalive0304:20180728232550p:plain

  • これまでの全結合層
    • [Affine, ReLU]を繰り返し,最後に[Affine,Softmax]

f:id:stillalive0304:20180728232625p:plain

  • CNN
    • [Conv, ReLU, (Pooling)]を繰り返し,最後の方で[Affine, ReLU], 最後に[Affine, Softmax]

全結合層の問題点

  • 入力データの形状無視されてしまう点

    • たとえば画像の場合,縦・横・チャンネルの3方向を盛っているが,全結合相に入力するときは3次元を1次元にする必要がある.形状には大切な空間情報が含まれているはず.
    • すべての入力データを同等のニューロンとして扱う.
  • 畳み込み層(convolutionレイヤ)では形状を維持する.

    • 畳み込み層の入出力データを特徴マップ(feature map)
    • 入力データを入力特徴マップ(input feature map)
    • 出力データを出力特徴マップ(output feature map)

畳み込み演算

f:id:stillalive0304:20180728234000p:plain

  • 画像処理でいうところ「フィルター処理」に相当
  • 「フィルター」はカーネルとも言う
  • フィルターのパラメータは全結合のニューラルネットワークにおける「重み」に対応 f:id:stillalive0304:20180728234327p:plain
  • 上図はフィルター処理にバイアスを加えたもの

パディング(padding)

  • 入力データの周囲に固定のデータを埋める
    • 出力サイズを調整するため f:id:stillalive0304:20180728234553p:plain

ストライド(stride)

  • フィルターを適用する位置の間隔のこと f:id:stillalive0304:20180728234639p:plain

プーリング層

  • プーリングは縦・横方向の空間を小さくする演算
    • プーリングの種類は色々ある
      • Maxプーリング : 領域内の最大値を取る

f:id:stillalive0304:20180728234932p:plain

   - Averageプーリング : 領域内の平均値をとる
  • プーリング演算によってチャネル数は変化しない
  • 微小な位置変化に対してロバスト

f:id:stillalive0304:20180729212029p:plain

 

重みの可視化

f:id:stillalive0304:20180729214253p:plain

  • AlexNetでは、最初の層は単純なエッジに反応し、続いてテクスチャに反応し、そしてより複雑な物体のパーツへと反応

    • Cov1:エッジ、ブロブ(Edge+Blob)
    • Cov3:テキスチャ(Texture)
    • Cov5:物体のパーツ(Object Parts)
    • Fc8:犬や猫などの物体のクラス(Object Classes)
  • 層が深くなるに連れて、ニューロン単純な形状から"高度"な情報へと変化

  • モノの「意味」を理解するように、反応する対象が変化していく

  

代表的なCNN

  • LeNet(1998)

    • 約20年前に提案された初めてのCNN
    • 活性化関数は_シグモイド関数
    • Pooling層はサブサンプリング
  • AlexNet(2012) : ディープラーニングブームの火付け役

    • LeNetと大きな構造は変わらないが、
      • LeNetにおける活性化関数をReLUとした
      • LRN(Local Response Normalization)層という局所的正規化を用いた
      • Dropoutを使用した

  

本章で学んだこと

  • CNNは、これまでの全結合層のネットワークに対して、畳み込み層プーリング層が新たに加わる
  • 畳み込み層とプーリング層は、im2col(画像を行列に展開する関数)を用いるとシンプルで効率の良い実装ができる
  • CNNの可視化によって、層が深くなるにつれて高度な情報が抽出されていく様子が分かる
  • CNNの代表的なネットワークには、LeNetAlexNetがある
  • ディープラーニングの発展に、ビッグデータGPUが大きく貢献している

  

第8章 ディープラーニング(P241~P273 : 61分)

こちらのエントリが詳しいです。以下抜粋。

qiita.com

認識精度を高めるには

Data Augumentation(データ拡張)

  • 回転縦横移動をさせて画像データを増幅する

層を深くする

  • フィルタを小さくでき、パラメータが減る
    • 階層的に情報を抽出することで学習が効率化する
  • ReLUなどの活性化関数を畳み込み層の間に挟めるので、非線形化できるため、複雑な表現が可能となる

有名なCNNアーキテクチャ

VGG (2014年2位)

f:id:stillalive0304:20180729224525p:plain

  • CNNのネットワークを深くしたものをVGGという
  • 重みの初期値にHeの初期値、重みパラメーターの更新にAdamを使う
  • 後段の全結合層では、Dropoutレイヤを使う
  • 画像認識度は高く、誤認識率も低いネットワークを構成できる

GoogLeNet(2014年1位)

f:id:stillalive0304:20180729230709p:plain - ネットワークが縦方向の深さだけでなく、横方向にも深さを持っている(インセプション構造)

ResNet (ついにエラー率で人を超える)

f:id:stillalive0304:20180729230229p:plain 畳み込みニューラルネットワークの研究動向より引用

f:id:stillalive0304:20180729230849p:plain

  • 層を深くできるような仕掛けとして「スキップ構造」をもつ
  • スキップ構造
    • 入力データの畳み込み層をまたいで出力に合算する構造
    • 逆伝播の際に、スキップ構造によって信号が減衰せずに伝わり、学習が効率的に進む

  

ディープラーニングの高速化

  • GPUによる高速化
  • 分散学習
  • 演算精度のビット削減
    • 通常の64ビットや32ビットの浮動小数点数ではなく、16ビットの半浮動小数点数を使う
      • Google TPU8ビットの計算ユニットで計算を行う
      • 最近では重みや中間データを1ビットで表現する手法も提案されている

  

ディープラーニングの実用例

物体検出

f:id:stillalive0304:20180729232032p:plain

  • 画像から物体の種類と位置を特定するクラス分類問題
  • CNNをベースとした手法が多く,R-CNN,さらにはFaster R-CNNが有名

セグメンテーション

f:id:stillalive0304:20180729232158p:plain

  • 画像に対するピクセルレベルでのクラス分類問題
  • FCN(Fully Convolutional Network)というすべてがConvolution層からなるネットワークが使われる

画像キャプション生成

f:id:stillalive0304:20180729232338p:plain

  • 画像を入力すると,その説明文を出力する問題
  • 代表的な方法はNIC(Neural Image Caption)を呼ばれ,画像を理解するでディープなCNNと自然言語を扱うRNNから構成される.
  • CNNが画像から特徴を抽出し,RNNに初期値としてそれを渡す.そこからRNNは再帰的に文章を生成する

画像スタイル変換

f:id:stillalive0304:20180729232516p:plain

  • スタイル画像とコンテンツ画像の2つの画像を入力することで,新しい画像を生成する.
  • ネットワークの中間データがコンテンツ画像の中間データに近くなるように,かつスタイル画像から抽出したスタイル行列のズレも小さくなるように学習を行う

画像生成

f:id:stillalive0304:20180729232719p:plain

  • DCGAN(Deep Convolutional Generative Adversarial Network)
  • GeneratorとDiscriminatorという2つのニューラルネットワークを用い,前者が本物そっくりの偽物を作り,後者がそれが本物か否かを判定することを競争的に繰り返し,お互いに学習を進める

自動運転

f:id:stillalive0304:20180729232906p:plain

  • CNNベースのSegNetは走路環境のセグメンテーションを高精度で行う

Deep Q-Network

f:id:stillalive0304:20180729233517p:plain www.youtube.com

  • DQNは、動作に対する価値観数をCNNで近似することで、画像に対しての動作を最適化する学習を行う

本章で学んだこと

画像認識はfast.aiでもやっていたので駆け足で学習しました。引き続き、自然言語処理編の②へ!