其他分享
首页 > 其他分享> > 神经网络基础知识第一章

神经网络基础知识第一章

作者:互联网

1.1 人工智能

机器学习分类方式:

  1. 监督学习(Supervised Learning)

    通过标注的数据来学习,例如,程序通过学习标注了正确答案的手写数字的图像数据,它就能认识其他的手写数字。

  2. 无监督学习(Unsupervised Learning)

    通过没有标注的数据来学习。这种算法可以发现数据中自然形成的共同特性(聚类),可以用来发现不同数据之间的联系,例如,买了商品A的顾客往往也购买了商品B。

  3. 强化学习(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​=(x1​​x2​​)⎝⎛​w11,1​w12,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​=(x1​​x2​​)⎝⎛​w11,2​w12,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​=(x1​​x2​​)⎝⎛​w11,3​w12,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=(x1​​x2​​)⎝⎜⎜⎛​w11,1​w12,1​​w11,2​w12,2​​w11,3​w12,3​​⎠⎟⎟⎞​+(b11​​b12​​b13​​)

最后变成矩阵符号:

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所示:

  1. 从 z z z 到 x x x 到 b b b;
  2. 从 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. 第1个人,输入层,随机输入第一个 x x x 值, x x x 的取值范围 ( 1 , 10 ] (1,10] (1,10],假设第一个数是 2 2 2;
  2. 第2个人,第一层网络计算,接收第1个人传入 x x x 的值,计算: a = x 2 a=x^2 a=x2;
  3. 第3个人,第二层网络计算,接收第2个人传入 a a a 的值,计算: b = ln ⁡ ( a ) b=\ln (a) b=ln(a);
  4. 第4个人,第三层网络计算,接收第3个人传入 b b b 的值,计算: c = b c=\sqrt{b} c=b ​;
  5. 第5个人,输出层,接收第4个人传入 c c c 的值

反向传播

  1. 第5个人,计算 y y y 与 c c c 的差值: Δ c = c − y \Delta c = c - y Δc=c−y,传回给第4个人
  2. 第4个人,接收第5个人传回 Δ c \Delta c Δc,计算 Δ b = Δ c ⋅ 2 b \Delta b = \Delta c \cdot 2\sqrt{b} Δb=Δc⋅2b
  3. 第3个人,接收第4个人传回 Δ b \Delta b Δb,计算 Δ a = Δ b ⋅ a \Delta a = \Delta b \cdot a Δa=Δb⋅a
  4. 第2个人,接收第3个人传回 Δ a \Delta a Δa,计算 Δ x = Δ 2 x \Delta x = \frac{\Delta}{2x} Δx=2xΔ​
  5. 第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)

其中:

梯度下降的三要素

  1. 当前点;
  2. 方向;
  3. 步长。
    部分代码
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∑m​lossi​

损失函数的作用

损失函数的作用,就是计算神经网络每次迭代的前向计算结果与真实值的差距,从而指导下一步的训练向正确的方向进行。

如何使用损失函数呢?具体步骤:

  1. 用随机值初始化前向计算公式的参数;
  2. 代入样本,计算输出的预测值;
  3. 用损失函数计算预测值和标签值(真实值)的误差;
  4. 根据损失函数的导数,沿梯度最小方向将误差回传,修正前向计算公式中的各个权重值;
  5. 进入第2步重复, 直到损失函数值达到一个满意的值就停止迭代。

标签:150,partial,self,第一章,神经网络,Delta,frac,基础知识,162
来源: https://blog.csdn.net/huimoSS/article/details/117886862