ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

神经网络基础知识第一章

2021-06-13 23:58:10  阅读:229  来源: 互联网

标签:150 partial self 第一章 神经网络 Delta frac 基础知识 162


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)

其中:

  • θ n + 1 \theta_{n+1} θn+1​:下一个值;
  • θ n \theta_n θn​:当前值;
  • − - −:减号,梯度的反向;
  • η \eta η:学习率或步长,控制每一步走的距离,不要太快以免错过了最佳景点,不要太慢以免时间太长;
  • ∇ \nabla ∇:梯度,函数当前位置的最快上升点;
  • J ( θ ) J(\theta) J(θ):函数。

梯度下降的三要素

  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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有