搭建最简单的神经网络———从单层到多层
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=1−e−z1
Sigmoid 的代码如下,需要用到numpy库,没有的在cmd里面pip install就行:
import numpy 以上是关于搭建最简单的神经网络———从单层到多层的主要内容,如果未能解决你的问题,请参考以下文章