こんにちは､ このチュートリアルにようこそ｡
さて､ この2つ目の関数を作って重みを初期化し､ この関数は実際にこれらの重みの最適な学習を得るために使われることになります｡
2つ目の関数は､ weightsと呼ぶことにします｡
そして､ その中のスコア｡
そして､ 引数としてニューラルネットワークを表すオブジェクトendを取る｡
というわけで､ 以上です｡
そして､ コロン｡
そして､ 今度は関数の中に入って､ 私たちがやりたかったことを定義してみましょう｡
つまり､ 私たちがやりたかったのは､ 最適な学習ができるようにニューラルネットワークの重みを初期化することなのです｡
ですから､ これは特に直感的にはわからないでしょう｡
これは､ 研究論文や実験に基づいています｡
これから重みを今まで見たこともないような特殊な方法で初期化しますが､ 信じてください､ それが学習プロセスを最適化するのです｡
そこで､ なぜこのように重みを初期化するのか､ その詳細には触れずに､ そのまま実装することにします｡
そこで､ まず､ 後で使うことになるトリックを使って､ 畳み込みと完全な接続を区別することにします｡
なぜなら､ 私たちの目には目がありますから､ 畳み込み層もあれば､
もちろん完全連結層もあり､ これら2種類の連結の重みの初期化が異なることを思い出してください｡
そこで､ このトリックを使ってこれら2種類の接続を分離し､ いくつかのif条件を使って､
それぞれの接続に対して異なる初期化を行うことにします｡
つまり､ このトリックは､ クラス名と呼ぶ新しい変数を作成し､ それをMオブジェクトと等しくすることです｡
つまり､ Mはニューラルネットワークを表しているのですが､ オブジェクトなんですね｡
このオブジェクトから特別な属性を取得します｡ クラス名にダブルアンダーコア､
最初のクラスにダブルアンダーコアドット､ 再び名前にダブルアンダーコア､ そしてもう少しでスコアにもう一つダブルが入ります｡
このように､ 新しいネットワーク・オブジェクトの接続の種類を探すのは､ かなり不格好なトリックです｡
でも､ それで私たちが欲しいものを手に入れることができるのです｡
if条件を開始すると､ それが意味を持つことが分かると思います｡
ちなみに､ ifの条件といえば､ 今すぐにでも始められますよ｡
そして､ これから行うのは､ 最初のif条件を開始し､ 最初のケースを取得することです｡
それは､ 接続がコンボリューションである場合です｡
それで､ この条件を書くために､ ifクラス名を書きます｡
でも大丈夫｡
ここでは､ findという細かいメソッドを使い､ その中にconfという引用符で畳み掛けるように入力しています｡ つまり､
クラス名のdot find confがマイナス1とは違うことをするのです｡
それは､ マイナス1がノーという意味なので､ 実はコンボリューションがある場合なのです｡
まあ､ その場合は重みの初期化を特別に行うことになるのですが｡
つまり､ この条件は､ 畳み込み接続がある場合ということです｡
ですから､ その場合はどうするかというと､ このように具体的にやりたい重みの初期化を実行するのです｡
そうすると､ 直感的でないものはすべてそこに来るわけです｡
まず､ weightとescort shapeと呼ぶ変数を作成します｡
このコースシェイプのウェイトは､ 基本的にニューラルネットワークのウェイトの形状を含むリストとなるわけです｡
と､ いうわけで､ リスト関数を使って､ リストを作ってみます｡
そして､ 内部ではニューラルネットワークのドットウエイトを入力することにしています｡
しかし､ コンボリューション関連では
そして､ これらの重みの形状を得るために､ ドットデータという別の属性を使用し､ そのサイズによって､ 畳み込み接続におけるこれらの重みの形状を得ることができます｡
つまり､ weight shapeは､ ニューラルネットワークの重みと畳み込み接続の形状をリストで含んでいるのだ｡
わかりました｡
そこで､ この畳み込み接続の重みを初期化するために､ 2つの値が必要になるのです｡
ファーストは､ 1次元と2次元の積､ 3次元の積です｡
それが今､ 手に入れようとしているものなんですね｡
そして､ 0次元×2次元×3次元も必要で､ この2つの値を使って重みを初期化する計算をします｡
では､ この最初の製品に取りかかりましょう｡
ファンインと呼んでいますが､ これが製品とイコールになるわけです｡
そして､ numpyによる関数で､ ショートカットのprod関数を使うことにします｡
NP そのprodをnpして､ prodの中に作りたいものを入力するわけです｡
そして､ これが私たちのウェイトシェイプの1次元､ 2次元､ 3次元ということになります｡
そして､ これを得るために､ 体重の形を取ることができるわけです｡
そして､ この3つの次元のインデックスを取得します｡
それで､ 1次元から3次元までが含まれ､ 4次元までは含まれないとしたのです｡
そしてそれは､ ここの上限が含まれていないために得られるものなのです｡
それならば､ それこそ私たちの望むところではないでしょうか｡
ファンアウトも同様です｡
先ほど言ったように､ ファンアウトは次元の積､ 0倍次元､ 2倍次元､ 3倍次元になります｡
そして､ ここでは､ 含まれる2つから除外される4つまでのインデックスを得ることができるわけです｡
つまり､ 2次元と3次元の積が得られ､ それに0次元を掛けることができます｡ 0次元は､
インデックス0のウェイトシェイプ0を使ってアクセスすることができます｡
つまり､ 要約すると､ これはディム1回､ ディム2回､ ディム3回となります｡
すぐ下にあります｡
ジムゼロ｡
タイムズディムからタイムズディム3までの我々の方法､ 形､ 重量のリスト｡
それでは､ この2つの値fan inとfan outを使って初期化に進みます｡
新しい値を計算し､ W boundと呼ぶことにします｡ これは､ 関数とpで得られる平方根に等しく､
前とまったく同じようにこのスクリプトによって得られます｡
つまり､ 6の平方根をファンとファンアウトで割ると､ ファンインとファンアウトができるわけです｡
つまり､ このWバウンドは､ ある意味､ 暫定的な重みの大きさを表しているのです｡
そして､ なぜこれを手に入れたのか｡
なぜなら､ これから行うのは､ 重みのテンソルのサイズに反比例するランダムな重みを生成したいからです｡
実際にこれから行うのは､ 新しいネットワーク､ Mを取ることです｡
そして､ その重さを得る｡
だから､ まだ属性重量を取ることで､ 次に過剰｡
センサーそのものであるデータです｡
そして､ この重みのテンソルから､ 重みのテンソルの大きさに反比例するランダムな重みをいくつか生成するのです｡
そこで､ この一様関数に､ マイナスW境界となる下限とプラスW境界となる上限を入力することになります｡
それがウェイトになるわけです｡
そして､ 今度はバイアスを初期化する必要があるのですが､ バイアスに朗報です｡
もっとシンプルになりそうです｡
すべてゼロで初期化します｡
そこで､ これらのバイオを取得するために､ モデルからバイオを取得します｡
もちろん､ それが私たちのニューラルネットワークです｡
そして､ そのための属性がバイアスになる｡
これは､ ご想像の通り､ バイアスのテンソルをゼロで埋めるために使用されます｡
さて､ ゼロの場合､ ここでゼロで埋め尽くすことを指定しなければなりません｡
というわけで､ ここにインプットしています｡
ゼロです｡
わかりました｡
つまり､ 要約すると､ テンソル重みの大きさに反比例したランダムな重みをいくつか生成し､ バイアスをゼロで初期化するのである｡
わかりました｡
つまり､ コンボリューション接続の初期化のためだったんですね｡
そして今度は､ 完全な接続のために同じことをする必要があります｡
新しい条件を追加します､ Elif､ このトリックを使います､ 最初のクラス名を使います､
この変数は接続の異なる名前を含んでいます｡
そのため､ クラス名が同じであれば､ 定義されたメソッドを使用することになります｡
それに対して､ 今回は古典的な線形接続と古典的な人工ニューラルネットワークである完全な接続を引用に入れました｡
それで､ その名前がリニアで､ マイナス1とは違うものにしたいと言うのに､
このトリックを使うんです｡
つまり､ このエンドオブクラス9のファインリニア､ 異なる､ マイナス1は､ 接続がリニアである場合､ つまり､ クラシックなフル接続である場合を意味します｡
では､ その場合､ 重みはどのように初期化するのでしょうか｡
まあ､ まったく同じになるんですけどね｡
この場合かあの場合のどちらかになるので､ 最初のものを消さない重みのある形状変数を導入する予定です｡
だから､ 同じにはならない｡
だから､ それを完全に再利用できるんです｡
それから同じ｡
今回は､ この3次元の積に等しくないファンを変数に導入します｡
しかし､ 実は今回は単純にイコールになる｡
1つ言いましたっけ？
そしてそれは､ 完全な接続の場合､ コンボリューション接続よりも接続数が少ないからです｡
NやCNNのコーナーにある直観講義で見たでしょ？
コンボリューションに比べ､ フル・コネクションの方が次元が低い｡
つまり､ 基本的にはこの1次元を取り込んで､ それを使ってw boundを計算するために､ fanned
outという変数を用意します｡
そして､ この1次元は､ インデックス・ゼロの重量形状になる｡
それがディメンション・ゼロです｡
よし､ じゃあwバウンドを計算するのも同じだ｡
6の平方根をファンニングとファンアウトの合計で割ったものになるんです｡
そうそう､ そうなんです｡
それから､ 以前と全く同じというのも良い点です｡
重みは一様関数､ バイアスは充填関数を用いて､ 同じような初期化を行った｡
しかし､ 今回はファンインとファンアウトが異なるため､ Wバウンドが異なる｡
つまり､ それと同じ原理ですね｡
それと同じ発想ですね｡
ここで唯一変わったのは､ 完全な接続のための寸法が少なくなったことで､ このランダムな重みを生成するための重みの境界の計算がより簡単になったことです｡
でも､ 今なら間に合うというのがいいところです｡
この機能だけでなく､ 2つの道具が揃ったので､ 脳を作り始める準備ができたのです｡
だから､ 待ち遠しいんです｡
もちろん､ これが一番楽しみなところでしょう｡
これは､ ウォームアップと､ 大事なことの準備のためでしたので､ 次のチュートリアルでそれを処理します｡
まあ､ 実際には何回かチュートリアルが必要なんですけどね｡
もちろん､ まず目を作って､ それから入力の時間的特性を学習するためのlshtmを追加して､ アクターとクリティックを担当することを忘れないようにしましょう｡
そして､ その中でこの2つの関数正規化列､ 初期化､ 重みを使うことになります｡
だから､ 早くやりたいんです｡
これから非常に強力なものを作りますので､ 覚悟しておいてください｡
それまではお楽しみに｡
I.