原书链接(感谢作者,书是真的经典,建议购买纸质书):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
主要介绍了Python的定义、安装以及简单语法,除此之外还介绍了一下Numpy包和Matplotlib包的用法,大多为Python相关的基础知识。
与电流做类比,简明扼要地介绍了感知机中输入值如何被激活,以及如何用感知机来实现:与门、与非门和或门。
引入权重和偏置的概念:w1和w2是控制输入信号的重要性的参数,而偏置是调
整神经元被激活的容易程度(输出信号为1的程度)的参数。
然后提到了感知机的局限性,感知机对于线性不可分(异或)问题是无法解决的,但是多层感知机可以解决。
最后还提到了,理论上:2层感知机(严格地说是激活函数使用了非线性的sigmoid函数的感知机,具
体请参照下一章)可以表示任意函数。
原文提到的值得记录的一点是:
接下来介绍了sigmoid函数,阶跃函数以及它们的实现,并对比了两者的不同:
以及相同:
然后还介绍了另一种激活函数: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 |
最后是举一个例子,手写数字识别的实现,再次诠释神经网络的神奇。
首先介绍数据驱动的观点,然后把数据分为训练数据和测试数据,然后介绍了两种损失函数,均方误差和交叉熵误差。
然后扩展到mini-batch学习:神经网络的学习也是从训练数据中选出一批数据(称为mini-batch, 小批量),然后对每个mini-batch 进行学习。比如,从60000 个训练数据中随机
选择100 笔,再用这100 笔数据进行学习。这种学习方式称为mini-batch 学习。
求所有训练数据的损失函数的总和,以交叉熵误差为例。
然后介绍数值微分的求解,并计算梯度。
知识点:
开始作者为了介绍计算图,举了买苹果的栗子,然后讲到反向传播,比较重要的有两点,加法节点的反向传播和乘法节点的反向传播。
值得记录的一点,由于Softmax对于输出的大小关系是不会有影响的,因此在推理(测试)的时候可以不用,但是训练的时候要用到,因为要与交叉熵组合为Softmax-with-Loss层来计算反向传播的误差。
然后代码实现误差反向传播,其中要更好地理解程序,一定要跟着程序跑一遍。
这里关于学习的技巧总结起来有这几点:
这几种优化方法的实验对比:
结论:从图6-9 的结果中可知,与SGD相比,其他3 种方法学习得更快,而且速度基本相同,仔细看的话,AdaGrad的学习进行得稍微快一点。这个实验需要注意的地方是,实验结果会随学习率等超参数、神经网络的结构(几层深等)的不同而发生变化。不过,一般而言,与SGD相比,其他3 种方法可以学习得更快,有时最终的识别精度也更高。
因为在误差反向传播法中,所有的权重值都会进行相同的更新。比如,在2 层神经网络中,假设第1 层和第2 层的权重为0。这样一来,正向传播时,因为输入层的权重为0,所以第2 层的神经元全部会被传递相同的值。第2 层的神经元中全部输入相同的值,这意味着反向传播时第2 层的权重全部都会进行相同的更新(回忆一下“乘法节点的反向传播”6.2 权重的初始值 177的内容)。因此,权重被更新为相同的值,并拥有了对称的值(重复的值)。这使得神经网络拥有许多不同的权重的意义丧失了。为了防止“权重均一化”(严格地讲,是为了瓦解权重的对称结构),必须随机生成初始值。
归一化和正则化这里就不说了,在提到一点就是,超参数的选择,一般说参数指的权重和偏置是可以训练出来的,而所谓超参数是那些人为设定好的参数,所谓的调参也就是指调超参数。这里需要注意,一般把数据集分为训练集、验证集和测试集。
我的理解,一般先用验证集来选取最佳的超参数,有很多方法包括网格搜索、随机采样又或者贝叶斯最优化。然后再用训练集来训练出参数,最后用测试集测试效果。
书上提到,比较理想的情况下测试集只用一次。
其实笔者早在16年开始接触深度学习,最开始就是学习了一些简单的机器学习知识(主要是NG老师的课和统计学习方法),就接触CNN,一开始是真的蒙蔽,以至于觉得图像好难好难,这次再看,有了很大的改观,这里更多的是心得。
其实理解上上面章节的知识,理解卷积神经网络(CNN)真的是特别简单!
最后一章深度学习就不再记录。
最后一点感悟,理论确实要与代码结合,代码得去跑和理解。
最后最后,代码要与业务结合,工程上利用理论和代码把业务处理好才是王道!!