1、概述
1.1 目的
神经网络是用来解决海量特性下,一般机器学习方法无法胜任的问题。
假如某批数据有100个特征,为了很好的适应训练集,评估函数可能需要采用二次项、三次项、n次项,如下所示:
$
h
θ
(
X
)
=
x
1
2
+
x
1
∗
x
2
+
x
1
∗
x
3
+
.
.
.
.
.
.
+
x
1
∗
x
n
+
x
2
2
+
x
2
∗
x
3
+
x
2
∗
x
4
+
x
2
∗
x
5
+
.
.
.
.
h_θ(X)=x_1^2+x1*x_2+x_1*x_3+......+x_1*x_n+x_2^2+x_2*x_3+x_2*x_4+x_2*x_5+....
hθ(X)=x12+x1∗x2+x1∗x3+......+x1∗xn+x22+x2∗x3+x2∗x4+x2∗x5+....
评估函数的特征空间急剧变大,大于等于
n
2
2
\frac{n^2}{2}
2n2。这种情况下,再使用线性回归的方式,计算量就无法忍受了。
再比如图片识别的例子。每张图片都是由像素构成的,图像识别其实就是对像素特征的学习过程。由于一张图片的像素数是非常大的,尤其是现在的高清图片,像素数都是海量的,特征空间就显得尤为巨大。
而神经网络就是为解决这类问题而生的。
2、来源
神经网络的灵感来自于人脑,人脑是世界上最神奇的计算机,无论是听觉、视觉还是触觉、嗅觉,都能非常快速精准的计算出结果。
那是不是人类的大脑需要对于不同的输入例如听觉、视觉,要使用不同的部位进行处理呢?
科学家做了很多实验,他们把动物的眼睛的神经接入到大脑的“听觉皮层(专门用来处理听觉的部位)”,结果发现动物可以正常看东西;
把动物的眼睛的神经接入到大脑的“触觉皮层(专门用来处理触觉的部位)”,结果发现动物仍然可以正常看东西;
这说明大脑的各个位置虽然各司其职,但本质上他们都是一样的,都可以处理不同的输入源。
人们从中得到启发,想通过一套算法模型实现对不同输入数据的处理,这就是神经网络。
3、模型
单个神经元可以表示为:
多个神经元组成神经网络,表示为:
上图省略了
x
0
x_0
x0特征,因为该特征的值是固定的:1。
神经网络的术语:
- 分层:每一列代表一层,最左边的是输入层,最右边的是输出层,中间的叫隐藏层。
- 激活函数:非线性函数g(z),该函数就是逻辑回归中使用的函数: g ( z ) = 1 1 + e − z g(z)=\frac{1}{1+e^{-z}} g(z)=1+e−z1
- 激活值:每一层的输出,称为激活值。
- α i ( j ) α_i^{(j)} αi(j):表示第j层,第i个神经元的激活项。
- θ ( j ) θ^{(j)} θ(j):之前的参数,在这里可以称之为权重矩阵, θ ( j ) θ^{(j)} θ(j)表示从第j层到第j+1层的权重矩阵。
神经网络的数学表达式为:
第二层的表达式为:
a 1 ( 2 ) = g ( θ 10 ( 1 ) ∗ x 0 + θ 11 ( 1 ) ∗ x 1 + θ 12 ( 1 ) ∗ x 2 + θ 13 ( 1 ) ∗ x 3 ) a_1^{(2)}=g(θ_{10}^{(1)} * x_0 + θ_{11}^{(1)} * x_1 + θ_{12}^{(1)} * x_2 + θ_{13}^{(1)} * x_3) a1(2)=g(θ10(1)∗x0+θ11(1)∗x1+θ12(1)∗x2+θ13(1)∗x3)
a 2 ( 2 ) = g ( θ 20 ( 1 ) ∗ x 0 + θ 21 ( 1 ) ∗ x 1 + θ 22 ( 1 ) ∗ x 2 + θ 23 ( 1 ) ∗ x 3 ) a_2^{(2)}=g(θ_{20}^{(1)} * x_0 + θ_{21}^{(1)} * x_1 + θ_{22}^{(1)} * x_2 + θ_{23}^{(1)} * x_3) a2(2)=g(θ20(1)∗x0+θ21(1)∗x1+θ22(1)∗x2+θ23(1)∗x3)
a 3 ( 2 ) = g ( θ 30 ( 1 ) ∗ x 0 + θ 31 ( 1 ) ∗ x 1 + θ 32 ( 1 ) ∗ x 2 + θ 33 ( 1 ) ∗ x 3 ) a_3^{(2)}=g(θ_{30}^{(1)} * x_0 + θ_{31}^{(1)} * x_1 + θ_{32}^{(1)} * x_2 + θ_{33}^{(1)} * x_3) a3(2)=g(θ30(1)∗x0+θ31(1)∗x1+θ32(1)∗x2+θ33(1)∗x3)
因为 a i ( 2 ) a_i^{(2)} ai(2)是输出层的输入,所以输出层的表达式为:
h θ ( x ) = a 1 ( 3 ) = g ( θ 10 ( 2 ) ∗ a 0 ( 2 ) + θ 11 ( 2 ) ∗ ∗ a 1 ( 2 ) + θ 12 ( 2 ) ∗ ∗ a 2 ( 2 ) + θ 13 ( 2 ) ∗ ∗ a 3 ( 2 ) ) h_θ(x)=a_1^{(3)}=g(θ_{10}^{(2)} * a_0^{(2)} + θ_{11}^{(2)} * * a_1^{(2)} + θ_{12}^{(2)} * * a_2^{(2)} + θ_{13}^{(2)} * * a_3^{(2)}) hθ(x)=a1(3)=g(θ10(2)∗a0(2)+θ11(2)∗∗a1(2)+θ12(2)∗∗a2(2)+θ13(2)∗∗a3(2))
3.1 向量化表示
下面做个假设,假设
z
1
(
2
)
=
θ
10
(
1
)
∗
x
0
+
θ
11
(
1
)
∗
x
1
+
θ
12
(
1
)
∗
x
2
+
θ
13
(
1
)
∗
x
3
z^{(2)}_1=θ_{10}^{(1)} * x_0 + θ_{11}^{(1)} * x_1 + θ_{12}^{(1)} * x_2 + θ_{13}^{(1)} * x_3
z1(2)=θ10(1)∗x0+θ11(1)∗x1+θ12(1)∗x2+θ13(1)∗x3
z
2
(
2
)
=
θ
20
(
1
)
∗
x
0
+
θ
21
(
1
)
∗
x
1
+
θ
22
(
1
)
∗
x
2
+
θ
23
(
1
)
∗
x
3
z^{(2)}_2=θ_{20}^{(1)} * x_0 + θ_{21}^{(1)} * x_1 + θ_{22}^{(1)} * x_2 + θ_{23}^{(1)} * x_3
z2(2)=θ20(1)∗x0+θ21(1)∗x1+θ22(1)∗x2+θ23(1)∗x3
z
3
(
2
)
=
θ
30
(
1
)
∗
x
0
+
θ
31
(
1
)
∗
x
1
+
θ
32
(
1
)
∗
x
2
+
θ
33
(
1
)
∗
x
3
z^{(2)}_3=θ_{30}^{(1)} * x_0 + θ_{31}^{(1)} * x_1 + θ_{32}^{(1)} * x_2 + θ_{33}^{(1)} * x_3
z3(2)=θ30(1)∗x0+θ31(1)∗x1+θ32(1)∗x2+θ33(1)∗x3
X
=
[
x
0
x
1
x
2
x
3
]
X=\left[\begin{matrix}x_0\\x_1\\x_2\\x_3\end{matrix}\right]
X=⎣⎢⎢⎡x0x1x2x3⎦⎥⎥⎤
z
(
2
)
=
[
z
1
(
2
)
z
2
(
2
)
z
3
(
2
)
]
=
θ
(
1
)
∗
X
z^{(2)}=\left[\begin{matrix}z_1^{(2)}\\z_2^{(2)}\\z_3^{(2)}\end{matrix}\right]=θ^{(1)}*X
z(2)=⎣⎢⎡z1(2)z2(2)z3(2)⎦⎥⎤=θ(1)∗X
则上述的表达式简化为:
a
1
(
2
)
=
g
(
z
1
(
2
)
)
a_1^{(2)}=g(z_1^{(2)})
a1(2)=g(z1(2))
a 2 ( 2 ) = g ( z 2 ( 2 ) ) a_2^{(2)}=g(z_2^{(2)}) a2(2)=g(z2(2))
a 3 ( 2 ) = g ( z 3 ( 2 ) ) a_3^{(2)}=g(z_3^{(2)}) a3(2)=g(z3(2))
h θ ( x ) = a ( 3 ) = g ( z ( 3 ) ) h_θ(x)=a^{(3)}=g(z^{(3)}) hθ(x)=a(3)=g(z(3))
3.2 前向传播
我们观察神经网络的计算过程,第一层的数据经过激活函数处理后的激活值,作为第二层的输入;第二层的数据经过激活函数处理后的激活值,作为第三层的输入;以此类推。
如果了解过map-reduce算法的话,可以看出这两种算法有异曲同工之妙;学过编程的同学,会不会觉得这个算法与递归很类似。
神经网络的这种层层计算的方式,称之为前向传播。
4 示例
假设y的取值范围是(0,1),特征有两个( x 1 , x 2 x_1,x_2 x1,x2)。
4.1 实现and判断
and关系的判断逻辑如下:
x 1 x_1 x1 | x 2 x_2 x2 | y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
则评估函数为:
h
θ
(
x
)
=
g
(
−
30
+
20
x
1
+
20
x
2
)
h_θ(x)=g(-30+20x_1+20x_2)
hθ(x)=g(−30+20x1+20x2)
对应的图形为:
得出的结论是:
- 当z>4.6时, g ( z ) ≈ 1 g(z)\approx1 g(z)≈1
- 当z<-4.6时, g ( z ) ≈ 0 g(z)\approx0 g(z)≈0
把X值代入到g(z)中,计算结果如下:
x 1 x_1 x1 | x 2 x_2 x2 | y |
---|---|---|
0 | 0 | g ( − 30 ) ≈ 0 g(-30)\approx0 g(−30)≈0 |
0 | 1 | g ( − 10 ) ≈ 0 g(-10)\approx0 g(−10)≈0 |
1 | 0 | g ( − 10 ) ≈ 0 g(-10)\approx0 g(−10)≈0 |
1 | 1 | g ( 10 ) ≈ 1 g(10)\approx1 g(10)≈1 |
正好与and的计算结果保持一致。
4.2 实现or判断
or关系的判断逻辑如下:
x 1 x_1 x1 | x 2 x_2 x2 | y |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
只要是 θ = [ − 10 , 20 , 20 ] θ=[-10, 20, 20] θ=[−10,20,20]即可实现or的效果,不再赘述。
4.3 实现not判断
not关系的判断逻辑如下:
x 1 x_1 x1 | x 2 x_2 x2 | y |
---|---|---|
0 | 0 | 1 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 0 |
只要是 θ = [ 10 , − 20 , − 20 ] θ=[10, -20, -20] θ=[10,−20,−20]即可实现 ( n o t x 1 ) a n d ( n o t x 2 ) (not \ x_1) \ and\ (not \ x_2) (not x1) and (not x2)的效果,不再赘述。
4.4 实现XNOR判断
XNOR关系的判断逻辑如下:
x 1 x_1 x1 | x 2 x_2 x2 | y |
---|---|---|
0 | 0 | 1 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
上面3种逻辑运算,都是通过一层神经网络完成的,XNOR比较复杂,它的表达式是
(
x
1
a
n
d
x
2
)
o
r
(
x
1
‘
a
n
d
x
2
‘
)
(x_1 \ and \ x_2) \ or \ (x^`_1 \ and \ x^`_2)
(x1 and x2) or (x1‘ and x2‘)
其中
x
1
‘
x^`_1
x1‘代表的是
n
o
t
x
1
not \ x_1
not x1的意思。
用神经网络图形来表示XNOR计算为:
分析一下上面的图形:
- 第一层红色的线代表的是and运算,计算结果是 a 1 ( 2 ) a_1^{(2)} a1(2)。
- 第一层蓝色的线代表的是not运算,计算结果是 a 2 ( 2 ) a_2^{(2)} a2(2)。
- 第二层绿色的线代表的是or运算,计算结果是 h θ ( x ) = a 1 ( 3 ) h_θ(x)=a_1^{(3)} hθ(x)=a1(3)。
代入X值后,计算结果如下,与XNOR是一致的:
x 1 x_1 x1 | x 2 x_2 x2 | a 1 ( 2 ) a_1^{(2)} a1(2) | a 2 ( 2 ) a_2^{(2)} a2(2) | y |
---|---|---|---|---|
0 | 0 | 0 | 1 | 1 |
0 | 1 | 0 | 0 | 0 |
1 | 0 | 0 | 0 | 0 |
1 | 1 | 1 | 0 | 1 |