文章目录
- 第1章 Python入门
- 第2章 感知机
- 第3章 神经网络
- 第4章 神经网络的学习
- 第5章 误差反向传播
- 第6章 与学习相关的技巧
- 1. 各种参数更新的方法
- 2. 权重的初始值
- 第7章 卷积神经网络
原书链接(感谢作者,书是真的经典,建议购买纸质书):https://github.com/zjcao/books/blob/master/%E3%80%8A%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E5%85%A5%E9%97%A8%EF%BC%9A%E5%9F%BA%E4%BA%8EPython%E7%9A%84%E7%90%86%E8%AE%BA%E4%B8%8E%E5%AE%9E%E7%8E%B0%E3%80%8B_%E4%B8%AD%E6%96%87%E7%89%88.pdf
第1章 Python入门
主要介绍了Python的定义、安装以及简单语法,除此之外还介绍了一下Numpy包和Matplotlib包的用法,大多为Python相关的基础知识。
第2章 感知机
与电流做类比,简明扼要地介绍了感知机中输入值如何被激活,以及如何用感知机来实现:与门、与非门和或门。
引入权重和偏置的概念:
w1和w2是控制输入信号的重要性的参数,而偏置是调
整神经元被激活的容易程度(输出信号为1的程度)的参数。
然后提到了感知机的局限性,感知机对于线性不可分(异或)问题是无法解决的,但是多层感知机可以解决。
最后还提到了,理论上:
2层感知机(严格地说是激活函数使用了非线性的sigmoid函数的感知机,具
体请参照下一章)可以表示任意函数
。
第3章 神经网络
原文提到的值得记录的一点是:
- 激活函数是连接感知机和神经网络的桥梁。
- 实际上,如果将激活函数从阶跃函数换成其他函数,就可以进入神经网络的世界了。
接下来介绍了sigmoid函数,阶跃函数以及它们的实现,并对比了两者的不同:
- 首先注意到的是“平滑性”的不同。sigmoid函数是一条平滑的曲线,输出随着输入发生连续性的变化。而阶跃函数以0为界,输出发生急剧性的变化。
- 另一个不同点是,相对于阶跃函数只能返回0或1,sigmoid函数可以返回0.731 …、0.880 …等实数(这一点和刚才的平滑性有关)。
以及相同:
- 当输入信号为重要信息时,阶跃函数和sigmoid函数都会输出较大的值;当输入信号为不重要的信息时,两者都输出较小的值。
- 还有一个共同点是,不管输入信号有多小,或者有多大,输出信号的值都在0到1之间。
然后还介绍了另一种激活函数:ReLU函数。
3.3节 介绍了神经网络中运算的数学基础知识-矩阵运算并介绍神经网络的内积。
3.4节 3.5节 介绍3层神经网络的理论实现以及代码实现,并介绍了输出层的恒等函数和softmax函数。其中: 一般地,回归问题可以使用恒等函数,二元分类问题可以使用 sigmoid函数,多元分类问题可以使用 softmax函数 。最后提到输出的神经元数量需要根据待解决的问题来决定。对于分类问题,输出层的神经元数量一般设定为类别的数量。
问题类型 | 最后一层激活 | 损失函数 |
---|---|---|
二元分类问题 | sigmoid | binary_crossentropy |
多分类、单标签问题 | softmax | categorical_crossentropy |
多分类、多标签问题 | sigmoid | binary_crossentropy |
回归到任意值 | 无 | mse |
回归到0~1范围内的值 | sigmoid | mse或sigmoid |
最后是举一个例子,手写数字识别的实现,再次诠释神经网络的神奇。
第4章 神经网络的学习
首先介绍数据驱动的观点,然后把数据分为
训练数据
和
测试数据
,然后介绍了两种损失函数,
均方误差
和
交叉熵误差
。
然后扩展到mini-batch学习:神经网络的学习也是从训练数据中选出一批数据(称为mini-batch, 小批量),然后对每个mini-batch 进行学习。比如,从60000 个训练数据中随机
选择100 笔,再用这100 笔数据进行学习。这种学习方式称为mini-batch 学习。
求所有训练数据的损失函数的总和,以交叉熵误差为例。
然后介绍数值微分的求解,并计算梯度。
知识点:
-
epoch是一个单位。一个epoch表示学习中所有训练数据均被使用过
一次时的更新次数。比如,对于10000 笔训练数据,用大小为100
笔数据的mini-batch 进行学习时,重复随机梯度下降法100 次,所
有的训练数据就都被“看过”了A。此时,100次就是一个epoch。
第5章 误差反向传播
开始作者为了介绍计算图,举了买苹果的栗子,然后讲到反向传播,比较重要的有两点,加法节点的反向传播和乘法节点的反向传播。
值得记录的一点,由于Softmax对于输出的大小关系是不会有影响的,因此在推理(测试)的时候可以不用,但是训练的时候要用到,因为要与交叉熵组合为Softmax-with-Loss层来计算反向传播的误差。
然后代码实现误差反向传播,其中 要更好地理解程序,一定要跟着程序跑一遍 。
第6章 与学习相关的技巧
这里关于学习的技巧总结起来有这几点:
-
- 参数更新的方法
-
- 权重初始值的选取
-
- Batch Normalization(批归一化)
-
- 正则化(权值衰减和dropout)
-
- 超参数的验证(验证集)
1. 各种参数更新的方法
这几种优化方法的实验对比:
结论:从图6-9 的结果中可知,与SGD相比,其他3 种方法学习得更快,而且速度基本相同,仔细看的话,AdaGrad的学习进行得稍微快一点。这个实验需要注意的地方是,实验结果会随学习率等超参数、神经网络的结构(几层深等)的不同而发生变化。不过,一般而言,与SGD相比,其他3 种方法可以学习得更快,有时最终的识别精度也更高。
2. 权重的初始值
- 为什么不能将初始值设为0?
因为在误差反向传播法中,所有的权重值都会进行相同的更新。比如,在2 层神经网络中,假设第1 层和第2 层的权重为0。这样一来,正向传播时,因为输入层的权重为0,所以第2 层的神经元全部会被传递相同的值。第2 层的神经元中全部输入相同的值,这意味着反向传播时第2 层的权重全部都会进行相同的更新(回忆一下“乘法节点的反向传播”6.2 权重的初始值 177的内容)。因此,权重被更新为相同的值,并拥有了对称的值(重复的值)。这使得神经网络拥有许多不同的权重的意义丧失了。为了防止“权重均一化”(严格地讲,是为了瓦解权重的对称结构),必须随机生成初始值。
归一化和正则化这里就不说了,在提到一点就是,超参数的选择,一般说参数指的权重和偏置是可以训练出来的,而所谓超参数是那些人为设定好的参数,所谓的调参也就是指调超参数。这里需要注意,一般把数据集分为训练集、验证集和测试集。
我的理解,一般先用验证集来选取最佳的超参数,有很多方法包括网格搜索、随机采样又或者贝叶斯最优化。然后再用训练集来训练出参数,最后用测试集测试效果。
书上提到,比较理想的情况下测试集只用一次。
第7章 卷积神经网络
其实笔者早在16年开始接触深度学习,最开始就是学习了一些简单的机器学习知识(主要是NG老师的课和统计学习方法),就接触CNN,一开始是真的蒙蔽,以至于觉得图像好难好难,这次再看,有了很大的改观,这里更多的是心得。
其实理解上上面章节的知识,理解卷积神经网络(CNN)真的是
特别简单
!
- 卷积层是用来提取图像的特征的;
- 全连接层就是神经网络的全连接版!!把卷积层收集的特征,再次激活,并分类;
- 至于为什么一般接两层全连接层,请看感知机两层的效果(当然激活函数是非线性的)。当然是两层理论上就可以处理任何非线性问题了!
- 还有就是,为什么要有卷积层,我的理解是,有些图像太大,而且会有多层,所以直接神经网络分类奇慢,所以需要卷积的方式提取特征,其实也是神经网络的思想,只不过可以理解为局部神经网络,并可以保留空间的信息。
最后一章深度学习就不再记录。
最后一点感悟,理论确实要与代码结合,代码得去跑和理解。
最后最后,代码要与业务结合,工程上利用理论和代码把业务处理好才是王道!!