こんにちは､ このPythonチュートリアルへようこそ｡
では､ これから実装する次の機能では､ 人工知能の中にあるディープニューラルネットワークを学習させます｡
基本的には､ 前方伝搬と後方伝搬の全プロセスを行うことで､ 出力を得て､
ターゲットを得ることができるのです｡
出力とターゲットを比較して､ 最後の誤差を計算することになる｡
そして､ この最後のエラーをニューラルネットワークに逆伝播するのです｡
そして､ 確率的勾配降下法を用いて､ 誤差を少なくするためにどれだけ貢献したかに応じて重みを更新していくのです｡
だから､ これを全部やりましょう｡
ディープラーニングコースから来られた方には､ 子供向けの内容になりますが､ それ以外の方には､ もう一度説明しますので､
ご安心ください｡
そこで､ この新しい関数をlearnと呼ぶことにします｡
そしてこの学習関数は､ いくつかの引数を取ることになる｡
もちろん､ 最初のselfは､ 異なるクラスのオブジェクトを参照することになります｡
次に､ 現在の状態を表すバッチの状態､ 次の状態を表すバッチ､ 報酬を表すバッチ､ そして最後にアクションを表すバッチの状態を表すバッチとなります｡
では､ なぜこれを撮るのか｡
何のシリーズか認識されているのでしょうか？
まあ､ それはもちろん､ ディープラーニングの根底にあるマルコフ決定過程の遷移なんですけどね｡
そして､ なぜ皆､ 何かのバッチに取り込むのでしょうか？
それは､ トップが現在の状態次の状態､ 現在の報酬､ 現在の行動という一連の流れによる遷移を考えていないからだと覚えておいてください｡
ここではサンプル機能により､ いくつかのサンプルバッチを作成しました｡
そして今､ 私たちのトランジションは､ 状態に関する最初のバッチ､ 次の日付に関する2番目のバッチ､ 報酬に関するバッチ､
そして行動に関するバッチという形になっています｡
これが今のトランジションの形です｡ 1次元に対して行ったこの連結のおかげで､
すべて時間に対してうまく整合しています｡
つまり､ 状態､ 次の状態､ 報酬､ アクションのそれぞれに1バッチずつ､ このバッチの遷移があるのです｡
これは､ ディープニューラルネットワークが何かを学習できるように､ この経験値再生のトリックを使っているためです｡
トランジション単体だけなら､ まあ､ 即席の学習にはなるでしょうから､ 覚えておいてください｡
あるいは､ 非常に短い記憶学習が必要で､ そのためモデルが何も学習しない場合です｡
そこで､ トランジションとなるこれらのバッチをメモリから取り出して､ 最終的には入力されたバッチの状態ごとに異なる出力を得ることになります｡
そして､ 損失を計算するために両方が必要になるので､ バッチ状態とバッチネクスト状態についてこれを行います｡
深層学習アルゴリズムの核となるバランス方程式をすぐに思い出すことができる｡
では､ 関数に入り､ まずバッチの状態の出力を取得してみましょう｡
そこで､ この最初の変数をoutputsと呼ぶことにする｡
そして､ もちろんセルフモデルも取り上げます｡
バッチ状態の入力状態のモデル出力を得たいので､ セルフティーチングモデルですね｡
そして､ このモデルは実際に入力状態のバッチを期待しているので､ 今すぐモデルの入力にバッチの状態を入力することができます｡
このように､ バッチ用の偽の次元を持つトーチテンソルを使って､ ネットワークに入る状態を初期化したわけです｡
だから､ 完璧なんです｡
これでモデルの出力が得られたわけですが､ ここでまた技術的なトリックが発生します｡
もし､ 自己をモデル化するバッチ状態だけをうまくやれば､ すべての可能なアクションの出力が得られるでしょう､ ほら､
ゼロ1と2です｡
でも､ それは私たちが望んでいることではありません｡
私たちが関心を持つのは､ 選択された行動､ つまりネットワークによってその都度プレイすることが決定された行動だけです｡
そして､ 私たちが興味を持っているこれらのアクションを得るために､ アクションがうまく再生されるのです｡
選択されたアクションだけが欲しいので､ 1つを入力するこのgather関数を使わなければならないのです｡
そして､ これでバッチアクションを追加します｡ バッチアクションは､ バッチステートの入力状態ごとに再生する最適なアクションをその都度集めます｡
私たちが欲しいのは､ プレイされるアクション､ 選ばれるアクションだけであり､ このギャザーワンやバッチアクションでこれを手に入れることができます｡
でも､ その時は気をつけてください｡
このバッチ状態には､ バッチに対応するこの偽の次元があり､ バッチアクションにはそれが戻ってこない､
状態にはそれがある？
というのも､ ここではエントリーを使用していますが､ アクションについてはスクイーズでは一切使用していないからです｡
そこで､ バッチアクションがバッチステートと全く同じ次元になるように､ ここに追加する必要があります｡
そこで､ スクイーズ・ゼロにドットを追加することにします｡
ここです｡
そして､ 実はこれはゼロではなく､ 1なのです｡ ゼロは国家の信仰の次元に対応し､ 1は行動のフェイクの次元に対応することになるからです｡
そして最後に､ この偽バッチをスクイーズで殺す必要があるのです｡
そして､ なぜそのようなことをする必要があるのでしょうか｡
なぜなら､ 今はニューラルネットワークから外れているからです｡
出力はしているが､ 一括では困る｡
単純なテンソル､ 単純なベクトル､ 出力のベクトルで欲しいのです｡
バッチは､ ちょうどニューラルネットワークで作業するときに､ ニューラルネットワークがセンサーのフォーマットをバッチにすることを想定しているからです｡
しかし､ 今は出力があるので､ 次の深層学習のバランス式では､ バッチにする必要はないでしょう｡
だから､ ここでバッチを殺しているんです｡
偽物の次元を殺して､ 出力のシンプルな形を取り戻そうとしているのです｡
だから､ ここにドット､ そしてスクイーズを加えているんです｡
そして､ アクションのバッチに対応する偽の次元を殺したいので｡
さて､ この偽次元にはインデックスが1つあるので､ ここに1つ追加します｡
わかりました｡
そして今､ こうしている｡
私たちは､ OCというアウトプットを持っています｡
少し予告します｡
何ですか？
ローカル変数outputsは割り当てられるが､ 使用されることはない｡
それでいいんです｡
さっそく使わせていただきます｡
これが私たちのアウトプットなんですね｡
そして今､ 私たちは次を手に入れたいと考えています｡
出力します｡
では､ なぜ次の出力が必要なのか､ と思われるかもしれません｡
さて､ これを理解するためには､ ここにある深層学習のアルゴリズムに戻る必要があります｡
それは､ ロジックハンドブックの一部です｡
それがディープラーニングの全体像なんですね｡
最初にすべての値を初期化し､ その都度
T そうですか､ そうですか｡
ソフトマックスでアクションを選択します｡
それが「セレクトアクション」機能です｡
そして､ 遷移を追加して､ ご覧のように予測､ 目標､ 損失を計算します｡
では､ なぜ次の出力も必要なのでしょうか？
それは､ ターゲットがあるからです｡
目標はγ倍､ 次の出力に報酬を加えたものに等しく､ その直後に目標を計算します｡
しかし､ ターゲットの次の出力が必要なので､ まずこれを計算しよう｡
つまり､ 次の出力を得るには､ とても簡単なことなのです｡
次の出力は､ 次の日付のバッチを入力としたときのニューラルネットワークの結果になります｡
つまり､ 非常に簡単に言えば､ ニューラルネットワークのモデルを作成し､ 今回のニューラルネットワークの入力は､
次のバッチの日付になります｡
バッチ次回の日付です｡
しかし､ 今､ 思い出してほしいのは､ 深層学習アルゴリズムに戻ると､ まあ､ 次の出力は､
すべての行動に関して､ 次の集合のキュー値の最大値であることがわかります｡
つまり､ 今､ 次の出力を得るためには､ このQ値の最大値を得る必要があるのです｡
というのも､ このバッチにはいくつかの状態があるからです｡
そこで､ detach関数を使ってすべてのキューを切り離し､ これらのキューの値の最大値を取っているのです｡
そして､ これらのQ値のうち､ アクションに関する最大値を取っているので､ まあ､ アクションに関するものであることを明記する必要があります｡
そして､ アクションはインデックス1で表されるため､ ここでもインデックス1を置き､
次の状態であるs tプラス1のQ値を取ることを指定しなければならないのです｡
そして､ 次の状態はインデックスゼロで表される｡ インデックスゼロは状態に対応するからだ｡
したがって､ ここではインデックスがゼロの括弧を追加する必要があります｡
そうすれば､ インデックス0で表される次の状態のQ値の最大値を､ インデックス1で表されるすべての行動に従って得ることができる｡
そして今､ 完璧になった｡
次の出力を得ることができます｡
これらは､ 新しい状態です｡
そこで警告を受けたのです｡
でも､ それでいいんです｡
今すぐ使って､ ターゲットを計算します｡
そして､ ターゲットといえば､ この学習機能の次のステップです｡
そうそう､ そうなんです｡
ターゲットは等しい｡
さて､ AIハンドブックに話を戻しましょう｡
ターゲットは報酬にガンマ回数を加えたものである｡
次の出力は､ 行動に従って次の日付のQ値の最大値となる｡
そうそう､ そうなんです｡
それを計算してみましょう｡
つまり､ self, that gammaとself, that gammaは等しく､ ここで初期化され､ 導入されるのです｡
これはGQとオブジェクトの変数で､ 先ほど言ったようにガンマに次の出力を掛け､ さらにバッチ報酬を加えたもので､
ここではバッチを扱っているのでプラスバッチです｡
ご褒美
そして､ それがメモリの1サンプルでターゲットになります｡
ガンマに次の出力を掛け合わせたものを報酬とする｡
よし､ 完璧だ｡
さて､ これでアウトプットができました｡
また､ 目標もあります｡
したがって､ 予測誤差を表す損失､ ロスを計算することができる｡
だから､ これは負けとしよう｡
TD損失 TDはもちろんCU学習の核となる時間差の損失で､ このTD損失はQ学習を大幅に改善するHuber損失と等しくなる予定である｡
それが､ 私たちが人工知能に選ぶ最後の機能です｡
ディープラーニングのコースから来た人には､ ディープラーニングを導入するなら､
本当におすすめのロスです｡
それで､ このフーバー・ロスをどうするのか？
さて､ 今回もFで表される機能モジュールから関数を取り出してみます｡
したがって､ ここで私は私たちの機能モジュールFドットを使用するつもりですと､ 関数スムーズlのおかげで得ることができるようにハッブルは､
その1を失うので､ エンターキーを押すと､ それは本当に私が深層学習にお勧めします最高の失われた関数です｡
本当にQの学習が向上するのですが､ これは機能なんです｡
だから､ 括弧をいくつか追加して､ あとは予測値とターゲットを入力するためのシンプルな引数だけです｡
つまり､ 予測はもちろん､ ニューラルネットワークの出力ですから､ 私たちの出力です｡
ニューラルネットワークの出力は､ ニューラルネットワークが予測したものなんですよね｡
というのが予測です｡
つまり､ ここでの第一の論点は､ 出力です｡
そして第2引数は､ もちろんターゲットです｡
我々が得ようとしているもの､ それはすでに完璧に計算され､ 我々は直接ターゲット完璧を入力することができ､
今損失を持っています｡
ただ､ ここで少し忘れていたことがあります｡
これでよしとしよう｡
これで､ 警告が消えるはずです｡
はい､ 完璧です｡
そして､ 最後のエラーが出たので､ このエラーをネットワークに逆伝播して､ 確率的勾配降下法で重みを更新することができるのです｡
そして､ それこそが､ 次のステップで行うべきことなのです｡
さて､ 次はご想像のとおり､ オプティマイザーを使ってみましょう｡
アトム・オプティマイザーはアトムクラスのオブジェクトで､ すでにモデルのパラメータがフィットしており､
学習率も0を選択しています｡
1％です｡
これでオプティマイザーの準備は整いましたが､ あとは最後のエラーに対して確率的勾配降下とデータの重みを適用する必要があります｡
そのため､ PyTorchを扱う際には､ まずループの反復ごとに初期化をし直す必要があります｡
確率的勾配降下のループの中で､ ある反復から別の反復へと､ ループの持続時間ごとに最適化器を再初期化しなければなりません｡
さて､ 今回はゼログリッドである次の方法を使います｡
さて､ ゼログリッドは､ ループの各反復でオプティマイザーを再初期化します｡
それから､ 忘れてはいけないのが､ 「括弧」です｡
完璧です｡
そして､ 再初期化されたことで､ オプティマイザで逆伝播を行うことができるようになりました｡
そして､ どうすればいいのか？
さて､ TDロスを受け取って､ それをネットワークに逆伝播するのですが､ ネットワークに逆伝播するためには､
バックワード関数を使用する必要があります｡
そして､ このバックワード関数の内部では､ アンダースコア変数を入力し､ 保持し､ それをtrueに等しく設定することをお勧めします｡
そうすることで､ バックプロパゲーションが改善されるので､ おすすめです｡
return variables equals trueの使い方は､ メモリを解放するためで､ 何度も損失を出すのでメモリを解放する必要があります｡
そうすれば､ トレーニングのパフォーマンスも確実に向上するわけです｡
そして最後に､ この学習関数の最後のステップは､ バックプロパゲーションに従って､ つまり､ 重みがどれだけ誤差に寄与したかに応じて､
重みを更新することである｡
そのために､ 初期化されたオプティマイザーを再度､ 初期化し､ ステップ関数を使用します｡
ステップ関数を使用することによって､ このコードの行で簡単に重みを更新します｡
それが､ 重さを更新するこの一行のコードです｡
このコードの行は､ エラーをニューラルネットワークに逆伝播し､ このコードの行は､ オプティマイザーを使って重みを更新しています｡
そして､ そこに行く｡
学習型ニューラルネットワークがあります｡
わかりました｡
だから､ おめでとうございます｡
今回のディープラーニングモデルの中で､ 最も技術的に難しい部分だったのではないでしょうか｡
PyTorchは時にトリッキーですが､ 最終的には非常に機能的なニューラルネットワーク､
つまりディープラーニングモデル､ そして最終的には素晴らしい人工知能を手に入れることができることをお約束します｡
AIが新しい状態を発見したときに更新する更新関数です｡
つまり､ 新しい状態を発見し､ 先ほど行った行動とこの新しい状態に応じた報酬を受け取ることができるのです｡
そこで､ update関数でこれを処理することにします｡ これは次のチュートリアルで行います｡
それまではお楽しみに｡
I.