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,因此:

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

然后是隐藏层:

对于三层网络来说:

最后带入整合:

MachineLearning Exercise 4 :Neural Networks Learning的更多相关文章

  1. Andrew Ng机器学习 四:Neural Networks Learning

    背景:跟上一讲一样,识别手写数字,给一组数据集ex4data1.mat,,每个样例都为灰度化为20*20像素,也就是每个样例的维度为400,加载这组数据后,我们会有5000*400的矩阵X(5000个 ...

  2. 斯坦福大学公开课机器学习: neural networks learning - autonomous driving example(通过神经网络实现自动驾驶实例)

    使用神经网络来实现自动驾驶,也就是说使汽车通过学习来自己驾驶. 下图是通过神经网络学习实现自动驾驶的图例讲解: 左下角是汽车所看到的前方的路况图像.左上图,可以看到一条水平的菜单栏(数字4所指示方向) ...

  3. Machine Learning - 第5周(Neural Networks: Learning)

    The Neural Network is one of the most powerful learning algorithms (when a linear classifier doesn't ...

  4. (原创)Stanford Machine Learning (by Andrew NG) --- (week 5) Neural Networks Learning

    本栏目内容来自Andrew NG老师的公开课:https://class.coursera.org/ml/class/index 一般而言, 人工神经网络与经典计算方法相比并非优越, 只有当常规方法解 ...

  5. 【Deep Learning Nanodegree Foundation笔记】第 7 课:NEURAL NETWORKS Intro to Neural Networks

    In this lesson, you'll dive deeper into the intuition behind Logistic Regression and Neural Networks ...

  6. Stanford机器学习---第五讲. 神经网络的学习 Neural Networks learning

    原文 http://blog.csdn.net/abcjennifer/article/details/7758797 本栏目(Machine learning)包括单参数的线性回归.多参数的线性回归 ...

  7. Ng第九课:神经网络的学习(Neural Networks: Learning)

    9.1  代价函数 9.2  反向传播算法 9.3  反向传播算法的直观理解 9.4  实现注意:展开参数 9.5  梯度检验 9.6  随机初始化 9.7  综合起来 9.8  自主驾驶 9.1   ...

  8. 论文翻译:Neural Networks With Few Multiplications

    目录 Abstract 1. Introduction 2.Related Work 3.Binary And Ternary Connect 3.1 BINARY CONNECT REVISITED ...

  9. 斯坦福大学公开课机器学习:Neural Networks,representation: non-linear hypotheses(为什么需要做非线性分类器)

    如上图所示,如果用逻辑回归来解决这个问题,首先需要构造一个包含很多非线性项的逻辑回归函数g(x).这里g仍是s型函数(即 ).我们能让函数包含很多像这的多项式,当多项式足够多时,那么你也许能够得到可以 ...

随机推荐

  1. jmeter no-gui模式动态传递场景参数

    jmeter进行性能压测时,有时候需要在linux上no-gui模式下运行,为了在no-gui模式下更方便的设置脚本的运行的场景, 将脚本的线程数,运行时间设置为动态参数,可以在脚本运行时动态设置“线 ...

  2. ecCodes 学习 利用ecCodes Python API对GRIB文件进行读写

    参考 https://www.ecmwf.int/assets/elearning/eccodes/eccodes2/story_html5.htmlhttps://confluence.ecmwf. ...

  3. centos7搭建ANT+jmeter+jenkins接口测试自动化环境

    一.环境准备 因为用到了jmeter和apache-tomcat,centos7必须要有java环境,所以配置jdk和apache-tomcat什么的,就不多说了,自行操作 帮你们偷懒: ant下载地 ...

  4. spring cloud 入门系列八:使用spring cloud sleuth整合zipkin进行服务链路追踪

    好久没有写博客了,主要是最近有些忙,今天忙里偷闲来一篇. =======我是华丽的分割线========== 微服务架构是一种分布式架构,微服务系统按照业务划分服务单元,一个微服务往往会有很多个服务单 ...

  5. 1.0 JAVA基础核心概念

    JAVA基础知识 转载至:http://www.runoob.com/java/java-variable-types.html 对菜鸟教程进行核心整理: 一.JAVA理论概念 1.基础概念 Java ...

  6. 如何判断Map中的key或value是什么类型

    在上班写工具类时,遇到了一个问题,将xml文件的节点都放入map容器中时,map的value也是一个map,导致取map的value时,需要判断这个value的数据类型,用到了一下说的这些知识: 对于 ...

  7. Hyperledger Fabric CA User’s Guide——开始(三)

    Fabric CA User’s Guide——开始 先决条件 安装Go 1.9+ 设置正确的GOPATH环境变量 安装了libtool和libtdhl-dev包 下面是在Ubuntu上安装libto ...

  8. 【Docker】第五篇 Docker 数据管理

    一.基本介绍 数据管理的原因:Docker中的容器一旦删除,容器本身的rootfs文件系统就会被删除,容器中的所有数据就会被删除.为了对一些需要持久化的数据,不随容器删除而删除,所以我们可以通过多个容 ...

  9. 高可用OpenStack(Queen版)集群-12.Cinder计算节点

    参考文档: Install-guide:https://docs.openstack.org/install-guide/ OpenStack High Availability Guide:http ...

  10. Less 的用法

    1. node.js node.js是一个前端的框架 自带一个包管理工具npm node.js 的安装 官网:http://nodejs.cn/ 在命令行检验是否安装成功 切换到项目目录,初始化了一个 ...