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翻訳で何となく意味は汲み取れる気がします。スローペースですが前に進めていきます...海外の偉大な先人たちに感謝しつつ...
DL4US落ちたので、書籍『ゼロから作るDeeplearning②―自然言語処理編』をやるしかない
ゼロつく②やるしかない...!!
- 「ゼロから作るDeep Learning②」とは
- 第3章 Word2Vec(P93~P129)
- 第4章 Word2Vecの高速化(P131~P174)
- 第5章 リカレントニューラルネットワーク(RNN)(P175~P221)
- 第6章 ゲート付きRNN( LSTM ) (P223~P275)
- 第7章 RNN( LSTM ) による文章生成(P277~P324)
- 第8章 Attention (P325~P379)
「ゼロから作るDeep Learning②」とは
ゼロから作るDeep Learning ? ―自然言語処理編
- 作者: 斎藤康毅
- 出版社/メーカー: オライリージャパン
- 発売日: 2018/07/21
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (3件) を見る
10万部も売れているベストセラー本『ゼロから作るDeep Learning』の第2段。 "できるだけ優しい言葉と図解を多用する"というのをモットーとして書かれていて、 数式だらけで難解な本が多い中、初学者にとってはヒジョーにありがたい"神シリーズ"である。
最近、待望の続編である自然言語処理編が満を持して登場した。 元ネタはスタンフォード大の授業CS231n(画像認識のためのCNN)、CS224d(自然言語処理のためのディープラーニング)である。
7/20新刊『ゼロから作るDeep Learning ❷――自然言語処理編』O'Reilly Japan(978-4-87311-836-9)斎藤康毅 著◆「O'Reilly」棚にて展開中!『ゼロから作るDeep Learning』の続編。やさしい言葉で分かりやすくをモットーに、高度に見える技術の裏側をじっくり説明し、実際に作ることで理解を深めます。 pic.twitter.com/2dw0Rzc7VS
— 書泉ブックタワーコンピュータ書売り場 (@shosen_bt_pc) 2018年7月20日
今作もロングセラー間違いなしっすね!!
準備 : 無料GPUのgoogle colab上で実行する
こちらのエントリを参考に。 qiita.com forhighlow0.hatenablog.com
- 本書GitHubサイト からdeep-learning-from-scratch-2-master をフォルダーごとダウンロードし、zipファイル解凍後、google driveにアップロードします。
- google colabのノートブックを新規作成して、「Python3」のノートブックを作成します。
- 編集 > ノートブックの設定 > ハードウェア アクセラレータ でGPUに設定。
エントリ通り、下のコードをコピペして実行します。
!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
誰でも無料でディープラーニングできる時代...凄すぎる!!
「ゼロから作る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が正しく出力されれば成功です。
以降、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)
まずは前作の復習から。さらっと流し読み。
ニューラルネットワークを用いると複雑な表現が可能になり、例え「渦巻き」のような複雑なパターンでも分離することができると。
本章で学んだこと
- ニューラルネットワークは、入力層、隠れ層、出力層を持つ
- 全結合層によって線形な変換が行われ、活性化関数によって非線形な変換が行われる
- 全結合層やミニバッチ処理は、行列としてまとめて計算することができる
- 誤差逆伝搬法を使って、効率的にニューラルネットワークの損失に関する勾配を求めることができる
- ニューラルネットワークで行う処理は、計算グラフによって可視化することができ、順伝搬や逆伝搬の理解に役立つ
- ニューラルネットワークの実装では、構成要素を「レイヤ」としてモジュール化することで、組み立てが容易になる
- ニューラルネットワークの高速化において、データのビット精度とGPUによる並列計算が重要である
とりあえず、ニューラルネットワークは凄いと...φ(。。)
第2章 自然言語と単語の分散表現(P57~P92)
ここから本題の"自然言語処理"に入っていきます...!!
ここからはAmazonのレビューのKyleさんのメモを参考に。感謝!
自然言語処理
- 『単語の意味』をコンピュータに理解させることがテーマ
- 本章と次章では次の3つの手法を見ていく
- ① シソーラスによる手法 : 人の手によって作られた類語辞書を利用
- ② カウントベースの手法 : 統計情報から単語を表現(コーパスを利用)
- ③ 推論ベースの手法 : ニューラルネットワークによる推論(word2vecと呼ばれる)
①シソーラスによる手法
IBM Knowledge Center より引用
- 単語の上位/下位関係、部分/全体関係などによって単語を分類し、体系づけた類語辞書。
WordNet
- もっとも有名なシソーラス
Word2Vec:発明した本人も驚く単語ベクトルの驚異的な力 - DeepAge より引用
シソーラスの問題点
- 時代の変化に対応するのが困難!
- 人の作業コストが高い!
- 単語の細かなニュアンスを表現できない!
②カウントベースの手法
- 「単語の意味は、周囲の単語によって形成される」という仮説に基づき、着目した単語の周囲の単語の頻度をカウントし、集計する手法。
CS224d Lecture2スライド より引用
カウントベースの手法の改善
①相互情報量(PMI)の調整
- 例えば、英語の特性で冠詞(the)と単語(car)の頻度が高い場合、他の単語(driveなど)の方を優先させる調整
②特異値分解(SVD)による次元削減
- ベクトルの次元を("重要な情報"をできるだけ残すように)削減して、ロバスト性(頑健性)を高める。
30分でわかる機械学習用語「次元削減(Dimensionality Reduction)」 より引用
各改善点などの実装(PTBデータセットを例に)
- cos_similarity() : ベクトル間の類似度(コサイン類似度)を計測するための関数
- most_similar() : 類似単語のランキングを表示する関数
SVDは結構時間がかかっていました... ここでは"時間がかかる"というのを体験させる意味合いなのカモ。
本章で学んだこと
- WordNetなどのシソーラスを利用して、類義語の取得や単語間の類似度の計測など有用なタスクを行うことができる
- シソーラスを用いる手法には、シソーラスを作製する人の作業量や新しい単語への対応などの問題がある
- 現在では、コーパスを利用して単語をベクトル化するアプローチが主流である
- 近年の単語ベクトル化の手法では、「単語の意味は、周囲の単語によって形成される」という分布仮説に基づくものがほとんどである
- カウントベースの手法は、コーパス内の各単語に対して、その単語の周囲の単語の頻度をカウントし集計する(=共起行列)
- 共起行列をPPMI行列に変換し、それを次元削減することで、巨大な疎のベクトルを小さな「密なベクトル」へ変換することができる
- 単語のベクトル空間では、意味的に近い単語はその距離が近くなることが期待される
2章は次のword2vecへの"前振り"っすね。
第3章 Word2Vec(P93~P129)
名前の通り、word(単語)をvector(ベクトル)にします。
推論ベースの手法(Word2Vec)の利点
カウントベース(SVD)の手法の問題点
- 大規模なコーパスを使う場合、語彙数*語彙数の巨大な行列を作る必要がある。計算量的に現実的でない!
推論ベース(Word2Vec:ニューラルネットワークによる推論)の利点
- 推論ベースでは、少量(ミニバッチ)ごとに重みを繰り返し更新して学習が出来る。(逐次学習が可能)
- 推論ベースでは、単語の意味を的確にとらえたベクトル表現=単語の「分散表現」を可能にする。
Word2Vecを用いた類義語の抽出が上手く行ったので、分析をまとめてみた より引用
- 分散表現 : 単語の意味を的確にとらえた"密な"ベクトル表現
イメージ図:単語の分散表現により抽象的な意味を表現できる
Word2Vec:発明した本人も驚く単語ベクトルの驚異的な力 - DeepAge より引用
例:「king -man + woman=queen」の問題が解ける!
word2vec King-Queen composition | the morning paper より引用
参考:自然言語処理を学ぼう #3 word2vec 理論編(田中TOMさんのyoutube動画)
Word2Vecのアルゴリズム(CBOWモデル、skip-gramモデル)
- CBOWモデル
- 前後の単語(文脈)から、現在の単語を推測する。
Word2Vec:発明した本人も驚く単語ベクトルの驚異的な力 - DeepAge より引用
- skip-gramモデル
- 現在の単語から、前後の単語(文脈)を推測する。
Word2Vec:発明した本人も驚く単語ベクトルの驚異的な力 - DeepAge より引用
- イメージ図:CBOWモデルとskip-gramモデルは逆の関係
Word Embeddings - word2vec - Mubaris' Blog より引用
- CBOWモデル vs skip-gramモデル
言語と画像の表現学習 より引用
シンプルなWord2Vecの実装と学習と評価
- 学習回数(~1000 epoch)を重ねるごとに損失が減少しているのを確認
- 単語の分散表現を確認
本章で学んだこと
- 推論ベースの手法は、推測することを目的として、その副産物として単語の分散表現を得られる
- Word2Vecは推論ベースの手法であり、シンプルな2層のニューラルネットワークで構成される
- Word2Vecには、skip-gramモデルとCBOWモデルがある
- CBOWモデルは複数の単語(コンテキスト)からひとつの単語(ターゲット)を推測する
- skip-gramモデルは逆に、ひとつの単語(ターゲット)から複数の単語(コンテキスト)を推測する
- Word2Vecは重みの再学習ができるため、単語の分散表現の更新や追加が効率的に行える
引き続き4章では、Word2Vecの問題点を指摘し、"使える"モデルに改善していきます...!!
第4章 Word2Vecの高速化(P131~P174)
問題点
- 大きなコーパスを扱うときに、次の①②の部分で計算量が増える
① 入力層のone-hot表現と重み行列の積による計算が重すぎる
対策:重みパラメータから「単語IDに該当する行(ベクトル)」をだけを抜き出すようにする ( = Embeddingレイヤの導入)
- つまり、Embeddingレイヤに単語の"密な"ベクトル表現(分散表現)が格納される
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」を入力する
- ③ 正例と負例の損失を足し合わせ、最終的な損失を出力する
Notes from Coursera Deep Learning courses by Andrew Ng より引用
Negative Samplingのサンプリング手法
- 負の例として多くの単語をカバーするため、高頻出な単語を抜き出す
- レアな単語はほとんど出現しないため
- とは言え、レアな単語を"見捨てない”ように、単語の確率分布を0.75乗(3/4乗)する
- 0.75乗することで、レアな単語の出現確率が少しだけ高くなる
- =サンプリングされやすくなる
Distributed Representations of Words and Phrases and their Compositio… より引用
問題点対策①②の実装と、改良版での学習と評価
- CBOWモデルの評価
- 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モデルは、単語の並びが無視されてしまう
ニューラルネットワークについて より引用
循環するニューラルネットワーク(RNN)
MIRU2018 tutorial より引用
- ループする経路(閉じた経路)を持ち、隠れ状態を内部に記憶できる
MIRU2018 tutorial より引用
- RNNレイヤを展開すると、複数のニューラルネットワークが繋がった状態とみなすことができる。
RNNレイヤに対する誤差逆伝播法も行える:BPTT
- BPTT (Backpropagation Through Time): 時間軸上の逆伝播
【Day-18】時系列のディープラーニング、RNNのまとめとKeras実装 - プロクラシスト より引用
弱点:時間サイズが長くなると逆伝播時の勾配が不安定になる
最近の自然言語処理 より引用
http://akimacho.hatenablog.com より引用
Truncated BPTTで解決!
- truncatedは「切り取られた」という意味。途中で断ち切る逆伝搬。
- 逆伝播のつながりを一定間隔で断ち切る。
- ※順伝播はそのまま変えない
Truncated BPTTのミニバッチ学習
- 注意点
- ①データをシーケンシャルに与えること
- 例)[0~9][500~509] > [10~19][510~519] > ....
- ②各バッチでデータを与える開始位置をズラすこと
RNNLM(Language Model)の実装、学習と評価
- RNNLMはWord2Vecの提案者であるMikolov氏によって発案されたもの。
またMikolov氏...まさに自然言語処理界の界王....。
パープレキシティ(予測性能の良さ)の評価
- パープレキシティ:言語モデルの予測性能の良さを評価する指標。最小値は1.0で、1に近いほど性能が良い。
最近の自然言語処理 より引用
PTBデータセット(1000個の単語)を利用したRNNLMの学習
- 最初は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の問題点
Recurrent Neural Networks により引用
時系列データの長期の依存関係をうまく学習できない
- 勾配消失、または勾配爆発がおきてしまう
- 理由:重み行列Whの値を規定回数分乗算しているため、データが大きいと乗算回数が多くなり、1より大きいと指数的に増加し、1より小さいと指数的に減少するため。
勾配爆発対策
- 勾配クリッピング
- 単純に勾配の最大値を制限する技。例えば、勾配は100は大きすぎるから5にしましょうという超単純な考え。
第2回 メドレー読書会 より引用
勾配消失対策
ゲート付きRNN:LSTM
MIRU2018 tutorial より引用
LSTMレイヤのインタフェース
情報を保存する記憶セル
Understanding LSTM Networks -- colah's blog より引用
- RNNで1つだった前セルからの情報伝搬が、隠れ状態ベクトルhのほかに記憶セルcが追加されて2ラインになっている。
ディープラーニングブログ より引用
- 隠れ状態ベクトルhの方が短期記憶で、記憶セルcが長期記憶だと考える。LSTM(Long short-term memory)は、その名の通り、短期と長期を関連させながらも別々のラインで記憶保持している。
LSTM 〜Long Short-Term Memory〜(Vol.18) より引用
LSTMで使用するゲート:開くか閉じるかだけでなく、どの割合(0.0~1.0)で開くかをコントロールする
LSTM -- Gateを持つRNN より引用
- 学習データから自動的にゲートの開き具合を学ばせる
- LSTMにある3つのゲートでは、ゲートの開き具合をコントロールするための、専用の重みパラメータがあり、学習データによって更新される
LSTM -- Gateを持つRNN より引用
LSTM -- Gateを持つRNN より引用
ゲート① outputゲート
MIRU2018 tutorial より引用
- 情報を出力するかどうかを制御する
- 0.0のとき、何も出力しない
- 1.0のとき、全部出力する
- 0.0~1.0の間、一部出力する
ゲート② forgetゲート
MIRU2018 tutorial より引用
- 情報を削除かどうかを制御する
- 0.0のとき、全部削除する
- 1.0のとき、何も削除しない
- 0.0~1.0の間、一部削除する
ゲート③ inputゲート
MIRU2018 tutorial より引用
- 情報を書き込むかどうかを制御する
- 0.0のとき、何も書き込まない
- 1.0のとき、全部書き込む
- 0.0~1.0の間、一部書き込む
LSTMが勾配消失を起こさない理由
- LSTMの逆伝播は、記憶セルの「行列の積」ではなく、「要素ごとの積(アダマール積)」であるため、勾配爆発・消失を起こしにくい。
LSTM -- Gateを持つRNN より引用
LSTM難しい…、ぐぬぬ...。
参考 : LSTM 〜Long Short-Term Memory〜(Vol.18) のわかりやすい説明
- 上記ブログでわかりやすくまとめられていました。感謝!
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: 下ブログでもわかりやすい図でまとめられています。
あーそーゆーことね、LSTM完全に理解した...(棒)
LINEスタンプ ポプテピピックより引用
ぐぬぬ...使っているうちに理解できる日が来ると信じ...先へ...
LSTMの実装
- PTBデータセットの訓練データ全てを使ったLSTMによる学習
20分程の学習で、パープテキシティは100を下回る結果に。
これは全然良い結果ではないので、さらなる匠の技を追加すると...!!
LSTMのさらなる改善
LSTMレイヤの多層化
最近の自然言語処理 より引用
Dropoutによる過学習の抑制
- 時系列方向のDropout(右)では、時間が進むにつれて情報が失われる(ノイズが蓄積する)ため、深さ方向のDropout(左)を考える。
最近の自然言語処理 より引用
- 変分Dropoutなら深さ方向に加えて時間方向へも適応でき、言語モデルの精度向上をさらに押し上げる。
重み共有
- EmbeddingレイヤとAffineレイヤの重みを共有するテクニック
- 学習するパラメータを大きく減らすことができ、それでいて精度を向上させることができる、一石二鳥のテクニック!
より良いRNNLMの実装
GPUで5時間かかるとのことで、今回はパス
6章むずい~...7章はRNN(LSTM)の実践編..."文章生成"、"seq2seq"へ...!!
本章で学んだこと
第7章 RNN( LSTM ) による文章生成(P277~P324)
RNN( LSTM ) による文章生成
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') と設定
最初の言葉"you"とor"the meaning of life"から、なんかそれっぽい文章が生成されてきました...これがLSTMのチカラ...
時系列データを別の時系列データに変換するモデルとしてのseq2seq
ここから"seq2seq"、google翻訳やチャットボット*3で使われている技術、を学んでいくと...!!
- "seq2seq"は時系列データ(sequence)を別の時系列データへ変換する、という意味
- RNN(LSTM や「シンプルなRNN」やGRU )を2つ組み合わせたもの
確かに、LSTMが2つつながっていますね...!!
参考:Ryobotさんのブログ
推論は次のように実行する.
- 入力文 (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)を使用する
- 入力されるデータ系列の長さがバッチ内で異なるので、バッチ内での長さを揃えるためのパディングと、パディングした部分が学習の邪魔にならないようにするマスキングを実装して対処する必要がある
パディングとマスキング...CNNで学んだ技術が再び...そして足し算学習データを実際に学習させてみます!
ぐぬぬ...かなり低いですが、seq2seqの正答率は徐々に上昇していますね...このように「昨日より今日、今日より明日」の前進が大事であると感じます...
seq2seqの改良
- ① 入力データを反転させて学習させる(Reverse)と学習効率が格段にあがる
うおっ、Reverse学習でseq2seqが急に50%正解し始めました...学習の仕方はやはり...コツがある...と!!
- ② 覗き見(Peeky):重要な情報を複数レイヤで共有させる
GitHub - farizrahman4u/seq2seq: Sequence to Sequence Learning with Keras より引用
すげぇ...Peekyを身につけたseq2seqは完全に足し算をマスターしています...!! なんか育成ゲームみたいな楽しさ...!!
スラムダンク 22巻 より引用
seq2seqを用いたアプリケーション
ディープラーニング入門 ~ 画像処理・自然言語処理について ~ より引用
- 自動要約
ディープラーニング入門 ~ 画像処理・自然言語処理について ~ より引用
- 画像キャプション
ディープラーニング入門 ~ 画像処理・自然言語処理について ~ より引用
本章で学んだこと
- RNNを用いた言語モデルは新しい文章を生成することができる
- 文章生成を行う際には、ひとつの単語(もしくは文字)を与え、モデルの出力(確率分布)からサンプリングするという手順を繰り返し行う
- RNNを2つ組み合わせることで、時系列データを別の時系列データに変換することができる(seq2seq)
- seq2seqは、Encoderが入力文をエンコードし、そのエンコード情報をDecoderが受け取り、デコードして目的の出力文を得る
- 入力文を反転させること(Reverse)、またエンコード情報をDecoderの複数レイヤに与えること(Peeky)は、seq2seqの精度向上に有効である
- 機械翻訳やチャットボット、イメージキャプションなど、seq2seqはさまざまなアプリケーションに利用できる
第8章 Attention (P325~P379)
最後はseq2seqを更なる高みへと押し上げる究極奥義..."Attention"...を学びます...!!
seq2seqを更に強力にする「注意機構(attention mechanism)」
[最新版] JSAI2018 チュートリアル「"深層学習時代の" ゼロから始める自然言語処理」 より引用
ディープラーニング入門 ~ 画像処理・自然言語処理について ~ より引用
- seq2seqには問題点があり、入力分の長さに関わらず、出力が固定長のベクトルである。そのため、必要な情報が収まり切れなくなって溢れちゃう....
- そこで重要な情報に注意(Attention)を向けさせる!
NLP2017 NMT Tutorial より引用
Attentionで拡張されたRecurrent Neural Networks - DeepAge より引用
Attention付きseq2seqへ改良
A Brief Overview of Attention Mechanism – SyncedReview – Medium より引用
最近のDeep Learning (NLP) 界隈におけるAttention事情 より引用
- Encoderの改良:LSTMレイヤの隠れ状態のベクトルをすべて利用する
- Decoderの改良:
- Weight Sumレイヤ:Encoderから出力されたhsをすべて活用できるようにする
- Attention Weightレイヤ:各単語の重要度を表す重み付き和を計算し、コンテキストベクトルを得る
NLP2017 NMT Tutorial より引用
ぐぬぬ...さすが最終章...わけがわからなくなってきました...!! ここでも、使っているうちに理解できると信じて、先へ...
Attention付きseq2seqの実装、学習と評価
それではAttentionつきseq2seqを早速使っていきます...!!
お題:日付フォーマットの変換問題
How to Visualize Your Recurrent Neural Network with Attention in Keras より引用
2エポック目でほとんどすべての問題に正解という驚異の結果...!Attentionつよい...!!(確信)
Attentionの可視化
- 単語と単語の関連性を見ることができ、モデルの処理ロジックが人間のそれに従っているかを判断することができる
おぉ...キレイに対応関係を結べていますね...Attentionすごい...!!
Attentionに関する残りのテーマ
双方向RNN
- 双方向から処理することで、各単語に対する隠れベクトルはバランスのとれた情報がエンコードされる。
- 実装は簡単!
seq2seqの深層化とskipコネクション
- 層を深くすることで、表現力の高いモデルを作ることができる。
- skipコネクションを用いることで、層を深くしても勾配が消失(or爆発)せず、良い学習が期待できる
Attentionの応用
Google Neural Machine Translation (GNMT)
いつもお世話になっているgoogle翻訳。LSTMレイヤの多層化、skipコネクションなどが見られると...!!
Transformer (機械翻訳の現王者)
論文解説 Attention Is All You Need (Transformer) - ディープラーニングブログ より引用
名前からして怪物ですが、RNNの代わりにSelf-Attentionという技術が使われていると...!!
Neural Turing Machine (NTM)
人間で言う「紙とペンによる計算」を、Attentionを使って必要な情報をメモリに読み書きさせることで実現してしまう技術...!!
本章で学んだこと
- 翻訳や音声認識など、ある時系列のデータを別の時系列データに変換するタスクでは、時系列データ間に対応関係が存在することが多くある
- Attentionは2つの時系列データ間の対応関係をデータから学習する
- Attentionでは、(ひとつの方法として)ベクトルの内積を使ってベクトル間の類似度を算出し、その類似度を用いた重み付き和ベクトルがAttentionの出力となる
- Attentionで使用する演算は微分可能であるため、誤差逆伝搬法によって学習ができる
- Attentionが算出する重み(確率)を可視化することで、入出力の対応関係を見ることができる
- 外部メモリによるニューラルネットワークの拡張の研究例では、メモリの読み書きにAttentionが用いられる
DL4US落ちたので、書籍『ゼロから作るDeeplearning』をやるしかない
- はじめに:「ゼロから作るDeep Learning」とは
- 第7章 第7章 畳み込みニューラルネットワーク(P205~P239 : 120分)
- 第8章 ディープラーニング(P241~P273 : 61分)
はじめに:「ゼロから作るDeep Learning」とは
ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装
- 作者: 斎藤康毅
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/09/24
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (18件) を見る
10万部も売れているディープラーニング界隈では大人気本。 "できるだけ優しい言葉と図解を多用する"というのをモットーとして書かれていて、 数式だらけで難解な本が多い中、初学者にとってはヒジョーにありがたい"神シリーズ"である。 最近、待望の続編である自然言語処理編も満を持して登場した。 元ネタはスタンフォード大の授業CS231n(画像認識のためのCNN)、CS224d(自然言語処理のためのディープラーニング)である。
7/20新刊『ゼロから作るDeep Learning ❷――自然言語処理編』O'Reilly Japan(978-4-87311-836-9)斎藤康毅 著◆「O'Reilly」棚にて展開中!『ゼロから作るDeep Learning』の続編。やさしい言葉で分かりやすくをモットーに、高度に見える技術の裏側をじっくり説明し、実際に作ることで理解を深めます。 pic.twitter.com/2dw0Rzc7VS
— 書泉ブックタワーコンピュータ書売り場 (@shosen_bt_pc) 2018年7月20日
利点:ベストセラー本なので先達のまとめブログが多い
ベストセラー本だけあってやはり、ネットを検索するとQiitaやはてなブログ等で多数の実践ブログが上がってくる。
今回は、こうした先人の知恵をパク...『転移学習』することで、自分の知見を深めることを目的とした。
qiita.com yusuke-ujitoko.hatenablog.com
今回は上記の2エントリを参考にさせて頂きました。感謝!
第1章 Python入門(P1~P20 : 10分)
まずはpython入門みたいな感じ。流し読み。
本章で学んだこと
第2章 パーセプトロン(P21~P37 : 15分)
シグモイド関数のような__非線形関数__で変換すれば、任意の関数を表現できると。 これも導入でよくある内容で流し読み。
https://qiita.com/ruka38/items/2f2f958c1d45728ea577 パーセプトロンからはじめる分類問題より引用
本章で学んだこと
第3章 ニューラルネットワーク(P39~p82 : 31分)
まずは順伝搬の説明。よく見るMNISTデータセットを用いた画像認識の例。 aidemyや石川氏の本で読んだ気がするので流し読み。
- 作者: 石川聡彦
- 出版社/メーカー: KADOKAWA
- 発売日: 2018/02/24
- メディア: 単行本
- この商品を含むブログを見る
本章で学んだこと
- ニューラルネットワークでは,活性化関数としてシグモイド関数やReLU関数のような滑らかに変化する関数を利用する
- NumPyの多次元配列をうまく使うことで,ニューラルネットワークを効率よく実装することができる
- 機械学習の問題は,回帰問題と分類問題に大別できる
- 出力層で使用する活性化関数は,回帰問題では恒等関数,分類問題ではソフトマックス関数を一般的に利用する
- 分類問題では,出力層のニューロンの数を分類するクラス数に設定する
- 入力データのまとまりをバッチと言い,バッチ単位で推論処理を行うことで計算を高速に行うことができる.
第4章 ニューラルネットワークの学習(P83~P122 : 30分)
ここら辺も導入でよくある概念の説明で流し読み。pythonコードの説明が詳しい。
ニューラルネットワークの学習アルゴリズム
- 前提
- ニューラルネットワークには適応可能な重みとバイアスがあり,この重みとバイアスを訓練データに適応するように調整することを学習と呼ぶ.
- ①ミニバッチ
- 訓練データの中からランダムに一部のデータを選び出す
- ②勾配の算出
- ミニバッチの損失関数を減らすために,各重みパラメータの勾配を求める
- ③パラメータの算出
- 重みパラメータを勾配方向に微小量だけ更新する
- ①~③を繰り返す
確率的勾配降下法(stochastic gradient descent)
- 確率的に無作為に選びだしたデータ(ミニバッチ)を使って,パラメータを更新する
- SGDと略される
本章で学んだこと
- 機械学習で使用するデータセットは,訓練データとテストデータに分けて使用する
- 訓練データで学習を行い,学習したモデルの汎化能力をテストデータで評価する
- ニューラルネットワークの学習は,損失関数を指標として,損失関数の値が小さくなるように,重みパラメータを更新する
- 重みパラメータを更新する際には,重みパラメータの勾配を利用して,勾配方向に重みの値を更新する作業を繰り返す
- 微小な値を与えたときの差分によって微分を求めることを数値微分という
- 数値微分によって,重みパラメータの勾配を求めることができる
- 数値微分による計算には時間がかかるが,その実装は簡単である.一方,次章で実装するやや複雑な誤差逆伝播法は,高速に勾配を求めることができる.
第5章 誤差逆伝播法(P123~P164 : 40分)
この章の内容は、p.123に言及があるスタンフォードのCS231n授業や、また本シリーズ②の第1章でも再度説明がある。
ゼロから作るDeep Learning ? ―自然言語処理編
- 作者: 斎藤康毅
- 出版社/メーカー: オライリージャパン
- 発売日: 2018/07/21
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (3件) を見る
本章で学んだこと
- 計算グラフを用いれば,計算過程を視覚的に把握することができる
- 計算グラフのノードは局所的な計算によって構成される.局所的な計算が全体の計算を構成する.
- 計算グラフの順伝播は,通常の計算を行う.一方,計算グラフの逆伝播によって,各ノードの微分を求めることができる.
- ニューラルネットワークの構成要素をレイヤとして実装することで,勾配の計算を効率的に求めることができる.
- 数値微分と誤差逆伝播法の結果を比較することで,誤差逆伝播法の実装に誤りがないことを確認できる.
第6章 学習に関するテクニック(P165~P203 : 121分)
冒頭で、冒険家のたとえ話から。
目隠しをした冒険家が最も『深き場所』へたどり着くための手段=最適化手法について。 今いる場所で一番傾斜がきつい方向へ進もうとする、前章の確率的勾配法(SGD)には欠点があった。
- SGDの欠点
- ジグザグな動きで、問題によっては非効率
- 関数の形状が等方的でないと,勾配が最小値を指さない.
そこで、SGDの欠点を改善する手法として,_Momentum, AdaGrad, RMSProp, Adam_といった手法が開発されていると。
パラメータ更新手法の選択
Momentum
- Momentum : 運動量のこと
- 前の更新を保存し,慣性力が働くようにする
- ボールがお椀を転がるような動きでなめらか
AdaGrad
- Adaptive(適応的)のAda、つまり『適応的』勾配
- パラメータの要素ごとに、学習係数を過去のすべての勾配の2乗和で割って減衰させていく
- 無限の学習を行うと更新量が0になってしまう欠点がある
- そこで開発されたのがRMSProp
- AdaGradにおいて,過去の更新における勾配を徐々に忘れるようにするもの
Adam
- MomentumとAdaGradの融合(フュージョン)
- Momentum -ボールがお椀を転がるように物理法則に準じる動きを再現
- AdaGrad
- パラメータの要素ごとに,『適応的』に更新ステップを調整
AdamW
- 最近、さらに改良版のAdamWも出てきているようだ AdamW and Super-convergence is now the fastest way to train neural nets · fast.aiより引用
ドラゴンボール世代がフュージョンと聞くと_最強_のイメージですが、 やはり更なる上(スーパーAdam的なAdamW)があるようですね...
ドラゴンボール より
初期パラメータの選択
Weight decay
- 重みの値を小さくすることで、過学習を抑え、汎化性能を高めるテクニック
- 重みを小さくしたいのであれば、初期値もできるだけ小さい値でスタートしたいと思うのが当然
とはいえ、重みの初期値を0にしてはいけない
- 重みが均一になってしまうと,重みを持つ意味がなくなるため
重みの初期値のベストプラクティス
- std=0.01の場合は全く学習が進んでいおらず、He、Xavierの際にスムーズに学習が進んでいる
- →重みの初期値はとても重要
Batch Normalization
各層のアクティベーションの分布が適度な広がりを持つように”強制的”にアクティベーションの調整を行う
Batch Normalizationの利点
- 学習を早く進行させることができる(学習係数を大きくすることができる)
- 初期値にそれほど依存しない(初期値に対してそこまで神経質にならなくて良い)
- 過学習を抑制する(Dropoutなどの必要性を減らす)
- データ分布の正規化(平均が0、分散が1の分布)を行うレイヤ(Batch Normalizationレイヤ) をニューラルネットワークに挿入し、各ミニバッチごとに正規化する
正則化
過学習が起きる原因
- パラメータを大量に持ち,表現力の高いモデルであること
- 訓練データが少ないこと
Weight decay
- 大きな重みを持つことにペナルティを課す
- 具体的には、損失関数に重みの二乗ノルム(L2ノルム)を加える
- 複雑なニューラルネットワークには対応しきれない qiita.com
dropout
- ニューロンをランダムに消去ながら学習する
ハイパーパラメータの検証
6章からが本番だと前述のQiitaの記事に書いてありました。
6章~7章が本書の核のようで、内容が濃く充実していますね!
本章で学んだこと
第7章 第7章 畳み込みニューラルネットワーク(P205~P239 : 120分)
この章は下エントリに、図解ありで非常に詳しくまとまっていました。以下抜粋。
全体の構造
- これまでの全結合層
- [Affine, ReLU]を繰り返し,最後に[Affine,Softmax]
- CNN
- [Conv, ReLU, (Pooling)]を繰り返し,最後の方で[Affine, ReLU], 最後に[Affine, Softmax]
全結合層の問題点
入力データの形状が無視されてしまう点
- たとえば画像の場合,縦・横・チャンネルの3方向を盛っているが,全結合相に入力するときは3次元を1次元にする必要がある.形状には大切な空間情報が含まれているはず.
- すべての入力データを同等のニューロンとして扱う.
畳み込み層(convolutionレイヤ)では形状を維持する.
- 畳み込み層の入出力データを特徴マップ(feature map)
- 入力データを入力特徴マップ(input feature map)
- 出力データを出力特徴マップ(output feature map)
畳み込み演算
- 画像処理でいうところ「フィルター処理」に相当
- 「フィルター」は「カーネル」とも言う
- フィルターのパラメータは全結合のニューラルネットワークにおける「重み」に対応
- 上図はフィルター処理にバイアスを加えたもの
パディング(padding)
- 入力データの周囲に固定のデータを埋める
- 出力サイズを調整するため
ストライド(stride)
- フィルターを適用する位置の間隔のこと
プーリング層
- プーリングは縦・横方向の空間を小さくする演算
- プーリングの種類は色々ある
- Maxプーリング : 領域内の最大値を取る
- Averageプーリング : 領域内の平均値をとる
- プーリング演算によってチャネル数は変化しない
- 微小な位置変化に対してロバスト
重みの可視化
代表的なCNN
本章で学んだこと
第8章 ディープラーニング(P241~P273 : 61分)
こちらのエントリが詳しいです。以下抜粋。
認識精度を高めるには
Data Augumentation(データ拡張)
- 回転や縦横移動をさせて画像データを増幅する
層を深くする
- フィルタを小さくでき、パラメータが減る
- 階層的に情報を抽出することで学習が効率化する
- ReLUなどの活性化関数を畳み込み層の間に挟めるので、非線形化できるため、複雑な表現が可能となる
有名なCNNアーキテクチャ
VGG (2014年2位)
- CNNのネットワークを深くしたものをVGGという
- 重みの初期値にHeの初期値、重みパラメーターの更新にAdamを使う
- 後段の全結合層では、Dropoutレイヤを使う
- 画像認識度は高く、誤認識率も低いネットワークを構成できる
GoogLeNet(2014年1位)
- ネットワークが縦方向の深さだけでなく、横方向にも深さを持っている(インセプション構造)
ResNet (ついにエラー率で人を超える)
- 層を深くできるような仕掛けとして「スキップ構造」をもつ
- スキップ構造
- 入力データの畳み込み層をまたいで出力に合算する構造
- 逆伝播の際に、スキップ構造によって信号が減衰せずに伝わり、学習が効率的に進む
ディープラーニングの高速化
ディープラーニングの実用例
物体検出
- 画像から物体の種類と位置を特定するクラス分類問題
- CNNをベースとした手法が多く,R-CNN,さらにはFaster R-CNNが有名
セグメンテーション
- 画像に対するピクセルレベルでのクラス分類問題
- FCN(Fully Convolutional Network)というすべてがConvolution層からなるネットワークが使われる
画像キャプション生成
- 画像を入力すると,その説明文を出力する問題
- 代表的な方法はNIC(Neural Image Caption)を呼ばれ,画像を理解するでディープなCNNと自然言語を扱うRNNから構成される.
- CNNが画像から特徴を抽出し,RNNに初期値としてそれを渡す.そこからRNNは再帰的に文章を生成する
画像スタイル変換
- スタイル画像とコンテンツ画像の2つの画像を入力することで,新しい画像を生成する.
- ネットワークの中間データがコンテンツ画像の中間データに近くなるように,かつスタイル画像から抽出したスタイル行列のズレも小さくなるように学習を行う
画像生成
- DCGAN(Deep Convolutional Generative Adversarial Network)
- GeneratorとDiscriminatorという2つのニューラルネットワークを用い,前者が本物そっくりの偽物を作り,後者がそれが本物か否かを判定することを競争的に繰り返し,お互いに学習を進める
自動運転
- CNNベースのSegNetは走路環境のセグメンテーションを高精度で行う
Deep Q-Network
- DQNは、動作に対する価値観数をCNNで近似することで、画像に対しての動作を最適化する学習を行う
本章で学んだこと
- 多くの問題では、ネットワークを深くすることで、性能の向上が期待できる
- ILSVRCと呼ばれる画像認識のコンペティションの最近の動向は、ディープラーニングによる手法が上位を独占し、使われるネットワークもディープ化している
- 有名なネットワークには、VGG、GoogLeNet、ResNetがある
- GPUや分散学習、ビット精度の削減などによってディープラーニングの高速化を実現できる
- ディープラーニング(ニューラルネットワーク)は、物体認識だけではなく、物体検出やセグメンテーションに利用できる
- ディープラーニングを用いたアプリケーションとして、画像のキャプション生成、画像の生成、強化学習などがある。最近では、自動運転へのディープラーニングの利用も期待されている
画像認識はfast.aiでもやっていたので駆け足で学習しました。引き続き、自然言語処理編の②へ!