シリーズのブログ、GitHubの上で維持原作者:https://aka.ms/beginnerAI、
より多くの意味するものではありません星と星をクリックして、著者難しく星。
4.3ニューラルネットワーク
勾配降下では、我々は単に、すなわち、線形フィットを行うには、ニューラルネットワークの原則について話します:
- 初期重量値
- 重量による解決策を発表
- 平均二乗誤差関数の評価
- 重み値を調整するための線形演算部にバックプロパゲーション
- 終了条件が満たされているかどうか?バックジャンプした後、満足していない2
テーブルの上に赤い果実を移動せずに、あなたの竹の棒の子、選択された角度を与えるために十分な長さ12個の赤い果実を、子どもたちの行を入れて、竹の棒で児童のほとんどを置くために方法を考える:不適切なアナロジーは砂糖漬けを着用することです赤い果実。
その後、デスクトップ上に竹のサブ水平方向の角度を調整し、6に着用してい...;最初はあなたがいずれかの方向を選択することができ、竹の棒の子を持つジェスチャーは、いくつかの赤い果実をカウントするように着ることができる、私は5であることが判明しました....結局あなたは10が角度の赤い果実を見つけ着ることができます。
4.3.1ニューラルネットワークの構造を定義します
私たちは、最初の図4-4に示す簡単なシングルポイントの単一ニューロンと、ニューラルネットワークを確立するための最初の試みです。
単一ニューロンà図4-4
ここでは、最も重要とバックプロパゲーション勾配降下の概念、およびプロセスコードを説明するために、線形回帰、ニューラルネットワークの最も単純な例を使用します。
入力層
入力層の特徴では、この一方の入力ニューロンは、直接出力を算出した後、B、Wのパラメータを介して、受け付けます。このような単純な「ネットワーク」は、単純な線形回帰問題を解決することができますが、それは線形であるので、我々は大幅にプロセスを簡素化する活性化関数を定義する必要があり、様々な進歩的知識点のよりよく理解促進します。
厳密にニューラルネットワークの入力層に話すと層と呼ばれることはできません。
W / B重量
次元の線形問題なので、W / bがスカラです。
出力層
出力層のニューロンは、線形予測方程式は以下のとおりです。
\ [z_i = X_I \ CDOT + B W \]
zはyは実際のサンプル値タグ、添字であり、予測出力モデルである\(I \)サンプルとして。
損失関数
それは、線形回帰問題、平均二乗誤差関数を使用してその損失関数であるため。
\ [損失(W、B)= \ FRAC {1} {2}(z_i-Y_I)^ 2 \]
4.3.2バックプロパゲーション
私たちは数学的な原則を使用して、勾配降下に同じなので、バックプロパゲーションアルゴリズムは同じなので、詳細は4.2.2を参照してください。
wの勾配を計算します
= \ FRAC {\部分{損失}} {\部分{z_i}} \ FRAC {\部分{z_i}} {\部分{} W} \ [{{W}の部分\オーバー\部分{損失} \} = (z_i-Y_I)X_I \]
傾きbの計算
\ [\ FRAC {\部分{損失}} {\部分{B}} = \ FRAC {\部分{損失}} {\部分{z_i}} \ FRAC {\部分{z_i}} {\部分{B} } = z_i-Y_I \]
問題を単純化するために、このセクションでは、次のセクションに戻って伝播モードを使用して単一のサンプルは、我々は多様な本実施例を紹介します。
4.3.3コードの実装
実際には、ニューラルネットワーク及び勾配降下法は、本質的に同じであるが、その後の拡張機能を容易にコード設計の中心で、すなわちニューロンをニューラルネットワークを使用するための新しいプログラミングモデル。
Pythonは通じ達成するためにニューラルネットワークを訓練するために、ここで我々は、NeuralNetという名前のクラスを作成するクラスを作成することにより、ニューラルネットワークの性質や振る舞いを記述するために、オブジェクト指向技術で使用され、その後、徐々にそのような方法に追加することができますそして、推論。
クラスの定義
class NeuralNet(object):
def __init__(self, eta):
self.eta = eta
self.w = 0
self.b = 0
NeuralNetクラスクラスは、オブジェクトから派生して、その引数イータである初期化関数は、呼び出し側が指定する必要があり、学習率です。他の二つのメンバーはゼロに初期化変数w aとb、です。
フォワード計算
def __forward(self, x):
z = x * self.w + self.b
return z
これはプライベートな方法であるので、一般に公開されていないだけでNeuralNetクラスで呼び出される前に2つのアンダースコアが、あります。
逆伝搬
以下のコードは、それが、プライベートメソッドに設計され、誘導される勾配降下式によって得られます。
def __backward(self, x,y,z):
dz = z - y
db = dz
dw = x * dz
return dw, db
dzがダブルカウントを避けるために、中間変数です。そしてDZはdelta_Z、ニューラルネットワークの逆電流誤差入力層を書き込むことができます。
グラデーション更新
def __update(self, dw, db):
self.w = self.w - self.eta * dw
self.b = self.b - self.eta * db
次の反復のために直接使用される場合、グローバルスコープのパラメータ内周りに渡されるすべての新しい更新は、Wは良い値であり、時間およびb後、直接メンバ変数に格納され、必要としません。
トレーニング方法
唯一つのアルゴリズムを訓練することです:
ループのために、すべてのサンプルデータを使い切るまで:
- サンプルデータを読みます
- フォワード計算
- 逆伝搬
- 更新勾配
def train(self, dataReader):
for i in range(dataReader.num_train):
# get x and y value for one sample
x,y = dataReader.GetSingleTrainSample(i)
# get z from x,y
z = self.__forward(x)
# calculate gradient of w and b
dw, db = self.__backward(x, y, z)
# update w,b
self.__update(dw, db)
# end for
推論予報
def inference(self, x):
return self.__forward(x)
プロセスを推論、実際に前方に計算され、我々は、外部インタフェースの設計を容易にし、一人でそれを置くので、このメソッドは、メソッドがオープンな設計になっています。
メインプログラム
if __name__ == '__main__':
# read data
sdr = SimpleDataReader()
sdr.ReadData()
# create net
eta = 0.1
net = NeuralNet(eta)
net.train(sdr)
# result
print("w=%f,b=%f" %(net.w, net.b))
# predication
result = net.inference(0.346)
print("result=", result)
ShowResult(net, sdr)
4.3.4業績の可視化
プリントアウト:
w=1.716290,b=3.196841
result= [3.79067723]
最後に、我々はWとBの値を取得し、対応する方程式は線形である(Y = 1.71629x 3.196841 + \)\。横軸は単位のためのK(千台)サーバであるためときに予測推論、最初の1000によって346台の知られているサーバが、存在する、演算機能を置換する前に、結果は、3.74キロワットです。
結果は、その機能を示しました:
def ShowResult(net, dataReader):
......
ニューラルネットワーク、トレーニングのプロセスと結果の可視化は、大幅にニューラルネットワークの原理を理解するのに役立つことができます初心者のために、Pythonのmatplotlibのは、グラフィックスの非常に豊富なライブラリを提供します。
上記の関数では、サンプルポイントは、それらを引き出すために、すべてのデータを取得します。その後間セット等距離[0,1]最後に、これらの点を、我々ができリンクするために、各点についてのyの値を取得するためのX net.inferenceネットワーク法()の値で10ポイントのx値、として図に示す直線を当てはめる。4-5。
図4-5フィッティング効果
あなたが赤のラインが青い点を越えますが、中心位置にあるとは思えない見ることができますが、それはその後、数度の反時計回りの回転は最高の位置を達成する必要があります。私たちは、訓練の結果の精度を改善する方法を、後のセクションを述べます。
4.3.5ワークス
あなたは、単に線形回帰問題を見て、原則的には、サンプル点が線形ではなく、わずか2次元平面より高次元空間があるかもしれないリニア注意を分散していると仮定することです。我々は同様に使用することがありますので、しかし、人間は、二次元平面上の問題を例示し、高次元空間を想像することはできません。
4.2勾配降下法、最初の問題は線形問題であると仮定し、したがって、式を有する\(Z = XW + B \) 、勾配降下を解決するための最良の方法(\ B、W)\値。
在本节中,用神经元的编程模型把梯度下降法包装了一下,这样就进入了神经网络的世界,从而可以有成熟的方法论可以解决更复杂的问题,比如多个神经元协同工作、多层神经网络的协同工作等等。
如图4-5所示,样本点摆在那里,位置都是固定的了,神经网络的任务就是找到一根直线(注意我们首先假设这是线性问题),让该直线穿过样本点阵,并且所有样本点到该直线的距离的平方的和最小。
可以想象成每一个样本点都有一根橡皮筋连接到直线上,连接点距离该样本点最近,所有的橡皮筋形成一个合力,不断地调整该直线的位置。该合力具备两种调节方式:
- 如果上方的拉力大一些,直线就会向上平移一些,这相当于调节b值;
- 如果侧方的拉力大一些,直线就会向侧方旋转一些,这相当于调节w值。
直到该直线处于平衡位置时,也就是线性拟合的最佳位置了。
如果样本点不是呈线性分布的,可以用直线拟合吗?
答案是“可以的”,只是最终的效果不太理想,误差可以做到在线性条件下的最小,但是误差值本身还是比较大的。比如一个半圆形的样本点阵,用直线拟合可以达到误差值最小为1.2(不妨假设这个值的单位是厘米),已经尽力了但能力有限。如果用弧线去拟合,可以达到误差值最小为0.3。
所以,当使用线性回归的效果不好时,即判断出一个问题不是线性问题时,我们会用第9章的方法来解决。
代码位置
ch04, Level3
思考和练习
- 请把上述代码中的dw和db也改成私有属性,然后试着运行程序。