依然是跟着Michael Nielsen的神经网络学习,基于前一篇的学习,已经大概明白了神经网络的基本结构和BP算法,也能通过神经网络训练数字识别功能,之后我试验了一下使用神经网络训练之前的文本分类,只是简单的使用了词频来作为词向量处理过程,没有任何的其他调参过程,对于八分类,其正确率到了84%,相比于之前各种调参才能勉强达到72%的SVM分类方法而言,神经网络有无可比拟的简单和高正确率。好了,安利了这么久的神经网络,现在是时候回归正题了

这一篇以及后面的文章涉及到神经网络的调优问题,有人会说“看,神经网络也需要调参”,其实我想表达的是神经网络在不调参的时候准确度已经非常好了,调参只是为了更上一层楼,而且神经网络调参绝对比支持向量机(SVM)简单的多,这是我喜欢神经网络的原因。

神经网络调参包括三个方面:

**1. 损失函数的选取Loss Function
2. 正则化
3. 初始参数w和b的选取**

本文主要是就第一个方面来进行优化,也就是选取新的损失函数来加快学习过程。

简要回忆一下前一篇文章Michael Nielsen’s神经网络学习之一上面的损失函数,也就是二次损失函数:quadratic cost 。其基本形式是:

这个损失函数有什么问题呢,其实二次损失函数有很多的有点,比如容易求导,也能基本表征”损失“这一词的意思。现在让我们看下对于一个具体的神经元,这个损失函数的表现过程。

首先对于下图的单个神经元,我们假设初始化的权重w=0.6,以及偏移量b=0.9以及步长n=0.15,然后我们假设这个神经元的应该输出的结果是0.0,按照以往的神经元计算方法,我们计算出来的结果是0.82,初始的误差较大,然后我们观察在这个神经元使用梯度下降法的过程中的参数变化过程:

从图中可以看到结果还是很给力的,300次迭代之后结果为0.09,和结果相差也不算大,恩,这是其中一个例子。

我们再来看另一个例子,同样使用二次损失函数,但是我们把最初的权重w和b都设计为2,步长为0.15不变,应该输出的结果为0也不变,按照这个参数第一次计算的结果是0.98,相差比第一次大,同样我们看一下其参数在梯度下降过程中的变化过程:

经过30次迭代之后,其输出的结果是0.2,误差较第一次变大了不少。

通过这两次的例子,我们可以发现什么,在第二个例子中,其初始参数偏差非常发,因此初始的误差非常大,但是从其变化图可以看出,其学习过程相当缓慢(曲线比较平滑),从人的角度考虑,如果给定初始的参数,一个人发现这个参数的偏差非常大,通常这个人会将参数调整的幅度变大而不是变小,但是从第二个例子来看,二次损失函数恰恰相反,这一个特性无疑降低了学习的速度。

回顾前面的神经网络,我们在最开始选取w和b的时候是使用随机的数产生,在二次损失函数的情况下,这就产生了严重的问题,如果我们随机生成的数稍微正常一点,如上面的例一,我们可以收敛的快一点,但是如果我们生成的数开始偏差就非常大,这非常容易导致最后的收敛过程过度缓慢的问题。

现在我们从数学的角度,想象为什么二次损失函数会在参数误差很大的情况下学习速度反而放缓。
为了简要起见,我们以单个的神经元为例。
首先损失函数:

对应的其求导方法:

因为使用了sigmoid函数,那么a的取值在(0,1)之间,由上面的求导公式可以看出,当a和y相差很大的情况下,该求导值反而低,也就是说这个值得输出和误差值的大小并不是呈直接线性相关的,这也就是为什么二次损失函数容易出现学习过慢的问题

鉴于二次损失函数的上面所说的确定,这就引入了”互熵“损失函数(corss-entropy cost function),或者叫交叉熵。
还是以单个的神经元为例:

我们来看一下互熵的表示形式:

其实这个和一般的熵的形式也没什么区别,下面来说一下为什么”互熵“能够起到损失函数的作用。总结起来有一下几点好处:

  1. 其值为正
  2. 和输出数据之间有依赖关系
  3. 对w和b求分导的结果和误差值呈正相关

    下面具体来说说具体的方面。
    对于第一点:这是显然的

对于第二点:我们可以看到,假如应该输出的结果是1的话,当我们通过神经元得到的输出也接近为1的时候其值为0,当我们通过神经元得到的输出为0的时候,其值是1,也就是基本上满足损失函数所要求的功能

对于第三点:我们容易得到:



其中a为神经元的输出值
由上面的求导公式很容易得到结论:当误差值较大的时候,w和b的下降梯度也会变大,这和我们想要的功能是一样的。
现在来测试一下使用互熵作为损失函数的效果,和文章开篇测试的方法一样,只是对于单个神经元的测试:

例一:初始权重w为0.6,偏移b=0.9,需要的输出是0,步长为0.15.

例二:w和b都为2,需要输出是0,步长为0.15

可以看出如果误差越大,其下降的梯度也就越大,也就是说学习过程加快了,达到了我们要的效果。

拓展到多层多个神经元,其求导方式是一样的,只不过多了一些参数罢了

在使用了互熵作为损失函数之后,之前的神经网络代码就需要改变了,不过只是需要改变一下在BP步骤里面的求导值即可

delta = (self.cost).delta(zs[-1], activations[-1], y) #(1)
nabla_b[-1] = delta  #(2)
nabla_w[-1] = np.dot(delta, activations[-2].transpose()) #(3)

其中在第一步中

delta计算值为:activations[-1]-y
这个和我们上面的求导结果是一样的。

END!

参考文献:《Improving the way neural networks learn》 Michael Nielsen神经网络与深度学习

Micheal Nielsen's神经网络学习之二相关推荐

  1. Micheal Nielsen's神经网络学习之三:过拟合与规范化

    依然是Michael Nielsen的书,依然是神经网络,上文说到的是神经网络有关于损失函数的调整使得学习速度加快,但是还是有几个问题没有解决: 过拟合问题 权重和b初始化问题 一,首先来看第一个问题 ...

  2. 神经网络学习(二)Tensorflow-简单神经网络(全连接层神经网络)实现手写字体识别

    神经网络学习(二)神经网络-手写字体识别 框架:Tensorflow 1.10.0 数据集:mnist数据集 策略:交叉熵损失 优化:梯度下降 五个模块:拿数据.搭网络.求损失.优化损失.算准确率 一 ...

  3. 神经网络学习(二):解常微分方程

    前言 在完成了函数拟合之后,现在考虑常微分方程:给定一个常微分方程,让你求得这个微分方程的近似解(在给定的初值条件下).以前都是用数学的知识来解决(这让我想起了大一在立人楼上常微分的夜晚),现在有了神 ...

  4. 神经网络学习(三):解偏微分方程

    前言 在完成了常微分的数值解之后,我开始如法炮制的来解偏微分,我觉得解法上是一样的,都直接使用autograd就可以了,所以理论是难度并不大(虽然实际上我是花的时间最长的),只不过需要注意的细节比较多 ...

  5. tensorflow学习笔记二——建立一个简单的神经网络拟合二次函数

    tensorflow学习笔记二--建立一个简单的神经网络 2016-09-23 16:04 2973人阅读 评论(2) 收藏 举报  分类: tensorflow(4)  目录(?)[+] 本笔记目的 ...

  6. 卷积神经网络学习路线(二十一) | 旷世科技 ECCV 2018 ShuffleNet V2

    前言 这个系列已经更新了20多篇了,感谢一直以来大家的支持和等待.前面已经介绍过MobileNet V1,MobileNet V2,MobileNet V3,ShuffleNet V1这几个针对移动端 ...

  7. 图机器学习(GML)图神经网络(GNN)原理和代码实现(前置学习系列二)

    图机器学习(GML)&图神经网络(GNN)原理和代码实现(PGL)[前置学习系列二] 上一个项目对图相关基础知识进行了详细讲述,下面进图GML networkx :NetworkX 是一个 P ...

  8. 系统学习机器学习之神经网络(十二) --人工神经网络总结

    本来这篇还缺个RBM,但RBM在DBN中使用,暂时放在深度学习那里.这里看到一篇非常好的总结,保存下来. 转自:http://blog.csdn.net/fengbingchun/article/de ...

  9. Python-深度学习-学习笔记(13):keras搭建卷积神经网络(对二维数据进行一维卷积)

    Python-深度学习-学习笔记(13):keras搭建卷积神经网络(对二维数据进行一维卷积) 卷积神经网络进行图像分类是深度学习关于图像处理的一个应用,卷积神经网络的优点是能够直接与图像像素进行卷积 ...

最新文章

  1. L1-047 装睡 (结构体解决)
  2. 基于人工智能方法的手写数字图像识别_【工程分析】基于ResNet的手写数字识别...
  3. SQLServer------聚集索引和非聚集索引的区别
  4. SDL 库 无法解析的外部符号 __imp__fprintf
  5. celery AttributeError: 'str' object has no attribute 'items'
  6. OpenCV学习笔记(五):线性滤波-方框、均值、高斯:boxFilter(),blur(),GaussianBlur()
  7. 诗与远方:无题(二十一)
  8. OpenShift 4 - DevSecOps (1) - 安装 DevOps 环境
  9. PHP中include和require的区别详解
  10. http请求头中包含未编码中文时webapi self host崩溃
  11. 嵌入式系统功能需求分析_嵌入式系统开发流程及前景分析
  12. PHP设计模式——备忘录模式
  13. 【Android开发】高级组件-选项卡
  14. 力推个p站相关站点 画师美图和各种工具方法
  15. SAP SD初阶之VL10A为销售订单创建外向交货单
  16. bcoma 应用程序发生错误_打开网页老是出现《应用程序错误》是怎么回事?
  17. 调用android的拍照或本地相册选取再实现相片上传服务器,Android调用系统相机、本地相册上传图片(头像上传(裁剪)、多张图片上传)...
  18. MFC不同窗口之间传递数据
  19. js如何判断保留两位小数
  20. layer icon图标汇总

热门文章

  1. 如何写好一篇优秀的硕士毕业论文
  2. 0_13_QGIS纠正矢量数据
  3. 聚类分析(K-means、系统聚类和二阶聚类)的原理、实例及在SPSS中的实现(一)
  4. 今天鹏鹏会来,待会一起出去买东西。
  5. 最新版 sublime text 3 切换中文方法
  6. 键盘上的按键--键码 对应表
  7. 《读书是教师最好的修行》读后感优秀范文2200字
  8. notebook常用快捷键
  9. WIN10系统进入BIOS的方法(无需开机时按快捷键)
  10. 【翻译】驯服野兽:Scylla 如何利用控制理论来控制压实