《深度学习入门——基于Python的理论与实现》笔记心得

系统 530 0

文章目录

    • 第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函数,阶跃函数以及它们的实现,并对比了两者的不同:

  1. 首先注意到的是“平滑性”的不同。sigmoid函数是一条平滑的曲线,输出随着输入发生连续性的变化。而阶跃函数以0为界,输出发生急剧性的变化。
  2. 另一个不同点是,相对于阶跃函数只能返回0或1,sigmoid函数可以返回0.731 …、0.880 …等实数(这一点和刚才的平滑性有关)。

以及相同:

  1. 当输入信号为重要信息时,阶跃函数和sigmoid函数都会输出较大的值;当输入信号为不重要的信息时,两者都输出较小的值。
  2. 还有一个共同点是,不管输入信号有多小,或者有多大,输出信号的值都在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章 神经网络的学习

首先介绍数据驱动的观点,然后把数据分为 训练数据 测试数据 ,然后介绍了两种损失函数, 均方误差 交叉熵误差
《深度学习入门——基于Python的理论与实现》笔记心得_第1张图片
《深度学习入门——基于Python的理论与实现》笔记心得_第2张图片
然后扩展到mini-batch学习:神经网络的学习也是从训练数据中选出一批数据(称为mini-batch, 小批量),然后对每个mini-batch 进行学习。比如,从60000 个训练数据中随机
选择100 笔,再用这100 笔数据进行学习。这种学习方式称为mini-batch 学习。

求所有训练数据的损失函数的总和,以交叉熵误差为例。
《深度学习入门——基于Python的理论与实现》笔记心得_第3张图片
然后介绍数值微分的求解,并计算梯度。

知识点:

  1. epoch是一个单位。一个epoch表示学习中所有训练数据均被使用过
    一次时的更新次数。比如,对于10000 笔训练数据,用大小为100
    笔数据的mini-batch 进行学习时,重复随机梯度下降法100 次,所
    有的训练数据就都被“看过”了A。此时,100次就是一个epoch。

第5章 误差反向传播

开始作者为了介绍计算图,举了买苹果的栗子,然后讲到反向传播,比较重要的有两点,加法节点的反向传播和乘法节点的反向传播。
《深度学习入门——基于Python的理论与实现》笔记心得_第4张图片
《深度学习入门——基于Python的理论与实现》笔记心得_第5张图片
《深度学习入门——基于Python的理论与实现》笔记心得_第6张图片
《深度学习入门——基于Python的理论与实现》笔记心得_第7张图片
值得记录的一点,由于Softmax对于输出的大小关系是不会有影响的,因此在推理(测试)的时候可以不用,但是训练的时候要用到,因为要与交叉熵组合为Softmax-with-Loss层来计算反向传播的误差。

然后代码实现误差反向传播,其中 要更好地理解程序,一定要跟着程序跑一遍

第6章 与学习相关的技巧

这里关于学习的技巧总结起来有这几点:

    1. 参数更新的方法
    1. 权重初始值的选取
    1. Batch Normalization(批归一化)
    1. 正则化(权值衰减和dropout)
    1. 超参数的验证(验证集)

1. 各种参数更新的方法

《深度学习入门——基于Python的理论与实现》笔记心得_第8张图片
这几种优化方法的实验对比:
《深度学习入门——基于Python的理论与实现》笔记心得_第9张图片
结论:从图6-9 的结果中可知,与SGD相比,其他3 种方法学习得更快,而且速度基本相同,仔细看的话,AdaGrad的学习进行得稍微快一点。这个实验需要注意的地方是,实验结果会随学习率等超参数、神经网络的结构(几层深等)的不同而发生变化。不过,一般而言,与SGD相比,其他3 种方法可以学习得更快,有时最终的识别精度也更高。

2. 权重的初始值

  • 为什么不能将初始值设为0?

因为在误差反向传播法中,所有的权重值都会进行相同的更新。比如,在2 层神经网络中,假设第1 层和第2 层的权重为0。这样一来,正向传播时,因为输入层的权重为0,所以第2 层的神经元全部会被传递相同的值。第2 层的神经元中全部输入相同的值,这意味着反向传播时第2 层的权重全部都会进行相同的更新(回忆一下“乘法节点的反向传播”6.2 权重的初始值 177的内容)。因此,权重被更新为相同的值,并拥有了对称的值(重复的值)。这使得神经网络拥有许多不同的权重的意义丧失了。为了防止“权重均一化”(严格地讲,是为了瓦解权重的对称结构),必须随机生成初始值。

  • 当激活函数使用ReLU时,权重初始值使用He初始值,当激活函数为sigmoid 或tanh 等S 型曲线函数时,初始值使用Xavier 初始值。
    《深度学习入门——基于Python的理论与实现》笔记心得_第10张图片 《深度学习入门——基于Python的理论与实现》笔记心得_第11张图片

归一化和正则化这里就不说了,在提到一点就是,超参数的选择,一般说参数指的权重和偏置是可以训练出来的,而所谓超参数是那些人为设定好的参数,所谓的调参也就是指调超参数。这里需要注意,一般把数据集分为训练集、验证集和测试集。

我的理解,一般先用验证集来选取最佳的超参数,有很多方法包括网格搜索、随机采样又或者贝叶斯最优化。然后再用训练集来训练出参数,最后用测试集测试效果。

书上提到,比较理想的情况下测试集只用一次。

第7章 卷积神经网络

其实笔者早在16年开始接触深度学习,最开始就是学习了一些简单的机器学习知识(主要是NG老师的课和统计学习方法),就接触CNN,一开始是真的蒙蔽,以至于觉得图像好难好难,这次再看,有了很大的改观,这里更多的是心得。

《深度学习入门——基于Python的理论与实现》笔记心得_第12张图片
其实理解上上面章节的知识,理解卷积神经网络(CNN)真的是 特别简单

  1. 卷积层是用来提取图像的特征的;
  2. 全连接层就是神经网络的全连接版!!把卷积层收集的特征,再次激活,并分类;
  3. 至于为什么一般接两层全连接层,请看感知机两层的效果(当然激活函数是非线性的)。当然是两层理论上就可以处理任何非线性问题了!
  4. 还有就是,为什么要有卷积层,我的理解是,有些图像太大,而且会有多层,所以直接神经网络分类奇慢,所以需要卷积的方式提取特征,其实也是神经网络的思想,只不过可以理解为局部神经网络,并可以保留空间的信息。

最后一章深度学习就不再记录。

最后一点感悟,理论确实要与代码结合,代码得去跑和理解。

最后最后,代码要与业务结合,工程上利用理论和代码把业务处理好才是王道!!


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请请扫描上面二维码支持博主1元、2元、5元等您想捐的金额吧,狠狠点击下面给点支持吧

发表我的评论
最新评论 总共0条评论