斯坦福机器学习笔记四

来源:互联网 发布:中国经济数据统计网 编辑:程序博客网 时间:2024/05/17 21:58

神经网络

当输入变量的特征太多时,线性回归算法和逻辑回归算法的计算负荷会非常大,不能有效地处理这么多的特征,因此需要使用神经网络。神经网络是许多逻辑单元按照不同层级组织起来的网络,每一层的输出变量都是下一层的输入变量。

1、前向传播

这里写图片描述

如图所示是一个三层的神经网络。第一层是输入层,有3个输入单元,分别是 x1x2x3。最后一层是输出层,负责计算 h θ (x)。中间层是隐藏层,负责进行数据处理,然后将数据传到下一层,它有3个激活单元,分别是 a(2)1a(2)2a(2)3。图中,为每层都增加了一个偏差单位。像这种从左到右的算法称为前向传播算法。

在神经网络中,a(j)i 代表第 j 层的第 i 个激活单元;  Θ (j) 代表从第 j 层映射到第 j+1 层时的权重的矩阵,它的尺寸为( j+1 层的激活单元数) *(j层的激活单元数+1);sl 表示每层的激活单元的个数;sL 表示最后一层中处理单元的个数;L 表示神经网络的层数;K 表示输出层单元的个数,也是最终分类的类数。

上图中神经网络的激活单元和输出分别是:

a(2)1=g( Θ (1)10x0+ Θ (1)11x1++ Θ (1)12x2+ Θ (1)13x3)
a(2)2=g( Θ (1)20x0+ Θ (1)21x1++ Θ (1)22x2+ Θ (1)23x3)
a(2)3=g( Θ (1)30x0+ Θ (1)31x1++ Θ (1)32x2+ Θ (1)33x3)
hθ(x)=a(3)1=g( Θ (2)10a(2)0+ Θ (2)11a(2)1++ Θ (2)12a(2)2+ Θ (2)13a(2)3)

使用向量化的方法会使得计算更为简便。将上述的栗子向量化。
令:

这里写图片描述

第一层到第二层之间的计算:

这里写图片描述

向量化化简得到:

z(2)= Θ (1)X
a(2)=g(z(2))

然后添加 a(2)0=1

第二层到第三层之间的计算:

这里写图片描述

化简得到:

z(3)= Θ (2)a2
h θ (x)=g(z(2))

通过上述的栗子,可以得到一个一般的神经网络向量化的式子。

将 x 和 z 向量化,

这里写图片描述

输入层向隐藏层传递的公式:

z(2)= Θ (1)X
a(2)=g(z(2))

然后添加 a(2)0=1

隐藏层之间传递的公式:

z(j)= Θ (j1)aj1
a(j)=g(z(j))

计算完要为求出的 a(j) 添加一个偏差单元 a(j)0=1

最后传到输出层的公式为:

h θ (x)=a(j+1)=g(z(j+1))

上述的神经网络的输出层只有一个单元,对应的是二分类问题。神经网络在多分类问题上也有应用。

这里写图片描述

上图中输出层有 3 个输入单元,两个隐藏层,输出层的 4 个神经元用来表示 4 类,输出的结果为以下四种可能的情形之一,分别表示 1, 2, 3, 4 类。

这里写图片描述

神经网络的代价函数为:

J( Θ )=1m[mi=1Kk=1(y(i)klog(h Θ (x(i)))k+(1y(i)k)log(1h Θ (x(i)))k)]+λ2mL1l=1sli=1sl+1j=1( Θ lji)2

对于多分类问题,它会把所有类的输出与期望值做比较,再求和。

2、反向传播

想要计算使得代价函数最小的权重矩阵Θ ,需要用到梯度下降法。为了计算代价函数的偏导数,引入了反向传播算法,它首先计算的是最后一层的误差,然后再一层一层的反向求出各层的误差,直到倒数第二层。

这里写图片描述

如图所示的栗子,从最后一层的误差开始计算,误差是激活单元的预测 a(4)k 与实际输出值 yk 之间的误差(其中k=1:K,表示的是K个分类)。用δ 来表示误差,则:

δ(4)=a(4)y

再利用这个误差值来计算前一层的误差:

δ(3)= (    Θ (3))Tδ(4)*g(z(3))

其中 ,g'(z(3))=a(3).(1a(3))

依次类推,

δ(2)=(    Θ (2))Tδ(3)*g(z(2))

由于训练集是一个矩阵而非向量,需要计算每一层的误差单元来计算代价函数的偏导数。

 Δ (l)i,j:= Δ (l)i,j+aljδl+1i

 Δ (l)ij 表示的是第 l 层的第 i 个激活单元受到第 j 个参数影响导致的误差。

最后的到代价函数的偏导数为:

D(l)i,j:=1m( Δ (l)i,j+λ Θ li,j)   ,  if  j0
D(l)i,j:=1m Δ (l)i,j   ,  if  j=0

3、梯度检测

当对一个较为复杂的模型使用梯度下降算法时,可能会存在一些不易察觉的错误,为了避免这个问题,引入了梯度的数值检验。使用在高数里对导数的定义,即某点的梯度等于在代价函数上沿着切线方向选择两个非常近的点,然后计算两个点的平均值用以估计梯度。

θ1J(θ)J(θ1+ε,θ2,θ3θn)J(θ1ε,θ2,θ3θn)2ε
θ2J(θ)J(θ1,θ2+ε,θ3θn)J(θ1,θ2ε,θ3θn)2ε

θnJ(θ)J(θ1,θ2,θ3θn+ε)J(θ1,θ2,θ3θnε)2ε

一般ε 会取一个非常小的值,例如  ε =104,一般  ε =104 是最合适的值。

实现梯度检测的步骤一般是:先使用BP算法计算梯度,再使用数值算法(梯度检测算法)计算梯度,确定两个值相等或近似,则认为算法计算正确。为了提高算法的效率,在已经确保算法正确的前提下,在迭代训练开始之前,关掉梯度检查,否则程序会非常慢。

4、随机初始化

任何算法的参数都需要初始化,一般算法都是初始化所有的参数为0,如果神经网络的参数也都初始化为0,这就会导致第二层的所有激活单元都会有相同的值,因此要对神经网络随机初始化。
通常初始参数为正负ε 之间的随机数,假设随机初始化一个尺寸为10*11的参数矩阵,代码如下:

这里写图片描述

5、网络结构的选择

输入层的单元个数等于输入的训练样本 X 的特征数;输出层的单元个数等于最后想要得到的分类的类数; 隐藏层个数的选择:一般默认使用一层隐藏层,当然正则化后的大型神经网络往往效果更好。如果使用的隐藏层数目超过 1,则每个隐藏层的单元数应该相等。一般来说,隐藏层的单元数越多越好,但是过多的隐藏层会导致大量的计算。同时,隐藏层的单元数还应该和输入层的维度、特征元素数目相匹配,一般来说,隐藏层的单元数会稍微大于输入层的特征数目。使用较小的神经网络计算量小,但是容易发生欠拟合。大型神经网络容易出现过度拟合,在这种情况下,可以使用正则化(增加 λ),以解决过度拟合。

总结一下神精网络算法的实现步骤:
第一步,需要对参数进行随机初始化;
第二步,利用正向传播方法计算所有的 h θ (x)
第三步:写出代价函数 J;
第四步:利用反向传播算法计算所有的偏导数;
第五步:利用数值检验方法检验这些偏导数;
第六步:使用优化算法来最小化代价函数。

2 0