nnCostFunction

消耗公式:

a1 = [ones(m,) X];
z2 = a1*Theta1';
pre = sigmoid(a1*Theta1');
a2 = [ones(m,) pre];
z3 = a2*Theta2';
a3 = sigmoid(z3); y_vec = zeros(m,num_labels);
for i=:m;
y_vec(i,y(i)) = ;
end for i=:m
J = J + y_vec(i,:)*log(a3(i,:)')+(1-y_vec(i,:))*log(1-a3(i,:))';
end
J = (-/m)*J; % add regularized
J = J + (lambda/(*m))*(sum(sum(Theta1(:,:end).^))+sum(sum(Theta2(:,:end).^))); % back
Delta1 = zeros(size(Theta1));
Delta2 = zeros(size(Theta2));
for i=:m,
delta3 = a3(i,:) - y_vec(i,:);
temp = (delta3*Theta2);
delta2 = temp(:,:end).*sigmoidGradient(z2(i,:)); Delta2 = Delta2 + delta3' * a2(i,:); Delta1 = Delta1 + delta2' * a1(i,:);
end; Theta2_grad = Delta2/m;
Theta1_grad = Delta1/m; Theta2_grad(:,:end) = Theta2_grad(:,:end) + lambda * Theta2(:,:end) / m;
Theta1_grad(:,:end) = Theta1_grad(:,:end) + lambda * Theta1(:,:end) / m;
  • 为了方便使用fminunc(),这里讲Theta1和Theta2展开组合成一个vector(nn_params=[Theta1(:);Theta2(:)]),在需要使用时使用reshape重构。
  • 初始化是,y是一个由0到9组成的向量,由于我们使用了sigmoid函数,需要将y转化成一个编码式的矩阵。
  • a1,a2,a3分别为各层激活值。
  • 对矩阵使用一次sum只是分别将行相加求和得到一个向量,因此在求消耗值时应该使用两次sum。
  • 没必要求delta1,因为第一层是我们的原始输入数据,不存在误差一说。

反向传播算法公式推导

反向传播算法的本质是利用链式求导法则,虽然神经网络求grad的公式一眼看不明白,但实质都是根据对 J 求导推导出来的,下面将给出一个大致的分析过程:

这是我们熟悉的cost函数,这里故意没有写求和符号,把各种角标丢掉,使公式清晰一些,而且也不影响推导过程。

我们假设有神经网络L层,那么对thetaL-1求导公式为:

上一层公式为:

从上边两个公式就可以看出,他们是有公共部分的,而这个公共部分就是我们的delta:

以此类推,之后的各层delta就有了:

把delta带入我们的求导公式中:

有了上面的解释,整个过程基本就比较明了了,让我们再仔细验证一番,首先从输出层开始,也就是练习的三层神经网络最后一层;

其中

然后我们将开头的cost函数变换为,对a(L)求导得:

由于a(L)=g(z),而g(z)就是我们的s函数,所以a(L)对z求导得:

这样就可以得到delta了:

终于,看到一丝曙光了,对于练习中的三层神经网络来说,delta3的值显而易见了:

z的值是theta*a,因此:

把上边的总结下,对于输出层,我们得到:

然后是隐藏层:

对于三层网络来说:

最后带入整合:

最新文章

  1. 一种简单,轻量,灵活的C#对象转Json对象的方案(续)
  2. jsp的 javascript中 嵌套 html 注释
  3. ionic实现双击返回键退出功能
  4. RAID磁盘阵列的搭建(以raid0、raid1、raid5、raid10为例)
  5. cmd中无法运行svn命令
  6. hdfs: 数据流(二)
  7. 20160406javaweb 之JDBC简单案例
  8. (转载)linux中shell变量
  9. oracle 的 startup,startup mount,startup nomount之间的区别
  10. [Git] MAC上Git初探
  11. php各类hash算法长度及性能
  12. Java实现定时任务的三种方法(转)
  13. Visual Studio 实用技能
  14. java虚拟机 jvm java堆 方法区 java栈
  15. 《T-SQL查询》读书笔记Part 2.执行计划
  16. 【黑客免杀攻防】读书笔记5 - PE格式讲解
  17. 合并两个sorted ranges(merge和inplace_merge)
  18. cnpm安装
  19. 2017-12 CDQZ集训(已完结)
  20. solr的基本使用

热门文章

  1. 2018年美国大学生数学建模竞赛(MCM/ICM) D题解题思路
  2. jenkins 多任务串行执行
  3. 《图解 HTTP 》阅读 —— 第一章
  4. PHPCMS增加SEO字段调用
  5. kubeadm 线上集群部署(二) K8S Master集群安装以及工作节点的部署
  6. MFC -- Excel操作简介(基于VS2010)
  7. Ubuntu16.04安装搜狗拼音输入法
  8. 互评Beta版本——杨老师粉丝群——Pinball
  9. Classifier
  10. iOS开发学习-如何优化tableview的使用