こんにちは､ このPythonチュートリアルへようこそ｡
それでは､ このチュートリアルでは､ その都度正しいアクションを選択する関数を作っていきます｡
ですから､ 基本的には､ ゴールに向かって左回り､ 直進､ 右回り､ それぞれのタイミングで正しい動きをさせ､
障害物を避けて降下する部分を実装していきます｡
では､ 今すぐやってみましょう｡
いつものようにdefで関数を定義して､ 関数に名前をつけて､ selectと呼ぶことにします｡
アクション
そして､ いくつかの括弧とこの選択アクション関数は2つの引数を取ることになります｡
最初のものは､ オブジェクトを参照するために通常通り自己である｡
そして､ 2つ目の議論ですが､ あなたによるとどちらになるのでしょうか？
さて､ それは何でしょう？
考えてみれば､ 私たちが選択する行動は､ ニューラルネットワークの出力からきています｡ ニューラルネットワークの出力は､
3つの可能な行動それぞれに対するキューの値ですから､ 私たちが演じる行動､ ニューラルネットワークの出力となる行動は､
入力状態に依存しているのです｡
そして､ この入力状態は､ まさにselect action関数に必要な第2引数である｡
文字通り､ ニューラルネットワークの出力を取り出すからです｡
そしてもちろん､ ニューラルネットワークの出力は､ ニューラルネットワークの入力に直接依存する｡
だから､ それが私たちの主張になるのです｡
そして今､ 私たちはそれにどんな名前でもつけることができます｡
実際には､ ニューラルネットワークの入力は､ ベクトル5次元､ 3つの信号の向きとマイナスの向きで符号化された入力状態であるため､
状態と呼ぶことにします｡
それで､ 今は楽になった｡
入力された状態を､ すぐ上で構築したニューラルネットワークに､ このネットワーククラスで送り込みます｡
そして､ 3つの可能な行動のそれぞれのキュー値である出力を得ることになります｡
そして､ このチュートリアルで説明するソフトマックスの手法で､ 最後のアクションを再生させるのです｡
では､ こうしてみましょう｡
関数に入り､ これをすべて実装してみましょう｡
そこで､ まず始めに､ 今お話したような詰めについてです｡
マックス ソフトマックスの考え方は､ その都度､ 最適なアクションを考えながら､ 同時にさまざまなアクションを探っていくということです｡
そして､ どうすればいいのか？
他のアクションを模索しながらも､ どうすれば最適なアクションをプレイできるのか｡
さて､ このソフトマックスの考え方は､ Q値Q状態行動のそれぞれについて確率の分布を生成することからなるものである｡
1つのアクションに対して1つのQ値を用意していますね｡
左へ行く､ まっすぐ行く､ 右へ行く｡
しかし､ このQ値も入力状態に依存する｡
まさにQファンクションを見て､ 直感的にレクチャーを受けたわけですね｡
このQ関数は､ 状態とアクションの関数である｡
つまり､ ここには1つの入力状態､ つまりここの状態があり､ 3つの可能なアクションがあるので､ 3つあることになります｡
Q 価値観について｡
Q ステートアクション1｡
Qステートアクション2､ Qステートアクション3｡
そして､ この3つのQ値に関する確率の分布を生成することになります｡
つまり､ 1つ目のQ値に対する確率､ 2つ目のQ値に対する確率､ 3つ目のQ値に対する確率を1つずつ用意することになる｡
そして､ これら3つの確率はすべて合計すると1になる｡
そして､ これをすべてソフトマックスで行うわけですが､ ソフトマックスは､ 最も高いQ値に大きな確率を帰属させます｡
だから､ 自己最大値の代わりに､ 単純な最大値､ つまり､ Q値の最大値を直接取るという方法があるんだ｡
しかし､ その場合､ 他のアクションを探っているわけではありません｡
この確率のおかげで､ すぐにわかる温度パラメータを使って､ どこかを探検することができるのです｡
この温度パラメーターを設定することで､ まだ探索することができます｡
ですから､ 一般にディープラーニングでは､ 単純なarg maxではなく､ soft maxを使うことを強くお勧めします｡
よし､ じゃあソフトマックスを実装しよう｡
したがって､ あなたが理解したように､ Soft Maxは3つの可能な行動に対する3つのQ値のそれぞれの確率を返すので､
さて､ 最初に作成する変数は､ もちろん､ これらの確率を参照するprobsとします｡
だから､ 小道具はイコール｡
そして､ 今度はソフトマックス関数を使います｡
そして､ あなたによると､ どこから取るつもりなのでしょうか？
まあ､ 当然ですね｡
トーチドットやドットファンクショナルサブモジュールをインポートしたのは､ ニューラルネットワークを実装するためのアクションがほとんど含まれているモジュールだと記憶しています｡
ショートカットにしたのです｡
F そして､ この機能的なサブモジュールから､ まさに自己最大関数を取り出そうとしているわけです｡
しかし､ fというショートカットをつけたので､ ここではFを表す関数から始め､ そこからソフトマックス関数を取り出すことにします｡
これです｡
それが最初の1枚です｡
と括弧書き｡
わかりました｡
さて､ このself max関数には何を入力すればいいのでしょうか？
もちろん､ それは確率分布を作りたい対象である｡
そして､ その実体は何なのか？
まあ､ これらはもちろんQ値なんですけどね｡
そこで今度は､ Q値をどのように求めるかです｡
まあ､ 当然ですが､ Q値はニューラルネットワークの出力ですからね｡
そして､ このニューラルネットワークの出力を得るために､ さて､ どうするか｡
ニューラルネットワークを
でも実は､ すでに持っているんです､ それが｡
init関数で初期化したself dot modelは､ networkクラスのオブジェクトなので､
ニューラルネットワークに他なりません｡
それで完璧なんです｡
ここで作ったモデルをself maxで入力状態に適用すれば､ 引数として求めている出力が返ってくるのです｡
それがQ値です｡
それで､ なぜここでモデルを取ってinit関数に導入しなければならなかったのか､ 直感的に理解できるようになったかもしれません｡
オブジェクト指向プログラミングを始めた方にとっては､ これらすべてが自然なことだとおわかりいただけると思います｡
じゃあ､ セルフMAXで｡
ここで作成したオブジェクトのモデルでなければならないので､ モデル self dot model を取ります｡
しかし､ 次にニューラルネットワークモデルの出力を得る必要があります｡ そのため､
ここにいくつかの括弧を追加して､ stateという入力状態を入力します｡
つまり､ 最初にやりたいことは状態の入力なのですが､ ここで何かに気をつけなければならないのです｡
今は単純な状態のように見えるが､ 実はこの状態はトーチテンソルになることを覚えておいてほしい｡
なぜなら､ 後でこのself less stateを使ってselectアクション関数の引数に入れるからで､ ここにある状態の引数は､
実は後でこのself､ that less stateになるのだ｡
そして､ これはトーチテンソルなので､ まあモデルが受け入れてくれるからいいんですけどね｡
しかし､ 今はアルゴリズムを改良することができます｡
つまり､ ご理解いただいたように､ Stateはトーチテンソルなのです｡
また､ 先ほども言ったように､ ほとんどのセンサーはグラデーションを含む変数にラップされています｡
では､ まずテンソルである入力状態をtorch変数にラップしてみましょう｡
しかし､ これは入力状態なので､ まあ､ 多少の差別化はできないでしょう｡
この状態の変数の勾配は計算には使わない｡
したがって､ これから行うのは､ このトーチテンソルの状態をトーチ変数に変換することである｡
そうそう｡
しかし､ その後､ PNモジュールのすべての計算のグラフの勾配はいらないと指定すること｡
さて､ 私たちはここに､ 揮発性の等しい真を追加します｡
これで､ トーチテンソルがトーチ変数になったわけです｡
しかし､ このvolatile equals trueパラメータのおかげで､ まあ､ この入力状態に関連する勾配を､
モジュールのすべての計算のグラフに含めることはないでしょう｡
これも技術的なトリックなんですね｡
これにより､ メモリを節約することができ､ したがって､ これはパフォーマンスを向上させることができます｡
そこで､ ぜひやっていただきたいのが､ これからもっと楽しいことを追加していくことです｡
先ほどのこの温度パラメーターについてです｡
つまり､ この温度パラメータは､ ニューラルネットワークがどのような行動を取るべきかを確信する方法を調節するためのパラメータなのです｡
つまり､ この温度パラメータは正の数になり､ ゼロに近いほど､ ニューラルネットワークがアクションをするときの確信度が低くなる｡
そして､ この温度パラメータが高いほど､ ニューラルネットワークが決定するアクションの確度が高くなる｡
そして､ このパラメータを追加するために､ キュー値であるアウトプットにこの温度パラメータを掛け合わせることにしています｡
そこで､ 例えば7から始めて､ ここに小さなコメントTイコール7を指定することにしましょう｡
つまり､ 温度パラメータを7に設定しているわけです｡
他にもいろいろ試してみたいのですが､ まずは小さいものから見ていただきたいのです｡
私たちのクルマは､ まだ何かの昆虫のような挙動をする｡
しかし､ その後､ この温度パラメータを増やすことで､ 我々のコードはより車のように見えるようになります｡
それに､ セルの運転がもっと､ もっとよくなりますよ｡
つまり､ この温度パラメータが高ければ高いほど､ Q値の当選確率が高くなるわけですから､ 理にかなっていると思います｡
というのも､ 例えばQ値のソフトマックスがあったとして､ 簡単な数字を挙げてみましょう｡
1､ 2､ 3
1～3の詰め合わせ最大値が､ 例えば0になる場合｡ 04､ お点前11､ 0｡ 85.
そして､ より高い温度をとって温度を上げることで､ 今､ 温度は1に等しくなります｡
例えば2などの高い温度を取ることで､ より効果的です｡
だからソフトMAX｡
これをコピーして､ 掛け算してみましょう｡
例えば､ Macの詰め物が2つでも3つでもQ値は同じですが､ この温度パラメータを3倍しています｡
まあ､ 最初のQ値については､ これは非常に低い確率でしたから､ ゼロのようなものが得られるでしょう｡
つまり､ ゼロ付近の確率で､ 2番目の確率は非常に小さいということです｡
そこで､ 例えば0とします｡ 02 しかし､ 3つ目の確率は最も大きく､ かなり高いものでしたから､ 温度を上げることで､
この確率はさらに大きくなります｡ なぜなら､ 私たちがしなければならない行動に対応する正しいQ値であると､
さらに確信が持てるようになるからです｡
したがって､ これはああいうポイント98みたいなものになるわけです｡
さて､ この温度パラメータを上げると､ 3番目のアクションがプレイすべきアクションであることがより確かなものになります｡
この温度パラメーターはそういうことなんですね｡
どのアクションを決めるべきかという確信のことです｡
わかりました｡
というわけで､ このコメントは削除させていただきます｡
これは､ あくまでも説明のためです｡
そして､ いよいよアクションです｡
では､ どうすればいいのか？
さて､ ソフトマックス法の原理は､ Q値のそれぞれについて確率分布を生成するだけでなく､
このソフトマックス法の第二段階でもあります｡
この分布からランダムに抽選を行い､ 最終的なアクションを得る｡
そしてもちろん､ 分布がそうである以上､ 最も確率の高いQ値に対応するアクションを高い確率で得ることができるだろう｡
そうそう､ そうなんです｡
アクションを起こそう
そこで､ actionと呼ぶ新しい変数を導入することにします｡
そしてこのアクションは､ 先ほどこの行で作った確率分布の中からランダムに抽選されることになります｡
それで､ どうやったらそんなランダムな抽選ができるのか？
さて､ それぞれのQ値の小道具の確率をとってみます｡
propsとdotを取り､ multi nominal関数を使って､ この分布propsからランダムに抽選を行います｡
というわけで､ 以上です｡
それが､ アクションにつながるのです｡
完璧です｡
そして今度はもちろん､ ここにちょっとした仕掛けがあることをアクションで返していくわけです｡
さて､ この小道具は､ 多年生が偽のバッチでpytorch変数を返すという事実です｡ この偽の次元はバッチに対応し､
したがって､ 我々が望む正しい結果､ すなわち､ ゼロ1または2のアクションを得るために知っています｡
ここにデータを追加し､ いくつかの括弧を追加するだけで､ 私たちが探しているアクションゼロ1または2は､
インデックス､ ゼロとゼロに含まれています｡
わかりました｡
そして､ そこに行く｡
さて､ いよいよアクションです｡
このセレクトアクション機能により､ AIはその都度､ どのアクションをプレイすべきかを知ることができるようになりました｡
すごい｡
では､ 次の関数､ 学習関数に進みましょう｡
そこで､ 確率的勾配降下法を用いて､ 前方伝搬､ 後方伝搬と､ ニューラルネットワーク全体を学習させるのです｡
まあ､ 基本的には人工知能の心臓部であるディープラーニングモデルの学習を丸ごと実装することになります｡
だから､ 早くやりたいんです｡
これはエキサイティングなチュートリアルになりそうなので､ また次のチュートリアルでお会いしましょう｡
それまではお楽しみに｡
I.