こんにちは､ このPythonチュートリアルへようこそ｡
さて､ これから非常にエキサイティングなチュートリアルが待っています｡
まず､ ニューラルネットワークのアーキテクチャを作るところから始めます｡
つまり､ AIの核となる､ その都度再生するアクションを返すニューラルネットワークを作るのです｡
ほらね｡
では､ こうしてみましょう｡
そこで､ ニューラルネットワークをオブジェクトにしたいので､ クラスを作ることにします｡
そして､ その方がずっと便利だからです｡
Know a classは､ 私たちが作りたいもののモデルなのです｡
ニューラルネットワークを作りたいのですが､ そのためには､ すべてクラスに含まれるような何らかの命令を作る必要があります｡
そして､ この授業では､ 2つの関数を作ることにします｡
まず､ init関数ですが､ これはクラスを作るときにいつも出てくる関数で､
基本的にオブジェクトの変数を定義します｡
それがニューラルネットワークで､ グローバル変数とは対照的に､ オブジェクトにアタッチされた変数がありますよね｡
そして､ このinit関数でニューラルネットワークのアーキテクチャを定義します｡
入力状態の符号化ベクトルが5次元なので､ 5つの入力ニューロンで構成される入力層を定義し､
次にいくつかの隠れ層を定義することになります｡
まずは1つの隠れ層から始めて､ 他のニューラルネットワークのアーキテクチャを試してみるのもいいかもしれませんね｡
そしてもちろん､ 最終的には出力レイヤーに､ 各時刻に再生可能なアクションが格納されます｡
ですから､ このinit関数で行うのはまさにこれです｡
そして､ クラスの中にもう一つ関数を作ります｡ これが前進関数で､ ニューラルネットワークのニューロンを活性化する関数です｡
つまり､ 信号を活性化する関数です｡
もちろん純粋に非線形な問題を扱っているので､ 整流器活性化関数を使いますが､ この整流器関数は線形性を壊してしまいます｡
しかし､ ほとんどの場合､ このフォワード関数はニューラルネットワークの出力であるQ値を返すように作っています｡
しかし､ 各アクションに対して1つのキュー値を持っており､ 後でキュー値の最大値を取るか､ ソフトマックス法を用いて最終的なアクションを返すことになる｡
それは追々見ていくとして｡
そこで､ このチュートリアルでは､ まずinit関数を実装し､ 次回はforward関数を実装する予定です｡
では､ こうしてみましょう｡
まず､ クラスの紹介をする必要があります｡
そこで､ まずは授業から｡
そして､ このクラスに名前を付けます｡ まあ､ networkと呼ぶこともできます｡
そして､ このネットワーククラスでは､ 継承と呼ばれるオブジェクト・プログラミングのテクニックを使います｡
つまり､ これから作るネットワーク・クラスは､ より大きなクラスであるRN DOTモジュールの子クラスなのです｡
つまり､ このモジュールクラスのすべてのツールを継承することで､ もちろんニューラルネットワークを実装するためのツールになるわけです｡
これは､ オブジェクト指向プログラミングにおける非常に強力で効率的なトリックで､ 継承と呼ばれているんですね｡
そして今､ このモジュールの親クラスを継承しています｡
わかりました｡
そして､ これでクラスの中に入る準備ができました｡
というわけで､ 実はエンターキーを2回押しています｡ 2つの関数を作るので､ まずはinit関数からです｡
init関数は､ アンダースコアを2つ使って､ このように名前を付けなければなりません｡
そしてまたアンダースコアにするのはPythonの構文で､ そうしなければならないだけで､ 引数を入力する必要があります｡
というわけで､ 3つの主張があります｡
1つ目は､ 実は自己と自己という強制的な論法です｡
これから作るこのクラスから生成されるオブジェクトを指すというのは､ 不思議とありません｡
この授業は､ 私たちが作っているんですよ｡
これは､ 私たちが構築したいニューラルネットワークのモデルであり､ 命令のようなものです｡
そして､ 授業の準備が整ったら､ 好きなだけニューラルネットワークを作ればいいのです｡
そして､ これらのニューラルネットワークは､ それぞれこのクラスの何らかのオブジェクトになる｡
そして､ このオブジェクトを他の目的で使用することになるので､ オブジェクトの変数が何であるかを特定する必要があります｡
そして､ これを見破るために､ このselfを使って､ オブジェクトを参照していることを指定しているのです｡
そこで､ 自分のオブジェクトの変数を使いたいときは､ 変数の前に self を使って､ これがオブジェクトの変数であることを指定することにします｡
わかりました｡
それが第一の主張ですね｡
そして､ もう一つの引数は､ もちろん入力ニューロンの数と出力ニューロンの数である｡
そこで､ 入力ニューロンの数､ これを入力サイズと呼ぶことにします｡
入力ベクトルは､ 3つの信号＋方向＋マイナス方向の5次元ですから､ 実際には5つです｡
これが､ 環境の1つの状態を表す､ 符号化された値のベクトルです｡
この5つの値だけで､ 環境の状態を表現することができるのです｡
より少ない価値観や､ より多くの価値観を考えることもできたのですが､ それを試してみたのです｡
そして､ 実際には､ 左から1つ､ 前から1つ､ 右から1つの信号が必要なので､ 理にかなっています｡
車を運転するとき､ 360の信号､ つまりGoogleカーの上部にある信号のようなものにすればよかったんです｡
でも､ 3つのセンサーで完全に自動運転ができるんです｡
そして､ このオリエンテーションとマイナス・オリエンテーションで､ 目指すゴールを把握するのです｡
そして､ もちろん､ 行動に対応するニューラルネットワークの出力ニューロンがあります｡
そして､ 左回り､ 直進､ 右回りの3つのアクションが考えられます｡
それゆえ､ 私はそれを呼んでアクションとするつもりです｡
そして､ その数は3人になります｡
わかりました｡
でも､ ここまでは入力に名前をつけるだけで､ あとはその変数を使ってニューラルネットワークの中で計算をします｡
よし､ それなら
まずはPyTorchの別のトリックを使ってみることにします｡
この仕掛けがスーパーファンクションです｡
これは､ 実はRNモジュールを継承した機能なんです｡
そのため､ モジュールツールの継承を行う必要があったわけです｡
これは､ 私たちが最初に使うツールです｡
そして､ 基本的には､ このスーパートリック､ スーパーファンクションを使って､ モジュールのツールを使えるようにしているだけなのです｡
だから､ その方がずっと効率的なんです｡
そして､ このスーパーファンクションの中で､ 最初にネットワークを指定する必要があるんだ｡
これがネットワークの子クラスで､ モジュールの親クラスとオブジェクトを継承して､
ドットやイニシャル関数を追加しています｡
わかりました｡
これは､ そのモジュールのすべてのツールを使用するだけのトリックで､ 次のステップである入力レイヤーの指定に進むことができるわけです｡
つまり､ 基本的に私がしなければならないのは､ オブジェクトにアタッチされる新しい変数を導入し､
この変数に入力ニューロンの数を格納することです｡
だから､ 入力サイズと混同しないように｡
入力サイズはinit関数の引数ですが､ それはまだオブジェクトにアタッチされる変数ではありません｡
さて､ 先ほど述べたように､ 代わりにオブジェクトにアタッチされることを指定する必要があります｡
そこで､ selfドットを使って､ オブジェクトに付けられたこの最初の変数に名前を付けています｡
それで､ 入力と同じ名前をつければいいのです｡
これをinput sizeと呼び､ init関数の引数がinput sizeであることと等しいとすることができる｡
わかりました｡
したがって､ ネットワーク・クラスからオブジェクトを作成し､
入力サイズを指定するたびに､ たとえば5を入力すると､ ここには5があるので､
オブジェクトの入力サイズ変数には5という値が設定されることになります｡
わかりました｡
そして､ これはオブジェクトにアタッチしたい他の変数についても同じです｡
そして､ ご想像の通り､ これは出力ニューロンの数を表す変数になります｡
そして､ オブジェクトのselfを取り､ このオブジェクトの2番目の変数に名前をつけて､ それを呼び出すと､
アクションになるのです｡
そして､ これはこの引数と同じになり､ アクションの数､ つまり出力ニューロンの数を与えます｡
そして､ それをイコールとし､ アクションとするのです｡
つまり､ actuallyとbe actionは3つになる｡
したがって､ ネットワークへのオブジェクトに付属する変数とアクションは､ 3という値を得ることになります｡
実は､ ここに警告を見ることができるのです｡
これは､ RNのショートカットを使っているからで､ このショートカットを使って､ 最後のmoduleのところで使うようにすれば､
消えます｡
さあ､ どうぞ｡
完璧です｡
今､ 私たちは警告を発していません｡
ここでの警告はすべて､ インポートしたものがまだ使われていないことを指定するためのものです｡
でも､ それでいいんです｡
この後､ 使用する予定です｡
よし､ ではもう2つ変数を用意しよう｡
4つのオブジェクトを定義したいと思います｡
そしてこれが､ ニューラルネットワークの異なる層間の完全な接続となります｡
つまり､ 今は隠れ層1つだけで構成されるニューラルネットワークを作りたいので､ まあ完全な接続が2つあることになりますね｡
入力層と隠れ層の間には1/1の完全な接続があり､ 隠れ層と出力層の間には1/2の完全な接続があることになる｡
では､ まず最初にフル接続するところから始めましょう｡
FC1ということにしています｡
また､ ここでもselfを使って､ FC oneが私のオブジェクトの変数であることを指定しています｡
だから､ そのFC1をセルフで｡
と同じになる｡
そして今度はRNモジュールを使って､ linearという関数を使ってみます｡
そして､ まさにこの入力層のニューロンと隠れ層のニューロンとの間の完全な接続を行うためです｡
そして､ フル接続とはどういうことでしょうか？
つまり､ 入力層のすべてのニューロンは､ すべて隠れ層のすべてのニューロンに接続されることになる｡
そこで､ この完全な接続を行うために､ いくつかの引数を入力する必要があるこの一次関数を使用します｡
そして､ これらの主張はご覧の通り､ 特徴としてあります｡
つまり､ これが接続したい第1層のニューロン数です｡
次にout featuresですが､ これは2層目のニューロンを接続したい数です｡
右側の層が隠れ層で､ バイアスは真に等しい｡
偏っているイコール真実ということですね｡
バイアスを持つためにデフォルト値を維持し､ ニューロンを取り付ける方法だけでなく､
各層に重みと1つのバイアスを持つことにします｡
というわけで......さて､ 何を入力すればいいのか､ 見てみましょう｡
つまり､ featuresの最初の引数は､ 入力層の入力ニューロンの数である｡
それで､ 何なんですか？
まあ､ 実際には入力サイズなんですけどね｡
これがinit関数の引数で､ 後で3つの信号の向きとマイナスの向きを5つずつ等しくすることになります｡
それでは､ どうぞ｡
第1引数の入力サイズを入力する｡
そして､ 2つ目の論点は､ 機能に関するものです｡
つまり､ 2層目､ つまり1層目に完全に接続される2層目に欲しいニューロンの数です｡
そこで問題は､ この隠れ層に何個のニューロンを入れるかです｡
まあ､ パラメータのチューニングはかなりやりましたね｡
いろいろと実験してみたんです｡
それがAIであったり､ ディープラーニングであったりするわけです｡
一般的には､ 特定の問題に対してどのようなニューラルネットワークが最適なのか､ 多くの実験を行います｡
それで､ いろいろな値を試して､ 最終的に隠れ層のニューロンを30個､ 30個にしました｡
そして､ この数字で､ かなり良い結果が得られることがおわかりいただけると思います｡
でもそれなら､ ニューラルネットワークのアーキテクチャを自由に変えてもいい｡
自由に遊んでみてください｡
隠れ層の隠れニューロンの数を変えるだけでなく､ さらにいくつかの層を追加することで､
より良い車を得ることができるかもしれません｡
しかし､ 3000個のニューロンは､ 良いニューラルネットワークと良い車を手に入れることができます｡
だから､ それを目指すのです｡
そして､ そこに行く｡
この一次関数で初めて完全な接続を実現しました｡
入力層と隠れ層の間の完全な接続を行うのです｡
そして､ いよいよ2回目の完全接続です｡
それが隠れ層と出力層の間の完全な接続です｡
そうそう､ そうなんです｡
これを2つ目のフルコネクションと呼ぶことにします｡
FC 2 そこへ行く｡
そして､ やはりこれは私たちのオブジェクトからの変数です｡
RNモジュールと1次関数を使いますが､
その前に引数を変更する必要があります｡
それは同じです｡
第一は､ 食物連関の第一層に欲しいニューロンの数です｡
つまり､ これが隠れ層なので､ 30になります｡
そして､ 第2引数は食物連関の第2層のニューロン数で､ これは出力層に相当する｡
そして､ 出力層には､ アクションニューロンがあり､ 後に3つの可能なアクションがあるので､ 3つになります｡
しかし､ これまでのところ､ 我々は我々が定義した名前を使用する必要があります､ それはinit関数の引数の名前であり､
したがって､ 我々はここに入力し､ アクションである｡
そして､ そこに行く｡
まず､ 2つのフルコネクションの準備ができ､ 次に､ init関数の準備ができました｡
ネットワーク・クラスからオブジェクトを作成するときは､ このようにオブジェクトを初期化します｡
オブジェクトを作るとすぐに､ これらの変数､ つまりここにある4つの変数 input sizeとbe
action FC 1とFC 2が定義されることになります｡
こうして､ ニューラルネットワークのアーキテクチャが出来上がるわけです｡
作成した各オブジェクトは､ 5つの入力ニューロン､ 30個の隠れニューロン､ 3つの出力ニューロンからなるニューラルネットワークに対応することになります｡
そうそう､ そうなんです｡
この関数は整流器活性化関数を用いてニューラルネットワークのニューロンを活性化し､
最終的にニューラルネットワークの出力であるQ値を返すために使用されます｡
だから､ 早く次のチュートリアルでやりたいんです｡
そしてそれまで､ お楽しみに｡
I.