转 神经网络

神经网络在解决一些复杂的非线性分类问题时,相对于线性回归、逻辑回归,都被证明是一个更好的算法。其实神经网络也可以看做的逻辑回归的组合(叠加,级联等)。

一个典型神经网络的模型如下图所示:

上述模型由3个部分组成:输入层、隐藏层、输出层。其中输入层输入特征值,输出层的输出作为我们分类的依据。例如一个20*20大小的手写数字图片的识别举例,那么输入层的输入便可以是20*20=400个像素点的像素值,即模型中的a1;输出层的输出便可以看做是该幅图片是0到9其中某个数字的概率。而隐藏层、输出层中的每个节点其实都可以看做是逻辑回归得到的。逻辑回归的模型可以看做这样(如下图所示):

有了神经网络的模型,我们的目的就是求解模型里边的参数theta,为此我们还需知道该模型的代价函数以及每一个节点的“梯度值”。

代价函数的定义如下:

代价函数关于每一个节点处theta的梯度可以用反向传播算法计算出来。反向传播算法的思想是由于我们无法直观的得到隐藏层的输出,但我们已知输出层的输出,通过反向传播,倒退其参数。

我们以以下模型举例,来说明反向传播的思路、过程:

该模型与给出的第一个模型不同的是,它具有两个隐藏层。

为了熟悉这个模型,我们需要先了解前向传播的过程,对于此模型,前向传播的过程如下:

其中,a1,z2等参数的意义可以参照本文给出的第一个神经网络模型,类比得出。

然后我们定义误差delta符号具有如下含义(之后推导梯度要用):

误差delta的计算过程如下:

然后我们通过反向传播算法求得节点的梯度,反向传播算法的过程如下:

有了代价函数与梯度函数,我们可以先用数值的方法检测我们的梯度结果。之后我们就可以像之前那样调用matlab的fminunc函数求得最优的theta参数。

需要注意的是,在初始化theta参数时,需要赋予theta随机值,而不能是固定为0或是什么,这就避免了训练之后,每个节点的参数都是一样的。

下面给出计算代价与梯度的代码:

[plain] view plaincopy

  1. function [J grad] = nnCostFunction(nn_params, ...
  2. input_layer_size, ...
  3. hidden_layer_size, ...
  4. num_labels, ...
  5. X, y, lambda)
  6. %NNCOSTFUNCTION Implements the neural network cost function for a two layer
  7. %neural network which performs classification
  8. %   [J grad] = NNCOSTFUNCTON(nn_params, hidden_layer_size, num_labels, ...
  9. %   X, y, lambda) computes the cost and gradient of the neural network. The
  10. %   parameters for the neural network are "unrolled" into the vector
  11. %   nn_params and need to be converted back into the weight matrices.
  12. %
  13. %   The returned parameter grad should be a "unrolled" vector of the
  14. %   partial derivatives of the neural network.
  15. %
  16. % Reshape nn_params back into the parameters Theta1 and Theta2, the weight matrices
  17. % for our 2 layer neural network
  18. Theta1 = reshape(nn_params(1:hidden_layer_size * (input_layer_size + 1)), ...
  19. hidden_layer_size, (input_layer_size + 1));
  20. Theta2 = reshape(nn_params((1 + (hidden_layer_size * (input_layer_size + 1))):end), ...
  21. num_labels, (hidden_layer_size + 1));
  22. % Setup some useful variables
  23. m = size(X, 1);
  24. % You need to return the following variables correctly
  25. J = 0;
  26. Theta1_grad = zeros(size(Theta1));
  27. Theta2_grad = zeros(size(Theta2));
  28. % ====================== YOUR CODE HERE ======================
  29. % Instructions: You should complete the code by working through the
  30. %               following parts.
  31. %
  32. % Part 1: Feedforward the neural network and return the cost in the
  33. %         variable J. After implementing Part 1, you can verify that your
  34. %         cost function computation is correct by verifying the cost
  35. %         computed in ex4.m
  36. %
  37. % Part 2: Implement the backpropagation algorithm to compute the gradients
  38. %         Theta1_grad and Theta2_grad. You should return the partial derivatives of
  39. %         the cost function with respect to Theta1 and Theta2 in Theta1_grad and
  40. %         Theta2_grad, respectively. After implementing Part 2, you can check
  41. %         that your implementation is correct by running checkNNGradients
  42. %
  43. %         Note: The vector y passed into the function is a vector of labels
  44. %               containing values from 1..K. You need to map this vector into a
  45. %               binary vector of 1‘s and 0‘s to be used with the neural network
  46. %               cost function.
  47. %
  48. %         Hint: We recommend implementing backpropagation using a for-loop
  49. %               over the training examples if you are implementing it for the
  50. %               first time.
  51. %
  52. % Part 3: Implement regularization with the cost function and gradients.
  53. %
  54. %         Hint: You can implement this around the code for
  55. %               backpropagation. That is, you can compute the gradients for
  56. %               the regularization separately and then add them to Theta1_grad
  57. %               and Theta2_grad from Part 2.
  58. %
  59. J_tmp=zeros(m,1);
  60. for i=1:m
  61. y_vec=zeros(num_labels,1);
  62. y_vec(y(i))=1;
  63. a1 = [ones(1, 1) X(i,:)]‘;
  64. z2=Theta1*a1;
  65. a2=sigmoid(z2);
  66. a2=[ones(1,size(a2,2)); a2];
  67. z3=Theta2*a2;
  68. a3=sigmoid(z3);
  69. hThetaX=a3;
  70. J_tmp(i)=sum(-y_vec.*log(hThetaX)-(1-y_vec).*log(1-hThetaX));
  71. end
  72. J=1/m*sum(J_tmp);
  73. J=J+lambda/(2*m)*(sum(sum(Theta1(:,2:end).^2))+sum(sum(Theta2(:,2:end).^2)));
  74. Delta1 = zeros( hidden_layer_size, (input_layer_size + 1));
  75. Delta2 = zeros( num_labels, (hidden_layer_size + 1));
  76. for t=1:m
  77. y_vec=zeros(num_labels,1);
  78. y_vec(y(t))=1;
  79. a1 = [1 X(t,:)]‘;
  80. z2=Theta1*a1;
  81. a2=sigmoid(z2);
  82. a2=[ones(1,size(a2,2)); a2];
  83. z3=Theta2*a2;
  84. a3=sigmoid(z3);
  85. delta_3=a3-y_vec;
  86. gz2=[0;sigmoidGradient(z2)];
  87. delta_2=Theta2‘*delta_3.*gz2;
  88. delta_2=delta_2(2:end);
  89. Delta2=Delta2+delta_3*a2‘;
  90. Delta1=Delta1+delta_2*a1‘;
  91. end
  92. Theta1_grad=1/m*Delta1;
  93. Theta2_grad=1/m*Delta2;
  94. Theta1(:,1)=0;
  95. Theta1_grad=Theta1_grad+lambda/m*Theta1;
  96. Theta2(:,1)=0;
  97. Theta2_grad=Theta2_grad+lambda/m*Theta2;
  98. % -------------------------------------------------------------
  99. % =========================================================================
  100. % Unroll gradients
  101. grad = [Theta1_grad(:) ; Theta2_grad(:)];
  102. end

最后总结一下,对于一个典型的神经网络,训练过程如下:

按照这个步骤,我们就可以求得神经网络的参数theta。

转载请注明出处:http://blog.csdn.net/u010278305

时间: 2024-10-09 23:04:32

转 神经网络的相关文章

Neural Networks and Deep Learning学习笔记ch1 - 神经网络

近期開始看一些深度学习的资料.想学习一下深度学习的基础知识.找到了一个比較好的tutorial,Neural Networks and Deep Learning,认真看完了之后觉得收获还是非常多的.从最主要的感知机開始讲起.到后来使用logistic函数作为激活函数的sigmoid neuron,和非常多其它如今深度学习中常使用的trick. 把深度学习的一个发展过程讲得非常清楚,并且还有非常多源代码和实验帮助理解.看完了整个tutorial后打算再又一次梳理一遍,来写点总结.以后再看其它资料

深度学习方法(十):卷积神经网络结构变化——Maxout Networks,Network In Network,Global Average Pooling

技术交流QQ群:433250724,欢迎对算法.技术感兴趣的同学加入. 最近接下来几篇博文会回到神经网络结构的讨论上来,前面我在"深度学习方法(五):卷积神经网络CNN经典模型整理Lenet,Alexnet,Googlenet,VGG,Deep Residual Learning"一文中介绍了经典的CNN网络结构模型,这些可以说已经是家喻户晓的网络结构,在那一文结尾,我提到"是时候动一动卷积计算的形式了",原因是很多工作证明了,在基本的CNN卷积计算模式之外,很多简

对抗神经网络(Adversarial Nets)的介绍[1]

对抗NN简介 概念介绍 对抗名字的由来及对抗过程 对抗NN的模型 对抗NN的模型和训练 判别网络D的最优值 模拟学习高斯分布 对抗NN实验结果 <生成对抗NN>代码的安装与运行 对抗网络相关论文 论文引用 一.对抗NN简介 大牛Ian J. Goodfellow 的2014年的<Generative Adversative Nets>第一次提出了对抗网络模型,短短两年的时间,这个模型在深度学习生成模型领域已经取得了不错的成果.论文提出了一个新的框架,可以利用对抗过程估计生成模型,相

第五章 神经网络

读书笔记 周志华老师的<机器学习> 因为边看边记,所以写在随笔里,如果涉及版权问题,请您联系我立马删除,[email protected] 5.1 神经元模型 “神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应.” 神经元模型:生物神经网络中,每个神经元与其他神经元相连,当它“兴奋”时,就会向相连的神经元发送化学物质,从而改变这些神经元内的电位:如果某神经元的电位超过了一个“阈值”,那么它就会被激活,即“兴奋”起来,向其他神经

中国首款嵌入式神经网络处理器发布

中国首款嵌入式神经网络处理器(NPU)芯片在北京正式发布,该芯片颠覆传统计算机架构,是由中星微“数字多媒体芯片技术”国家重点实验室研发,已于今年3月6日实现量产. 据介绍,有别于传统的冯诺依曼计算机架构,NPU采用了“数据驱动并行计算”架构,其具有低功耗的特点,擅长视频.图像类的多媒体数据处理,有助于人工智能在嵌入式机器视觉应用中稳定发挥. 中星微日前展示了型号为VC0758的国内首款NPU芯片产品,其内部集成了四个NPU内核,同时其还集成了[email protected]的SVAC国家标准音

Spark MLlib Deep Learning Convolution Neural Network (深度学习-卷积神经网络)3.1

3.Spark MLlib Deep Learning Convolution Neural Network (深度学习-卷积神经网络)3.1 http://blog.csdn.net/sunbow0 Spark MLlib Deep Learning工具箱,是根据现有深度学习教程<UFLDL教程>中的算法,在SparkMLlib中的实现.具体Spark MLlib Deep Learning(深度学习)目录结构: 第一章Neural Net(NN) 1.源码 2.源码解析 3.实例 第二章D

Spark MLlib Deep Learning Convolution Neural Network (深度学习-卷积神经网络)3.2

3.Spark MLlib Deep Learning Convolution Neural Network(深度学习-卷积神经网络)3.2 http://blog.csdn.net/sunbow0 第三章Convolution Neural Network (卷积神经网络) 2基础及源码解析 2.1 Convolution Neural Network卷积神经网络基础知识 1)基础知识: 自行google,百度,基础方面的非常多,随便看看就可以,只是很多没有把细节说得清楚和明白: 能把细节说清

Spark MLlib Deep Learning Convolution Neural Network (深度学习-卷积神经网络)3.3

3.Spark MLlib Deep Learning Convolution Neural Network(深度学习-卷积神经网络)3.3 http://blog.csdn.net/sunbow0 第三章Convolution Neural Network (卷积神经网络) 3实例 3.1 测试数据 按照上例数据,或者新建图片识别数据. 3.2 CNN实例 //2 测试数据 Logger.getRootLogger.setLevel(Level.WARN) valdata_path="/use

【原创】连“霍金”都想学习的“人工智能”---【自己动手写神经网络】小白入门连载开始了(1)

欢迎关注[自己动手写神经网络]的博客连载!!! 第1章 神经网络简介 神经网络这个词,相信大家都不陌生.就在你打开本书,并试图了解神经网络时,你已经在使用一个世界上最复杂的神经网络——你的大脑,一个由大约1000亿个神经元(每个单元拥有约1万个连接)构成的复杂系统.但人的大脑太过复杂,以至于科学家们到目前为止仍然无法准确解释大脑的工作原理和方式.但有幸的是,生物神经网络的最最基本的元素已经能够被识别,而这就构成了本书想为你介绍的人工神经网络(Artificial Neural Network).

CNN卷积神经网络新想法

最近一直在看卷积神经网络,想改进改进弄出点新东西来,看了好多论文,写了一篇综述,对深度学习中卷积神经网络有了一些新认识,和大家分享下. 其实卷积神经网络并不是一项新兴的算法,早在上世纪八十年代就已经被提出来,但当时硬件运算能力有限,所以当时只用来识别支票上的手写体数字,并且应用于实际.2006年深度学习的泰斗在<科学>上发表一篇文章,论证了深度结构在特征提取问题上的潜在实力,从而掀起了深度结构研究的浪潮,卷积神经网络作为一种已经存在的.有一定应用经验的深度结构,重新回到人们视线,此时硬件的运算