Toggle navigation
Yang's Blog
主页
week 9
Machine Learning
week 2
week 3
week 4
week 5
week 6
week 7
week 8
week 10
End_to_End_Learning
About Me
归档
标签
week 5
0
无
2023-07-12 08:04:09
2
0
hljyy96@126.com
1.neural network:cost function 首先引入一些新的标记法:假设神经网络的training Sample有m个,每个包含一组输入x和对应的一组输出y,L表示神经网络的层数,$S_l$表示第l层的neuron的个数,$S_L$表示输出层中处理的单元数。 神经网络分为2类,即单分类神经网络和多分类神经网络,其中单分类神经网络的输出只有0或1,即$S_L=1,y=0 or 1$,而多分类神经网络的输出有多种,即$S_L=k,y_i=1$表示分到哪一类中(k>2),如下图所示: ![](https://leanote.com/api/file/getImage?fileId=64adee07ab6441793d8233c8) ![](https://leanote.com/api/file/getImage?fileId=64adee07ab6441793d8233c5) 在逻辑回归中我们的代价函数为: ![](https://leanote.com/api/file/getImage?fileId=64adee07ab6441793d8233c9) 虽然神经网络算法与逻辑回归类似,但是由于逻辑回归中只有一种分类,也就是只有一个输出 scalar,所以在神经网络中的代价方程会比逻辑回归中复杂一些,方程如下: ![](https://leanote.com/api/file/getImage?fileId=64adee07ab6441793d8233cd) 在正则化余项中i是从1开始的,排除了每一层的$\theta_0$,将剩下的矩阵内对应的位置取和,实质上就是$h_\theta(x)$与真实值的差加和,对参数进行正则化的bias unit处理的所有参数的平方和。 2.back-propagation algorithm 之前我们在计算神经网络的输出结果时采用了一种逐层传输的propagation algorithm,一直到最后的$h_\theta(x)$,在这里为了计算代价函数的偏导数$\mathrm {\frac {d} {d\theta^l_{ij}}J(\theta)}$,我们需要采取一种反向的传播算法,先计算最后一层的误差,再逐层向前传递至第二层,下面采用一个例子来说明这种算法: 假设training set中只有一个sample,($x^{(i)}$,$y^{(i)}$),神经网络是一个4层的神经网络,即k=4,$s_L$=4,L=4。 forward propagation: ![](https://leanote.com/api/file/getImage?fileId=64adee07ab6441793d8233cc) 依据已有的向前传播算法得到的拟合结果,我们利用向后传播算法计算误差,首先从最后一层开始,误差是activation unit与实际值y之间的差值,我们用$\delta$来表示,则$\delta^{(4)}=a^{(4)}-y$,我们利用这个得到的误差来计算前一层的误差:$\delta^{(3)}=(\Theta)^T \delta^{(4)}.*g'(z^{(3)})$ 其中$g'(z^{(3)})=a^{(3)}.*(1-a^{(3)})$,而$\Theta^T \delta^{(4)}$是权重导致的误差的和,依次继续计算第二层的误差:$\delta^{(2)}=(\Theta)^T \delta^{(3)}.*g'(z^{(2)})$,由于第一层是输入层不存在误差,所以不用处理,在我们得到所有误差的表达式后就可以计算代价函数的偏导数了,假设$\lambda=0$,即我们不做任何正则化处理时有:$\mathrm {\frac {d} {d\theta^l_{ij}}J(\theta)}=a_j^{(l)}\delta_i^{l+1}$ 上述式子的下标含义如下: j代表当前计算层中的activation unit的下标,也就是下一层的第j个输入变量的下标,i代表下一层的error unit的下标,也就是收到权重矩阵第i层影响的下一层的error unit的下标。 我们要为整个training set计算error unit,其在实质上也是一个矩阵,我们用$\Delta_{ij}^l$表示,即第l层的第i个activation unit受到第j个参数影响产生的误差,算法表示如下: ![](https://leanote.com/api/file/getImage?fileId=64adee07ab6441793d8233ca) 即首先利用forward propagation求出每一层的activation unit,再利用training set与神经网络拟合后的结果的差值求出最后一层的误差,然后利用该误差,采用back propagation反向求出传播至第二层的所有误差。 在求出了$\Delta_{ij}^l$之后我们就可以计算代价函数的偏导数了,方法如下: $$ D_{ij} ^{(l)}:=\frac 1 m\Delta _{ij}^{(l)}+\lambda \theta_{ij}^{(l)} if j\ne0 $$ $$D_{ij} ^{(l)}:=\frac 1 m\Delta _{ij}^{(l)} if j=0 $$ 3.backpropagation intuition 关于反向传播算法,要在得到正向传播的结果之后才能执行,所以假设现有正向传播算法如下: ![](https://leanote.com/api/file/getImage?fileId=64adee07ab6441793d8233c3) 如图,假设第一层hidden layer中的3个神经元指向第二层hidden layer的第二个神经元的权重分别为$\Theta _{10}^{(2)} ,\Theta _{11}^{(2)} ,\Theta _{12}^{(2)}$,则$z^{(3)}_1=\Theta _{10}^{(2)}*1+\Theta _{11}^{(2)}*a^{(2)} _1+\Theta _{12}^{(2)}*a^{(2)} _2$。 那么反向传播算法的目的就是求出代价函数的偏导数,在一定程度上避免和减少重复的计算: ![](https://leanote.com/api/file/getImage?fileId=64adee07ab6441793d8233c6) 假设我们要求$\delta^{(2)}_2$,首先利用output layer,求出$\delta^{(4)}_1=y^{(i)}-a^{(4)}_1$,接着反向推倒,$\delta ^{(3)}_1=\Theta^{(3)}_{11}*\delta^{(4)}_1$,$\delta ^{(3)}_2=\Theta^{(3)}_{12}*\delta^{(4)}_1$,以此类推,$\delta^{(2)}_2=\Theta^{(2)}_{12}*\delta^{(3)}_1+\Theta^{(2)}_{22}*\delta^{(3)}_2$ 这就是反向传播算法的直观理解 4.gradient checking 当我们对一个较为复杂的神经网络采用梯度下降算法优化时,虽然在直观上cost确实一直在下降,但是可能出现一些我们发现不了的错误,导致最终的情况并不是最优解,所以在这里我们可以采用gradient checking来检查是否存在这个问题。 我们要做的就是对梯度进行估计,以确定算法确实沿着最优的路线进行梯度下降,而梯度的近似值可以采用两个距离十分近的点所构成的直线的斜率来近似表示(当两个点无限接近的时候就是该点的斜率/偏导),如下图所示: ![](https://leanote.com/api/file/getImage?fileId=64adee07ab6441793d8233cb) 我们在曲线上取一点$\theta$,并且在它的左边和右边同时取2点,距离该点为$\epsilon $,通常我们取$\epsilon $为$10^{-4}$,在octave中的代码如下: gradApprox=(J($\theta$+eps)-J(theta-eps))/(2*eps) 当$\theta$为一个向量时,我们要对偏导进行检验,方法是对向量中对应位置的$\theta$进行检验,以$\theta_1$为例: ![](https://leanote.com/api/file/getImage?fileId=64adee07ab6441793d8233c7) 最后我们还要采用反向传播对偏导数进行检验,将得到的数据存储到一个矩阵中,并与最终的$D$矩阵进行比较以确定梯度下降是否合理。 octave中的代码如下所示: for 1:n thetaPlus=theta; thetaPlus(i)=thetaPlus(i)+epsilon; thetaMinus=theta; thetaMinus(i)=thetaMinus(i)-epsilon; gradApprox=(J(thetaPlus)-theta(thetaMinus))/(2*epsilon); end; 最后检查gradApprox是否近似等于Dvec即可。 5.random initialization 在参数或权重的初始化方面,和logistic regression不同的是,我们不能采用全0或者全是相同数字的方法来初始化神经网络,因为这样的话在hidden layer中我们得到的值会是对应相同的,经过接下来的计算,由于权重始终是相同的,所以最终得到的值也会是相同的,无法很好地拟合数据。所以我们通常采用权重为$-\epsilon 到 +\epsilon$的随机数来初始化权重或参数。假设我们要初始化一个10*11的参数矩阵,在octave中的代码如下: Theta1=rand(10,11)*2(eps)-eps 6.putting it together 总结一下使用神经网络算法时采用的步骤: 首先就是要选择一个合适的神经网络模型,一般来说我们只需要采用一层hidden layer,这一层中的单元数一般略大于input layer中的单元数,当然这一层的单元数越多越好。我们也可以采用中间层多于1层的方式,但是所有的hidden layer中的单元数要保持一致。最后的output layer的单元数与我们要得到的特征数是一致的。 下面为计算步骤: ① 参数的随机初始化 ② 利用正向传播算法求出所有的$h_\theta(x)$ ③ 编写计算代价函数的代码 ④ 利用反向传播算法计算全部的偏导数 ⑤ 利用梯度检验法校验所求出的偏导数 ⑥ 使用高级的优化算法,如fminuc,来优化和寻找最小的代价函数
e2e
week 7
0
赞
2 人读过
新浪微博
微信
更多分享
腾讯微博
QQ空间
人人网
提交评论
立即登录
, 发表评论.
没有帐号?
立即注册
0
条评论
More...
文档导航