吴恩达机器学习----神经网络:学习

吴恩达机器学习教程学习笔记 (7/16)

吴恩达教授(Andrew Ng)的机器学习可以说是一门非常重视ML理论基础的课程,做做一些简单的笔记加上个人的理解。本笔记根据吴恩达的课程顺序,以每章内容作为节点进行记录。(共18章,其中第3章“线性代数回顾”与第5章“Octava教程”的笔记就不总结了)

第九章 神经网络:学习(Neural Network:Learning)

1、代价函数

假设神经网络的训练样本有m个,每个包含一组输入x和一组输出信号y,L表示神经网络层数,SI表示每层的neuron个数(S_l表示输出层神经元个数),SL代表最后一层中处理单元的个数。
将神经网络的分类定义为两种情况:二类分类和多类分类,
二类分类:SL=0,y=0 or 1表示哪一类;
K类分类:SL=k,yi=1表示分到第i类;(k>2)
在这里插入图片描述
逻辑回归问题中我们的代价函数为: J ( θ ) = 1 / m ∑ i = 1 n [ − 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(θ)=1/m∑^n_{i=1}[-y^{(i)}log(h_θ(x^{(i)}))-(1-y^{(i)})log(1-h_θ(x^{(i)}))]+λ/2m∑^n_{j=1}θ^2_j J(θ)=1/mi=1n[y(i)log(hθ(x(i)))(1y(i))log(1hθ(x(i)))]+λ/2mj=1nθj2在逻辑回归中,我们只有一个输出变量,又称标量(scalar),也只有一个因变量y,但是在神经网络中,我们可以有很多输出变量,我们的hθ(x)是一个维度为K的向量,并且我们训练集中的因变量也是同样维度的一个向量,因此我们的代价函数会比逻辑回归更加复杂一些,为: 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 ( j ) ) 2 J(θ)=-1/m[∑^m_{(i=1)}∑^k_{(k=1)}y^{(i)}_klog(h_θ(x^{(i)}))_k+(1-y^{(i)}_k)log(1-(h_θ(x^{(i)}))_k)]+λ/2m∑^{L-1}_{l=1}∑^{s_l}_{i=1}∑^{s_l+1}_{j=1}(θ^{(j)}_{ji})^2 J(θ)=1/m[(i=1)m(k=1)kyk(i)log(hθ(x(i)))k+(1yk(i))log(1(hθ(x(i)))k)]+λ/2ml=1L1i=1slj=1sl+1(θji(j))2这个看起来复杂很多的代价函数背后的思想还是一样的,唯一不同的是,对于每一行特征,我们都会给出K个预测,基本上我们可以利用循环,对每一行特征都预测K个不同结果,然后在利用循环在K个预测中选择可能性最高的一个,将其与y中的实际数据进行比较。
正则化的那一项只是排除了每一层θ0后,每一层的θ矩阵的和。最里层的循环j循环所有的行(由sl +1 层的激活单元数决定),循环i则循环所有的列,由该层(sl层)的激活单元数所决定。即:hθ (x)与真实值之间的距离为每个样本-每个类输出的加和,对参数进行regularization的bias项处理所有参数的平方和。

2、反向传播算法

之前我们在计算神经网络预测结果的时候我们采用了一种正向传播方法,我们从第一层开始正向一层一层进行计算,直到最后一层的hθ(x),现在,为了计算代价函数的偏导数,我们需要采用一种反向传播算法,也就是首先计算最后一层的误差,然后再一层一层反向求出各层的误差,直到倒数第二层。 以一个例子来说明反向传播算法。
假设我们的训练集只有一个实例(x(1),y(1)),我们的神经网络是一个四层的神经网络,其中K=4,SL=4,L=4:
前向传播算法:
在这里插入图片描述在这里插入图片描述
我们从最后一层的误差开始计算,误差是激活单元的预测(ak(4))与实际值(yk)之间的误差,(k=1:k)。
我们用δ来表示误差,则:δ(4)=a(4)-y。
注:δj(l)表示误差第 l 层第 j 个节点,aj(l)表示第 l 层第 j 个节点的激活值。
我们利用这个误差值来计算前一层的误差: δ ( 3 ) = ( Θ ( 3 ) ) T δ ( 4 ) ∗ g ′ ( z ( 3 ) ) δ^{(3)}=(Θ^{(3)})^T δ^{(4)}*g'(z^{(3)}) δ(3)=(Θ(3))Tδ(4)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)(1a(3))而(θ(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,即我们不做任何正则化处理时有: ∂ J ( Θ ) / ∂ Θ i j ( l ) = a j ( l ) δ i ( l + 1 ) ∂ J(Θ)/∂Θ^{(l)}_{ij}=a_j^{(l)}δ_i^{(l+1)} J(Θ)/Θij(l)=aj(l)δi(l+1)重要的是清楚地知道上面式子中上下标的含义:
l 代表目前所计算的是第几层。
j 代表目前计算层中的激活单元的下标,也将是下一层的第j个输入变量的下标。
i 代表下一层中误差单元的下标,是受到权重矩阵中第i行影响的下一层中的误差单元的下标。
如果我们考虑正则化处理,并且我们的训练集是一个特征矩阵而非向量。在上面的特殊情况中,我们需要计算每一层的误差单元来计算代价函数的偏导数。在更为一般的情况中,我们同样需要计算每一层的误差单元,但是我们需要为整个训练集计算误差单元,此时的误差单元也是一个矩阵,我们用Δij(l)来表示这个误差矩阵。第 l 层的第 i 个激活单元受到第 j 个参数影响而导致的误差。
我们的算法表示为:
在这里插入图片描述

3、梯度检验

对梯度的估计采用的方法是在代价函数上沿着切线的方向选择离两个非常近的点然后计算两个点的平均值用以估计梯度。即对于某个特定的 θ,我们计算出在 θ-ε 处和 θ+ε 的代价值(ε是一个非常小的值,通常选取 0.001),然后求两个代价的平均,用以估计在 θ 处的代价值。
在这里插入图片描述
Python代码如下:
gradApprox = (J(theta + eps) – J(theta - eps)) / (2*eps)
当θ是一个向量时,我们则需要对偏导数进行检验。因为代价函数的偏导数检验只针对一个参数的改变进行检验,下面是一个只针对θ_1进行检验的示例: ∂ / ( ∂ θ 1 ) = ( J ( θ 1 + ε 1 , θ 2 , θ 3 . . . θ n ) − J ( θ 1 − ε 1 , θ 2 , θ 3 . . . θ n ) ) / 2 ε ∂/(∂θ_1 )=(J(θ_1+ε_1,θ_2,θ_3...θ_n )-J(θ_1-ε_1,θ_2,θ_3...θ_n ))/2ε /(θ1)=(J(θ1+ε1,θ2,θ3...θn)J(θ1ε1,θ2,θ3...θn))/2ε
最后我们还需要对通过反向传播方法计算出的偏导数进行检验。

4、训练神经网络

网络结构:第一件要做的事是选择网络结构,即决定选择多少层以及决定每层分别有多少个单元。
第一层的单元数即我们训练集的特征数量。
最后一层的单元数是我们训练集的结果的类的数量。
如果隐藏层数大于1,确保每个隐藏层的单元个数相同,通常情况下隐藏层单元的个数越多越好。
我们真正要决定的是隐藏层的层数和每个中间层的单元数。
训练神经网络:
1.参数的随机初始化
2.利用正向传播方法计算所有的hθ (x)
3.编写计算代价函数 J 的代码
4.利用反向传播方法计算所有偏导数
5.利用数值检验方法检验这些偏导数
6.使用优化算法来最小化代价函数
注:我们通常初始参数为正负ε之间的随机值,假设我们要随机初始一个尺寸为10×11的参数矩阵,Python代码如下:
Theta1 = rand(10, 11) * (2*eps) – eps

感谢黄海广博士团队的翻译和笔记
END

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值