こんにちは､ このチュートリアルにようこそ｡
目の脳であるA3脳ができそうなので､ 超期待しています｡
そして､ 頭脳について言えば､ 注目したいことがあります｡
最初のモジュールで､ 完全に接続された層だけのシンプルな脳を作ったことを思い出してください｡
Doom」の2つ目のモジュールでは､ 完全に連結した層だけでなく､ 目も作りました｡
畳み込み層を追加したことで､ 目が映像を観察し､ 内部で起こっていることを理解できるようになったからです｡
そして今､ 私たちはそれをさらに高いレベルで実現しようとしています｡ なぜなら､ 目を持ち､ 完全に層をつなぐだけでなく､
記憶もできるような脳を作ろうとしているからです｡
前回のチュートリアルで述べたように､ この大きな脳の中にニューラルネットワークの記録を追加し､
脳に長い記憶を与えることで､ 入力画像の時間的関係や時間的特性を理解できるようになるからです｡
そうそう､ そうなんです｡
そして､ さらに強力な頭脳､ 今まさに実行しようとしているモデルは､ 本当に､ 本当に強力だと断言できます｡
そして､ 目を作り､ 深層学習を行い､ 深層強化学習を行うことで､ 人間の脳の働きにどんどん近づいていくことがわかります｡
私たちは､ まず脳の基本的な関係､ つまり直線的な食物のつながりから始めましたよね｡
そして､ 目を付け､ メモリを付けました｡
今後のモデルで何が追加されるかは誰にもわかりません｡
2018年には､ さらに人間の脳に似せたものが追加されるかもしれませんよ｡
しかし､ すでに完全につながった層､ 目､ 記憶を持つ私たちは､ 本当に優れた機能的な脳をすでに持っているのです｡
では､ やってみましょう｡
この脳を作ろう｡
そこで例によって､ コンボリューションとLCMSでいろいろな特性が出るので､ そのためのクラスを作ることになりました｡
そこで､ これらすべてを初期化するinit関数を作り､ すべての接続を作成します｡ そしてもちろん､
最終的に出力を得るために､ 信号を脳内に伝播させるforward関数を用意します｡
よし､ 準備はいいか？
こうしよう｡
そこで､ クラスですが､ アクター・クリティックと呼ぶ新しいクラスを導入しました｡
なぜなら､ ここではもちろん頭脳の話をしているからです｡
しかし､ 忘れてはならないのは､ 俳優と批評家を別々にしたアクティブ・クリティック主義に基づく「a3cモデル」を作っていることだ｡
そこで､ 実際には俳優用に1つのリニアなフルコネクションを作り､ 評論家用に1つのリニアなフルコネクションを作ることになります｡
どうやるかは､ 見てのお楽しみです｡
それは､ 実はとてもシンプルなことなのです｡
俳優評論家とこの俳優評論家クラスは､ endnoteモジュールを継承して､ すべてのPyTorchツールを使えるようにするわけです｡
そこで､ nodeモジュールを継承するために､ こうしてみましょう｡
では､ まずトーチライブラリ､ そしてそれを手に入れる必要があります｡
そして､ その後に｡
そして､ あれとモジュール｡
わかりました｡
そうすれば､ 私たちはそれを受け継ぐことができるのです｡
わかりました｡
さて､ 最初の関数はもちろんinit関数です｡
このinit関数は､ オブジェクトのself､ 入力画像の寸法を表すinput
shape､ そしてすべてのアクションを含むaction
spaceを引数として受け取ります｡
また､ このアクションスペースから､ アクションの数､ つまり､ 実際にすぐに得られる可能性のあるアクションの数を得ることができますね｡
だからこそ､ 私たちも必要なのです｡
だから､ それは主張のため､ それだけでいいんです｡
そして､ この関数の中に入って､ 私たちの脳にふさわしい変数をすべて作りましょう｡
しかし､ その前に､ 入力モジュールのすべてのツールを使えるようにするために､ 何らかの方法で継承を有効にしなければならないことを思い出してください｡
このようにスーパー関数を使って､ その中でアクターを入力するのです｡
私たちのクラスである批評家､ そしてオブジェクトのための自己を考え出す｡
よし､ じゃあ､ ドット｡
そして､ またまたinitの登場です｡
機能です｡
これでよしとしよう｡
これで､ トーチから脳を作るために必要な道具がすべて揃ったことになります｡
よし､ それなら
さて､ そろそろ目玉を作ろうか｡
それが凸凹です｡
というのも､ Doomではすでに詳しく説明しましたが､ The Eye for Doomには目があったのを覚えておいてください｡
だから､ まったく同じなんです｡
これからいくつかの畳み込みを行いますが､ サイズ3×3､ ストライド2､ パディング1の32個の特徴検出器を用いた非常にシンプルなアーキテクチャを使用します｡
かなり古典的なアーキテクチャですが､ ブレイクアウトゲームで何が起こっているのかを目で見て理解するためには､
実はこれで十分なのでしょう｡
わかりました｡
では､ その畳み掛けを作ろう｡
そこで､ 畳み込みはオブジェクトの変数になるので､ selfから始めることにする｡
そこで､ 自己のconfをconfと呼び､ 4つのコンボリューションがあることになります｡
GNモジュールのドット､ そしてconf
twoのdクラスです｡
そして､ 内部ではまず､ 画像の入力形状を入力します｡
ということで､ まさにこれをコピーして､ 最初の入力として入力します｡
そして､ 第2引数は特徴検出器の数､ あるいはカーネルの数である｡
そこで､ 先ほどの32を､ クラシックな選択で｡
次に､ カーネルのサイズを選択する必要があります｡
これは､ 入力画像の上をスライドするセルの数である｡
そして､ 3つ､ 4つ､ 5つのどれかを取ることができることを忘れないでください｡
それが一般的な選択です｡
そして､ ここでは3つを選びます｡
そして､ ストライドを2つ選びますし｡
1の水増し｡
これでよしとしよう｡
つまり､ 入力画像から32枚の畳み込み画像で構成される最初の畳み込み層までの畳み込みの場合です｡
さて､ これで2回目の畳み込みの準備が整いました｡
だから､ 実はほとんど同じになるんです｡
そこで､ この行をコピーして下に貼り付けているのですが､ ほとんど何も変わらない状態で4つのコンボリューションができるので､
もう一度下に貼り付けて､ 最後にもう一度貼り付けてください｡
つまり､ ここですでに､ 1×カウントを1×3に変換し､ 1×4を確信することができるのです｡
これが4つの凸部になります｡
もちろん､ ここでいくつか変更する必要がありますが､ それぞれの文字列は2､ パディングは1のままなので､
それほど大きな変更はありません｡
いずれも32フィーチャーディテクターを搭載する予定です｡
つまり､ 32枚の畳み込み画像が出力されます｡
しかし､ ここで､ これは畳み込みの左側部分に相当することを思い出してください｡
つまり､ 前の畳み込みの右側の部分にあったものと､ 実は対応しているのです｡
ドミノ倒しみたいなものだと覚えておいてください｡
だから､ 本当に簡単なんです｡
そのため､ ここでは32とここも入力しなければなりません｡
非常に簡単に32と32を見ることができます｡
わかりました｡
まとめると､ まず入力画像は､ 入力次元数が数である｡
最初の畳み込みで､ 32枚の畳み込み画像が得られ､ それぞれが特定の特徴を検出する｡
そして､ この32枚の畳み込み画像から2回目の畳み込みを行い､ 新たに32枚の畳み込み画像を得ます｡
そして､ この32枚の新しいコンボリューション画像から同じものを選びます｡
3回目の畳み込みを行い､ 再び32枚の新しい畳み込み画像を得る｡
そして､ 最終的にこの32枚の畳み込み画像から､ 4回目の畳み込みをかけ､ 写真を得るのです｡
わかりました｡
そして､ これで十分か､ 監督をします｡
ボールをよく検知してくれます｡
わかりました｡
というわけで､ コンボリューションはこれでおしまい｡
では､ 目については以上です｡
そして､ 今度はメモリを大切にしましょう｡
この脳の新機能は､ 以前はチューンで実装していたのですが､ 今回はそれとは別に実装しています｡
監視だけでなく､ 超記憶､ 長期記憶も持っています｡ STM長期短期記憶を実装する予定ですが､
これは通常のニューラルネットワークで､ モデルに長期記憶を与えて､
過去からの長い時間的関係を学習できるようにするものです｡
だから同じように､ 新しい変数を作るんだ｡
この新しい変数は､ 脳の中のLshtmネットワークに対応するため､
単にlshtmと呼ぶことにします｡
So Lshtm.
さて､ STMのコードを書く前に､ このlshtmの部分が何をするのかを理解しておこう｡
このように理解すると､ lshtmは入力画像の時間的特性を学習するために使われていることがわかります｡
つまり､ 例えばボールがレンガにぶつかった場合､ その跳ね返りをlshtmが符号化することになります｡
だから､ それをまず理解することです｡
ゲームの中で起こっていることを暗号化するようなものです｡
次に､ LSHTM を実装する際に理解すべき重要なことは､ 時間依存性の順序を選択することである｡
ここで､ ニューラルネットワークに4枚の画像のシーケンスを与えるので､ すでに順序の時間的依存性を学習できることになります｡
それは､ 90プラス1で起こることが､ 時間で起こることに依存する､ いくつかの時間的依存関係です｡
T Tマイナス1､ Tマイナス2､ Tマイナス3｡
だから､ それは絶対にできるんです｡
しかし､ 良いニュースは､ lshtmを使うので､ さらに複雑な時間的関係を学習することができることです｡
つまり､ 例えば､ 時刻t＋1に何が起こるかが､ 時刻に何が起こるかに依存するような時間的特性を学習することができるのである｡
T tマイナス1､ tマイナス2､ tマイナス3からt､ マイナスnまで｡
そして､ それはlshtmの長い部分､ 長短の記憶です｡
このLshtmのチームでは､ 非常に複雑な時間的関係を学ぶことができます｡
よし､ ではリストを追加しよう｡
このため､ RNモジュールを使用し､ Class Lshtmセルを追加して､ 新しいネットワークのLshtm部分を表すこのLshtmオブジェクトを作成します｡
今､ 重要なのは､ C､ R､ n､ つまり畳み込みニューラルネットワークを作っているということです｡
そして､ アーデンの部分はCNNの部分の後に来る｡
したがって､ 今､ このLshtmセルに入力する必要があるのは､ まず､ 畳み込み後の出力の大きさである｡
つまり､ 3×3の32倍です｡
つまり､ この32×3×3は､ 実はここで4回の畳み込みを行った後の出力なのです｡
しかし､ それがRとLshtmネットワークの入力になる｡
さて､ 4つの畳み込みの出力が32倍､ 3×3のサイズになるのはなぜでしょう？
まあ､ そんなに直接的なものではありませんので､ ご安心ください｡
実は単純な計算式ではないんです｡
しかし､ プールして畳み込んだ画像を平坦化した後に､ この出力ニューロンの数を計算する式がある｡
でも､ この大きな式の条件を集めると､ まあ､ 32倍､ 3倍3倍になるんです｡
もっとやりたいことがたくさんあるので､ あまり時間をかけたくなかったんです｡
それに､ この数字を計算するための関数もすでに作ってある｡
このカウントをしたのは､ ズームのためだったことを忘れないでください｡
神経細胞は機能するので､ 納得できないなら再利用すればいい｡
でもそれは､ この大きな数式計算の条件を集めて､ 出力の数を出しただけなんです｡
ということで､ 第1論になります｡
そして､ 第2引数はlshtmの出力ニューロンの数で､
256にします｡
なるほど｡
それで､ 今はどうなっているのでしょうか？
つまり､ 今はゲームの各イベントを符号化したベクトル､ 言い換えれば､ 符号化された状態があるわけです｡
これで､ 俳優と批評家を分離することができます｡ つまり､ 俳優用と批評家用の2つのニューラルネットワークを作るのです｡
しかし､ この2つの神経回路網には､ 画像の符号化と時間的な関係が同じように存在することになります｡
つまり､ この2つのニューラルネットワークに共通して行っている部分です｡
これは､ 2つのニューラルネットワークで同じ始まりになる｡
しかし､ これからは俳優と批評家の状況が変わります｡ 俳優には1つの直線的で完全な接続を､
批評家には別の直線的で完全な接続を作ることになるからです｡
では､ ちょっと休憩して､ 次のチュートリアルでやってみましょう｡
それまではお楽しみに｡
I.