1、为什么要用神经网络?
我们之前学的,无论是线性回归还是逻辑回归都有这样一个缺点,即:当特征太多时,计算的负荷会非常大。
如下面的例子:
当我们只考虑两个特征
x
1
、
x
2
x_1、x_2
x1、x2 时,我们的分类任务执行得很好。
但是假如现在我们希望用100个特征来构建一个非线性的多项式模型,结果将是数量非常惊人的特征组合,即便我们只采用两两特征的组合
(
x
1
x
2
+
x
1
x
3
+
x
1
x
4
+
.
.
.
+
x
2
x
3
+
x
2
x
4
+
.
.
.
+
x
99
x
100
)
(x_1 x_2+x_1 x_3+x_1 x_4+...+x_2 x_3+x_2 x_4+...+x_{99} x_{100})
(x1x2+x1x3+x1x4+...+x2x3+x2x4+...+x99x100),我们也会有接近5000个组合而成的特征。这对于一般的逻辑回归来说需要计算的特征太多了。
再比如,我们希望训练一个模型来识别一张图片是否是汽车,我们需要做的是利用很多汽车的图片和很多非汽车的图片,然后提取这些图片上一个个像素的值(饱和度或亮度)来作为特征。假如我们只选用灰度图片,即:每个像素只有一个值(而非 RGB值),我们可以选取图片上的两个不同位置上的两个像素,然后训练一个逻辑回归模型,利用这两个像素的值来判断图片上是否是汽车。
假如我们采用的都是50x50像素的小图片,并且我们将所有的像素视为特征,则会有 2500个特征,如果我们要进一步将两两特征组合构成一个多项式模型,则会有约
250
0
2
/
2
2500^2/2
25002/2 个(接近3百万个)特征。普通的逻辑回归模型,不能有效地处理这么多的特征,这时候我们就需要神经网络啦。
2、神经网络的模型表示
为了构建神经网络模型,我们需要首先思考大脑中的神经网络是怎样的?每一个神经元都可以被认为是一个处理单元/神经核(processing unit/Nucleus),它含有许多输入/树突(input/Dendrite),并且有一个输出/轴突(output/Axon)。神经网络是大量神经元相互链接并通过电脉冲来交流的一个网络,如下图所示。
下图是神经元的工作原理图
神经元之间是利用微弱的电流进行沟通的,这些弱电流也被称作动作电位。假如我们想活动一块肌肉,神经元就会就通过它的轴突发送一段微弱电流给其他神经元,其他神经元利用树突接收到信息后,会做一些计算,然后向肌肉发送脉冲,引起肌肉收缩。当然了,实际过程比这要复杂,在这里只是简单地进行描述。
神经网络模型建立在很多神经元之上,每一个神经元又是一个个学习模型。这些神经元(也叫激活单元,activation unit)采纳一些特征作为输入,并且根据本身的模型提供一个输出。下图是一个以逻辑回归模型作为自身学习模型的神经元示例,在神经网络中,参数又可被成为权重(weight)。
我们设计出了类似于神经元的神经网络,效果如下:
其中
x
1
,
x
2
,
x
3
x_1, x_2, x_3
x1,x2,x3 是输入单元(input units),我们将原始数据输入给它们。
a
1
,
a
2
,
a
3
a_1, a_2, a_3
a1,a2,a3 是中间单元,它们负责将数据进行处理,然后传递到下一层。最后是输出单元,它负责计算
h
θ
(
x
)
h_θ (x)
hθ(x)。
神经网络模型是许多逻辑单元按照不同层级组织起来的网络,每一层的输出变量都是下一层的输入变量。下图为一个3层的神经网络,第一层称为输入层(Input Layer),最后一层称为输出层(Output Layer),中间一层称为隐藏层(Hidden Layers)。我们为每一层都增加一个偏置单元(bias unit),也成为偏置项。
下面引入一些标记法来帮助描述模型:
a i ( j ) a_i^{(j)} ai(j)代表第 j j j 层的第 i i i 个激活单元。 θ ( j ) θ^{(j)} θ(j) 代表从第 j j j 层映射到第 j + 1 j+1 j+1 层时的权重矩阵,例如 θ ( 1 ) θ^{(1)} θ(1) 代表从第一层映射到第二层的权重矩阵。其尺寸为:以第 j + 1 j+1 j+1 层的激活单元数量为行数,以第 j j j 层的激活单元数加1为列数的矩阵。例如:上图所示的神经网络中 θ ( 1 ) θ^{(1)} θ(1) 的尺寸为 3*4。
对于上图所示的模型,激活单元和输出分别表达为:
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)
h Θ ( x ) = g ( Θ 10 ( 2 ) a 0 ( 2 ) + Θ 11 ( 2 ) a 1 ( 2 ) + Θ 12 ( 2 ) a 2 ( 2 ) + Θ 13 ( 2 ) a 3 ( 2 ) ) h_Θ (x)=g(Θ_{10}^{(2)} a_0^{(2)}+Θ_{11}^{(2)} a_1^{(2)}+Θ_{12}^{(2)} a_2^{(2)}+Θ_{13}^{(2)}a_3^{(2)}) hΘ(x)=g(Θ10(2)a0(2)+Θ11(2)a1(2)+Θ12(2)a2(2)+Θ13(2)a3(2))
上面进行的讨论中只是将特征矩阵中的一行(一个训练实例)喂给了神经网络,我们需要将整个训练集都喂给我们的神经网络算法来学习模型。
我们可以知道:每一个
a
a
a 都是由上一层所有的
x
x
x 和每一个
x
x
x 所对应的
θ
\theta
θ 决定的。
我们把这样从左到右的算法称为前向传播算法( FORWARD PROPAGATION ),把 x , θ , a x, θ, a x,θ,a 分别用矩阵表示,我们可以得到 θ ⋅ X = a θ⋅X=a θ⋅X=a :
前向传播相对于使用循环来编码,利用向量化的方法会使得计算更为简便。以上面的神经网络为例,试着计算第二层的值:
我们令
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
)
=
1
a_0^{(2)}=1
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))。
这只是针对训练集中一个训练实例所进行的计算。如果我们要对整个训练集进行计算,我们需要将训练集特征矩阵进行转置,使得同一个实例的特征都在同一列里。即:
z
(
2
)
=
Θ
(
1
)
×
X
T
z^{(2)}=Θ^{(1)}×X^T
z(2)=Θ(1)×XT
a ( 2 ) = g ( z ( 2 ) ) a^{(2)}=g(z^{(2)}) a(2)=g(z(2))
为了更好了了解Neuron Networks的工作原理,我们先把左半部分遮住:
右半部分其实就是以
a
0
,
a
1
,
a
2
,
a
3
a_0,a_1,a_2,a_3
a0,a1,a2,a3 为输入, 按照Logistic Regression的方式输出
h
θ
(
x
)
h_θ (x)
hθ(x),其实神经网络就像是logistic regression,只不过我们把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)],即:
h θ ( x ) = g ( θ 0 ( 2 ) a 0 ( 2 ) + θ 1 ( 2 ) a 1 ( 2 ) + θ 1 ( 2 ) a 1 ( 2 ) + θ 1 ( 2 ) a 1 ( 2 ) ) h_{\theta}(x) = g(\theta_{0}^{(2)}a_{0}^{(2)} + \theta_{1}^{(2)}a_{1}^{(2)} + \theta_{1}^{(2)}a_{1}^{(2)} + \theta_{1}^{(2)}a_{1}^{(2)}) hθ(x)=g(θ0(2)a0(2)+θ1(2)a1(2)+θ1(2)a1(2)+θ1(2)a1(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 x x与 θ \theta θ 决定的,因为是梯度下降的,所以 a a a 是变化的,并且变得越来越厉害,所以这些更高级的特征值远比仅仅将 x x x 次方厉害,也能更好的预测新数据。 这就是神经网络相比于逻辑回归和线性回归的优势。
从本质上讲,神经网络能够通过学习得出其自身的一系列特征。在普通的逻辑回归中,我们被限制为使用数据中的原始特征 x 1 , x 2 , . . . , x n x_1,x_2,...,x_n x1,x2,...,xn,我们虽然可以使用一些二项式项来组合这些特征,但是我们仍然受到这些原始特征的限制。在神经网络中,原始特征只是输入层,在我们上面三层的神经网络例子中,第三层也就是输出层做出的预测利用的是第二层的特征,而非输入层中的原始特征,我们可以认为第二层中的特征是神经网络通过学习后自己得出的一系列用于预测输出变量的新特征。神经网络中,单层神经元(无中间层)的计算可用来表示逻辑运算,比如逻辑与(AND)、逻辑或(OR)。
下面是AND 函数的神经网络设计与output层表达式,我们可以用这样的一个神经网络来表示 AND 函数:
其中,
θ
0
=
−
30
,
θ
1
=
20
,
θ
2
=
20
θ_0=-30,θ_1=20,θ_2=20
θ0=−30,θ1=20,θ2=20 我们的输出函数
h
θ
(
x
)
h_θ (x)
hθ(x)即为:
h
Θ
(
x
)
=
g
(
−
30
+
20
x
1
+
20
x
2
)
h_Θ (x)=g(-30+20x_1+20x_2 )
hΘ(x)=g(−30+20x1+20x2)
结合
s
i
g
m
o
d
sigmod
sigmod 函数图像,写出真值表,如下图所示:
所以我们有:
h
Θ
(
x
)
h_Θ (x)
hΘ(x) ≈
x
1
x_1
x1 AND
x
2
x_2
x2
接下来再介绍一个 OR 函数:
OR 与 AND 整体一样,区别只在于
θ
\theta
θ 的取值不同。
二元逻辑运算符(BINARY LOGICAL OPERATORS)当输入特征为布尔值(0或1)时,我们可以用一个单一的激活层可以作为二元逻辑运算符,为了表示不同的运算符,我们只需要选择不同的权重即可。
下图的神经元(三个权重分别为-30,20,20)可以被视为作用同于逻辑与(AND):
下图的神经元(三个权重分别为-10,20,20)可以被视为作用等同于逻辑或(OR):
下图的神经元(两个权重分别为 10,-20)可以被视为作用等同于逻辑非(NOT):
我们可以利用神经元来组合成更为复杂的神经网络以实现更复杂的运算。例如,我们要实现 XNOR 功能(输入的两个值必须一样,均为1或均为0),即:
XNOR = ( x 1 x_1 x1 AND x 2 x_2 x2) OR ((NOT x 1 x_1 x1) AND (NOT x 2 x_2 x2))
首先构造一个能表达(NOT
x
1
x_1
x1) AND (NOT
x
2
x_2
x2) 部分的神经元:
然后将表示 AND 的神经元和表示 (NOT
x
1
x_1
x1)AND(NOT
x
2
x_2
x2) 的神经元以及表示 OR 的神经元进行组合:
我们就得到了一个能实现 XNOR 运算符功能的神经网络。
按这种方法我们可以逐渐构造出越来越复杂的函数,也能得到更加厉害的特征值。
这就是神经网络的厉害之处。
3、神经网络解决多分类问题
当我们有不止两种分类时(也就是 y = 1 , 2 , 3 … y=1,2,3… y=1,2,3…),比如以下这种情况,该怎么办?如果我们要训练一个神经网络算法来识别路人、汽车、摩托车和卡车,在输出层我们应该有4个值。例如,第一个值为1或0用于预测是否是行人,第二个值为1或0用于判断是否为汽车…
输入向量 x x x 有三个维度,两个中间层,输出层4个神经元分别用来表示4类,也就是每一个数据在输出层都会出现 [ a b c d ] T [a\quad b\quad c\quad d]^T [abcd]T,且 a , b , c , d a,b,c,d a,b,c,d 中仅有一个为1,表示当前类。下面是该神经网络的可能结构示例:
神经网络算法的输出结果为以下四种可能情形之一:
4、代价函数
假设神经网络的训练样本有
m
m
m 个,每个样本包含一组输入
x
x
x 和一组输出
y
y
y,
L
L
L 表示神经网络层数,
S
l
S_l
Sl 表示每层的激活单元个数(偏置项除外),
S
L
S_L
SL 代表最后一层中处理单元的个数。
将神经网络的分类定义为两种情况:二类分类和多类分类,
二分类:
S
L
=
0
,
y
=
0
o
r
1
表
示
哪
一
类
S_L=0,y=0 or 1表示哪一类
SL=0,y=0 or 1表示哪一类;
K分类:
S
L
=
k
,
y
i
=
1
表
示
分
到
第
i
类
;
(
k
>
2
)
S_L=k,y_i=1表示分到第i类;(k>2)
SL=k,yi=1表示分到第i类;(k>2)
逻辑回归问题中的代价函数为:
J ( θ ) = − 1 m [ ∑ i = 1 m [ y ( i ) l o g h θ ( x ( i ) ) + ( 1 − y ( i ) ) l o g ( 1 − h θ ( x ( i ) ) ) ] ] + λ 2 m ∑ j = 1 n θ j 2 J(\theta) = -\frac{1}{m}[\sum\limits_{i=1}^{m}[y^{(i)}logh_{\theta}(x^{(i)}) + (1-y^{(i)})log(1-h_{\theta}(x^{(i)}))]]+\frac{\lambda}{2m}\sum\limits_{j=1}^{n}\theta_{j}^{2} J(θ)=−m1[i=1∑m[y(i)loghθ(x(i))+(1−y(i))log(1−hθ(x(i)))]]+2mλj=1∑nθj2
在逻辑回归中,我们只有一个输出变量,也只有一个因变量 y y y,但是在神经网络中,我们可以有很多输出变量,我们的 h θ ( x ) h_θ (x) hθ(x) 是一个维度为 K K K 的向量,并且我们训练集中的因变量也是同样维度的一个向量,因此我们的代价函数会比逻辑回归更加复杂一些,为: h θ ( x ) ∈ R K , ( h θ ( x ) ) i = i t h o u t p u t h_θ (x)∈R^K ,(h_θ (x))_i=i^{th}output hθ(x)∈RK,(hθ(x))i=ithoutput
J ( Θ ) = − 1 m [ ∑ i = 1 m ∑ k = 1 K [ y k ( i ) l o g ( h Θ ( x ( i ) ) ) k + ( 1 − y k ( i ) ) l o g ( 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}[\sum\limits_{i=1}^{m}\sum\limits_{k=1}^{K}[y_{k}^{(i)}log(h_{\Theta}(x^{(i)}))_{k} + (1-y_{k}^{(i)})log(1-h_{\Theta}(x^{(i)}))_{k}]]+\frac{\lambda}{2m}\sum\limits_{l=1}^{L-1}\sum\limits_{i=1}^{s_{l}}\sum\limits_{j=1}^{s_{l}+1}(\Theta_{ji}^{l})^{2} J(Θ)=−m1[i=1∑mk=1∑K[yk(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(Θjil)2
这个看起来复杂很多的代价函数背后的思想还是一样的,我们希望通过代价函数来观察算法预测的结果与真实情况的误差有多大,唯一不同的是,对于每一行特征,我们都会给出 K K K 个预测,基本上我们可以利用循环,对每一行特征都预测 K K K 个不同结果,然后再利用循环在 K K K 个预测中选择可能性最高的一个,将其与 y y y 中的实际数据进行比较。注意:公式的下标是从1开始的,即不包含下标为0的值。
5、反向传播算法
之前我们在计算神经网络预测结果的时候我们采用了一种正向传播方法,我们从第一层开始,正向一层一层地进行计算,直到最后一层的 h θ ( x ) h_θ (x) hθ(x)。
如果要使用梯度下降法来求解神经网络,需要求出代价函数对参数的偏导数。现在,为了计算代价函数的偏导数 ∂ ∂ Θ i j ( l ) J ( Θ ) \frac{\partial}{\partial\Theta_{ij}^{(l)}}J(Θ) ∂Θij(l)∂J(Θ),我们需要采用一种反向传播算法,也就是首先计算最后一层的误差,然后再一层一层反向求出各层的误差,直到倒数第二层。 以一个例子来说明反向传播算法。
假设我们的训练集只有一个实例 ( x ( 1 ) , y ( 1 ) ) (x^{(1)},y^{(1)}) (x(1),y(1)),我们的神经网络是一个四层的神经网络,其中 K = 4 K=4 K=4, S L = 4 S_L=4 SL=4, L = 4 L=4 L=4:
前向传播算法:
我们从最后一层的误差开始计算,误差是激活单元的预测(
a
k
(
4
)
a_{k}^{(4)}
ak(4))与实际值(
y
k
y^k
yk)之间的误差,(
k
=
1
:
K
k=1:K
k=1:K)。
我们用 δ δ δ 来表示误差,则: δ ( 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)) 其中
g
′
(
z
(
3
)
)
g'(z^{(3)})
g′(z(3))是 S 形函数的导数,
g
′
(
z
(
3
)
)
=
a
(
3
)
∗
(
1
−
a
(
3
)
)
g'(z^{(3)})=a^{(3)}*(1-a^{(3)})
g′(z(3))=a(3)∗(1−a(3))。而
(
θ
(
3
)
)
T
δ
(
4
)
(θ^{(3)})^Tδ^{(4)}
(θ(3))Tδ(4)
则是权重导致的误差的和。下一步是继续计算第二层的误差:
δ
(
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 ) J ( Θ ) = a j l δ i l + 1 \frac{\partial}{\partial\Theta_{ij}^{(l)}}J(Θ)=a_{j}^{l}\delta_{i}^{l+1} ∂Θij(l)∂J(Θ)=ajlδil+1
重要的是清楚地知道上面式子中上下标的含义:
l
l
l 代表目前所计算的是第几层。
j
j
j 代表目前计算层中的激活单元的下标,也将是下一层的第
j
j
j 个输入变量的下标。
i
i
i 代表下一层中误差单元的下标,是受到权重矩阵中第
i
i
i 行影响的下一层中的误差单元的下标。
如果我们考虑正则化处理,并且我们的训练集是一个特征矩阵而非向量。在上面的特殊情况中,我们需要计算每一层的误差单元来计算代价函数的偏导数。在更为一般的情况中,我们同样需要计算每一层的误差单元,此时的误差单元也是一个矩阵,我们用
Δ
i
j
(
l
)
Δ_{ij}^{(l)}
Δij(l)来表示这个误差矩阵。第
l
l
l 层的第
i
i
i 个激活单元受到第
j
j
j 个参数影响而导致的误差。
首先用正向传播方法计算出每一层的激活单元,利用训练集的结果与神经网络预测的结果求出最后一层的误差,然后利用该误差运用反向传播法计算出直至第二层的所有误差。
在求出了
Δ
i
j
(
l
)
Δ_{ij}^{(l)}
Δij(l)之后,我们便可以计算代价函数的偏导数了,计算方法如下:
D i j ( l ) : = 1 m Δ i j ( l ) + λ Θ i j ( l ) D_{ij}^{(l)}:=\frac{1}{m} Δ_{ij}^{(l)}+λΘ_{ij}^{(l)}\quad Dij(l):=m1Δij(l)+λΘij(l) if j ≠ 0
D i j ( l ) : = 1 m Δ i j ( l ) D_{ij}^{(l)}:=\frac{1}{m}Δ_{ij}^{(l)}\quad Dij(l):=m1Δij(l) if j = 0
5、梯度检验
当我们对一个较为复杂的模型(例如神经网络)使用梯度下降算法时,可能会存在一些不容易察觉的错误,意味着,虽然代价看上去在不断减小,但最终的结果可能并不是最优解。
为了避免这样的问题,我们采取一种叫做梯度的数值检验(Numerical Gradient Checking)方法。这种方法的思想是通过估计梯度值来检验我们计算的导数值是否符合我们的要求。
当参数为实数时,某点代价函数对参数的导数为
d
d
θ
J
(
θ
)
\frac{d}{d\theta}J(\theta)
dθdJ(θ),我们分别计算出在
θ
−
ε
θ-ε
θ−ε 处和
θ
+
ε
θ+ε
θ+ε 的代价值(
ε
ε
ε 是一个非常小的值,通常选取 0.001),然后求两个代价的平均值,如果
d
d
θ
J
(
θ
)
≈
J
(
θ
+
ε
)
−
J
(
θ
−
ε
)
2
ε
\frac{d}{d\theta}J(\theta)\approx\frac{J(θ+ε) - J(θ-ε)}{2ε}
dθdJ(θ)≈2εJ(θ+ε)−J(θ−ε),则认为是OK的。
当参数为向量时,我们可以用同样的方法来估计任意点代价函数对参数偏导的估计:
梯度检验主要是根据反向传播计算出来的偏导项跟我们用数值导数估计计算出来的偏导项进行比较,保证它们的值非常相近,说明反向传播算法正确。但是由于数值导数估计的计算量巨大,我们验证完算法正确性之后,要记得关闭梯度验证的代码,不然运算速度回非常慢。
6、随机初始化
任何优化算法都需要一些初始的参数。到目前为止我们都是初始所有参数为0,这样的初始方法对于逻辑回归来说是可行的,但是对于神经网络来说是不可行的。如果我们令所有的初始参数都为0,这将意味着我们第二层的所有激活单元都会有相同的值。同理,如果我们初始所有的参数都为一个非0的数,结果也是一样的。
所以引入了随机初始化的思想,用随机函数生成参数组。
7、使用神经网络的步骤
1)选择模型架构:模型架构包括三层(输入层、隐藏层和输出层)
我们选择的时候需要注意的是:输入层的单元数由我们训练集中的特征数量决定,输出层的单元数由类别数量决定。如果隐藏层数大于1,确保每个隐藏层的单元个数相同,通常情况下隐藏层单元的个数越多越好。
我们真正要决定的是隐藏层的层数和每个中间层的单元数。
2)训练模型
参数的随机初始化
利用正向传播方法计算所有的
h
θ
(
x
)
h_θ (x)
hθ(x)
计算代价函数
J
(
θ
)
J(\theta)
J(θ)
利用反向传播方法计算所有偏导数
利用数值检验方法检验这些偏导数(梯度检验)
使用优化算法来最小化代价函数