搭建最简单的神经网络———从单层到多层

Posted DuanPenghao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了搭建最简单的神经网络———从单层到多层相关的知识,希望对你有一定的参考价值。

搭建最简单的神经网络———从单层到多层

1.单层神经网络

1.1 介绍

我们在前面的课题中介绍了什么是感知器模型,还介绍了感知器模型的训练方法,已经损失函数和激活函数是什么。现在我们可以着手开始搭建自己的神经网络了。其实所谓神经网络就是多个感知器组合成的网络,如果只有一列就是单层,有多列就是多层,现在我们先从最简单的单层神经网络开始介绍。

1.2 单层神经网络的结构

上图就是一个单层神经网络的结构,当然或许你看到的是好几层,不只是三层,那下面我就来一一介绍一下每一层的作用。

第一层:第一层叫做输入层,就是 x 1 , x 2 . x 3 x_1,x_2.x_3 x1,x2.x3,故名思意,输入层就是我们前面一章提到的感知器的输入部分,可以是图片的像素,也可以是电线杆的粗细和麻雀的数量等。

第二层:第二层叫做隐含层,它就是我们之前见到的感知器的中间部分,只不过这里变成了多个感知器,它这里放的就是我们的激活函数 f ( . ) f(.) f(.)它的作用就是处理前面过来的输入,把它变成 y y y进行输出。在这里也就可以说明ReLU函数为什么可以逼近任何图形,这是因为每一个神经元(就是隐含层的小圆圈),里面的激活函数都是不一样的,所以许多个不同的ReLU在一起合成的图形就是一个非线性的图形,之所以不直接用线性模型是因为它不具有筛选能力。为什么是叫“隐含层”呢,因为作为程序员的我们,在程序运行起来的时候,只能看见输入和输出的结果,比如丢进去一张图片,出来一个模型,但是看不到中间的处理的结果,是不知道激活函数操作的每一个具体过程的,所以这一层就像是被隐藏了一样。

第三层:第三层读者肯定是可以猜到,就叫输出层,最后的圆圈和Y都是输出层,最后的圆圈把前面隐含层的输出整理一下(可以用一个激活函数来整合),变成最终的输出y。它和感知器的输出部分是一样。

我们可以看到,其实整个网络结构里面最复杂的部分,也是起到关键作用的部分就是隐含层,因为隐含层只有一层,所以这个网络也就叫做单层神经网络。(部分的人也叫它三层或者两层(两层是因为输出层也可能涉及激活函数)神经网络,我参考的资料还是以隐含层的数量来决定名称,读者可以根据自己的喜好来取名,名字不重要,重要的是知识能否被掌握)

1.3 单层神经网络的参数
其实神经网络的参数是什么,我们在之前已经学习过,就是权值 w w w和偏置数 b b b。每一个激活函数在接受输入的时候,他们接受的输入是加上了权值和偏执数的输入,所以在把输入放入激活函数中前,需要把其对应的 w w w b b b定义好,就如下图所示。
对上图的说明:
(1)隐含层和输出层都有激活函数,所以它们都需要设置好权值 w i j n w_ij^n wijn和偏置数 b i n b_i^n bin
(2) w w w的n就代表他来自第几层。
(3) b b b的n则是从隐含层开始,因为隐含层才开始有n。
(4) b b b的i代表了它是该层的第几个单元。
(5) w w w i i i代表的是它是下一层哪个节点的输入, j j j代表它是上一层的哪个节点的输出(如果学过离散数学,应该知道i其实代表着这是前一个节点的第几出度,j代表着这是后一节点的第几入度),这样有一个规范以后,可以方便我们后续的学习(它和参数矩阵化后的坐标一致,后面会细讲)。

1.4 单层神经网络的向前传播
上一章我们学过感知器模型的向后传播,就是把输入的结果通过激活函数处理,之后再计算误差,计算新的权值传递回来。其中,把输入的结果往前丢给激活函数处理,激活函数处理以后又往前丢出输出,这就是一个向前传播。后面我们把输出处理以后,得到新的权值,把这个新的权值丢回最开始的地方,这就是向后传播

其实单层神经网络向前还是向后的原理和感知器没有任何区别,为了进一步加深影响,我们还是从数学公式的角度来细讲一下什么是向前传播。如果你已经理解上面的那段话,那完全可以不看这里的内容。我们用刚才的图为例:
第一次向前传播为,从输入层向隐含层的传播,输入了 x 1 , x 2 x_1,x_2 x1,x2,输出为 y i y_i yi
y 1 = f ( w 11 ( 1 ) x 1 + w 12 ( 1 ) x 2 + b 1 ( 1 ) ) y 2 = f ( w 21 ( 1 ) x 1 + w 22 ( 1 ) x 2 + b 2 ( 1 ) ) y 3 = f ( w 31 ( 1 ) x 1 + w 32 ( 1 ) x 2 + b 3 ( 1 ) ) y 4 = f ( w 41 ( 1 ) x 1 + w 42 ( 1 ) x 2 + b 4 ( 1 ) ) y_1=f(w_11^(1)x_1+w_12^(1)x_2+b_1^(1))\\\\ y_2=f(w_21^(1)x_1+w_22^(1)x_2+b_2^(1))\\\\ y_3=f(w_31^(1)x_1+w_32^(1)x_2+b_3^(1))\\\\ y_4=f(w_41^(1)x_1+w_42^(1)x_2+b_4^(1)) y1=f(w11(1)x1+w12(1)x2+b1(1))y2=f(w21(1)x1+w22(1)x2+b2(1))y3=f(w31(1)x1+w32(1)x2+b3(1))y4=f(w41(1)x1+w42(1)x2+b4(1))
第二次向前传播为把 y 1 . . . . y 4 y_1....y_4 y1....y4向前传播到输出层单元处理,输出最终结果 y y y
y = f ( w 11 ( 2 ) y 1 + w 21 ( 2 ) y 2 + w 31 ( 2 ) y 3 + b 2 ) y=f(w_11^(2)y_1+w_21^(2)y_2+w_31^(2)y_3+b_2) y=f(w11(2)y1+w21(2)y2+w31(2)y3+b2)

当然,有时候输出不仅仅是一个,可以像第一次向前传播一样,列多个公式。

2. 训练单层神经网络的方法

2.1 介绍
我们在第一部分已经搭建了一个单层的神经网络模型,现在需要学习的就是如何去训练它,本部分十分的重要,因为这个训练方法在神经网络中是通用的,你学会了,你就可以去做自己的神经网络了。

2.2 梯度下降算法
梯度下降算法很关键,也很常用,是一个非常好用的算法。但是这个算法我们之前已经介绍过,就是我们之前说的训练感知器模型的方法。我们来用现有知识描述一下,并且附上一个测试代码描述:
(1)首先,我们假设我们的目标函数是 z = 3 x + 6 z=3x+6 z=3x+6,但是我们目前并且不知道这个z长这样样子,我们只知道输入的 x = 1 x=1 x=1,输出的 y ^ = 9 \\haty=9 y^=9。我们知道有一个 w w w和一个 b b b,所以 z = w x + b z=wx+b z=wx+b,我们的目标就是把这个函数猜测出来。我们先定义一下这个函数,记为funz:

def funcz(x,w,b):
    """
    @Description:z的公式
    """
    return w*x+b

(2)第二步,我们需要选择一个激活函数,这里我们选择Sigmoid函数
f ( z ) = y = 1 1 − e − z f(z)=y = \\frac11-e^-z f(z)=y=1ez1
Sigmoid 的代码如下,需要用到numpy库,没有的在cmd里面pip install就行:

import numpy 以上是关于搭建最简单的神经网络———从单层到多层的主要内容,如果未能解决你的问题,请参考以下文章

多层感知机识别垃圾短信

手把手写深度学习:用最简单的神经网络多层感知机识别数字

手把手写深度学习:用最简单的神经网络多层感知机识别数字

机器学习从入门到精通系列之BP神经网络理论知识详解

神经网络多层感知机

Matlab基于多层前馈网络BP神经网络实现多分类预测(Excel可直接替换数据)