神经网络基础知识第一章
作者:互联网
1.1 人工智能
机器学习分类方式:
-
监督学习(Supervised Learning)
通过标注的数据来学习,例如,程序通过学习标注了正确答案的手写数字的图像数据,它就能认识其他的手写数字。
-
无监督学习(Unsupervised Learning)
通过没有标注的数据来学习。这种算法可以发现数据中自然形成的共同特性(聚类),可以用来发现不同数据之间的联系,例如,买了商品A的顾客往往也购买了商品B。
-
强化学习(Reinforcement Learning)
我们可以让程序选择和它的环境互动(例如玩一个游戏),环境给程序的反馈是一些“奖励”(例如游戏中获得高分),程序要学习到一个模型,能在这种环境中得到高的分数,不仅是当前局面要得到高分,而且最终的结果也要是高分才行。
机器学习领域出现了各种模型,其中,神经网络模型是一个重要的方法,它的原型在1943就出现了,在生物神经网络中,每个神经元与其他神经元相连,当它兴奋时,就会像相邻的神经元发送化学物质,从而改变这些神经元内的电位;如果某神经元的电位超过了一个阈值,那么它就会被激活(兴奋),向其他神经元发送化学物质。把许多这样的神经元按照一定的层次结构连接起来,我们就构建了一个神经网络。图1是M-P神经元模型的示意图。
图1 M-P神经元模型
1.2神经网络中的矩阵运算
图2是一个两层的神经网络,包含隐藏层和输出层,输入层不算做一层。
z
1
1
=
(
x
1
x
2
)
(
w
1
1
,
1
w
1
2
,
1
)
+
b
1
1
z1_1= \begin{pmatrix} x_1 & x_2 \end{pmatrix} \begin{pmatrix} w1_{1,1} \\\\ w1_{2,1} \end{pmatrix} +b1_1
z11=(x1x2)⎝⎛w11,1w12,1⎠⎞+b11
z 1 2 = ( x 1 x 2 ) ( w 1 1 , 2 w 1 2 , 2 ) + b 1 2 z1_2= \begin{pmatrix} x_1 & x_2 \end{pmatrix} \begin{pmatrix} w1_{1,2} \\\\ w1_{2,2} \end{pmatrix} +b1_2 z12=(x1x2)⎝⎛w11,2w12,2⎠⎞+b12
z 1 3 = ( x 1 x 2 ) ( w 1 1 , 3 w 1 2 , 3 ) + b 1 3 z1_3= \begin{pmatrix} x_1 & x_2 \end{pmatrix} \begin{pmatrix} w1_{1,3} \\\\ w1_{2,3} \end{pmatrix} +b1_3 z13=(x1x2)⎝⎛w11,3w12,3⎠⎞+b13
再变成大矩阵:
Z 1 = ( x 1 x 2 ) ( w 1 1 , 1 w 1 1 , 2 w 1 1 , 3 w 1 2 , 1 w 1 2 , 2 w 1 2 , 3 ) + ( b 1 1 b 1 2 b 1 3 ) Z1 = \begin{pmatrix} x_1 & x_2 \end{pmatrix} \begin{pmatrix} w1_{1,1}&w1_{1,2}&w1_{1,3} \\\\ w1_{2,1}&w1_{2,2}&w1_{2,3} \\\\ \end{pmatrix} +\begin{pmatrix} b1_1 & b1_2 & b1_3 \end{pmatrix} Z1=(x1x2)⎝⎜⎜⎛w11,1w12,1w11,2w12,2w11,3w12,3⎠⎟⎟⎞+(b11b12b13)
最后变成矩阵符号:
Z 1 = X ⋅ W 1 + B 1 Z1 = X \cdot W1 + B1 Z1=X⋅W1+B1
然后是激活函数运算:
A 1 = a ( Z 1 ) A1=a(Z1) A1=a(Z1)
同理可得:
Z 2 = A 1 ⋅ W 2 + B 2 Z2 = A1 \cdot W2 + B2 Z2=A1⋅W2+B2
注意:损失函数不是前向计算的一部分。
1.3反向传播
1.3.1线性反向传播
求
w
w
w 的偏导
目前 z = 162 z=162 z=162,如果想让 z z z 变小一些,比如目标是 z = 150 z=150 z=150, w w w 应该如何变化呢?为了简化问题,先只考虑改变 w w w 的值,而令 b b b 值固定为 4 4 4。
如果想解决这个问题,最笨的办法是可以在输入端一点一点的试,把 w w w 变成 3.5 3.5 3.5 试试,再变成 3 3 3 试试…直到满意为止。现在我们将要学习一个更好的解决办法:反向传播。
从 z z z 开始一层一层向回看,图中各节点关于变量 w w w 的偏导计算结果如下:
因为 z = x ⋅ y z = x \cdot y z=x⋅y,其中 x = 2 w + 3 b , y = 2 b + 1 x = 2w + 3b, y = 2b + 1 x=2w+3b,y=2b+1
所以:
∂ z ∂ w = ∂ z ∂ x ⋅ ∂ x ∂ w = y ⋅ 2 = 18 (4) \frac{\partial{z}}{\partial{w}}=\frac{\partial{z}}{\partial{x}} \cdot \frac{\partial{x}}{\partial{w}}=y \cdot 2=18 \tag{4} ∂w∂z=∂x∂z⋅∂w∂x=y⋅2=18(4)
其中:
∂ z ∂ x = ∂ ∂ x ( x ⋅ y ) = y = 9 \frac{\partial{z}}{\partial{x}}=\frac{\partial{}}{\partial{x}}(x \cdot y)=y=9 ∂x∂z=∂x∂(x⋅y)=y=9
∂
x
∂
w
=
∂
∂
w
(
2
w
+
3
b
)
=
2
\frac{\partial{x}}{\partial{w}}=\frac{\partial{}}{\partial{w}}(2w+3b)=2
∂w∂x=∂w∂(2w+3b)=2
是链式法则的具体表现,
z
z
z 的误差通过中间的
x
x
x 传递到
w
w
w。
求
w
w
w 的具体变化值
公式4和公式6的含义是:当 w w w 变化一点点时, z z z 会产生 w w w 的变化值18倍的变化。记住我们的目标是让 z = 150 z=150 z=150,目前在初始状态时是 z = 162 z=162 z=162,所以,问题转化为:当需要 z z z 从 162 162 162 变到 150 150 150 时, w w w 需要变化多少?
既然:
Δ z = 18 ⋅ Δ w \Delta z = 18 \cdot \Delta w Δz=18⋅Δw
则:
Δ w = Δ z 18 = 162 − 150 18 = 0.6667 \Delta w = {\Delta z \over 18}=\frac{162-150}{18}= 0.6667 Δw=18Δz=18162−150=0.6667
所以:
w
=
w
−
0.6667
=
2.3333
w = w - 0.6667=2.3333
w=w−0.6667=2.3333
x
=
2
w
+
3
b
=
16.6667
x=2w+3b=16.6667
x=2w+3b=16.6667
z
=
x
⋅
y
=
16.6667
×
9
=
150.0003
z=x \cdot y=16.6667 \times 9=150.0003
z=x⋅y=16.6667×9=150.0003
我们一下子就成功地让
z
z
z 值变成了
150.0003
150.0003
150.0003,与
150
150
150 的目标非常地接近。
求
b
b
b 的偏导
这次我们令 w w w 的值固定为 3 3 3,变化 b b b 的值,目标还是让 z = 150 z=150 z=150。同上一小节一样,先求 b b b 的偏导数。
注意,在上一小节中,求 w w w 的导数只经过了一条路:从 z z z 到 x x x 到 w w w。但是求 b b b 的导数时要经过两条路,如图2-7所示:
- 从 z z z 到 x x x 到 b b b;
- 从 z z z 到 y y y 到 b b b。
从复合导数公式来看,这两者应该是相加的关系,所以有:
∂ z ∂ b = ∂ z ∂ x ⋅ ∂ x ∂ b + ∂ z ∂ y ⋅ ∂ y ∂ b = y ⋅ 3 + x ⋅ 2 = 63 (7) \frac{\partial{z}}{\partial{b}}=\frac{\partial{z}}{\partial{x}} \cdot \frac{\partial{x}}{\partial{b}}+\frac{\partial{z}}{\partial{y}}\cdot\frac{\partial{y}}{\partial{b}}=y \cdot 3+x \cdot 2=63 \tag{7} ∂b∂z=∂x∂z⋅∂b∂x+∂y∂z⋅∂b∂y=y⋅3+x⋅2=63(7)
其中:
∂
z
∂
x
=
∂
∂
x
(
x
⋅
y
)
=
y
=
9
\frac{\partial{z}}{\partial{x}}=\frac{\partial{}}{\partial{x}}(x \cdot y)=y=9
∂x∂z=∂x∂(x⋅y)=y=9
∂
z
∂
y
=
∂
∂
y
(
x
⋅
y
)
=
x
=
18
\frac{\partial{z}}{\partial{y}}=\frac{\partial{}}{\partial{y}}(x \cdot y)=x=18
∂y∂z=∂y∂(x⋅y)=x=18
∂
x
∂
b
=
∂
∂
b
(
2
w
+
3
b
)
=
3
\frac{\partial{x}}{\partial{b}}=\frac{\partial{}}{\partial{b}}(2w+3b)=3
∂b∂x=∂b∂(2w+3b)=3
∂
y
∂
b
=
∂
∂
b
(
2
b
+
1
)
=
2
\frac{\partial{y}}{\partial{b}}=\frac{\partial{}}{\partial{b}}(2b+1)=2
∂b∂y=∂b∂(2b+1)=2
求
b
b
b 的具体变化值
公式7和公式8的含义是:当 b b b 变化一点点时, z z z 会发生 b b b 的变化值 63 63 63 倍的变化。记住我们的目标是让 z = 150 z=150 z=150,目前在初始状态时是 162 162 162,所以,问题转化为:当我们需要 z z z 从 162 162 162 变到 150 150 150 时, b b b 需要变化多少?
既然:
Δ z = 63 ⋅ Δ b \Delta z = 63 \cdot \Delta b Δz=63⋅Δb
则:
Δ b = Δ z 63 = 162 − 150 63 = 0.1905 \Delta b = \frac{\Delta z}{63}=\frac{162-150}{63}=0.1905 Δb=63Δz=63162−150=0.1905
所以:
b
=
b
−
0.1905
=
3.8095
b=b-0.1905=3.8095
b=b−0.1905=3.8095
x
=
2
w
+
3
b
=
17.4285
x=2w+3b=17.4285
x=2w+3b=17.4285
y
=
2
b
+
1
=
8.619
y=2b+1=8.619
y=2b+1=8.619
z
=
x
⋅
y
=
17.4285
×
8.619
=
150.2162
z=x \cdot y=17.4285 \times 8.619=150.2162
z=x⋅y=17.4285×8.619=150.2162
这个结果也是与
150
150
150 很接近了,但是精度还不够。再迭代几次,直到误差不大于 1e-4
时,我们就可以结束迭代了,对于计算机来说,这些运算的执行速度很快。
1.3.2非线性反向传播
例子
正向传播
- 第1个人,输入层,随机输入第一个 x x x 值, x x x 的取值范围 ( 1 , 10 ] (1,10] (1,10],假设第一个数是 2 2 2;
- 第2个人,第一层网络计算,接收第1个人传入 x x x 的值,计算: a = x 2 a=x^2 a=x2;
- 第3个人,第二层网络计算,接收第2个人传入 a a a 的值,计算: b = ln ( a ) b=\ln (a) b=ln(a);
- 第4个人,第三层网络计算,接收第3个人传入 b b b 的值,计算: c = b c=\sqrt{b} c=b ;
- 第5个人,输出层,接收第4个人传入 c c c 的值
反向传播
- 第5个人,计算 y y y 与 c c c 的差值: Δ c = c − y \Delta c = c - y Δc=c−y,传回给第4个人
- 第4个人,接收第5个人传回 Δ c \Delta c Δc,计算 Δ b = Δ c ⋅ 2 b \Delta b = \Delta c \cdot 2\sqrt{b} Δb=Δc⋅2b
- 第3个人,接收第4个人传回 Δ b \Delta b Δb,计算 Δ a = Δ b ⋅ a \Delta a = \Delta b \cdot a Δa=Δb⋅a
- 第2个人,接收第3个人传回 Δ a \Delta a Δa,计算 Δ x = Δ 2 x \Delta x = \frac{\Delta}{2x} Δx=2xΔ
- 第1个人,接收第2个人传回 Δ x \Delta x Δx,更新 x ← x − Δ x x \leftarrow x - \Delta x x←x−Δx,回到第1步
1.4梯度下降
梯度下降的数学公式:
θ n + 1 = θ n − η ⋅ ∇ J ( θ ) (1) \theta_{n+1} = \theta_{n} - \eta \cdot \nabla J(\theta) \tag{1} θn+1=θn−η⋅∇J(θ)(1)
其中:
- θ n + 1 \theta_{n+1} θn+1:下一个值;
- θ n \theta_n θn:当前值;
- − - −:减号,梯度的反向;
- η \eta η:学习率或步长,控制每一步走的距离,不要太快以免错过了最佳景点,不要太慢以免时间太长;
- ∇ \nabla ∇:梯度,函数当前位置的最快上升点;
- J ( θ ) J(\theta) J(θ):函数。
梯度下降的三要素
- 当前点;
- 方向;
- 步长。
部分代码
import numpy as np
import matplotlib.pyplot as plt
from HelperClass.DataReader_1_0 import *
file_name = "../data/ch04.npz"
class NeuralNet_0_1(object):
def __init__(self, eta):
self.eta = eta
self.w = 0
self.b = 0
def __forward(self, x):
z = x * self.w + self.b
return z
def __backward(self, x,y,z):
dz = z - y
db = dz
dw = x * dz
return dw, db
def __update(self, dw, db):
self.w = self.w - self.eta * dw
self.b = self.b - self.eta * db
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)
def ShowResult(net, dataReader):
X,Y = dataReader.GetWholeTrainSamples()
# draw sample data
plt.plot(X, Y, "b.")
# draw predication data
PX = np.linspace(0,1,10)
PZ = net.inference(PX)
plt.plot(PX, PZ, "r")
plt.title("Air Conditioner Power")
plt.xlabel("Number of Servers(K)")
plt.ylabel("Power of Air Conditioner(KW)")
plt.show()
if __name__ == '__main__':
# read data
sdr = DataReader_1_0(file_name)
sdr.ReadData()
# create net
eta = 0.1
net = NeuralNet_0_1(eta)
net.train(sdr)
# result
print("w=%f,b=%f" %(net.w, net.b))
# predication
result = net.inference(1.346)
print("result=", result)
ShowResult(net, sdr)
1.5损失函数
概念
在各种材料中经常看到的中英文词汇有:误差,偏差,Error,Cost,Loss,损失,代价…意思都差不多,在本书中,使用“损失函数”和“Loss Function”这两个词汇,具体的损失函数符号用 J J J 来表示,误差值用 l o s s loss loss 表示。
“损失”就是所有样本的“误差”的总和,亦即( m m m 为样本数):
损 失 = ∑ i = 1 m 误 差 i 损失 = \sum^m_{i=1}误差_i 损失=i=1∑m误差i
J = ∑ i = 1 m l o s s i J = \sum_{i=1}^m loss_i J=i=1∑mlossi
损失函数的作用
损失函数的作用,就是计算神经网络每次迭代的前向计算结果与真实值的差距,从而指导下一步的训练向正确的方向进行。
如何使用损失函数呢?具体步骤:
- 用随机值初始化前向计算公式的参数;
- 代入样本,计算输出的预测值;
- 用损失函数计算预测值和标签值(真实值)的误差;
- 根据损失函数的导数,沿梯度最小方向将误差回传,修正前向计算公式中的各个权重值;
- 进入第2步重复, 直到损失函数值达到一个满意的值就停止迭代。
标签:150,partial,self,第一章,神经网络,Delta,frac,基础知识,162 来源: https://blog.csdn.net/huimoSS/article/details/117886862