背景
继续学习浙大机器学习的课程。上次刚开始人工神经网络部分的学习,学习了感知器算法。现在开始学习多层神经网络。
看了下距离上次更新都快过去两个月了-_-|| 虽然也有工作和生活的原因,还是得好好督促下自己,专心地把想学的东西学完。
多层神经网络
之前学习了基于单个神经元的感知器算法可以解决线性可分的问题。多层神经网络通过把多个神经元组织在一起,层与层之间使用阶跃函数连接,从而解决非线性可分的问题。
阶跃函数
这样的函数就是阶跃函数。
网上搜了下定义,阶跃函数是指这一类的函数。而不是特指一模一样的这样一个函数。
三层神经网络模拟任意非线性函数
课程中提到了一个定理:神经网络层与层之间用非线性函数连接,一个三层神经网络就可以模拟任意的非线性函数。
关于定理本身,课程里给出的证明感觉也不是一个严谨的证明。我们就略去证明了。我们通过几个例子来说明如何用多层神经网络模拟非线性函数。
例子
判断一个点是否在一个三角形中
有三条直线在二维平面围成了一个三角形,我们要设计一个多层神经网络来判断一个点是否落在三角形里。
这显然是个非线性可分的问题。因为我们不可能找到一条直线把三角形里面的点和外面的分开。
三条直线的方程为:
ω
11
x
1
+
ω
12
x
2
+
b
1
=
0
ω
21
x
1
+
ω
22
x
2
+
b
2
=
0
ω
31
x
1
+
ω
32
x
2
+
b
3
=
0
\omega_{11}x_{1} + \omega_{12}x_{2} + b1= 0 \\ \omega_{21}x_{1} + \omega_{22}x_{2} + b2= 0 \\ \omega_{31}x_{1} + \omega_{32}x_{2} + b3 = 0
ω11x1+ω12x2+b1=0ω21x1+ω22x2+b2=0ω31x1+ω32x2+b3=0
针对这个问题,我们可以使用如下的二层神经网络:
- 最初的输入为 x 1 , x 2 x_1, x_2 x1,x2。
- 输入到达第一层神经网络的三个神经元。三个神经元得到结果即这个点是否在直线的“里面”还是“外面”。(这里就通俗地讲了,不抠字眼了)
- 然后再通过阶跃函数,把在里面和在外面转化为0或者1。我们让在“里面”为1。
- 到这里第一层神经网络结束。刚才得到3个值为0或者1的数。现在这三个数作为第二层神经网络的输入。
- 第二层神经网络的
ω
\omega
ω 就简单地设为1。然后偏置
b
b
b 为
−
2.5
-2.5
−2.5。这样我们最后就会得到这样的结果:
- 如果点在三条线里面,那最后输出 y = 0.5 y = 0.5 y=0.5
- 如果点不在任意一条直线里面,那最后输出 y < 0 y < 0 y<0
这样这个神经网络就能够判定一个点是否在一个三角形里。
判断一个点是否在两个三角形的某一个中
现在更进一步:有两个三角形,判断一个点是否在某一个三角形的内部。
有了刚才的例子,这个也非常简单。只不过我们要用到三层神经网络。
思路就是先沿用刚才的两层神经网络。把它复制一份,我们就可以判断一个点是否在第一个三角形以及是否在第二个三角形中。然后基于这个结果,再加一层神经网络来判断该点是否在某个三角形中。
C
x
C_x
Cx代表点是否在三角形
x
x
x 中。最后一层神经网络中,我们依然把权重
ω
\omega
ω 直接设为
1
1
1,偏置设为
−
0.5
-0.5
−0.5。这样最后如果点在某个三角形里,输出
y
>
0
y > 0
y>0。否则
y
<
0
y < 0
y<0。