シリーズのブログは、原作者はGitHubの上で維持:https://aka.ms/beginnerAI、
星と星をクリックすると、より困難作者を主演意味するものではありません。
5.2ニューラルネットワークソリューション
高次元空間で線形フィッティングであるように、単一の線形回帰固有値と同様の問題、線形回帰の複数の変数(複数の固有値)を見ることができます。例ケースではなくポイントにフィット平面と、もはやフィット点に直線線形フィットである二つの特徴を有しています。
5.2.1ニューラルネットワークアーキテクチャ
私たちは、とにかく、入力層が2以上であり、これ以上の差異の2以上を図5-1に示したニューラルネットワークの層を定義していません。ニューラルネットワークのこの層の特長は以下のとおりです。
- 中間層ず、出力層のみエントリ(一つのエントリが作成されていない)は、
- 唯一の出力層ニューロン;
- 線形出力ニューロンは、活性化関数を介してを介して、図形すなわち、下部、処理されていないいる(\ \シグマ\)合計(\ Z)を\直接の値の後に\(Z \)値出力。
単層構造図5-1マルチ入力シングル出力ニューロン
前章ニューロンと比較し、これは単に1つの以上の入力が、質的変化である、すなわち、ニューロンは、同時に基本的なニューラルネットワークは複雑なロジックを扱うことができるされており、複数の入力を受け取ることができます。
入力層
最初のサンプルは、このような単一の外観です。
\ [X_1 = \開始{pmatrixの} X_ {11}&X_ {12} \端{pmatrixの} = \開始{pmatrixの} 10.06&60 \端{pmatrixの} \]
\ [Y_1 = \ \ {} pmatrixの302.86 \端{pmatrixのを}開始]
1000個のサンプル、各サンプル2つの特徴の値の合計、Xは\(\ 1000倍2 \)マトリックス:
\ [X = \開始{pmatrixのX_1} \\ X_2 \\ \ドット\\ X_ {1000年} \端{pmatrixの} = \開始{pmatrixの} X_ {1,1}&X_ {1,2} \\ X_ {2,1}&X_ {2,2} \\ \ドット&\ドット\\ X_ {1000,1}&X_ {1000,2} \端{pmatrixの} \]
\ [Yは= \ Y_1 \\ Y_2 \\ \ドット\\ Y_ {1000} \端{pmatrixの} = \開始{pmatrixの} 302.86 393.04 \\ \\ \ドット\\ 450.59 \端{pmatrixのを} {pmatrixのを}開始します\]
\(X_1 \) 、最初のサンプルを表す\(X_ {1,1} \)最初のサンプルの特性値を示し、\(Y_1 \)は、最初のタグのサンプル値です。
重量WとB
二つの入力層、出力層に特徴があるので変数であり、wは2X1の形状であり、bは1×1の形状です。
\ [W = \ \ {} pmatrixのW_1 \\ W_2 \端{pmatrixのを}開始]
\ [B =(B)\]
独自の値bを有するであろうニューロンが複数ある場合、唯一のニューロン出力層、そうだけBIAS一つにバイアス各ニューロンの対応があるためBは、単一の値です。
出力層
我々は、出力層これだけ1個のニューロンを回帰(フィッティング)のタスクを完了したいので。それはなし活性化機能で、線形なので。
\ [開始\ {整列} Z &= \開始{pmatrixの} X_ {11}&X_ {12} \端{pmatrixのは} W_1 \\ W_2 \端{pmatrixの} +(B)\\&=を{pmatrixのを}開始\ X_ {11} W_1 + X_ { ] \ {整列} 12} W_2 + B \端
行列形式で書かれて:
\ [Z = X \ CDOT W + B \]
損失関数
それは、線形回帰問題、平均二乗誤差関数を使用してその損失関数であるため。
\ [損失(W、B)= \ FRAC {1} {2}(z_i-Y_I)^ 2 \タグ{1} \]
ここで、\(z_i \)予測サンプル値は、\(Y_I \)サンプルラベルの値です。
5.2.2バックプロパゲーション
サンプル計算単一のマルチ機能
異なる前の章では、チャプター前方の計算式は、多値機能です。
\ [z_i = X_ {I1} \ CDOT W_1 + X_ {I2} \ CDOT W_2 + \ B]
\ [= \開始{pmatrixの} X_ {I1}&X_ {I2} \端{pmatrixの} \ {pmatrixのを}開始W_1 \\ W_2 \端{pmatrixの} + B \タグ{2} \]
ので\(X \)に対応する、2つの特徴の値を有している(Wは\)\ 2点の重みの加重値を有します。\(X_ {i1は} \)を表し\(I \)があるので、試料の第1の特徴値を\(X \)または\(Wが\である)ベクトルまたは行列であり、我々のトランスまだ有効伝播勾配式の計算方法?答えはイエス、私たちは、単純な控除であることを一緒に来るています。
ための\(Wは\である)に分割されている\(W1 \)と\(\のW2)二つの部分、それらの式1及び2によれば、我々単独誘導体で:
\ [\ FRAC {\部分的喪失} {\部分W_1} = \ FRAC {\部分的喪失} {\部分z_i} \ FRAC {\部分z_i} {\部分W_1} =(z_i-Y_I)\ CDOT X_ {I1 } \タグ{3} \]
\ [\ FRAC {\部分的喪失} {\部分W_2} = \ FRAC {\部分的喪失} {\部分z_i} \ FRAC {\部分z_i} {\部分W_2} =(z_i -y_i)\ CDOT X_ {I2} \タグ{4} \]
損失シーク機能\(Wは\)各リクエストになるように偏微分行列は、直接決定されていない\(Wは\)成分の偏微分。以来\(W \)形状は、次のとおりです。
\ [W = \ \ {} pmatrixのW_1 \\ W_2 \端{pmatrixのを}開始]
BEGだから、\(損失\)に\(W \)による偏微分、\(W \)行列であり、それは次のように記述する必要がありますので。
\ [\ FRAC {\部分的喪失} {\部分W}&= \開始{pmatrixの} {\部分的喪失} / {\部分W_1} \\ \\ {\部分的喪失} / {\部分\ {整列}始めW_2} \端{pmatrixの} = \開始{pmatrixの}(z_i-Y_I)\ CDOT X_ {I1} \\(z_i-Y_I)\ CDOT X_ {I2} \端{pmatrixの} \\&= \ {pmatrixのを開始します} X_ {I1} \\ X_ {I2} \端{pmatrixの}(z_i-Y_I)= \ {} pmatrixのX_ {I1}&X_ {I2} \端{pmatrixの} ^ T(z_i-Y_I)を開始\\ &= X_I ^ T(z_i-Y_I)\端{整列} \タグ{5} \]
\ [{\部分的損失\オーバー\部分B} = z_i-Y_I \タグ{6} \]
この多機能、複数のコンピューティング
複数のサンプルの計算は、我々は、M = 3で誘導されるサンプルのインスタンスを作成する場合:
\ [Z_1 = X_ {11} W_1 + X_ {12} W_2 + B \]
\ [Z_2 = X_ {21} W_1 + X_ {22} W_2 + B \]
\ [Z_3 = X_ {31} W_1 + X_ {32} W_2 + B \]
\ [J = \ FRAC {1} {2 \ 3回} [(Z_1-Y_1)^ 2 +(Z_2-Y_2)^ 2 +(Z_3-y_3)^ 2] \(B、W)]
\ [\ \ {整列} FRAC {\部分J} {\部分Wを}開始&= \ {pmatrixの} \ FRAC {\部分J} {\部分W_1} \\ \\ \ FRAC {\部分J} {を開始\部分W_2} \端{pmatrixの} = \ \ FRAC {\部分J} {\部分Z_1} \ FRAC {\部分Z_1} {\部分W_1} + \ FRAC {\部分J} {\部分を{pmatrixのを}開始Z_2} \ FRAC {\部分Z_2} {\部分W_1} + \ FRAC {\部分J} {\部分Z_3} \ FRAC {\部分Z_3} {\部分W_1} \\ \\ \ FRAC {\部分J} {\部分Z_1} \ FRAC {\部分Z_1} {\部分W_2} + \ FRAC {\部分J} {\部分Z_2} \ FRAC {\部分Z_2} {\部分W_2} + \ FRAC {\部分J} {\部分Z_3} \ FRAC {\部分Z_3} {\部分W_2} \端{pmatrixの} \\&= \開始{pmatrixの} \ FRAC {1}、{3}(Z_1-Y_1)X_ {11} + \ FRAC {1}、{3}(Z_2-Y_2)X_ {21} + \ FRAC {1}、{3}(Z_3-y_3)X_ {31} \\ \ FRAC {1}、{3}(Z_1-Y_1)X_ {12} + \ FRAC {1}、{3}(Z_2-Y_2)X_ {22} + \ FRAC {1}、{3}(Z_3-y_3)X_ {32} \端{pmatrixの} \\&= \ FRAC {1} {3} \開始{pmatrixの} X_ {11}&X_ {21}&X_ {31} \\ X_ {12}&X_ {22}&X_ {32} \端{pmatrixの} \ {} pmatrixのZ_1、Y_1 \\ Z_2-Y_2 \\ Z_3-y_3 \端{pmatrixのを}開始\\ &= \ FRAC {1} {3} {} pmatrixのX_ {11}&X_ {12} \\ X_ {21}&X_ {22} \\ X_ {31}&X_ {32} \端を開始\ {pmatrixの} ^ T \開始{pmatrixの} Z_1、Y_1 \\ Z_2-Y_2 \\ Z_3-y_3 \端{pmatrixの} \\&= \ FRAC {1} {M} X ^ T(ZY)\端{整列} \タグ{7} \]
\ [{\部分J \オーバー\部分B} = {1 \オーバーMを}(ZY)\タグ{8} \]
5.2.3コードの実装
式(6)および式5の4.4節にも、我々はまだ私達のニューラルネットワークを表現するために第四章ですでに書かれhelperClassのディレクトリにこれらのクラスを使用するようにします。入力ニューロンの複数が、フォワード計算コードので、行列乗算が使用されて、この変更に適応するためのコードを変更しないが、それは自動的に対応する限り、複数列の入力xに適合させることができますWが右にマトリクス状です。
しかし、初期化中に、我々は次のコードに示すように、手動で、xおよびwの形状を指定する必要があります。
if __name__ == '__main__':
# net
params = HyperParameters(2, 1, eta=0.1, max_epoch=100, batch_size=1, eps = 1e-5)
net = NeuralNet(params)
net.train(reader)
# inference
x1 = 15
x2 = 93
x = np.array([x1,x2]).reshape(1,2)
print(net.inference(x))
学習率0.1、サイクル100の最大数、バッチサイズのサンプル、及び停止条件損失関数値1E-5を指定するパラメータです。
ニューラルネットワークの場合、初期化、指定input_size = 2、及びoutput_size = 1、すなわち、ニューロンは、2つの入力、最終的に出力を受信してもよいです。
推論の最後の部分は、二つの条件(15キロ、93平方メートル)置換は、出力が表示されます。
ニューラルネットワークの次の初期化コードでは、Wは、初期値input_sizeとoutput_sizeに従って行われます。
class NeuralNet(object):
def __init__(self, params):
self.params = params
self.W = np.zeros((self.params.input_size, self.params.output_size))
self.B = np.zeros((1, self.params.output_size))
フォワード計算コード
class NeuralNet(object):
def __forwardBatch(self, batch_x):
Z = np.dot(batch_x, self.W) + self.B
return Z
エラーバックプロパゲーション・コード
class NeuralNet(object):
def __backwardBatch(self, batch_x, batch_y, batch_z):
m = batch_x.shape[0]
dZ = batch_z - batch_y
dB = dZ.sum(axis=0, keepdims=True)/m
dW = np.dot(batch_x.T, dZ)/m
return dW, dB
5.2.4業績
Visual Studioの2017年に、あなたはコードレベル2を実行するには、Ctrl + F5を使用することができ、しかし、プリントアウトはイライラが発生します。
epoch=0
NeuralNet.py:32: RuntimeWarning: invalid value encountered in subtract
self.W = self.W - self.params.eta * dW
0 500 nan
epoch=1
1 500 nan
epoch=2
2 500 nan
epoch=3
3 500 nan
......
減算は、どのように間違って行きますか?ナンは何ですか?
ナン平均異常値は、計算オーバーフローをもたらす値は意味がなかったです。今、すべての500回の反復を監視するための時間があり、私たちはいくつかの小さなの音の周波数を監視し、もう一度試してください。
epoch=0
0 10 6.838664338516814e+66
0 20 2.665505502247752e+123
0 30 1.4244204612680962e+179
0 40 1.393993758296751e+237
0 50 2.997958629609441e+290
NeuralNet.py:76: RuntimeWarning: overflow encountered in square
LOSS = (Z - Y)**2
0 60 inf
...
0 110 inf
NeuralNet.py:32: RuntimeWarning: invalid value encountered in subtract
self.W = self.W - self.params.eta * dW
0 120 nan
0 130 nan
最初の10回の反復は、損失関数の値は、+ 66 6.83eに達し、もはやそれは大きな価値を実行し、最終的にオーバーフローしました。次の履歴レコードは、プロセス内の機能の喪失することを示しています。
トレーニング機能値の間に変化図5-2損失
5.2.5障害の原因を探して
私たちは、NeuralNet.pyファイル、図5-3ブレークポイントのコードの行のセット、問題を見つけるためにどのようなトレーニング過程を追跡することができます。
図VisualStudioをデバッグ中5-3
VS2017でF5デバッグモード動作を使用する、最初の50行の結果を参照してください。
batch_x
array([[ 4.96071728, 41. ]])
batch_y
array([[244.07856544]])
返されたサンプルデータは正常です。次の行を見てください:
batch_z
array([[0.]])
第一次运行前向计算,由于W和B初始值都是0,所以z也是0,这是正常的。再看下一行:
dW
array([[ -1210.80475712],
[-10007.22118309]])
dB
array([[-244.07856544]])
dW和dB的值都非常大,这是因为图5-4所示这行代码。
图5-4 有问题的代码行
batch_z是0,batch_y是244.078,二者相减,是-244.078,因此dB就是-244.078,dW因为矩阵乘了batch_x,值就更大了。
再看W和B的更新值,一样很大:
self.W
array([[ 121.08047571],
[1000.72211831]])
self.B
array([[24.40785654]])
如果W和B的值很大,那么再下一轮进行前向计算时,会得到更糟糕的结果:
batch_z
array([[82459.53752331]])
果不其然,这次的z值飙升到了8万多,如此下去,几轮以后数值溢出是显而易见的事情了。
那么我们到底遇到了什么情况?
代码位置
ch05, Level2