Processing math: 100%

machine learning 之 Neural Network 2

整理自Andrew Ng的machine learning 课程 week5.

目录:

  • Neural network and classification
  • Cost function
  • Backpropagation (to minimize cost function)
  • Backpropagation in practice
  • Gradient checking
  • Random initialization
  • Assure structure and Train a neural network

 

前提:

训练数据集:(x(1),y(1)),(x(2),y(2)),...,(x(m),y(m))

L:神经网络的总的层数,total layers,如下图,L=4

sl:第l层的单元数目,如下图,s1=3,s2=5,...

K:输出层的单元数,如下图,K=4

 

1、neural network and classification

对于二分类问题(binary classification):输出为0或1,K=1

对于多分类问题(Multi-class classification):输出为hot one编码形式,K为类别数目,类似如下:

 

2、cost function

之前的文章中介绍过logistic regression的cost function为:

J(θ)=1m[mi=1y(i)loghθ(x(i))+(1y(i))log(1hθ(x(i)))]+λ2mnj=1θ2j

more generally,在神经网络中,hΘ(x)RK(hΘ(x))iioutput,神经网络的cost function为:

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

相比于logistic regression:

  • 需要把K个输出的损失相加,所以有了K个累加项;
  • 在惩罚项里面,需要把除bias unit以外的所有的参数(除Θ0Θ)都进行惩罚;

 

3、Backpropagation

有了cost function之后,我们就需要minimize cost function,使用的就是backpropagation算法计算出进行参数更新的值(类似于梯度下降的偏导数),也就是神经网络的损失函数的偏导数:

梯度计算:

  • 首先进行forward propagation,计算出每一层的单元值(包括输出层的值);(上一篇文章的内容)
  • 进行backpropagation:(以前提中的神经网络为例)
    • 设定δ(l)k:为第l层上第j个结点的误差error,那么δ(4)j=a(4)jyj,给出 δ(l)=(θ(l))Tδ(l+1).g(z(l)),其中g(z(l))=a(l).(1a(l))

       
      • 注意:没有δ(1),因为δ(1)是观测数据,不存在误差一说,由于在此处计算误差是从后往前,所以这个算法被称为backpropagation
    • 给出公式 J(θ)θ(l)ij=a(l)jδ(l+1)i
    • 对于每一个训练数据,计算它们的偏导数,并且将其相加,Δ(l):=Δ(l)+δ(l+1)(a(l))T
    • 在所有的训练数据处理完之后,计算损失函数对每一个参数的偏导数,也就是参数的更新参数,D(l)ij=1mΔ(l)ij+λΘ(l)ij,当j为0时,λ为0(θ0不惩罚)

 

4、Backpropagation in practice

unrolling parameters:把矩阵形式的参数展开成向量,为了使用已有的函数对损失函数进行最小化运算;(matrix to vector)

reshape:vector to matrix,在计算偏导数和损失函数时,矩阵运算

 

5、Gradient checking

 做了backpropagation计算了损失函数对每个参数的偏导数之后,我们需要做一个checking来确定偏导数的计算是否正确,数值计算梯度如图所示:

计算公式为:(ε取一个很小的值,领域的概念)

J(θ+ε)J(θε)2ε

对于所有的参数,数值计算偏导数的公式如下:

如果数值计算的梯度和backpropagation算法计算的梯度是近似相等的话,就说明我们的backpropagation做对了,可以继续用backpropagation去计算梯度,训练模型

注意:在确定了backpropagation做对了之后,应该停止gradient checking,因为这种数值计算梯度的方法是十分的computational expensive,如果不停止的话,模型训练的速度会相当的慢

 

6、Random initalization

如何设定Θ的初始值?在logistic regression中,初始的参数θ被设定为0,那么如果在neural network中也做这种设定呢?

如上所示,如果设定初始的参数全部为0,那么隐藏层的所有的单元的值都会是一样的(在),同时,由后往前传的error δ也会是一样的,由此一来,损失函数对同一个输入对应的参数的偏导数也是一样的,也就是说,虽说是同步更新参数,但其实在网络中同一输入出发的的参数永远都是一样的,也就是说计算出来的隐含单元的值也永远是一样的,a(2)1永远等于a(2)2,如果有更多的隐含单元的话,也是一样的值。无论隐含层有多少的单元数,它们的值都是相同的,这就是一个极度冗余的现象,而且也根本没有发挥出来多个单元该有的作用。

以上问题称之为symmetry breaking,解决的办法是random initialization,设定初始参数时不可以设置为0,而是一些较小的随机数

 

7、Assure structure and Train a neural network

对于一个neural network的工程,我们首先需要做的是确定这个神经网络的结构(层数,每一层的单元数):

  • 输入单元数:x(i)的维度(x(i)代表第i个训练数据)
  • 输出单元数:类别数
  • 每一个隐含层的单元数:通常多多益善
  • 默认一个hidden layer,如超过了一个hidden layer,那就默认每一层的单元数相同

结构确定之后就可以开始训练模型了:

  1. 随机初始化权重参数Θ
  2. 使用forward propagation计算每一层的单元的值(包括输出层的值)
  3. 根据以上公式计算cost function
  4. 使用backpropagation计算偏导数
  5. 使用gradient checking去验证backpropagation是否做的正确,若正确,则立即停止gradient checking
  6. 使用gradient descent或者其他的优化函数去最小化cost function,得到权重参数Θ

注意这里的损失函数不是一个凸函数,所以我们很有可能得到的是一个局部最小值,这是ok的。

 

posted @   Echo_fy  阅读(351)  评论(0)    收藏  举报
编辑推荐:
· 记一次 .NET某旅行社酒店管理系统 卡死分析
· 长文讲解 MCP 和案例实战
· Hangfire Redis 实现秒级定时任务,使用 CQRS 实现动态执行代码
· Android编译时动态插入代码原理与实践
· 解锁.NET 9性能优化黑科技:从内存管理到Web性能的最全指南
阅读排行:
· 工良出品 | 长文讲解 MCP 和案例实战
· 一天 Star 破万的开源项目「GitHub 热点速览」
· 多年后再做Web开发,AI帮大忙
· 记一次 .NET某旅行社酒店管理系统 卡死分析
· 别再堆文档了,大模型时代知识库应该这样建
点击右上角即可分享
微信分享提示