【Nan's 吴恩达机器学习笔记】第八、九章 神经网络
神经网络(Neural Networks)
8.1 非线性假设
假如我们只选用灰度图片,每个像素pixel则只有一个值,我们可以选取图片上的两个不同位置上的两个像素,然后训练一个逻辑回归算法利用这两个像素的值来判断图片上是否是汽车。
假使我们采用的都是50x50像素的小图片,并且我们将所有的像素视为特征,则会有 2500个特征(若为RGB,则7500)。
普通的逻辑回归模型,不能有效地处理这么多的特征。这时候我们需要神经网络。
8.2 模型表示
一篇关于CNN的博文写的很好,在此引用一下:
https://blog.csdn.net/v_JULY_v/article/details/51812459
下图为一个3层的神经网络,第一层成为输入层(Input Layer),最后一层称为输出层(Output Layer),中间一层成为隐藏层(Hidden Layers)。我们为每一层都增加一个偏差单位(bias unit):
a
i
(
j
)
a_i^{(j)}
ai(j)代表第j 层的第 i 个激活单元。
θ
(
j
)
θ^{(j)}
θ(j)代表从第 j 层映射到第 j+1 层时的权重的矩阵,
例如
θ
(
1
)
θ^{(1)}
θ(1)代表从第一层映射到第二层的权重的矩阵。
其尺寸为:以第 j+1层的激活单元数量为行数,以第 j 层的激活单元数加一为列数的矩阵。例如:上图所示的神经网络中
θ
(
1
)
θ^{(1)}
θ(1)的尺寸为 3*4。
前向传播算法(Forward Propagation)
从左到右的算法称为前向传播算法。利用向量化的方法,会使得计算更为简便。
令
z
(
2
)
=
θ
(
1
)
x
z^{(2)}=θ^{(1) }x
z(2)=θ(1)x,则
a
(
2
)
=
g
(
z
(
2
)
)
a^{(2)}=g(z^{(2)})
a(2)=g(z(2)),计算后添加
a
0
(
2
)
a_0^{(2)}
a0(2)=1。 计算输出的值为:
我们令
z
(
3
)
=
θ
(
2
)
a
(
2
)
z^{(3)}=θ^{(2)} a^{(2)}
z(3)=θ(2)a(2),则
h
θ
(
x
)
=
a
(
3
)
=
g
(
z
(
3
)
)
h_θ (x)=a^{(3)}=g(z^{(3)})
hθ(x)=a(3)=g(z(3))。
这只是针对训练集中一个训练实例x所进行的计算。如果我们要对整个训练集进行计算,我们需要将训练集特征矩阵进行转置,使得同一个实例的特征都在同一列里。
其实神经网络就像是逻辑回归logistic regression,只不过把输入向量
[
x
1
∼
x
3
]
[x_1∼x_3]
[x1∼x3] 变成了中间层的
[
a
1
(
2
)
∼
a
3
(
2
)
]
[a_1^{(2)}∼a_3^{(2)}]
[a1(2)∼a3(2)].
可以把
a
0
,
a
1
,
a
2
,
a
3
a_0,a_1,a_2,a_3
a0,a1,a2,a3看成更为高级的特征值,也就是
x
0
,
x
1
,
x
2
,
x
3
x_0,x_1,x_2,x_3
x0,x1,x2,x3的进化体,并且它们是由x与θ决定的,因为θ是梯度下降的,所以a是变化的,并且变得越来越厉害,所以这些更高级的特征值能更好的预测新数据。
8.3 逻辑运算
神经网络中,单层神经元(无中间层)的计算可用来表示逻辑运算。
OR与AND整体架构Architecture一样,区别只在于的θ取值不同
比如逻辑与(AND):
逻辑或(OR):
逻辑非(NOT):
利用神经元来组合成更为复杂的神经网络以实现更复杂的运算。例如我们要实现XNOR功能(输入的两个值必须一样,均为1或均为0),即:
X
N
O
R
=
(
x
1
A
N
D
x
2
)
O
R
(
(
N
O
T
x
1
)
A
N
D
(
N
O
T
x
2
)
)
XNOR=(x_1 AND x_2) OR((NOT x_1 )AND(NOT x_2 ))
XNOR=(x1 AND x2) OR((NOT x1)AND(NOT x2))
8.4 多元分类
如果我们要训练一个神经网络算法来识别路人、汽车、摩托车和卡车,在输出层我们应该有4个值。例如,第一个值为1或0用于预测是否是行人,第二个值用于判断是否为汽车。
神经网络算法的输出结果为四种可能情形之一:
9.1 代价函数
拟合神经网络参数的代价函数。
假设神经网络的训练样本有m个,每个包含一组输入x和一组输出信号y。
L表示神经网络层数。
S
l
S_l
Sl表示每层的neuron个数(
S
l
S_l
Sl表示输出层神经元个数)。
S
L
S_L
SL代表最后一层中处理单元的个数。
将神经网络的分类定义为两种情况:二类分类和多类分类。
二类分类(Binary):S_L=0,y=0 or 1表示哪一类;
K类分类:S_L=kx1的向量,y_i=1表示分到第i类;(k>2)
逻辑回归问题中我们的代价函数为:
在逻辑回归中,我们只有一个输出变量,又称标量(scalar),也只有一个因变量y。
但在神经网络中,我们可以有很多输出变量,我们的
h
θ
(
x
)
h_θ (x)
hθ(x)是一个维度为K的向量,并且我们训练集中的因变量也是同样维度的一个向量。
因此我们的代价函数会比逻辑回归更加复杂一些,为:
h
θ
(
x
)
∈
R
K
h_θ (x)∈R^K
hθ(x)∈RK,
(
h
θ
(
x
)
)
i
=
i
t
h
(h_θ (x))_i=i^{th}
(hθ(x))i=ith output
最里层的循环j循环所有的行(由
s
l
+
1
s_{l +1}
sl+1 层的激活单元数决定),循环i则循环所有的列.
9.2 反向传播算法(Back propagation)
好难…
引用一篇:
https://blog.csdn.net/qq_32865355/article/details/80260212
为了计算代价函数的偏导数
∂
∂
Θ
i
j
(
l
)
J
(
Θ
)
\frac{∂}{∂Θ_{ij}^{(l)}}J(Θ)
∂Θij(l)∂J(Θ),我们需要采用一种反向传播算法:首先计算最后一层的误差,然后再一层一层反向求出各层的误差,直到倒数第二层。
误差是激活单元的预测(
a
k
(
4
)
a_k^{(4)}
ak(4) )与数据集给出的实际值(
y
k
y^k
yk)之间的误差(k=1:k)
用
δ
j
(
i
)
δ_j^{(i)}
δj(i)来表示第i层的第j个结点的误差,则向量表示:
δ
(
4
)
=
a
(
4
)
−
y
δ^{(4)}=a^{(4)}-y
δ(4)=a(4)−y
δ
(
3
)
=
(
Θ
(
3
)
)
T
δ
(
4
)
⋅
∗
g
′
(
z
(
3
)
)
δ^{(3)}=(Θ^{(3)})^T δ^{(4)}·*g'(z^{(3)})
δ(3)=(Θ(3))Tδ(4)⋅∗g′(z(3))
δ
(
2
)
=
(
Θ
(
2
)
)
T
δ
(
3
)
⋅
∗
g
′
(
z
(
2
)
)
δ^{(2)}=(Θ^{(2)})^T δ^{(3)}·*g'(z^{(2)})
δ(2)=(Θ(2))Tδ(3)⋅∗g′(z(2))
而又因为第一层是输入变量,不存在误差。
我们有了所有的误差的表达式后,便可以计算代价函数的偏导数了,假设λ=0,即我们不做任何正则化处理时有:
用
Δ
i
j
(
l
)
Δ_{ij}^{(l)}
Δij(l)来表示这个误差矩阵。第 l 层的第 i 个激活单元受到第 j 个参数影响而导致的误差。
9.6 随机初始化
任何优化算法都需要一些初始的参数。到目前为止我们都是初始所有参数为0,但是对于神经网络来说是不可行的。
如果我们令所有的初始参数都为0,这将意味着我们第二层的所有激活单元都会有相同的值。
我们通常初始参数为正负ε之间的随机值,假设我们要随机初始一个尺寸为10×11的参数矩阵,代码如下:
T
h
e
t
a
1
=
r
a
n
d
(
10
,
11
)
∗
(
2
∗
e
p
s
)
–
e
p
s
Theta1 = rand(10, 11) * (2*eps) – eps
Theta1=rand(10,11)∗(2∗eps)–eps
小结
如果隐藏层数大于1,确保每个隐藏层的单元个数相同,通常情况下隐藏层单元的个数越多越好。
训练神经网络:
- 参数的随机初始化
- 利用正向传播方法计算所有的h_θ (x)
- 编写计算代价函数 J 的代码
- 利用反向传播方法计算所有偏导数
- 利用数值检验方法检验这些偏导数
- 使用优化算法(梯度下降等)来最小化代价函数