1. 非线性假设
线性回归和逻辑回归的缺点:特征太多的时候,计算负荷会非常大。但如果我们希望训练一个模型来识别视觉对象,比如手写数字的识别,这时候处理的特征数据就是一个个像素点的数值了,这时候一个图片的特征数量就可能几把甚至上千上万了。
假设采用的是50*50像素的小图片,将所有的像素视为特征,则有2500个特征。普通的逻辑回归模型不能处理的,需要使用神经网络。
神经网络是一种很古老的算法,它最初产生的目的是制造能模拟大脑的机器。神经网络是计算量有些偏大的算法。然而大概由于近些年计算机的运行速度变快,才足以真正运行起大规模的神经网络。
2. 基本概念
神经网络模型建立在很多神经元之上,每一个神经元又是一个个学习模型。这些神经元(也叫激活单元,activation unit)采纳一些特征作为输出,并且根据本身的模型提供一个输出。
我们需要注意的是,在任意一个神经元节点处,会接受上一级的神经元通过权重线性计算出来的结果,而后根据激活函数对该值进行一个变换。常见的激活函数有 sigmoid 函数,ReLU函数,恒等函数,以及 softmax 函数。
- 输入层:数据节点所在的层
- 网络层:输出hihi连同它的网络层参数w,bw,b
- 隐藏层:网络层中间的层
- 输出层:最后一层
- 偏置单元:bias unit,每层加上偏置单元
上图为一个 2 层的神经网络,第一层成为输入层(Input Layer),最后一层称为输出层(Output Layer),中间一层成为隐藏层(Hidden Layers)。
三个激活单元的表达式为:
a
1
(
2
)
=
g
(
Θ
10
(
1
)
x
0
+
Θ
11
(
1
)
x
1
+
Θ
12
(
1
)
x
2
+
Θ
13
(
1
)
x
3
)
a
2
(
2
)
=
g
(
Θ
20
(
1
)
x
0
+
Θ
21
(
1
)
x
1
+
Θ
22
(
1
)
x
2
+
Θ
23
(
1
)
x
3
)
a
3
(
2
)
=
g
(
Θ
30
(
1
)
x
0
+
Θ
31
(
1
)
x
1
+
Θ
32
(
1
)
x
2
+
Θ
33
(
1
)
x
3
)
\begin{aligned} a_{1}^{(2)} &=g\left(\Theta_{10}^{(1)} x_{0}+\Theta_{11}^{(1)} x_{1}+\Theta_{12}^{(1)} x_{2}+\Theta_{13}^{(1)} x_{3}\right) \\ a_{2}^{(2)} &=g\left(\Theta_{20}^{(1)} x_{0}+\Theta_{21}^{(1)} x_{1}+\Theta_{22}^{(1)} x_{2}+\Theta_{23}^{(1)} x_{3}\right) \\ a_{3}^{(2)} &=g\left(\Theta_{30}^{(1)} x_{0}+\Theta_{31}^{(1)} x_{1}+\Theta_{32}^{(1)} x_{2}+\Theta_{33}^{(1)} x_{3}\right) \end{aligned}
a1(2)a2(2)a3(2)=g(Θ10(1)x0+Θ11(1)x1+Θ12(1)x2+Θ13(1)x3)=g(Θ20(1)x0+Θ21(1)x1+Θ22(1)x2+Θ23(1)x3)=g(Θ30(1)x0+Θ31(1)x1+Θ32(1)x2+Θ33(1)x3)
最终输出的表达式为:
h
Θ
(
x
)
=
g
(
Θ
10
(
2
)
a
0
(
2
)
+
Θ
11
(
2
)
a
1
(
2
)
+
Θ
12
(
2
)
a
2
(
2
)
+
Θ
13
(
2
)
a
3
(
2
)
)
h_{\Theta}^{(x)}=g\left(\Theta_{10}^{(2)} a_{0}^{(2)}+\Theta_{11}^{(2)} a_{1}^{(2)}+\Theta_{12}^{(2)} a_{2}^{(2)}+\Theta_{13}^{(2)} a_{3}^{(2)}\right)
hΘ(x)=g(Θ10(2)a0(2)+Θ11(2)a1(2)+Θ12(2)a2(2)+Θ13(2)a3(2))
这种从左到右的计算方法称之为前向传播法。FORWARD PROPAGATION
如果我们不看Layer1,只看后面的部分,就会发现它似乎和逻辑回归非常的一致,实际上也确实是这样的!只不过逻辑回归处理的问题比较简单,而神经网络在复杂情形下运用的激活函数以及优化方法有所不同。
3. 损失函数
首先,对几个重要的参数做一下注释
-
m:训练样本个数
-
x,y:输入和输出信号
-
L:代表神经网络层数
-
S_p:每层的神经元个数
-
S_l:表示输出神经元个数
对于分类问题,我们一般分为二分类和多酚类。
- 二类分类:S_L = 0,y = 0 / 1;输出是一个实数
- K类分类:S_L = k,y_i = 1表示分到第i类的结果,输出是一个多维向量。
在逻辑斯蒂回归(LR)中,代价函数为:
J
(
θ
)
=
−
1
m
[
∑
i
=
1
m
y
(
i
)
log
h
θ
(
x
(
i
)
)
+
(
1
−
y
(
i
)
)
log
(
1
−
h
θ
(
x
(
i
)
)
)
]
+
λ
2
m
∑
j
=
1
n
θ
j
2
J(\theta)=-\frac{1}{m}\left[\sum_{i=1}^{m} y^{(i)} \log h_{\theta}\left(x^{(i)}\right)+\left(1-y^{(i)}\right) \log \left(1-h_{\theta}\left(x^{(i)}\right)\right)\right]+\frac{\lambda}{2 m} \sum_{j=1}^{n} \theta_{j}{ }^{2}
J(θ)=−m1[i=1∑my(i)loghθ(x(i))+(1−y(i))log(1−hθ(x(i)))]+2mλj=1∑nθj2
在逻辑斯蒂回归中,只有一个输出变量称之为标量scalar。但是在神经网络中会有多个输出变量,hθ(x)是一个K维的向量。代价函数表示为:
J
(
Θ
)
=
−
1
m
[
∑
i
=
1
m
∑
k
=
1
k
y
k
(
i
)
log
(
h
Θ
(
x
(
i
)
)
)
k
+
(
1
−
y
k
(
i
)
)
log
(
1
−
(
h
Θ
(
x
(
i
)
)
)
k
)
]
+
λ
2
m
∑
l
=
1
L
−
1
∑
i
=
1
s
l
∑
j
=
1
s
l
+
1
(
Θ
j
i
(
l
)
)
2
J(\Theta)=-\frac{1}{m}\left[\sum_{i=1}^{m} \sum_{k=1}^{k} y_{k}{ }^{(i)} \log \left(h_{\Theta}\left(x^{(i)}\right)\right)_{k}+\left(1-y_{k}^{(i)}\right) \log \left(1-\left(h_{\Theta}\left(x^{(i)}\right)\right)_{k}\right)\right]+\frac{\lambda}{2 m} \sum_{l=1}^{L-1} \sum_{i=1}^{s_{l}} \sum_{j=1}^{s_{l+1}}\left(\Theta_{j i}^{(l)}\right)^{2}
J(Θ)=−m1[i=1∑mk=1∑kyk(i)log(hΘ(x(i)))k+(1−yk(i))log(1−(hΘ(x(i)))k)]+2mλl=1∑L−1i=1∑slj=1∑sl+1(Θji(l))2
解释说明:
-
期望通过代价函数来观察算法预测的结果和真实情况的误差
-
每行特征会有K个预测,利用循环对每行进行预测
-
在K个预测中选择出可能性最高的那个,将其和实际的数据 y 进行比较
-
正则化项是排除了每个偏置θ_0之后,每层θ矩阵的求和
-
参数 j(由s_l + 1层的激活单元数决定)循环所有的行,i(由s_l层的激活单元数决定)循环所有的列
4. 反向传播
首先,我们需要知道反向传播算法的目的是快速进行梯度求解。
在介绍反向传播以前,我们首先来看一下正向传播,我们通过求解f(x+h)以及f(x-h),这里将h设置为一个较小的数字其实就可以了,一般为0.0001,而后根据数值微分原理,也就是导数的定义求解在这个点的梯度。可想而知,这种算法是非常复杂麻烦的,会耗费大量的时间。
反向传播基于的原理其实很简单——链式法则:如果某个函数由复合函数表示,则该复合函数的导数可以用构成复 合函数的各个函数的导数的乘积表示。用数学式表示的话,可以写成下面的样子:
∂
z
∂
x
=
∂
z
∂
t
∂
t
∂
x
\frac{\partial z}{\partial x}=\frac{\partial z}{\partial t} \frac{\partial t}{\partial x}
∂x∂z=∂t∂z∂x∂t
根据这个原理,我们从输出层出发,从后往前,依次乘上每一个子函数的梯度,就可以求得损失函数对于每一个 x 的偏导。
原理便是如此,但由于多层神经网络叠加,以及大量的矩阵和向量,想要手推证明或者代码实现都不是一件很容易的事情。
5.训练神经网络的步骤
根据前面的介绍,我们简单说明一下训练一个网络的步骤。
(1)随机初始化参数。但这里需要注意,不能将神经元之间的权重设置为一致。
(2)利用正向传播方法计算所有的h_θ(x)。
(3)根据损失函数,利用反向传播算法计算出所有的偏导数。
(4)利用数值检验方法来检验这些偏导数,这里所示的其实就是通过我们前面所示的正向传播求导的方式对反向传播的结果进行检验。
(5)使用优化算法来最小化代价函数,例如梯度下降。