简书博客地址:https://www.jianshu.com/p/388bbb5e0245

入门

首先,先简单的讲解一下神经网络。
我们从构建超级简单的机器开始。有一台基本的机器,接受了一个问题,做了一些“思考”,并输出了一个答案。就像我们从眼睛输入图片,使用大脑分析场景,并得出在场景中有哪些物体的结论。

试想一下将千米转化为英里的一台机器,如下图所示。我们所知道的就是,两者之间的关系是线性的。这意味着,如果英里数加倍,那么表示相同距离的千米数也是加倍的。千米和英里之间的这种线性关系,为我们提供了这种神秘计算的线索,即它的形式应该是“英里=千米×C”,其中C为常数。现在,我们还不知道这个常数C是多少。

首先,我们从尝试使用C=0.5,带入机器计算出结果。

结果比实际值少了12.137。这是计算结果与我们列出的示例真实值之间的差值,是误差。即:
误差值=真实值-计算值
=62.137-50
=12.137

让我们将C从0.5稍微增加到0.6,再次进行计算。
现在,由于将C设置为0.6,我们得到了英里=千米×C=100×0.6=60,这个答案比先前50的答案更好。我们取得了明显的进步。

让我们再次重复这个过程。输出值60还是太小了。我们再次微调C,将其从0.6调到0.7。结果超过了已知的正确答案。先前的误差值为2.137,现在的误差值为-7.863。我们为什么不使用一个较小的量,微调C,将C从0.6调到0.61呢?

这比先前得到的答案要好得多。我们得到输出值61,比起正确答案62.137,这只差了1.137。
因此,最后的这次尝试告诉我们,应该适度调整C值。如果输出值越来越接近正确答案,即误差值越来越小,那么我们就不要做那么大的调整。使用这种方式,我们就可以避免像先前那样得到超调的结果。

再换个例子,简单分析一下,比如我们希望训练线性分类器,使其能够正确分类瓢虫或毛虫。下图并不能准确的区分瓢虫和毛虫。

我们尝试修改直线的斜率,这样我们就可以精确的区分出这两种小虫。那如何使用公式进行表达呢?

回顾一下,在千米转换为英里预测器的实例中,我们有一个调整了参数的线性函数。此处,由于分界线是一条直线,因此我们也可以进行相同的处理:
y=Ax
由于严格来说,此处的直线不是一台预测器,因此我们有意使用名称y和x,而不使用名称长度和宽度。与先前我们将千米转换为英里不一样,这条直线不将宽度转换为长度。相反,它是一条分界线,是一台分类器。
同样,我们也可以采用之前的方法,根据误差来对直线进行调整,对此不再赘述。

神经网络介绍

前面简单的介绍了线性分类器,下面开始正式介绍神经网络。神经网络是机器学习中的一种模型,是一种模仿动物神经网络行为特征,进行分布式并行信息处理的算法数学模型。这种网络依靠系统的复杂程度,通过调整内部大量节点之间相互连接的关系,从而达到处理信息的目的。下图就是一个简单的神经网络。

神经元

神经元是神经网络中最基本的结构,也可以说是神经网络的基本单元,它的设计灵感完全来源于生物学上神经元的信息传播机制。我们学过生物的同学都知道,神经元有两种状态:兴奋和抑制。一般情况下,大多数的神经元是处于抑制状态,但是一旦某个神经元收到刺激,导致它的电位超过一个阈值,那么这个神经元就会被激活,处于“兴奋”状态,进而向其他的神经元传播化学物质(其实就是信息)。神经元是神经网络中最基本的结构,也可以说是神经网络的基本单元,它的设计灵感完全来源于生物学上神经元的信息传播机制。我们学过生物的同学都知道,神经元有两种状态:兴奋和抑制。一般情况下,大多数的神经元是处于抑制状态,但是一旦某个神经元收到刺激,导致它的电位超过一个阈值,那么这个神经元就会被激活,处于“兴奋”状态,进而向其他的神经元传播化学物质(其实就是信息)。

神经元的输出需要使用激活函数,我们更常用的方法是用sigmoid函数来表示激活函数。sigmoid函数的表达式和分布图如下所示:

(现在通常使用的是ReLU,人们起初并不觉得它的效果会好过 sigmoid 和 tanh。但是,实战中它确实做到了。)

前向传播

神经网络是一种多层的前馈神经网络,其主要的特点是:信号是前向传播的,而误差是反向传播的。
假设从左面一层结点i,j,k,…等一些结点与本层的结点w有连接,那么结点w的值怎么算呢?就是通过上一层的i,j,k等结点以及对应的连接权值进行加权和运算,最终结果再加上一个偏置项,最后在通过一个非线性函数(即激活函数),如ReLu,sigmoid等函数,最后得到的结果就是本层结点w的输出。
最终不断的通过这种方法一层层的运算,得到输出层结果。

矢量化

先前,我们手工对两层、每一层只有两节点的神经网络进行计算。对人类而言,这样的工作量也是足够大了,但是如果要对五层、每层100个节点的网络进行相同的计算,单单是写下所有必要的计算,也是一个艰巨的任务……对每一层每一个节点,计算所有这些组合信号的组合,乘以正确的权重,应用S激活函数……
那么,矩阵如何帮助我们简化计算呢?其实,矩阵在两个方面帮助了我们。首先,矩阵允许我们压缩所有这些计算,把它们变成一种非常简单的缩写形式。由于人类不擅长于做大量枯燥的工作,而且也很容易出错,因此矩阵对人类帮助很大。第二个好处是,许多计算机编程语言理解如何与矩阵一起工作,计算机编程语言能够认识到实际的工作是重复性的,因此能够高效高速地进行计算。
总之,矩阵允许我们简洁、方便地表示我们所需的工作,同时计算机可以快速高效地完成计算。

神经网络中的误差

先前,我们通过调整节点线性函数的斜率参数,来调整简单的线性分类器。我们使用误差值,也就是节点生成了答案与所知正确答案之间的差值,引导我们进行调整。实践证明,误差与所必须进行的斜率调整量之间的关系非常简单,调整过程非常容易。
当输出和误差是多个节点共同作用的结果时,我们如何更新链接权重呢?下图详细阐释了这个问题。

反向传播

神经网络的运作过程如下。

  1. 确定输入和输出
  2. 找到一种或多种算法,可以从输入得到输出
  3. 找到一组已知答案的数据集,用来训练模型,估算w和b
  4. 一旦新的数据产生,输入模型,就可以得到结果,同时对w和b进行校正

通过反向传播把误差传播到每一层,但是怎么调整权重w
使用数学公式计算,解数学方程特别复杂
暴力枚举,当数据量过大时不可行
这时就需要使用梯度下降

梯度下降

简单的公式计算如下:

## 深度学习

深度学习(DeepLearning)的概念由Hinton等人于2006年提出。此外Lecun等人提出的卷积神经网络是第一个真正多层结构学习算法,它利用空间相对关系减少参数数目以提高训练性能。深度学习(DL)是机器学习中一种基于对数据进行表征学习的方法,是一种能够模拟出人脑的神经结构的机器学习方法。(PS:两位大牛因为对深度学习的巨大贡献,因此获得2018年图灵奖)

说白了就是,深度学习就是深层的神经网络,比上面介绍的三层神经网络要复杂的多。

深度学习研究的热潮持续高涨,各种开源深度学习框架也层出不穷,其中包括TensorFlow、Caffe、Keras、CNTK、Torch7、MXNet、Leaf、Theano、DeepLearning4、Lasagne、Neon,等等。但是上图所示的简单的三层神经网络不需要使用任何深度学习框架,可以通过简单的 Python 代码就可以实现,下面主要讲一下实现过程。

Python实现

激动人心的时刻到了,下面直接使用Python代码,实现简单的神经网络。代码的主要框架如下:


# neural network class definition      class neuralNetwork :     # initialise the neural network     def __init__() :     pass       # train the neural network          def train() :     pass      # query the neural network      def query() :   pass

· 初始化函数—设定输入层节点、隐藏层节点和输出层节点的数量。

· 训练—学习给定训练集样本后,优化权重。

· 查询—给定输入,从输出节点给出答案。

实现的内容为识别mnist库中的手写数字,完整的代码如下:

https://github.com/makeyourownneuralnetwork/makeyourownneuralnetwork

可以查看 part2_neural_network.ipynb ,如果想训练自己手写的图片,可以看part3部分的代码,另外为了增加数据集,也可以对mnist中的图片进行旋转等操作。

向后查询

最后做个有意思的事情,在通常情况下,我们馈送给已受训练的神经网络一个问题,神经网络弹出一个答案。在我们的例子中,这个问题是人类的手写数字图像。答案是表示数字0到9中的某个标签。

如果将这种方式反转,向后操作,会发生什么呢?如果馈送一个标签到输出节点,通过已受训练的网络反向输入信号,直到输入节点弹出一个图像,那会怎么样?下图显示了正常的正向查询和疯狂的反向向后查询的想法。

逻辑S函数接受了任何数值,输出0和1之间的某个值,但是不包括0和1本身。逆函数必须接受相同的范围0和1之间的某个值,不包括0和1,弹出任何正值或负值。为了实现这一目标,我们将输入层重新调整到有效范围,选择的范围为0.01至0.99。

标签0的结果,从图中可以隐约的看到数字0

上图表示了从0-9的结果,是不是有点理解神经网络了呢?

主要参考《python神经网络编程》,感谢作者的讲解。

自己动手从零搭建神经网络相关推荐

  1. 由浅入深搭建神经网络

    一.从零搭建神经网络 1.利用numpy来搭建网络模型 import numpy as np import torch""" 热身: 用numpy实现两层神经网络 一个全 ...

  2. 深度学习笔记:利用numpy从零搭建一个神经网络

    很多人说深度学习就是个黑箱子,把图像预处理之后丢进 tensorflow 就能出来预测结果,简单有效又省时省力.但正如我在上一篇推送中所说,如果你已是一名功力纯厚的深度学习工程师,这么做当然没问题.但 ...

  3. Deep Learning:基于pytorch搭建神经网络的花朵种类识别项目(内涵完整文件和代码)—超详细完整实战教程

    基于pytorch的深度学习花朵种类识别项目完整教程(内涵完整文件和代码) 相关链接:: 超详细--CNN卷积神经网络教程(零基础到实战) 大白话pytorch基本知识点及语法+项目实战 文章目录 基 ...

  4. 在《我的世界》里搭建神经网络,运行过程清晰可见,不仅好玩,而且代码全部开源!...

    晓查 凌晨 发自 凹非寺  量子位 报道 | 公众号 QbitAI 可能是疫情吧,大家在现实中行动受限,就越来越多去游戏世界中释放天性. 前有<我的世界>举办毕业典礼,后有<动物森友 ...

  5. 在《我的世界》里搭建神经网络,运行过程清晰可见,这位印度小哥开发的新玩法火了...

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 晓查 凌晨 发自 凹非寺  量子位 报道 | 公众号 QbitAI 可能是疫情吧,大家 ...

  6. 基于pytorch搭建神经网络的花朵种类识别(深度学习)

    基于pytorch搭建神经网络的花朵种类识别(深度学习) 文章目录 基于pytorch搭建神经网络的花朵种类识别(深度学习) 一.知识点 1.特征提取.神经元逐层判断 2.中间层(隐藏层) 3.学习权 ...

  7. 从零构建神经网络-不使用框架(纯纯手撕)

    一.从零构建神经网络-不使用框架(纯手撕) 神经网络从0开始 动手从零开始实现一个神经网络,不使用框架,一步一步推理应该可以加深一下对神经网络的理解. 网络结构为三层全连接网络,节点个数依次为784. ...

  8. 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程

    暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...

  9. 使用OneFlow搭建神经网络

    使用OneFlow搭建神经网络 在 识别 MNIST 手写体数字 的例子中,通过 flow.layers 和 flow.nn 中提供的接口搭建了一个简单的 LeNet 网络.下面,将通过LeNet来介 ...

  10. 从零搭建React全家桶框架教程

    从零搭建React全家桶框架教程 源码地址:https://github.com/brickspert/react-family 欢迎star 提问反馈:blog 原文地址:https://githu ...

最新文章

  1. div中的内容水平垂直居中
  2. Linux 中执行命令
  3. Android设备的网络抓包
  4. JMeter接口测试通过企业微信API记录(二)创建审批接口并测试
  5. 如何让 zend studio 10 识别 Phalcon语法并且进行语法提示
  6. Python网页抓取、模拟登录
  7. iOS开发 发布之后的Crash错误反馈(二)
  8. 《疯狂的站长》站长必读书籍
  9. 线性回归的正规方程法
  10. seaweedfs入门
  11. 六度空间 c语言 【详解】
  12. Word 内容被锁定的两种解决方法
  13. Citrix提供免费阳春版XenServer
  14. 固态硬盘是什么接口_经常买错各种SATA和NVMe固态硬盘,有没有办法快速分辨呢?看接口...
  15. 同城货运主导全新商流体系:智慧物流成胜负关键?
  16. 华为手机如何给手机屏幕录制
  17. JupyterLab教程:程序员的笔记本神器v2.0
  18. 怎么在一堆身份证中筛选出大于18岁的?
  19. [Python图像处理] 二十九.MoviePy视频编辑库实现抖音短视频剪切合并操作
  20. UVa Online Judge 工具網站

热门文章

  1. 富爸爸穷爸爸 (全球最佳财商教育系列)——2019年04月18日15:25:56
  2. 在Apple Watch上了解时间旅行
  3. 服务器端查看图片库 eog display Xforwarding
  4. Java Document 工具类
  5. top在linux的命令,Linux命令详解之–top命令 | Linux大学
  6. 三村合建水厂问题研究
  7. PHP僵尸网络,byob--建立自己的僵尸网络
  8. 灯神动态规划(Dynamic Programing)学习笔记 打劫问题 凑整问题 背包问题 例题+原理+源码超详细讲解
  9. vs2013 qt5.6.3安装
  10. php常用的终止语录,下定决心结束感情的话 终止感情的经典语录