本笔记更像是一个大纲整理,着重建立知识框架,对于细节知识尤其是已熟知的点做简略或忽略处理
第一章 简介 [2019-10-04]
1.1 什么是神经网络
1.1.1 神经元
一个节点,该节点接收一些输入的数值,并进行计算(通常是加权求和+非线性变换),并把计算结果传递出来。
1.1.2 神经网络
一些神经元连接在一起,便构成神经网络。根据连接方式的不同(或者说数据流动方式的不同),可基本分为三大类:普通前馈神经网络(NN)、循环神经网络(RNN)、卷积神经网络(CNN)
1.2 神经网络与监督学习
前向传播(FP):神经网络接收一个输入(通常是一个向量或二维张量),经过若干个神经元层的计算与传递,最终输出。
反向传播(BP):前向传播的输出,与真实的y值的差异构成了损失函数。根据该误差,往回逐层调整神经网络的参数。其本质是链式求导。
FP+BP是神经网络训练的基本形式,属于典型的监督学习
1.3 深度学习兴起的原因
1)数据量的增大:数据量越大,模型效果越好,但对大部分传统ML算法(SVM等)而言,该趋势有上限,即当数据量大到一定程度后,训练效果将不再随着增大数据量而有明显提升。而神经网络则不然,由于神经网络结构可以非常复杂,其需要的数据量更大,且可以一直随着数据量增大而提升效果。
2)神经网络算法本身的演进:如ReLU激活函数的出现,其相比于sigmoid而言更快的收敛速度使得训练速度更快,从而更实际可用。
3)硬件的提升:主要包括算力和网络传输速度的提升等。
第二章 二分类简介
2.0 本章概述
以二分类问题和逻辑回归算法为例,介绍机器学习的基本流程和涉及的基本该念,主要包括:二分类问题、逻辑回归算法、损失函数、梯度下降等。
2.1 二分类问题简介 略
2.2 逻辑回归算法简介 略
2.3 逻辑回归的损失函数
使用交叉熵损失函数。
关于定义的区别:损失函数(loss function)指的是单个样本的损失。而代价函数或成本函数(cost function)一般指整个数据集的平均损失。
2.4 梯度下降法
基本原理和表达形式:略
基本特点:若代价函数为凸函数,则可寻得全局最优解,否则只能寻得局部最优解。
2.5 导数 略
2.6 更多导数的例子 略
对于大部分常见的函数形式,其导函数均可通过极限方法进行求解。
2.7 计算图
用计算图表达神经网络的FP和BP过程。
2.8 计算图的导数计算
同上,略
2.9 逻辑回归中的梯度下降法
可总结为以下步骤:
1)确定算法:逻辑回归
2)确定使用的损失函数:交叉熵
3)基于以上两步,损失函数就有了具体的形式。
4)梯度下降:针对每个特定样本,都可以求其损失对算法参数的导数。
2.10 整个数据集的梯度下降 略
2.11 向量化
含义:把整个过程包括前向传播、梯度求解、参数迭代等都用矩阵运算的方式去表达(或执行),而不是用for循环的方式。
实现:基于第三方库,如numpy等,其底层实现会充分利用CPU或GPU的并行化机制。(如何实现则不需要太关注)
2.12 更多向量化例子
2.13 逻辑回归的向量化表示
简单来说,一个样本就是一个vector,很多样本就是一个matrix,因为计算的形式可以表达为矩阵运算,而不是用for循环一个一个求,这就是向量化表示(基于numpy)
2.14 逻辑回归梯度下降的向量化表示
不止前向传播时可以向量化表示,反向传播时(求微分、求梯度)均可以用向量化表示。不再赘述。
(2019-10-08)
2.15 Python中的广播
广播是可以描述为:
① 一个(m, n)的矩阵,加减乘除一个数字,相当于把矩阵的每个元素都加减乘除这个数,或者说:是先把这个数字扩充成一个(m, n)的矩阵,然后再做一个pointwise的计算;
② 一个(m, n)的矩阵,加减乘除一个(m, 1)的向量,相当于把矩阵的每一行都加减乘除这个向量对应位置的元素,或者说,先把这个向量扩充成一个(m, n)的矩阵,然后做pointwise的计算;
② 一个(m, n)的矩阵,加减乘除一个(1 n)的向量,相当于把矩阵的每一列都加减乘除这个向量对应位置的元素,或者说,先把这个向量扩充成一个(m, n)的矩阵,然后做pointwise的计算;
以上所说的“扩充成一个矩阵”,就是“广播”的含义,“广播”在numpy里是默认实现的。
2.16 关于python/numpy的说明
略。numpy是数据分析/建模最常用的几个工具之一,应该进行系统学习。
2.17 jupyter/Ipython的基本使用
略
2.18 逻辑回归的损失函数的解释
逻辑回归:,其中y帽代表的是预测为1的概率
其中:
交叉熵损失函数:
(本篇后续专门整理一篇博客,待完成)
第三章 神经网络基础
3.1 神经网络概览
描述与符号,略...
3.2 神经网络表示
1. input layer、hidden layer、output layer。
2. 具体的符号表示:表示第一个隐藏层的第三个神经元~
3. 一般来说,隐藏层数+输出层数(1)等于通常说的神经网络层数。
3.3 计算神经网络的输出
输入 -> (加权求和 -> 激活) -> (加权求和 -> 激活) -> ... -> (加权求和 -> 激活) -> 输出
一个神经元内部有两步操作:加权求和、激活(非线性变换)
3.4 多样本的向量化
前向传播的矩阵运算形式表示,略
3.5 向量化实现的解释
W的每一行代表下一层的每个神经元对应的输入权重
X的每一列代表一个样本
3.6 激活函数()
1. sigmoid激活函数: 最经典的激活函数,但已经基本上不用了。
2. 双正切激活函数:
3. ReLU激活函数:
4. leaky ReLU:
经验法则:如果下一层是0-1二分类,则使用sigmoid,如果不是,则使用ReLU
3.7 为什么需要非线性激活
多个线性变化,本质山就是一个线性变换。
注意:ReLU并不是线性变换
3.8 激活函数的导数
1. sigmoid激活函数的导数:
2. tanh激活函数的导数:略
3. ReLU激活函数的导数:略
3.9 神经网络的梯度下降法
以一个只含有一个隐藏层的神经网络为例:
其包含的参数:
其中的损失函数:
前向传播过程:
反向传播过程:(梯度下降过程)
3.10 直观理解反向传播过程
本质就是链式求导。
可以直接看深度学习蓝皮书的反向传播四大公式。
3.11 网络参数的随机初始化
1. 不可全部初始化为零,因为参数全为0时,梯度下降法失效。
2. 随机初始化:
1) 对于sigmoid或tanh激活函数,w不宜初始化的过大,因为此时容易导致实际值落入梯度饱和区。对于ReLU类的激活函数则没有这类问题。
第四章 深层神经网络(DNN)
2019-10-11
4.1 深层神经网络
只针对简单的全连接神经网络而言,隐藏层较少就是浅层神经网络,隐藏层较多就是深层神经网络,多和少是个相对概念。
4.2 深层神经网络中的前向传播
加权求和 -> 激活函数 -> 加权求和 -> 激活函数 ... 还是这一套东西,略。
4.3 核对矩阵的维数
略
4.4 为什么使用深层神经网络
解释一:前面的层提取初级特征,后面的层在此基础上提取高级特征。以图像(人脸)识别为例:前面的层是提取折线、弯曲等初级特征,而后面的层在此基础上提取眼睛、鼻子等特征。
解释二:使用多个隐藏层,但每个隐藏层神经元数较少,即可拟合较复杂的函数。同等复杂的函数若用单隐藏层的神经网络进行拟合,隐藏层所需要的神经元数是巨大的,指数级(不懂)。
4.5 搭建深层神经网络块
本节实际讲了DNN中的前向传播和反向传播。再做如下阐述:
1)从数学角度看:前向传播就是加权求和+激活函数,循环往复。反向传播就是链式求导。
2) 从计算过程的优化角度看:前向传播并不是只算出输出,而是把中间层的输出也都缓存下来,反向传播时对各层的参数求偏导,也不是每层都从头开始求,而是缓存一些中间值,避免重复计算。(参考反向传播四大公式)
4.6 前向传播和反向传播
略…
4.7 参数 VS 超参数
对于DNN而言,参数就是W和b,通过学习而来。超参数可以分为两部分:一是结构参数,如网络层数,每层神经元数,每层用的激活函数等,二是训练参数:如学习率、迭代次数等。超参都是人为设定的。
4.8 神经网络和大脑的关系
算法所说的神经元与生物神经元类比,输入相当于树突,输出相当于轴突,核相当于激活函数。是个很粗糙的类比,其实没什么关系。
附录一 吴恩达采访Geoffrey Hinton
神仙聊天,什么都听不懂。捕捉到以下两点:
1. 被采访者是反向传播算法发明者
2. ReLU激活函数的本质是一叠sigmoid函数,唯一听说过的两个词语(但不懂这句话)
附录二 吴恩达采访Pieter Abbeel
略
附录三 吴恩达采访Ian Goodfellow
对抗神经网络的发明者