写在前面的

接触神经网络(ANN)的时间很长了,以前也只是学了学原理,做过一个BPN的练习,没有系统的总结过,最近看Torch的源码,对MLP有了更多的了解,写写自己学到的东西吧,算是做了一次总结!

ANN的特点

(1) 高度的并行性

人工神经网络是由许多相同的简单处理单元并联组合而成,虽然每个单元的功能简单,但大量简单单元的并行活动,使其对信息的处理能力与效果惊人。

(2) 高度的非线性全局作用

神经网络系统是由大量简单神经元构成的,每个神经元接受大量其他神经元的输入,通过非线性输入、输出关系,产生输出影响其它神经元。网络就是这样互相制约相互影响,实现从输入状态空间到输出状态空间非线性映射的。网络的演化遵从全局性作用原则,从输入状态演化到终态而输出。从全局观点来看,网络整体性能不是网络局部性能的简单迭加,而表现某种集体性行为;而电脑遵从串行式局域性操作原则,每一步计算与上一步计算紧密相关,并对下一步产生影响,问题是通过算法逐步进行处理的。

(3) 良好的容错性与联想记忆功能

人工神经网络通过自身的网络结构能够实现对信息的记忆,而所记忆的信息是存储在神经元之间的权值中。从单个权值中看不出所储存的信息内容,因而是分布式的存储方式。这使得网络具有良好的容错性,并能进行聚类分析、特征提取、缺损模式复原等模式信息处理工作。

十分强的自适应、自学习功能人工神经网络可以通过训练和学习来获得网络的权值与结构,呈现出很强的自学习能力和对环境的自适应能力。

ANN分类

BPN(Back Propagation Net)

在这里我介绍一下反向传播网络BPN---带动量项的误差反传。反向传播神经网络是对非线性可微分函数进行权值训练的多层网络,是前向神经网络的一种。BP网络主要用于:

1)函数逼近与预测分析:用输入矢量和相应的输出矢量训练一个网络,逼近一个函数或预测未知信息;

2)模式识别:用一个特定的输出矢量将它与输入矢量联系起来;

3)分类:把输入矢量以所定义的合适方式进行分类;

4)数据压缩:减少输出矢量维数以便于传输与存储。

比如,一个三层BPN结构如下:

由输入层、隐含层和输出层三层组成。其中每一层的单元与与之相邻层的所有单元连接,同一层的单元之间没有连接。当一对学习样本提供给网络后,神经元的激活值从输入层经各中间层向输出层传播,在输出层的各神经元获得网络的输入响应。接下来,按照减少目标输出与实际误差的方向,从输出层经过各中间层逐层修正各连接权值,最后回到输入层。

感知器(Perception)类型

linear----线性感知器

tanh----双曲正切函数

sigmoid----双曲函数

softmax----1/(e(net) * e(wi*xi- shift))

log-softmax---- log(1/(e(net) * e(wi*xi)))

exp----指数函数

softplus----log(1+ e(wi*xi))

梯度下降

Delta学习方法

增量梯度下降

MLP的缺陷

1.网络的隐含节点个数选取问题至今仍是一个 世界难题(Google, Elsevier, CNKI);

2.停止阈值、学习率、动量常数需要采用”trial-and-error”法,极其耗时(动手实验);

3.学习速度慢;

4.容易陷入局部极值,学习不够充分。

应用举例

举一个例子,是用BPN实现下面的问题,编程语言使用的是C#。
  1. static void Main(string[] args)
  2. {
  3. int row = 2;//训练样例的数目
  4. int n_in = 2;//输入值的个数
  5. int n_out = 1;//输出值的个数
  6. int n_hidden = 1;//隐含层单元个个数
  7. double eta = 0.3;//学习速率
  8. double alfa = 0.9;//动量项
  9. int [,] t_ex = new int[row,n_in + n_out];//训练样例
  10. //赋初值 训练样例
  11. t_ex[0, 0] = 1;
  12. t_ex[0, 1] = 0;
  13. t_ex[0, 2] = 1;
  14. t_ex[1, 0] = 0;
  15. t_ex[1, 1] = 1;
  16. t_ex[1, 2] = 0;
  17. double[] Delta_Out = new double[n_out];//输出单元误差
  18. double[] Delta_Hidden = new double[n_hidden];//隐藏单元误差
  19. double[] O_Out = new double[n_out];//输出单元的输出
  20. double[] O_Hidden = new double[n_hidden];//隐含单元的输出
  21. double[,] W_Out = new double[n_out,n_hidden + 1];//输出单元的权值
  22. double[,] W_Hidden = new double[n_hidden,n_in + 1];//隐含单元的权值
  23. double[,] Delta_W_Out = new double[n_out,n_hidden + 1];//输出单元的权值差
  24. double[,] Delta_W_Hidden = new double[n_hidden,n_in + 1];//隐含单元的权值差
  25. //初始化所有网络权值为0.1
  26. for (int i = 0; i < n_out;i++ )
  27. {
  28. for (int j = 0;j < n_hidden + 1;j++)
  29. {
  30. W_Out[i,j] = 0.1;
  31. Delta_W_Out[i,j] = 0;
  32. }
  33. }
  34. for (int i = 0; i < n_hidden; i++)
  35. {
  36. for (int j = 0; j < n_in + 1;j++ )
  37. {
  38. W_Hidden[i,j] = 0.1;
  39. Delta_W_Hidden[i,j] = 0;
  40. }
  41. }
  42. //迭代进行训练
  43. bool over = true;
  44. int itera_time = 0;//迭代次数
  45. while (over)
  46. {
  47. //进行训练
  48. for (int i = 0; i < row;i++ )
  49. {
  50. //计算隐含层单元的输出
  51. double net = 0;
  52. for (int j = 0; j < n_hidden; j++)
  53. {
  54. net = W_Hidden[j, 0];
  55. //计算输出值
  56. for (int r = 1; r < n_in + 1; r++)
  57. {
  58. net += W_Hidden[j, r] * t_ex[i, r - 1];
  59. }
  60. O_Hidden[j] = 1.0 / (1 + Math.Exp(-net));
  61. }
  62. //计算输出层单元的输出
  63. for (int j = 0; j < n_out;j++ )
  64. {
  65. net = W_Out[j,0];
  66. for (int r = 1; r < n_hidden + 1;r++ )
  67. {
  68. net += W_Out[j,r] * O_Hidden[r - 1];
  69. }
  70. O_Out[j] = 1.0 / (1 + Math.Exp(-net));
  71. }
  72. //计算输出层单元的误差项
  73. for (int j = 0; j < n_out;j++ )
  74. {
  75. Delta_Out[j] = O_Out[j] * (1 - O_Out[j]) * (t_ex[i,n_in + j] - O_Out[j]);
  76. }
  77. //计算隐含层单元的误差项
  78. for (int j = 0;j < n_hidden;j++)
  79. {
  80. double sum_weight = 0;
  81. for (int k = 0;k < n_out;k++)
  82. {
  83. for (int h = 0;h < n_hidden + 1;h++)
  84. {
  85. sum_weight += Delta_Out[k] * W_Out[k,h];
  86. }
  87. }
  88. Delta_Hidden[j] = O_Hidden[j] * (1 - O_Hidden[j]) * sum_weight;
  89. }
  90. //更新每个网络单元的权值
  91. //更新输出层的权值
  92. for (int j = 0;j < n_out;j++)
  93. {
  94. Delta_W_Out[j, 0] = eta * Delta_Out[j] + alfa * Delta_W_Out[j, 0];
  95. W_Out[j, 0] = W_Out[j, 0] + Delta_W_Out[j, 0];
  96. for (int k = 1; k < n_hidden + 1;k++ )
  97. {
  98. Delta_W_Out[j, k] = eta * Delta_Out[j] * O_Hidden[k - 1] + alfa * Delta_W_Out[j, k];
  99. W_Out[j, k] = W_Out[j, k] + Delta_W_Out[j, k];
  100. }
  101. }
  102. //更新隐含层的权值
  103. for (int j = 0; j < n_hidden; j++)
  104. {
  105. Delta_W_Hidden[j, 0] = eta * Delta_Hidden[j] + alfa * Delta_W_Hidden[j, 0];
  106. W_Hidden[j, 0] = W_Hidden[j, 0] + Delta_W_Hidden[j, 0];
  107. for (int k = 1; k < n_in + 1;k++ )
  108. {
  109. Delta_W_Hidden[j, k] = eta * Delta_Hidden[j] * t_ex[i, k - 1] + alfa * Delta_W_Hidden[j, k];
  110. W_Hidden[j, k] = W_Hidden[j, k] + Delta_W_Hidden[j, k];
  111. }
  112. }
  113. }
  114. //训练1000次结束循环
  115. itera_time++;
  116. if (itera_time == 1000)over = false;
  117. }
  118. //输出训练后的权值
  119. Console.WriteLine("输出层权值:");
  120. for (int i = 0; i < n_out; i++)
  121. {
  122. for (int j = 0; j < n_hidden + 1;j++ )
  123. {
  124. Console.WriteLine(W_Out[i,j]);
  125. }
  126. }
  127. Console.WriteLine("隐含层权值:");
  128. for (int i = 0; i < n_hidden; i++)
  129. {
  130. for (int j = 0; j < n_in + 1;j++ )
  131. {
  132. Console.WriteLine(W_Hidden[i,j]);
  133. }
  134. }
  135. }
  136. }

原文:http://blog.csdn.net/cxf7394373/article/details/6061372

MLP(多层神经网络)介绍的更多相关文章

  1. 多层神经网络BP算法 原理及推导

    首先什么是人工神经网络?简单来说就是将单个感知器作为一个神经网络节点,然后用此类节点组成一个层次网络结构,我们称此网络即为人工神经网络(本人自己的理解).当网络的层次大于等于3层(输入层+隐藏层(大于 ...

  2. TensorFlow 训练MNIST数据集(2)—— 多层神经网络

    在我的上一篇随笔中,采用了单层神经网络来对MNIST进行训练,在测试集中只有约90%的正确率.这次换一种神经网络(多层神经网络)来进行训练和测试. 1.获取MNIST数据 MNIST数据集只要一行代码 ...

  3. 用Tensorflow实现多层神经网络

    用Tensorflow实现多层神经网络 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 Tensorflow机器学习实战指南 源代码请点击下方链接欢迎加星 ReLU激活函数/L1范数 ...

  4. Spark2.0机器学习系列之7: MLPC(多层神经网络)

    Spark2.0 MLPC(多层神经网络分类器)算法概述 MultilayerPerceptronClassifier(MLPC)这是一个基于前馈神经网络的分类器,它是一种在输入层与输出层之间含有一层 ...

  5. ufldl学习笔记与编程作业:Multi-Layer Neural Network(多层神经网络+识别手写体编程)

    ufldl学习笔记与编程作业:Multi-Layer Neural Network(多层神经网络+识别手写体编程) ufldl出了新教程,感觉比之前的好,从基础讲起,系统清晰,又有编程实践. 在dee ...

  6. MLPclassifier,MLP 多层感知器的的缩写(Multi-layer Perceptron)

    先看代码(sklearn的示例代码): from sklearn.neural_network import MLPClassifier X = [[0., 0.], [1., 1.]] y = [0 ...

  7. (转)LSTM神经网络介绍

    原文链接:http://www.atyun.com/16821.html 扩展阅读: https://machinelearningmastery.com/time-series-prediction ...

  8. YJango的卷积神经网络——介绍

    原文地址:https://zhuanlan.zhihu.com/p/27642620 如果要提出一个新的神经网络结构,首先就需要引入像循环神经网络中“时间共享”这样的先验知识,降低学习所需要的训练数据 ...

  9. 【TensorFlow入门完全指南】神经网络篇·MLP多层感知机

    前面的不做过多解释了. 这里定义了两个占位符,各位也知道,在训练时,feed_dict会填充它们. 定义相关网络. 这里是权值矩阵和偏差. 这里是实例化了网络,定义了优化器和损失,和上一篇一样. 最后 ...

随机推荐

  1. 修改一些IntelliJ IDEA 11的设置,使Eclipse的使用者更容易上手(转)

    用惯了Eclipse,再来使用IntelliJ IDEA真是很难适应. 设置1:字体 修改IDE的字体:设置-Appearance-Look and Feel-OverRide设置你想要的字体.我设置 ...

  2. node.js中的事件循环机制

    http://www.cnblogs.com/dolphinX/p/3475090.html

  3. JZOJ.5236【NOIP2017模拟8.7】利普希茨

    Description

  4. JavaScript进阶之路 初学者的开始

    一:写在前面的问题和话 一个javascript初学者的进阶之路! 背景:3年后端(ASP.NET)工作经验,javascript水平一般般,前端水平一般般.学习资料:犀牛书. 如有误导,或者错误的地 ...

  5. 【BZOJ3522】[Poi2014]Hotel 树形DP

    [BZOJ3522][Poi2014]Hotel Description 有一个树形结构的宾馆,n个房间,n-1条无向边,每条边的长度相同,任意两个房间可以相互到达.吉丽要给他的三个妹子各开(一个)房 ...

  6. 解决phantomjs输出中文乱码

    解决phantomjs输出中文乱码,可以在js文件里添加如下语句: phantom.outputEncoding="gb2312"; // 解决输出乱码

  7. Powershell About Active Directory Server

    一.获取域控制器服务器清单 (Get-ADForest).Domains | %{ Get-ADDomainController -Filter * -Server $_ } | select hos ...

  8. java获取地址全路径

      String basePath = request.getScheme()+"://"+request.getServerName()+":"+reques ...

  9. 常用的SQLalchemy 字段类型

    https://blog.csdn.net/weixin_41896508/article/details/80772238 常用的SQLAlchemy字段类型 类型名 python中类型 说明 In ...

  10. 用jq实现鼠标移入按钮背景渐变其他的背景效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...