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))+(1−y(i))log(1−hθ(x(i)))]+λ2m∑nj=1θ2j
more generally,在神经网络中,hΘ(x)∈RK,(hΘ(x))i是第i个output,神经网络的cost function为:
J(Θ)=−1m[∑mi=1∑Kk=1y(i)klog(hΘ(x(i))k)+(1−y(i)k)log(1−(hΘ(x(i)))k)]+λ2m∑L−1l=1∑sli=1∑sl+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)j−yj,给出 δ(l)=(θ(l))Tδ(l+1).∗g′(z(l)),其中g′(z(l))=a(l).∗(1−a(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,那就默认每一层的单元数相同
结构确定之后就可以开始训练模型了:
- 随机初始化权重参数Θ
- 使用forward propagation计算每一层的单元的值(包括输出层的值)
- 根据以上公式计算cost function
- 使用backpropagation计算偏导数
- 使用gradient checking去验证backpropagation是否做的正确,若正确,则立即停止gradient checking
- 使用gradient descent或者其他的优化函数去最小化cost function,得到权重参数Θ
注意这里的损失函数不是一个凸函数,所以我们很有可能得到的是一个局部最小值,这是ok的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次 .NET某旅行社酒店管理系统 卡死分析
· 长文讲解 MCP 和案例实战
· Hangfire Redis 实现秒级定时任务,使用 CQRS 实现动态执行代码
· Android编译时动态插入代码原理与实践
· 解锁.NET 9性能优化黑科技:从内存管理到Web性能的最全指南
· 工良出品 | 长文讲解 MCP 和案例实战
· 一天 Star 破万的开源项目「GitHub 热点速览」
· 多年后再做Web开发,AI帮大忙
· 记一次 .NET某旅行社酒店管理系统 卡死分析
· 别再堆文档了,大模型时代知识库应该这样建