理解神经网络(Neural Networks)(三)
基础知识回顾:https://blog.csdn.net/weixin_42395916/article/details/81099945
实际应用回顾:https://blog.csdn.net/weixin_42395916/article/details/81160314
根据前几周的内容我们知道,应用梯度下降法或者其他高级优化算法求解参数需要写出代码计算
1)
J(Θ)
2)
∂∂ΘlijJ(Θ)
本节介绍神经网络的代价函数及其偏导项的计算
一、代价函数 Cost Function
本质上,神经网络是一种通过logistic模型,从旧特征中学习到新特征,经过一定层数的学习后最终输出分类结果的算法。因此,我们可以根据logistic回归的代价函数得到神经网络的代价函数。
逻辑回归的代价函数(含正则项):
J(θ)=−1m∑i=1m[y(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i)))]+λ2m∑j=1nθ2j
神经网络代价函数的表达与之类似,但由于神经网络分类结果是以单位列向量的形式输出的,计算代价函数时不仅需要对所有训练样本的cost求和,还要对每一类的cost求和。此外,正则项需要对每一层的除偏置项外的参数求和。
神经网络的代价函数(含正则项):
J(Θ)=−1m∑i=1m∑k=1K[y(i)klog(hΘ(x(i)))k+(1−y(i)k)log(1−hΘ(x(i)))k]+λ2m∑l=1L−1∑i=1sl∑j=1sl+1(Θlji)2
其中,
(hΘ(x))i
表示输出层的第i个输出结果,
hΘ(x)∈K
.
易错点:正则项中并不包含偏置项
(i,j=0)
二、计算
∂∂ΘlijJ(Θ)
神经网络代价函数的偏导计算比较复杂,需要用到反向传播算法(backpropagation algorithm)。偏导的计算分为三步:
1) 前向传播算法计算各层激励值
2) 反向传播算法计算各层激励值的误差
3) 求偏导
(一)前向传播算法
*前向传播算法具体参见:https://blog.csdn.net/weixin_42395916/article/details/81099945
以一个训练样本为例,令输入层的激励值
a(1)=x
,运用前向传播算法得到每层的激励值
a(l)
.
(二)反向传播算法 Backpropagation Algorithm
线性回归和逻辑函数代价函数(不含正则项)求偏导结果形式均为
∂∂θjJ(θ)=1m∑i=1m(hθ(x(i))−y(i))x(i)j
括号内为计算值和实际值的误差。在神经网络算法中,将误差项记作
δ(l)j
,它捕捉了l层第j个神经节点激励值的误差。我们用反向传播算法计算它。反向传播算法先计算输出层的
δ
,然后计算上一层的
δ
,重复该过程直至第二层。
首先计算输出层的误差,显然,就是激励值减去实际值。用向量形式可写作
δ(4)=a(4)−y
接下来计算隐藏层的误差,计算方法见下图。根据sigmoid函数的性质,
g′(z(l))=a(l).∗(1−a(l))
,所以有
δ(3)=(Θ(3))Tδ(4).∗a(3).∗(1−a(3))
易错点:不用计算输入层的误差,因为这是我们在训练集中观察到的值,所以不存在误差。
(三)
∂∂ΘlijJ(Θ)=D(l)ij
将上述内容整合起来,下图是根据激励值和误差得到
J(Θ)
对
Θ(l)ij
求偏导的值
D(l)ij
的详细流程(m个训练样本).
完整的包含正则项的偏导数形式应为
D(l)ij=⎧⎩⎨⎪⎪⎪⎪⎪⎪1m∑mi=1(error of activation δ(l+1)i)∗(feature value a(l)j)+λm∗(parameter value Θlij)1m∑mi=1(error of activation δ(l+1)i)∗(feature value a(l)j)if j≠0if j=0
Step1: 初始化
给定m个训练样本,令
Δ(l)ij=0
, 因此
Δ(l)
是一个零矩阵。它用于之后偏导数的计算。
Step2: 计算
∑mi=1(error of activation)∗(feature value)
对训练样本t=1:m执行以下循环(下图中为i=1:m,但这个i和下面的角标i无关,有歧义,故改成t):
1. 令
a(1):=x(t)
2. 执行前向传播算法得到每层的激励值
a(l)
3. 根据
y(t)
,计算
δ(L)=a(L)−y(t)
4. 根据
δ(l)=(Θ(l))Tδ(l+1).∗a(l).∗(1−a(l))
,计算
δ(L−1),δ(L−2),...δ(2)
5. 累积偏导数项,
Δ(l)ij:=Δ(l)ij+a(l)jδ(l+1)i
. 向量化表示为
Δ(l):=Δ(l)+δ(l+1)(a(l))T
,它是偏导数矩阵
Step3: 计算
D(l)ij
写出完整的偏导数表达式
D(l)ij
注:图中有错,
D(l)ij:=1m(Δ(l)ij+λΘ(l)ij)
if j ≠0