8.1 非线性假设
尽管我们前面介绍的线性回归和Logistic回归已经足以覆盖相当多的机器学习问题了,但是仍有一些不足,如下图所示:
我们可以看到,模型为了较好地拟合这些点,引入了非常多的二次项以及更高次项。然而,假如特征过多,这一方面会增加模型的求解难度,一方面很有可能过拟合。实际上,仅仅按照
x
1
2
,
x
1
x
2
,
x
1
x
3
.
.
.
x
1
x
n
;
x
2
2
,
x
2
x
3
.
.
.
x_1^2,x_1x_2,x_1x_3...x_1x_n;x_2^2,x_2x_3...
x12,x1x2,x1x3...x1xn;x22,x2x3...这样的二阶二次项作为模型的参数也足以增大我们的工作量(数量可达到
n
(
n
−
1
)
2
≈
n
2
2
\frac{n(n-1)}{2} \approx \frac{n^2}{2}
2n(n−1)≈2n2个)。但是若选择仅采用自身平方项,如
x
1
2
,
x
2
2
.
.
.
x
n
2
x_1^2,x_2^2...x_n^2
x12,x22...xn2,又会极大削弱模型精度,难以实现较好的拟合状态。
接下来我们来介绍,为什么非线性的模型是必要的。
以一张50x50像素的汽车图片为例子:
我们现在仅选取两个像素点作为特征量送入学习算法,当样本量足够多的时候我们会得出这个图:
实际上,我们肯定不能仅选取两个特征,若把5050的图片特征全部用上,则一共会有2500个像素点,即2500个特征。若是进一步细化这些特征,将每个像素点用其RGB值代替,则一共有25003=7500个特征值。若采用上述2500个像素特征的二次项组合成新特征的话,那就是
250
0
2
2
≈
3
m
i
l
l
o
n
\frac{2500^2}{2} \approx 3millon
225002≈3millon。因此,简单的Logistic算法并不能满足我们的要求,所以引入神经网络。
8.2 神经网络初步概念
如图所示,黄色的⭕即可代表一个简单的神经元。它接受前向的输入,并且向后传递输出。这里补充了一个
x
0
x_0
x0,我们把它称为偏置单元,通常令其为1。
引入偏置单元的目的在于减小偏差。举个简单的例子,若是以0为分界线,那么估计值为1似乎不是很有说服力,而引入偏置项后,1变成10就很有说服力了。引入偏置项会使函数在0这个分界线左右的值陡然跃升,保证了激活的可靠性。具体例子可以看下面的8.5部分。
另外,我们称 g ( z ) = 1 1 + e − z g(z) = \frac{1}{1+e^{-z}} g(z)=1+e−z1称为sigmoid激活函数。
所谓激活函数(Activation Function),就是在人工神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端。引入激活函数是为了增加神经网络模型的非线性。没有激活函数的每层都相当于矩阵相乘。就算你叠加了若干层之后,无非还是个矩阵相乘罢了。
还有,上述模型的 θ \theta θ一般被称为模型的参数,而在神经网络的文献里面,我们称之为权重。
8.3 神经网络模型(Ⅰ)
神经网络实际上就是由一组堆叠起来的神经元构成的,如图所示:
(上图省去了所谓的偏置神经单元)
各层之间相互交叠,第一层(通常被称为输入层)接受外界输入。此后,上一层的输出往往会作为下一层的输入。最后一层(通常被称为输出层)将汇总倒数第二层的输出,通过赋予相应的权重后得出假设函数
h
θ
(
x
)
h_{\theta}(x)
hθ(x)的输出。
值得一提的是,在机器学习任务中,我们往往只能给出输入,期待输出,但是对于中间层(通常被称为隐含层)的工作原理是不甚了解的。也就是说,隐含层本身对我们来说是一个近似于黑箱子一样的存在。这也是神经网络理论的薄弱点之一。接下来我们将通过具体的数学公式来进行演示。
首先规定记号:
α
j
(
i
)
\alpha_j^{(i)}
αj(i):第i层 第j个的神经元的激活项(激活项即为其计算并输出的值)
θ
(
j
)
\theta^{(j)}
θ(j):权重矩阵。它控制着每一层输出的权重。
θ
m
n
(
j
)
\theta_{mn}^{(j)}
θmn(j)代表第j层神经元下的第m行第n列的值。也可以理解为前一层的第n个神经元到后一层第m个神经元输入权重。j从1开始计数,因为输入层没有前面神经元的输入,因此也就没有第0层的权重。
由此,我们可以导出下图(仍未补充出各层的偏置神经元):
这里也可以看出,如果没有
g
(
z
)
g(z)
g(z),或者说
g
(
z
)
=
1
g(z)=1
g(z)=1,那么神经网络的本质就是一层层输入的线性组合。引入
g
(
z
)
g(z)
g(z)即可以提高神经网络的非线性度。
8.4 神经网络模型(Ⅱ)
8.4.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(\Theta_{10}^{(1)}x_0 +\Theta_{11}^{(1)}x_1+\Theta_{12}^{(1)}x_2+\Theta_{13}^{(1)}x_3)
a1(2)=g(Θ10(1)x0+Θ11(1)x1+Θ12(1)x2+Θ13(1)x3)为例。我们令:
z
1
(
2
)
=
Θ
10
(
1
)
x
0
+
Θ
11
(
1
)
x
1
+
Θ
12
(
1
)
x
2
+
Θ
13
(
1
)
x
3
z_1^{(2)} = \Theta_{10}^{(1)}x_0 +\Theta_{11}^{(1)}x_1+\Theta_{12}^{(1)}x_2+\Theta_{13}^{(1)}x_3
z1(2)=Θ10(1)x0+Θ11(1)x1+Θ12(1)x2+Θ13(1)x3
则有:
a
1
(
2
)
=
g
(
z
1
(
2
)
)
a_1^{(2)} = g(z_1^{(2)})
a1(2)=g(z1(2))
推广一下:
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
2
(
3
)
)
a_3^{(2)} = g(z_2^{(3)})
a3(2)=g(z2(3))
特别的,
a
0
(
2
)
=
0
a_0^{(2)} = 0
a0(2)=0。
将上述的变量统一规划为一个矩阵:
a
(
2
)
=
[
a
0
(
2
)
a
1
(
2
)
a
2
(
2
)
a
3
(
2
)
]
=
g
(
z
(
2
)
)
=
g
(
z
0
(
2
)
z
1
(
2
)
z
2
(
2
)
z
3
(
2
)
)
a^{(2)} = \begin{bmatrix} a_0^{(2)}\\\\ a_1^{(2)}\\ \\a_2^{(2)}\\\\a_3^{(2)} \end{bmatrix} =g(z^{(2)}) =g\begin{pmatrix} z_0^{(2)}\\\\ z_1^{(2)}\\ \\z_2^{(2)}\\\\z_3^{(2)} \end{pmatrix}
a(2)=⎣
⎡a0(2)a1(2)a2(2)a3(2)⎦
⎤=g(z(2))=g⎝
⎛z0(2)z1(2)z2(2)z3(2)⎠
⎞
z
(
2
)
=
[
z
0
(
2
)
z
1
(
2
)
z
2
(
2
)
z
3
(
2
)
]
=
[
1
Θ
10
(
1
)
x
0
+
Θ
11
(
1
)
x
1
+
Θ
12
(
1
)
x
2
+
Θ
13
(
1
)
x
3
Θ
20
(
1
)
x
0
+
Θ
21
(
1
)
x
1
+
Θ
22
(
1
)
x
2
+
Θ
23
(
1
)
x
3
Θ
30
(
1
)
x
0
+
Θ
31
(
1
)
x
1
+
Θ
32
(
1
)
x
2
+
Θ
33
(
1
)
x
3
]
z^{(2)} = \begin{bmatrix} z_0^{(2)}\\\\ z_1^{(2)}\\ \\z_2^{(2)}\\\\z_3^{(2)} \end{bmatrix} =\begin{bmatrix} 1 \\\\\Theta_{10}^{(1)}x_0 +\Theta_{11}^{(1)}x_1+\Theta_{12}^{(1)}x_2+\Theta_{13}^{(1)}x_3\\\\\Theta_{20}^{(1)}x_0 +\Theta_{21}^{(1)}x_1+\Theta_{22}^{(1)}x_2+\Theta_{23}^{(1)}x_3 \\\\ \Theta_{30}^{(1)}x_0 +\Theta_{31}^{(1)}x_1+\Theta_{32}^{(1)}x_2+\Theta_{33}^{(1)}x_3 \end{bmatrix}
z(2)=⎣
⎡z0(2)z1(2)z2(2)z3(2)⎦
⎤=⎣
⎡1Θ10(1)x0+Θ11(1)x1+Θ12(1)x2+Θ13(1)x3Θ20(1)x0+Θ21(1)x1+Θ22(1)x2+Θ23(1)x3Θ30(1)x0+Θ31(1)x1+Θ32(1)x2+Θ33(1)x3⎦
⎤
而且,若将
x
0
,
x
1
,
x
2
,
x
3
x_0,x_1,x_2,x_3
x0,x1,x2,x3这些输入变量也看成神经元,看成第一层的话,那么就有:
z
(
2
)
=
Θ
(
1
)
X
=
Θ
(
1
)
a
(
1
)
z^{(2)} = \Theta^{(1)}X = \Theta^{(1)}a^{(1)}
z(2)=Θ(1)X=Θ(1)a(1)
a
(
2
)
=
g
(
z
(
2
)
)
a^{(2)} = g(z^{(2)})
a(2)=g(z(2))
补充
a
0
(
2
)
=
1
a_0^{(2)} = 1
a0(2)=1,则有:
z
(
3
)
=
Θ
(
2
)
a
(
2
)
z^{(3)} = \Theta^{(2)}a^{(2)}
z(3)=Θ(2)a(2)
a
(
3
)
=
g
(
z
(
3
)
)
a^{(3)} = g(z^{(3)})
a(3)=g(z(3))
图源b站BV1bx411M7Zx
8.4.2 其它
如果将隐藏层遮住,那么神经网络实际上很想线性回归,即通过输入的线性组合后作为结果输出。但是区别在于
g(x)的存在。
当然,也可以用其它的图来表示神经网络,如下:
这张图所展示的神经网络节点是在逐渐减少的。
8.5 例子和直觉理解(Ⅰ)
现在有这么个分类任务,即“逻辑与”任务。其真值表为:
情况 | 结果 |
---|---|
(0,0) | 0 |
(0,1) | 0 |
(1,0) | 0 |
(1,1) | 1 |
按照惯例,我们决定在输入层添加一个神经元:
现在我们手动赋予各输入神经元不同的权重,如下图所示:
如上图所示,此时的假设函数可以表示为:
h
θ
(
x
)
=
g
(
−
30
+
20
x
1
+
20
x
2
)
h_\theta(x) = g(-30+20x_1+20x_2)
hθ(x)=g(−30+20x1+20x2)
为什么要取这样的参数值?
后面再说
此时,我们带入结果。但是需要补充一点sigmoid激活函数的性质,如下图所示:
在这里面我们可以看出,当输入值低于-4.6时,输出为0.01,近似于0;当输入值对应地大于4.6时,输入为0.99近似于1。
那么,带入输入则有:
输入 | 结果 |
---|---|
(0,0) | g(-30) < g(-4.6) = 0.01 |
(0,1) | g(-10) < g(-4.6) =0.01 |
(1,0) | g(-10) < g(-4.6) = 0.01 |
(1,1) | g(10) > g(4.6) = 1 |
完美契合了我们的预期要求,看来选择好的参数是一件很重要的事情。
同理,若是任务要求是“逻辑或”,我们也可以通过手动选取合适的参数来完成这一任务,如下所示:
若是要求“(NOT x1) AND (NOT x2)”,我们也可以实现:
现在,我们要综合上面的三种情况讨论“异或”问题。两个输入相同时即为×,两个输入相异时即为⚪。我们令结果为x时对应y = 1。
而很显然,异或的情况可以表示为:
(
x
1
∩
x
2
)
∪
(
¬
x
1
∩
¬
x
2
)
(x_1 \cap x_2) \cup (\neg x_1\cap \neg x_2)
(x1∩x2)∪(¬x1∩¬x2)
故我们先讨论
(
x
1
∩
x
2
)
(x_1 \cap x_2)
(x1∩x2)的神经网络,再讨论
(
¬
x
1
∩
¬
x
2
)
(\neg x_1\cap \neg x_2)
(¬x1∩¬x2)的神经网络,最后将这两者情况用“或”的神经网络穿起来。
很显然,我们现在需要一个非线性边界来进行分类。
见证奇迹!
8.7 多元分类
以下面的图为例:
我们要在一幅图片中识别出很多元素,行人,车,摩托车,卡车等等。此时问题就不是一个简单的二分类问题了,而是一个相当复杂的多分类问题。图中仅标出了四个元素需要我们识别,因此我们认为最终的神经网络输出层结果应当是四个。如上图所示,四维向量的不同值代表了不同的元素。
有点类似与独热编码。