こんにちは､ このチュートリアルにようこそ｡
さて､ 4つの畳み込みとlshtmを行った後､ 符号化された状態ができました｡ これは､ これから作る俳優と評論家のための2つのニューラルネットワークの入力となります｡
そして､ 彼らといえば､ あとは､ 俳優用と評論家用の2つの直線的な完全接続を作るだけです｡
しかし､ その前に､ 可能なアクションの数を求める必要がある｡
そして､ ここではオブジェクトの変数にならない新しい変数を呼び出すことにします｡
ここではselfを使わず､ num outputsという変数を作って､ 可能なアクションの数を表し､
アクションスペースからそれを取得できるようにします｡
そこで､ 私たちは行動空間を確保します｡
この入力は､ オブジェクトを作成するときの init 関数の入力になります｡ そして､ この可能なアクションの数を得るためにドット
n を追加し､ アクターとクリティックが別々に同じ入力を受け取るようにします｡
これが､ 畳み込みとLCMを使ったこのプロセス全体の出力です｡
つまり､ 同じ入力（エンコードされた状態）を受けても､ 2つの異なる線形食物接続を持つので､ 最終的には2つのニューラルネットワーク､
1つは俳優用､ もう1つはアクリル用となるわけです｡
そこで､ この2つの神経回路網を別々に作ってみましょう｡
しかし､ エンコードという大仕事はすでに済ませましたので､ あとは2つのオブジェクトを作成するだけです｡
1つはアクター用のリニアなフルコネクションで､ もう1つは評論家用のリニアなフルコネクションです｡
というわけで､ まさにその通りです｡
これから2つのオブジェクトを作成します｡ 最初のオブジェクトは､ 評論家のリニアフード接続用で､
評論家アンダースコア・リニアと呼ぶことにします｡
そして､ この直線的な食のつながりを作るには､ まあ､ どうしたらいいかということですね｡
RNモジュールと､ 入力する線形クラスが必要なだけです｡ 入力ニューロンは､
畳み込みとLCMによるエンコーディングの出力で､ 256個のニューロンです｡
入力は256で､ 出力は1つです｡ 評論家のためのニューラルネットワークの出力は､ 入力状態､ つまりここで作った入力エンコード状態に適用したV関数の値であることを思い出してください｡
そこで､ 入力された状態をseと呼ぶと､ それがすべての出力となる｡
評論家のニューラルネットワークの出力はsになりますから､ 一次元の値です｡
それで､ ここに1つ入力しました｡
そして､ VSEはアクターの間で共有されるものであり､ アクターはより適切な方法でアクションを行うために使用できる共通の情報を得ることができることを忘れないでください｡
それは評論家のニューラルネットワークのためなんですね｡
そして今度は､ アクターの新しいネットワークを作りましょう｡ そのため､ ここに self､ dot actor､ linear､ same を追加しています｡
入力はすでにエンコードされているので､ あとは単純にリニアの完全な接続を追加するだけです｡
このアクターのニューラルネットワークは､ 256のサイズを持つエンコードされた状態を取ることになる｡
だから､ ここで256｡
しかし､ その後､ 出力は異なってきます｡ もちろん､ 俳優のためのニューラルネットワークの出力は､
Q値､ 入力状態のQ値､ ここでエンコードしたものとアクションプレートであることはご存知の通りです｡
そこで､ もう一度､ この「SWが聞こえるかもしれない」という符号化された状態を「Action played」と呼ぶと､ このニューラルネットワークのactive
linearの出力はQ assayになります｡
そして､ それぞれのアクションに対して1つの値を持っているので､ したがって､ 出力はありません｡
Q値なので､ ここでの出力はなしとなる｡
出力がないのは､ 実際にはQ値の数だからです｡
よし､ 完璧だ｡
だから､ もしよかったら､ 私が代わりに書きますよ｡
ここで評論家の出力は s であり､ s は符号化された状態であり､ 俳優の出力は Q である｡
わかりました｡
ですから､ この違いを理解することは非常に重要で､ 評論家用と俳優用の2つの神経ネットワークがあることを理解することです｡
よし､ 完璧だ｡
ということで､ この機能でほぼ終了です｡
これで､ 一番大事なことは終わった｡
残るは､ これら2つのニューラルネットワークのすべての重みとすべてのバイアスを初期化することだけです｡
もちろん､ そのためには､ 先ほど作った2つの関数､ つまり正規化列の初期化とその中の重みを使うことになるのですが､ この2つの関数を使うことで､
正規化列の初期化とその中の重みの初期化を行うことができます｡
では､ 早速やってみましょう｡
かなり簡単で､ かなり早くできそうです｡
まず､ ランダムな重みを初期化するために､ オブジェクトにweights init関数を適用します｡
そこで､ ここでは self を使ってオブジェクトを取得し､ そのオブジェクトに weights の init 関数を適用しています｡
従って､ 内部では､ weights init関数を入力すればよいことになります｡
これによって､ この関数がオブジェクトに適用されます｡
そして､ このようにすることで､ 将来的にこれらの重みの最適な学習を得るために､ いくつかのランダムな重みを初期化しているに過ぎないのです｡
そして今､ 私たちがしなければならないのは､ 俳優と批評家のための特別な正規化をすることです｡
しかし､ 以前のチュートリアルで話したと思いますが､ クリティックのアクターに同じ分散を設定するのではないことを忘れないでください｡
役者は小さな標準偏差､ 小さな分散を得ることができ､ 批評家は大きなものを得ることができるのです｡
そして､ なぜこのようなことをするのか｡
俳優の重みの標準偏差を小さくして､ 評論家の重みの標準偏差を大きくする目的は何でしょうか？
そうすれば､ 取引の探査と開拓を管理することができます｡
それこそが､ これを行う目的なのです｡
俳優には小さな分散を､ 批評家には大きな分散を与えることで､ 探査と搾取をうまく管理することができます｡
では､ こうしてみましょう｡
まず､ アクターの面倒を見ようということで､ selfかobjectを取ります｡
次に､ アクターのニューラルネットワークを､ アクターリニアとして取り出します｡
そして､ このアクターのニューラルネットワークの重みにアクセスすることになりますが､ 重みのデータにアクセスすることを忘れないでください｡
そのデータを追加する必要があります｡
わかりました｡
これで重みが得られたので､ 今度は関数normalized columns initializeを使ってみましょう｡
だから､ ここはそれを踏まえてコピーしています｡
そして､ これらの重みが持つべき標準偏差を引数として入力します｡
しかし､ その前に､ この関数は2つの引数を取ることを覚えておいてください｡
まず､ 初期化したい重みがあります｡
ですから､ 単純にそれをもう一度取り出して､ ここに貼り付ければいいのです｡
そして､ 2つ目の引数は､ この重みが持つべき標準偏差である｡
ですから､ 先ほど言ったように､ 俳優の標準偏差を小さくしたいのですが､ 小さいと0になりますね｡ 01完璧です｡
つまり､ 俳優のニューラルネットワークの重みの分です｡
では､ 役者のニューラルネットワークのバイアスに気をつけよう｡
したがって､ ここでもほぼ同じことをすることになります｡
これを下記でコピーし､ 重みを偏りに置き換えて偏りを評価することにします｡
そして､ データの後に､ 単純にそのフィルを追加し､ 入力ゼロの中に記憶させるつもりです｡ なぜなら､ すべてのバイアスをゼロで初期化したいからです｡
というのも､ バイアスはすでにweights init関数内でこのfill関数によってゼロに初期化されていることを思い出してください｡
つまり､ バイアスが実際にゼロに初期化されていることを確認するために行っているのですが､ ここではすでに行われていると思います｡
でもとにかく､ これで100％間違いない｡
わかりました｡
そして今度は､ 評論家に対して同じことをするのです｡
では､ 効率よく､ この2行をコピーしてみましょう｡
こことここに貼り付けましょう｡
俳優を批評家に置き換えるだけです｡
ここも今も同じです｡
変更するのは､ あくまでも標準偏差だけです｡
評論家が持つ新しいネットワークの重みが欲しい｡
そして､ 覚えているように､ 今回は大きな標準偏差が欲しいので､ 代わりに. 01､ 1つ入力します｡
そうそう､ そうなんです｡
俳優の新しいネットワークの重みの標準偏差が小さく､ 評論家の神経ネットワークの重みの標準偏差が大きいことがわかる｡
もちろん､ ここでアクターをクリエイティングと言い換えることも忘れてはならない｡
わかりました｡
そして今､ 私たちは元気です｡
かっこいい｡
ということで､ 残るは2つ｡
まず､ STMのバイアスも初期化する｡
そして､ これを行うには､ LCMは我々のオブジェクトに属しているので､ 我々のオブジェクトの自己を取ります｡
そして､ STM､ DOTの順に､ STMにある2種類のバイアスを取るのです｡
これはバイアスのアンダースコア i h で､ もうひとつはバイアスのアンダースコア h h です｡
つまり､ LCMには2種類のバイアスがあり､ 同じように0に初期化されることになります｡
そこで､ まずデータにアクセスし､ アンダースコアの充填関数を使って､ この偏りをすべてゼロで埋めてしまう｡
ゼロで初期化する｡
わかりました｡
そして､ 2つ目のバイアスのグループについては､ ここに追加します｡
i h を h h に置き換えたのと同じビットです｡
LSBチームのバイアスをゼロで初期化しています｡
そして､ 最後にNATモジュールから継承されたメソッド､ つまりtrainメソッドを使用することになります｡
そして基本的にそれは､ モジュールをトレインモードにするメソッドに過ぎないのです｡
では､ その使い道は？
まあ､ 用途としては､ ドロップアウトやバッチ正規化などがあれば､ それを有効にすることができることです｡
これを使うには､ self dot trainを追加するだけで､ モジュールを完璧に列車モードにすることができます｡
というわけで､ init関数は終了です｡
畳み込み､ Lshtm､ 評論家と俳優のための2つの独立したニューラルネットワークがあり､
すべての重みとバイアスは適切に初期化されています｡
だから､ それでいいんです｡
次のステップでは､ 入力された画像をもとに､ 脳全体に信号を伝播させ､
出力を得るための前進関数を作成します｡
では､ 次のチュートリアルでそれをやってみましょう｡
そしてそれまで､ iを楽しんでください｡