美文网首页
Neural Network and Deep Learning

Neural Network and Deep Learning

作者: xx2bblol | 来源:发表于2018-11-01 21:35 被阅读19次

最近开始看Michael Nilson的Neural Network and Deep Learning,这位老兄最初是做量子物理研究的,后来转向了科普工作,写了很多科学普及读物,有兴趣的童鞋可以关注他的主页:http://michaelnielsen.org/。就这本书的话,看了几段之后感觉讲得还不错,深入浅出,每次有一些疑惑的地方发现后面都跟了解释,于是决定认真地读一下这本书,同时记录一下读书笔记。

Chapter 1

第一章主要是基于手写数字识别这个案例介绍了神经网络中的一些基本概念。首先是感知机(perceptrons),这里的perceptrons我理解是一个和sigmoid neuron相对的概念,即同样是一个神经元,由输出决定输入,如果这个输出是由输入的线性组合决定的,那么这就是感知机,而如果是由输入的线性组合再加上一个sigmoid函数映射之后得到的,就是sigmoid neuron。书中作者给了一个例子。考虑你是不是要去一个节日聚会,你有很多考虑因素,比如天气好不好,有没有人陪,公交方不方便。而如果给这些因素都赋予一定的权重,那么就能够计算得到这些因素的一个加权和,然后我们再设定一个阈值,如果加权和高于这个阈值,那么就去,如果小于就不去。这样我们就实现了用一个模型来判断是否去节日聚会,而这样由加权和和阈值组成的模型就称之为感知机。

上面这个例子只涉及到一次加权和,转换到神经网络中就相当于只涉及到了一个神经元。那如果这是一个正式的神经网络,对应到现实当中可以是怎样的一个逻辑呢?可以这样思考,仍然是那三个原始输入,天气好不好,有没有人陪,公交方不方便,但是这次这些因素并不会直接影响我的决定,而是先影响我们班上每一个同学的决定,比如说班上有15个同学,每个同学都基于上面三个条件表明自己想去的意愿,然后我(班主任)再基于同学们的意愿做出选择,我就是那个输出神经元。

阈值与偏差:上面我们说的时候都用的是threshold(阈值),如果加权和的结果大于某一阈值就输出1,否则输出0。但是使用阈值有时候不太方便,比如,我每次比较的等号两边的对象都不一样,而且在变成矩阵形式的时候,我们一定是将阈值放到等号左边然后将得到的结果与0比较,所以这时候用threshold的形式就不太方便,因此我们把threshold都放在等号左边,命名为bias,来表示对加权和的一个评判标准。其实可能与其说是一个评判标准,不如说就是一个仿射变换必须的偏移量,可以增加神经元的拟合能力。

以上是从加权和的角度来解释感知机,另一个感知机的解释角度是逻辑电路,实际上一个感知机神经元可以实现一个与非门,即只有11的时候是0,其他时候都是1,而在与非门的基础上可以形成任何逻辑电路。那么神经网络比逻辑电路的优势在哪里?在于神经网络可以自动学习权重和bias来解决问题,而这是显式组合逻辑电路不能做到的。

感知机的问题在哪里?神经元的输出是跳跃式的,这使得我们无法通过更改权重实现输出的渐进变化,也就是说我可能通过所谓的学习提升了识别“9”这个数字的精度,但是识别其他数字的精度可能发生很大的改变。(之前了解到不能解决异或问题是感知机的一个缺陷,但实际上这是单个感知机神经元的缺陷,多层感知机是可以解决异或问题的,就像多个与非门结合一定能实现异或门)。

解决这个问题的一个办法是用sigmoid神经元替换perceptrons,这样权重的微小变化只会引起输出的微小变化,从而可以更好的学习(当你在某一方向上达到最优时其他方向的状态不会发生太大的改变,从而可以使优化的过程持续下去)。

Ex2:将一个网络的所有神经元的激活函数都由阶跃函数替换为sigmoid函数,然后把所有的权重和bias都乘上非零常数C,证明当C趋近于无穷的时候,网络的表现会和感知机网络的表现一样。

解答思路:因为C趋近于无穷实际上就是让sigmoid函数中指数幂趋近于正无穷或负无穷,也就是sigmoid函数的值趋近于0或1,这就和感知机神经元一样了。

(有时候即使激活函数是sigmoid函数,也叫多层感知机)

前向神经网络:上一层的输入作为下一层的输出,即没有循环。对应的是循环神经网络。

图像分割问题:一种可能的办法是尝试多种分割,然后用神经网络去识别,如果每一个结果模型的置信度都很高,那么就认为分割是正确的。

输出层神经元个数的选择:如果使用四个输出神经元,意味着要用隐层的四个输出(书中是零的四个部分)来决定二进制0中最大的一位值是什么,可是这有什么道理呢?隐藏层的输出是0的四个部分,这些部分好像和二进制0的最大一位的值好像没什么关系。所以使用10个神经元来代表0-9十个数字会更加合理一些。

损失函数:为什么损失函数要用平方函数而不是识别对的图片的个数?因为个数这个函数对于权重和偏差不是光滑的,因此改变权重和偏差可能根本不会引起结果的任何改变,这使得很难知道怎么去优化来提升模型的表现。

梯度下降:为什么要用梯度下降?我们的目的,是要通过函数自变量在某个方向上的改变,使得函数值发生改变,并且最好是自变量改变量相同的情况下,函数值的改变最大。那首先可以对函数进行泰勒展开,只取一阶项,得到线性表达式。这个式子中的一阶导数对每一个点是确定的,假设要移动的距离也是一定的,那么由柯西不等式可以得到当移动的方向是梯度方向时,函数值的下降是最高的。

随机梯度下降:原始梯度下降需要计算带入每个样本点后损失函数对应的项的梯度,当样本量很多的时候,这样计算量比较大。一个快一点的方法是每次只从中选择一部分样本来计算梯度。

epoch:随机梯度下降时每次随机选一部分样本,当所有样本都选完一遍的时候,称为一个epoch。

Ex2:当随机梯度下降每次只选一个样本的时候,称为增量或在线学习,优点是速度快,缺点是与最优方向可能偏离较大。

验证集:本身测试集是有60000张图片,现在把他分成50000和10000两部分,10000的作为验证集,用于超参数调优。

深度神经网络:想象我们是如何识别一个人脸的,看是否有五官。又怎么识别五官(比如眼睛)?看是否有睫毛、眼皮。又怎么识别睫毛?看是否有...

相关文章

网友评论

      本文标题:Neural Network and Deep Learning

      本文链接:https://www.haomeiwen.com/subject/nkqgtqtx.html