课程目录
1.神经网络与深度学习
第1周:介绍
第2周:神经网络基础(神经网络理论知识,比如逻辑回归、损失函数、梯度下降、向量化)
第3周:浅层神经网络(神经网络、激活函数、反向传播、随机初始化)
第4周:深度神经网络(编程建立更深层的神经网络)
2.改进深度神经网络: (介绍了神经网络各个环境的更优化算法)
第1周:训练测试集划分、误差和方差、正则化、Dropout、输入归一化、梯度消失与梯度爆炸、权重初始化、梯度检验
第2周:一些优化算法(Mini-batch梯度降低、指数加权平均、Momentum梯度降低、RMSprop、Adam优化算法、衰减学习率、局部最优)
第3周:超参数调试、Batch Norm、Softmax
3.组织你的机器学习项目(从实践的角度介绍机器学习策略)
第1周:正交化、单一数字评估指标、训练/开发/测试集、误差和方差、改善模型的表现
第2周:误差分析、错误样本清除(打错标签)、数据分布不匹配问题、迁移学习、多任务学习、端到端的深度学习
4.卷积神经网络
自然语言处理:构建序列模型
神经网络基础
Python中的广播
进行矩阵运算时,如果在+ - * / 符号后的矩阵维度和前者并不是匹配的,那么Python会自动扩展后者的行数,而且这种复制即可以是水平的也可以是垂直的,广播的前提是被扩展的矩阵行或者列和前者相同
激活函数的选择
在神经网络选择激活函数时,除非是二元分类否则不要使用sigmoid函数。而是使用ReLU(或leaky ReLU)函数或者tanh函数。leaky ReLU相比于ReLU在Z<0时函数导数不为零,如果为零的话在利用反向传播更新权重时会出现步频=0
权重的初始化
神经网络不同于逻辑回归,参数不可初始化为0/相同值,否则隐藏层中每层的节点输出值都会相同,在反向传播过程中实际上使得更新之后隐藏层的不同节点的参数相同。所以参数w要随机初始化为较小的数,如果w特别大,那么使用sigmoid或tanh作为激活函数时此时的斜率很小,导致梯度下降很慢。
超参数
学习率a、迭代次数、隐藏层层数、每个层结点个数、激活函数的选择
数据集划分
将数据集划分为训练集、交叉验证集、测试集。交叉验证集用来选择最优的超参数搭配使得模型性能最好。要使数据分布在三个集合中是均匀的
偏差和方差高低的关系
低偏差高方差:过拟合
高偏差高方差:欠拟合
高偏差和更高方差:不仅没学好,仅学的那点东西还是歪的
训练完成后首先检查训练集的误差—偏差,若高解决的办法是挑选一个新的网络(更多层或者每层更多结点或延长训练时间或换用更高级的优化算法)、换别的网络结构。
解决高方差的办法是选择更多的数据加入训练、正则化
L2正则化
L2正则化(权重衰减)项是如何防止过拟合的?
在梯度下降环节,相比没有正则化项的代价函数求导,可以使权重w变小
为什么w变小就可以防止过拟合呢?
其他正则化方法
用已有数据扩增数据集、早终止法
反向随机失活
反向随机失活(随机失活Dropout的一种)算法:
过拟合实际上是神经网络训练出的模型对训练集中某个特征有过分的依赖,这个特征的变化对模型影响很大,且此特征并不再泛化集上表现,只是训练集独有的特征。反向随机失活使得某个结点的N个输入都有可能被随机抛弃,这样结点对这些输入的依赖减少,表现在权重值不会太大。
随机失活算法还有Spatial Dropout、Stochastic Depth、DropBlock、Cutout、DropConnect
如何选择结点并删除的更详细过程是这样:
1、第三层网络的网络节点用a3表示,使用a3的shape来产生一个0到1的随机数矩阵。
2、设置keep_prob(0到1)的大小,keep_prob表示该层节点保留的概率。对于第一步产生的随机矩阵与keep_prob进行比较,小于为1,大于为0。1表示保留该节点,0表示删除节点。用一个矩阵存放 决定留or删 的这些0、1数
3、将a3与第2步中0、1矩阵内积,得到新的网络节点a3。
4、对输出的a3矩阵除以keep_prob,即a3 /= keep_prob,这一步是最关键的。将a3除以keep_prob的目的是保证a3的期望值(均值)不变,从而保证第三层的输出大约不变。
归一化
使各个特征的值的范围相近,加快梯度下降速度
1.最大最小归一化(Min-Max Normalization)
线性函数将原始数据线性化的方法转换到[0 1]的范围,但是一旦数据中有一个离群值(特别大的值)就会出现这个离群值做完归一化后特别趋近于1,而其他值特别趋近于0。
2.均值归一化
标准化
标准差的公式会考虑到所有样本数据,所以受离群值影响会小一些。在样本足够多的情况下比较稳定。但是如果使用标准化不一定会把数据缩放到0-1之间
梯度消失/爆炸
在深层网络中梯度指数级的增大或减小。解决办法是,相比用[0,1]范围内的随机数初始化,选择更细致地方法随机初始化神经网络的权重。
这个方法具体是:第L层的权重向量WL=np.random.randn(f_in, f_out)* 1 / n \sqrt{1/n} 1/n(当激活函数为sigmoid、tanh)
WL=np.random.randn(f_in, f_out)* 2 / n \sqrt{2/n} 2/n(当激活函数为ReLU),n是L-1层的结点数也就是L层每个结点的输入个数。
梯度检验
神经网络算法使用反向传播计算目标函数关于每个参数的梯度,可以看做解析梯度,由于计算过程中涉及到的参数很多,反向传播计算的梯度很容易出现误差,导致最后迭代得到效果很差的参数值,所以使用数值梯度这种运算慢的方式检验结果是否近似。注意以下几点:
- 不要在训练中使用梯度检验,而仅仅在调试中使用(因为检验的计算过程非常慢)
- 使用梯度检验公式计算dθ时不要忘记正则化项(如果有L2正则化的话)
- 梯度检验不能与随机失活同时使用(如果要检验转头把失活概率先调成1.0)
小批量梯度下降法(mini-batch)
在m个样本的训练集中分成t组,每组都会梯度下降一次。如果t=1,那么就是批量梯度下降法(数据<2000),如果数据量特别大的话每一次迭代会消耗很长时间。在这俩之间的—小批量梯度下降, 每组组可以取(64~512个)。如果t=m,那么就是随机梯度下降法,有噪声且失去了可利用向量化加速运算的机会(反正每次迭代只有1个数据,没有拼成矩阵运算的这步)。
梯度下降的优化算法
指数加权移动平均
高效、所需临时存储空间少
以上Θt表示第t个样本数据值,Vt近似地表示此刻在第t个数据最近的 1 1 − β \frac{1}{1-β} 1−β1个数据的平均值。
前期的指数加权平均存在较大误差,下面通过偏差修正来减少前期指数加权平均的误差:
动量梯度下降法
对于批量梯度下降法,处理大样本太耗时;对于Mini_batch梯度下降法,相比批量梯度下降法上下波动较大,减慢了梯度下降的速度,而且无法使用较大的学习率(可能会超调震荡),动量梯度下降法是基于小批量梯度下降法:
每次迭代时用指数加权平均法得到的平均梯度带入到下降环节中,这里的每次小批量的dW值相当于上一个例子的温度值,动态调节梯度。
均方根传递梯度下降法(RMSprop)
如果某个参数Θ方向上的导数过大,那么在平方放大后SdΘ会很大,梯度下降时分母也大了,所以最后步频放小。这个算法的公式可以动态抑制或增大某个维度上的步频。可以使用较大的学习率。动态调节学习率
自适应梯度下降(Adam)
动量梯度下降法和RMSprop算法的结合。
使用动量梯度下降+偏差修正后的导数(减小小批量后数据不多引起的摆动问题),再除以RMSprop梯度下降+偏差修正的分母(动态调整各维度下降速度)。
β1推荐0.9,β2推荐0.999,ε推荐10-8
学习速率衰减
使用学习率衰减后,最初迭代时学习率较大可以使参数快速下降,随着迭代次数增多学习率减小,那么代价函数在最小值附近不会出现大幅度游离的情况。
停滞区
在高维神经网络学习中实际上陷入停滞区比陷入局部最优的情况更大,前面的Adam等优化算法可以很好地解决停滞区问题,这些优化算法会动态地调节各个维度下降步频使得尽量少走弯路。
Batch norm批量归一化
不仅仅在输入层,而在各隐藏层上也做归一化,有轻微正则化的效果。
1.使每个特征具有相同的取值范围,把等高线图“拍圆”后最优解的寻优过程明显会变得平缓,更容易正确的收敛到最优解
2.讲特征值拉回到激活函数对于输入较为敏感的区间
某个神经元 x 的值为1, 某个 Weights 的初始值为 0.1, 这样后一层神经元计算结果就是 Wx = 0.1; 又或者 x = 20, 这样 Wx 的结果就为 2. 现在还不能看出什么问题, 但是, 当我们加上一层激励函数, 激活这个 Wx 值的时候, 问题就来了. 如果使用像 tanh 的激励函数, Wx 的激活值就变成了 ~0.1 和 ~1, 接近于 1 的部已经处在了 激励函数的饱和阶段, 也就是如果 x 无论再怎么扩大, tanh 激励函数输出值也还是接近1换句话说, 神经网络在初始阶段已经不对那些比较大的 x 特征范围 敏感了
BN就是通过方法将该层特征值分布重新拉回标准正态分布,特征值将落在激活函数对于输入较为敏感的区间,输入的小变化可导致损失函数较大的变化,使得梯度变大,避免梯度消失,同时也可加快收敛。
其中gama和beta超参数可以像权重那样被Adam或RMSprop等算法学习更新。在标准化工序后我们可以得到均值0方差1的特征值,但是我们并不希望所有的隐藏单元都使用这样的特征值。比如如果激活函数使用sigmoid:
我们不希望归一化后的值都聚集在红色区间,而是希望有更大的方差以便于更好的利用s函数非线性的特性
测试时的Batch Norm
在训练时使用的Batch Norm是独立执行在各个mini-Batch上的,但在测试时可能需要对每个样本逐一处理,这时只有一个样本,一个样本的均值和方差没有意义。为了将你的神经网络运用于测试,就需要单独估算μ和 σ 2 σ ^2 σ2。对训练集中各个mini-Batch上的μ和 σ 2 σ ^2 σ2使用指数加权平均算法。
Softmax
当我们处理一个二分类的问题时,我们知道最后一层的激活函数要选用sigmoid函数,那对于多分类问题时,我们采用的,就是softmax函数。
正交化
在调参时,把调整某个环节的参数or算法看做是调节一个按钮,我们最优先选择正交化高的按钮—这个按钮的调节只影响单一评价指标,不会引起模型中多个指标变化。
单一量化评价指标
通过调整不同按钮得到的模型,设置单一评价指标来快速确定选择哪个模型。
- 精确度 A:分类正确的样本数占样本总数的比例。
- 查准率/准确率P:预测为正的样例中有多少是真正的正样例。通俗解释:面对一张真猫图片,有多少概率判定这个图片为真猫(理论上的正确率)
- 查全率/召回率R: 样本中的正例有多少被预测正确。通俗解释:100张图片50张真猫 识别出了30张真猫,R=30/50=60%(实际正确率)
F1度量是一个整合P与R的合理方法:<img
优化指标和满足指标
在判断模型优劣时常常很出现多个考虑因素,通常设置1个为优化指标,其余为满足指标。
优化指标:取最优
满足指标:为各个指标设置一个阈值,在不超过某个阈值的前提下看看优化指标
迁移学习
当我们想解决一个机器学习问题但是只有一个相对较小的数据集,可以把拥有更大数据集的相关问题训练出的神经网络,迁移到本问题上
多任务学习
比如在一张图中检测多个对象
和SoftMax还是有区别的:SoftMax中一个图片只有一个标签,只是标签不单一。多任务学习一个图片可以同时有多个标签。
使用条件:1.训练的一系列任务可以共享一些低层次特征 2.每个单任务的数据量相似 3.数据集足够大,因为如果数据集小的话,多任务神经网络不如拆成多个单任务神经网络。
卷积神经网络
非数学上严格定义的卷积运算,实际上是‘交叉相关’
卷积的含义
- 周围像素点对当前点如何产生影响。
- 一个像素点如何试探周围的像素点:在核内重点考虑的位置设1,从而筛选特征
- 降低噪声,把它周围的像素点全部加起来,然后求平均:平滑卷积核。
Padding 补白
现在有两个问题:
1.如果输入图片大小不是很大,在几层过滤器后图片就会变得很小以至于不能再进行下去
2.图片的边缘像素被用到的频率比中间的小,丢失了许多图片边界上的信息
那么怎么选择填充多少像素呢?
Valid convolution:不补白
Same convolution:经过一个过滤器后保持大小不变
卷积核的大小一般是奇数,两种原因,一是使用偶数卷积核如果要使经过后大小不变,需要不对称补白,二是奇数大小的卷积核方便定位中心点。
卷积步长
图像大小n 过滤器大小f 补白p 步长s,结果大小为 向下取整[(n+2p-f)/s +1]
卷积神经网络有三种层
随着在卷积神经网络中深度的增加视野由大变小,通道数目越来越多(特征越来越多),宽高会变小
Convolution 卷积层——提取特征
三维卷积:三通道的图片矩阵会被三通道的过滤器运算成一个矩阵。过滤器的每个通道都会分别在对应图片的通道上做普通卷积运算,最后每个通道得出来的值再相加。
可以同时应用多个过滤器,比如想要同时检测出图片的水平和垂直边缘,那最后结果矩阵的通道数就是过滤器的个数。卷积层的权重可以学习更新。
如上图,过滤器上的每个数相当于权重,输出的结果矩阵,可以对结果矩阵中的每个小方块值加偏置权重、激活函数,因为结果矩阵中每一个小方块相当于一个神经元。从输入层的663个神经元到下一层的442个神经元,并不是输入层的每个单元都和下一层的每个单元都有连接。有多个过滤器是为了在经过这一层后的结果中保留想要的某些特征,而其他信息被筛掉。~~回过头来看参数数量,虽然过滤器上的数相当于权重但并不是简单的做这样运算:3332,而是从结果矩阵入手:442 333 +2,前半部分是结果矩阵的方格数,每一个方格都需要有27个值相加得到,27这个值取决于过滤器的情况,2是偏置。~~回过头来看参数数量:(333+1偏置)*2,好处是不管输入图像有多大参数数量总是不变的,不会海量增长。
卷积层相较于全连接层的有点是参数共享(过滤器的那几个参数每一次移动都在重复用)和连接的稀疏性(下一层单元并不是需要上一层所有单元的参与)
Pooling 池化层 → Max 、Average ——缩小特征图像的大小
实际上池化层和卷积层移动方法一致,处理值的方式不同,池化层前的过滤器超参数是不变的,不需要梯度学习。在处理理多通道输⼊数据时,池化层对每个输⼊通道分别池化,⽽不是像卷积层那样将各通道的输入按通道相加。这意味着池化层的输出通道数与输⼊通道数相等。池化层的权重不需要学习。
Fully Connected 完全连接层(相当于前面普通神经网络层)
网中网 1*1的过滤器
- 缩小通道数量,因为池化层只能缩小宽高,主要用来减少计算量
中间加个11卷积核就可以减少到1240万运算量:28281611192+28283255*16
疑问:这样缩小输入那个层的特征不会失去一些信息从而降低性能吗?
答:合理地运用就不会,具体怎么合理的用没讲。
- 增加非线性性质,利用后接的非线性激活函数
深度残差网络(ResNet)
Deep residual network
比如,l+2层的激活函数运算变成a[l+2] = g(Z[l+1] + a[l] ),l层的输出值可以不经过主路径直接跳到后面某层中,也称为跳跃连接。
一般来说,神经网络层数浅时,误差会呈抛物线式先下降后上升,理论上增加深度可以使得误差不反扑一直降低下去,但是很显然运算量也是个限制。深度残差网络的能力就是在层数相对不太深的前提下还能保持误差一直降下去。也可以对梯度消失和爆炸问题有帮助。
残差块有恒等块、卷积块两种类型,主要取决于输入输出的维度是否相同。
残差块的作用:因为l+2层的输出值不仅仅由l+1层或l层决定,也就是说当某层的训练效果并不好时也能降低它对后面层的影响。
初始网络(Inceptionnetwork)
如果在某一层不好决定使用卷积层or池化,那么可以都用一遍(在同一层使用不同参数的卷积核/池化),不同参数的卷积核可能得到的结果宽高不一样,使用补白对齐。不同大小的卷积核来抓取不同大小的感受野。
至于此模型到底更合适在这层使用哪种类型,交给模型通过学习参数去选择。右边的模块图对应左边的多了1*1卷积核,是为了减少运算量。
将以上模块拼成如下网络结构:
中间的分支用来提前输出结果,也会以一定权重考虑进损失函数里,这样保证前面层的特征值虽然是处于刚开始的阶段,但对于用来预测结果来说也不会很差,这算是对网络的正则化。
深度可分离卷积(Depthwise seperable convolution)
两个步骤:1.深度卷积 2.逐点卷积(1*1前面有介绍)。目的是降低运算成本并且得到普通卷积同款输出
深度卷积算法:
输入是nwnhnc ,假设用普通卷积核要得到一个NwNhNc的输出,可以将原来的一次卷积操作拆成深度卷积+逐点卷积两步。第一步是得到预设的宽高,此时通道数和输入的通道数nc相等,第二步不会改变第一步得到的宽高,主要是调整通道数由nc变成Nc。
过滤器只能是f*f一维的,然后将nc个这样的过滤器叠到一起,每一层分别对应输入的每一层(红的盖红的上,绿的盖绿的)进行卷积运算。而逐点卷积实际上就是执行1x1卷积。
mobileNetV2是对mobileNetV1的改进,是一种轻量级的神经网络。mobileNetV2保留了V1版本的深度可分离卷积,增加了线性瓶颈(Linear Bottleneck)和倒残差块(Inverted Residual)。
1.Inverted Residuals(倒残差结构):先升维(PW),再卷积(DW),后降维(PW)
2.Linear Bottlenecks:降维后用的是线性激活(在代码中相当于1*1的卷积),而不是relu6,因为mobilenetv2认为relu将信息从低纬到高纬度不会存在信息丢失(反之会存在信息丢失),所以在expansion layer(1x1 conv进行channel升维)会保留relu6,但是在projection layer(1x1 conv进行channel降维)会取消relu6。
Expansion layer表示扩展层,使用1x1卷积,目的是将低维空间映射到高维空间(升维)
Depthwise Convolution表示深度可分离卷积,完成卷积功能,降低计算量、参数量
Projection layer表示投影层,使用1x1卷积,目的是把高维特征映射到低维空间去(降维)
目标检测
识别+定位
输出的结果向量:(图片中是否存在对象,x坐标,y坐标,宽,高,对象1,对象2…1)
目标定位
地标检测
在图片上打关键点,比如人脸表情识别,点出眼角、嘴角、脸轮廓等关键特征点,标注点1、点2…但是在不同的图片标注点1、2、3…代表的意义分别是固定的,比如标注点2永远表示人右眼的左眼角坐标。
在卷积网络上实现滑动窗口
因为卷积可以减少运算量。
滑动窗口的概念是,如下14*14的窗口大小,在原图片上以一定的步长裁剪出N个14*14的图像丢进网络识别。而以卷积操作的形式,用原图进行一次大的向前传播可以得到所有预测。
利用滑动窗口进行目标检测时,低级做法是:滑动一下窗口,送入CNN执行一次分类,再滑一下,再分类这样效率太低。我们很容易发现,在每次滑动得到的窗口卷积的过程中,很多地方是重复进行了卷积运算,那我们可不可以一次性送入整张图片,直接得到所有滑动窗口的结果呢?
那么由于全连接层的存在,会改变原先矩阵的结构,无法达到我们只传入一整张图实现所有滑动窗口的目的(即FC的存在会使输入图像固定大小)。所以我们先要将全连接层等价地变成卷积层:(注:全卷积网络参数量没有变)
1. 然后第一层全连接层我们换成采用400个5x5x16的卷积核进行卷积。
2. 第二层卷积用400个1x1x400的卷积核进行卷积
3. 最后用4个1x1x400代替softmax
滑动步幅是2是如何实现的呢?其实是通过max-pooling中的池化参数为2,这就相当于以大小为2的步幅在原始图片上应用CNN
这种算法仍然存在一个缺点,就是边界框的位置可能不够准确。其中一个能得到更精准边界框的算法是YOLO算法,基本思想就是将图像划分成nxn个grid cell,对象的中点落在哪个cell中,哪个cell就负责该对象的预测。
Bounding Box 预测
YOLO 算法:先将图片离散地分成若干网格,找出图片中所有对象的中点,看中点落到哪些格子上,然后对这些网格使分别用图形分类和定位算法。所以这个算法的优点在于神经网络可以输出精确的边界框,边界框并不是像前面那样同网格划分位置定死。
交并集
判断目标定位准确率的标准,预测标签面积比真实标签面积
非极大抑制(Non-max suppression)
对于同一个对象检测了多次出现重复框(例如使用滑动窗口造成多个网格框都检测到了同一个对象),选概率最高的留下。
锚框(anchorBox)
解决一个格子中存在多个对象的问题。
到目前为止,对象检测中存在的一个问题是每个格子只能检测出一个对象(可以是这唯一的一个对象有多种可能性)。如果你想让一个格子检测出多个对象(再特殊点一个中点对应好几个对象)。
每一个格子只会输出1个向量。
现在每个对象都和之前一样分配到同一个格子中,分配到对象中点所在的格子中,以及分配到和对象形状交并比最高的锚框。
但是这个锚框算法没办法处理一个格子有多个同类对象、一个格子对象数超过锚框数
转置卷积
转置卷积的运算步骤可以归为以下几步:
- 在输入特征图元素间填充s-1行、列0(其中s表示转置卷积的步距)
- 在输入特征图四周填充k-p-1行、列0(其中k表示转置卷积的kernel_size大小,p为转置卷积的padding,注意这里的padding和卷积操作中有些不同)
- 将卷积核参数上下、左右翻转
- 做正常卷积运算(填充0,步距1)
下面假设输入的特征图大小为2x2(假设输入输出都为单通道),通过转置卷积后得到4x4大小的特征图。这里使用的转置卷积核大小为k=3,stride=1,padding=0的情况(忽略偏执bias)。
首先在元素间填充s-1=0行、列0(等于0不用填充)
然后在特征图四周填充k-p-1=2行、列0
接着对卷积核参数进行上下、左右翻转
最后做正常卷积(填充0,步距1)
One-Shot Learning
意义:
- One-Shot试图将一个类别的训练图像减少,极端情况时只有一张图片,减少训练量
- 可以无需重新训练即可应用于新的类别的数据
与传统神经网络的区别:
传统的神经网络试图学习某一个类别图像的内部表达,One-Shot Learning试图学习不同图像之间的区别
三元组损失(Triplet loss)
假如你有一个10000个图片的训练集,里面是1000个不同的人的照片,你要做的就是取这10000个图片,然后生成这样的三元组,然后训练你的学习算法,对这种代价函数用梯度下降,这个代价函数就是定义在你数据集里的这样的三元组图片上。
损失函数: L(A,P,N) = max**(** ( | f(Anchor) - f(Positive) |²-| f(Anchor) - f(Negative) |² + α),0**)**
earning
意义:
- One-Shot试图将一个类别的训练图像减少,极端情况时只有一张图片,减少训练量
- 可以无需重新训练即可应用于新的类别的数据
与传统神经网络的区别:
传统的神经网络试图学习某一个类别图像的内部表达,One-Shot Learning试图学习不同图像之间的区别
三元组损失(Triplet loss)
假如你有一个10000个图片的训练集,里面是1000个不同的人的照片,你要做的就是取这10000个图片,然后生成这样的三元组,然后训练你的学习算法,对这种代价函数用梯度下降,这个代价函数就是定义在你数据集里的这样的三元组图片上。
损失函数: L(A,P,N) = max**(** ( | f(Anchor) - f(Positive) |²-| f(Anchor) - f(Negative) |² + α),0**)**