一、文章来由
好久没写原创博客了,一直处于学习新知识的阶段。来新加坡也有一个星期,搞定签证、入学等杂事之后,今天上午与导师确定了接下来的研究任务,我平时基本也是把博客当作联机版的云笔记~~如果有写的不对的地方,欢迎批评指正。
二、《一天搞懂深度学习》
300多页的PPT,台大教授写的好文章。
对应的视频地址
1、Lecture I: Introduction of Deep Learning
(1)machine learning≈找函数
training和testing过程
(2)单个神经网络
神经元连接起来构成网络
(3)deep 神经网络
Softmax层作为最后的output层,
找function的过程就是找一个函数让total loss最小
(4)deep比fat好
模块化 –>更少训练数据
2、Lecture II: Tips for Training DNN
如何在训练数据上效果更好
如何在test数据上效果更好
loss函数:Cross Entropy比Square Error要陡峭
(1)另一个激活函数,ReLU
因为多层的时候,激励函数算出来的值会越来越小,所以用ReLU把已经为0的值去掉
ReLU is a special cases of Maxout
(2)Learning Rates
If learning rate is too large, Total loss may not decrease
after each update
If learning rate is too small, Training would be too slow
一个更popular的做法是,开始大一点learning rate,之后减少
(3)动量
如果达到局部最优解,任然给一定机会向前探索(类似还给一定动量向前冲)
前馈控制(Feedforward Control) 就一般而言,管理中采取的 控制 可以在行动开始之前、 进行之中或结束之后进行,称为三种控制模型。第一种称为 前馈控制 或预先控制;第二种称为 同期控制 或过程控制;第三种称为 反馈控制 或事后控制。
三、MLDS Lecture
李老师很棒的课,课程地址:http://speech.ee.ntu.edu.tw/~tlkagk/courses_MLDS17.html
(1)全联通的神经网络,通常很多不必要的参数,可以剪枝
(2)RNN用于处理sequence很好用,因为就是同一个神经元的重复。
特点:不好train,一旦train好了,在test上面效果不错,不易过拟合
(3)LSTM有一个变化很慢的部分,用于模拟记忆
还有金字塔型神经网络,对于不收敛的data效果很好,可并行
另一个现在也比较常用的方法 GRU,运算量较LSTM要小,且参数少不易过拟合
LSTM的各种架构的表现
(4)share参数的情况,称之为filter或kernel,卷积特性
通常receiptive filed 只在一个轴上滑动,且是包含完整的这个轴信息,通常是时间轴
四、cs231n
第二讲:数据驱动的图像分类方式:K最近邻与线性分类器
(1)经典图像识别算法不可扩展,data-driven的方式更科学
早期没有使用的原因是早期没有这么多data,训练的模型是一个类
(2)nearest neighbor classifier
记住所有training images和他们的label,找一个最相近的label
这种方法简单,但是应用时效率低
CNN相对于这个方法反过来,不论训练数据多少,分类时间都是固定的
KNN是nearest neighbor classifier的一种,找到最近K个images,have them vote on the label
5个最近点,分界线变得平滑
超参数:
1)最好的距离选取标准
2)k如何选
(3)5折理论
将所有data5折,其中一折用于超参数的设置
循环验证,选取不同的折来设置超参
(4)线性分类器
类似于filter或者模板
f = Wx+b
将x展平,相乘于W,再加上b
所有的分数都是所有像素点值的加权和
W和b要训练出来
(5)为了定量选择的模型或者权值,定义了loss函数
为了让loss函数最小化
第三讲: 线性分类器损失函数与最优化
(1)计算loss,采用multiclass SVM loss
相当于单个相减,然后加安全系数1(可以是任意正数),hinge loss
full training loss就是在其上除以总数
代码实现
但这个里面有一个bug
如果double每个值,其实结果没有影响,但是会使数据间的差值越来越大
(2)正则化,给每个数字的权值尽量平均
分散权值
(3)softmax classifier
(4)不同的loss函数的比较
最大化log概率比直接最大化概率好
最大不同:
SVM比softmax稳定,就算slightly提高值也不会变化(前提条件是误分类评分小于正确评分减一),softmax不然,将所有样本点纳入考量
(5)梯度下降法
计算复杂,且如果参数很多的时候,每个都要计算不太可能
用微积分求解
要检查,写起来简单
并不是全部数据,而是抽样
SGD是一种常用的更新W的方法
(6)经典方法是用 特征+线性分类器 的方法
比如颜色直方图+hog边缘特征,这样线性分类器就有办法处理,通常是将一幅图人为拆分成多个特征的组合
=== 某种程度上的统计特征
传统方法 vs 深度学习
第四讲:反向传播与神经网络初步
1、求偏导
反向传播
在正向计算的时候,每个参数就能够把其对最后的结果偏导公式计算出来
导数的意义是,因变量的增量与自变量增量的比值
正向和反向传播的时间差不多相同。
2、反向传播门的性质
加法门:梯度分配器,将梯度分配到前面的门
max门:梯度路由,将最大梯度放入路由,反向传播的时候只分配给最大的那个(因为不是最大的,对结果产生不了影响)
乘法门:梯度开关
没有回路
3、正向传播与反向传播
1、总结前馈和反馈
对于每次更新,都要进行一次完整的前馈与反馈:
前馈计算loss,反馈计算梯度,update在负权值上权值微调
雅可比矩阵是一阶偏导组成的矩阵
特殊情况下,不必计算雅可比行列式所有值
每一层之间都是通过矩阵连接
2、神经网络
隐含层可以有多个数,自己定义
隐含层引入多样化
换算成公式太复杂,反向传播简化计算
每个单个的neuron都可以看作一个线性分类器
各种激活函数
relu会让神经网络快很多,默认激活函数首选
算神经网络的层数是算有权值的层数
正则化系数越低,拟合程度越高,也越容易过拟合
几条线就大概是几条边界,所以对于circle data来说,3条就好
三条边的组合,第二层只是把这些组合拼在一起
网络中的neuron越多越好,但是要选择合适的正则化项,而不是减少neuron,但可能有没时间训练等因素,所以选用更小的network
如果网络很小,有一种网络优化算法L-BFGS,mini-batch好用,通常用不上
对于更深还是更宽也没有一个确定的答案,对于图片来说,层数更重要
对于其他问题,是data相关的
不同层用不同的激活函数
通常不会这样做,通常是选一个激活函数,整个网络都用,不同层中换不同激活函数一般并没有什么好处
第五讲:神经网络训练细节
https://github.com/BVLC/caffe/wiki/Model-Zoo
大量已经训练好cnn权值数据的模型已经上传到网上,超参数也设置好了
讲述步骤
激励函数
(1)sigmoid function
梯度消失问题
问题很多,饱和的神经元要么非常接近0,要不非常接近1
—>反向的时候,梯度趋于0
问题1:local梯度很小
只在sigmoid的激活区域才会有用
问题2:
不关于原点中心对称,输出值都在0,1之间
w的梯度要么全正要么全负,收敛速度很慢
问题3:
exp()耗时
但在rnn中用到,因为特殊原因
(2)tanh(x)
(3)ReLU
网络收敛速度快,之前的6倍
问题:不中心对称
如果ReLU从未被激活,那反向的时候就会梯度消失,不激活就不能进行反向传播(不更新权值,可以说什么都不做)
如果激活了,因为局部梯度是1,所以都是将梯度传递给前面的
如果在x为0的时候,梯度未定义,随便选一个对结果也不会有很大影响
dead relu问题:
永远不激活,也不更新
学习率过高也会出现这个问题
解决方法:可以给一个小的bias,重新激活已死的神经元,但是讲者认为这个方法没什么用
(3)Leaky ReLU
也不一定是0.01,可以是任意值,这个α可以被学习,反馈学到
计算图中的每个神经元都有α,可以通过学习学到
还是relu最常用
(4)ELU
(5)maxout
数据处理
PPT中介绍了很多数据处理方法,但在图像处理中归一化不常用,但0中心化应用很多,均值中心化
每个像素减去均值image或者减去per channel 均值,后者更常用
权重初始化
过去人们常用全0初始化,但是效果不好,因为所有神经元的计算完全相同,反向的时候梯度也相同。最好采用随机小值。
如果初始化不好,很可能饱和,反向不了
策略也已经有了,2010年提出的Glorot提出的Xavier初始化
但是这个用于tanh,不用于relu
但新发论文引入因数2
但这就是一个data-driven的活,不同批数据效果不同
还有方法是通过一个公式,能够将数据高斯分布化
BN有很多优点,如下:
代替了一部分正则化的工作
Note: at test time BatchNorm layer
functions differently:
The mean/std are not computed
based on the batch. Instead, a single
fixed empirical mean of activations
during training is used.
(e.g. can be estimated during training
with running averages)
会稍稍延长一点时间
Babysitting the Learning Process
正确性检查,非常重要
为了确保神经网络工作正常:
step1:初始化2层神经网络,weights和bias用最简单的初始值
step2:two_layer_net那句是train这个网络,最重要的是关注要返回的loss和梯度,讲者取消了正则化,以确保损失值正确
step3:估算,softmax是-log(1/10)
step4:对于小数据,能够达到过饱和说明具有合理性(反向传播+update+学习率OK,算法没有大问题),然后才考虑增大训练集。所以不应该扩大训练集直到完全通过测试。
step5:扩大训练集,在找到好的learning rate,从小的learning rate开始
learning rate太小的情况,这种假设是要建立在完成了正确性检查之后,因为检查无误才能大胆判断
但如果rate太大,cost就爆炸了
cost: NaN almost
always means high
learning rate…
超参数优化
粗糙—>精细的过程
超参数优化要随机取样超参数,网格取比随机取差
一些可优化的超参
学会解读不同的图形
也要关注一些其他的参数,比如准确率
总结:
下节课继续:
第六讲:神经网络训练细节 part2
如何训练神经网络
为什么要用激活函数?
答:如果不用,不论多少层,如上图,也只是一个三层的三明治,还是相当于一个线性分类器,使用线性分类器记忆data
如果初始权重太小,在网络中activate,权值更新就会趋于0;如果太大,就会梯度爆炸
—>那么将会以超饱和的网络或者全0结束
–>选择一个合理的初始化范围很重要
batch normalization减轻初始化权重设定的麻烦
dx是梯度
原来只是用简单的梯度与learning rate相乘,现在要更复杂一点
对于gsd,在竖直方向上比较快,在水平方向上比较慢,所以会震荡,有一种方法就是用momentum方法
mu在0与1之间,通常取0.5~0.9
v通常初始化为0
不同参数更新方法
(1)nesterov momentum
original的方法是建立了一个actual向量,但是现在要做的是想一步超前,计算下一步的梯度,会有一点点的不同
动量法的出现也不是因为有局部最小值,当网络规模越来越大的时候,局部最小值的问题不用特别关心
(2)AdaGrad update自适应梯度法
凸优化理论的成熟拿过来的
用一个cache(梯度的平方和构成,联合矢量,每个维度记录相应梯度的平方和,有时叫做 second momentum),per parameter adaptive learning rate,保存参数空间的每一维都有不同的learning rate,比如上面那张图,垂直方向的learning rate会递减,水平方向的会增大
反对有个问题:learning步长会减少,最终停止
(3)RMSProp update
Hinton做了一个小的改动,将上面的那个问题解决了,不会更新停止,而是不断带来更新
梯度大的地方减慢速度才是最好的
(4)Adam update
ada和momentum的结合
动量用于稳定梯度方向
beta1和2是超参数
beta1通常是0.9,beta2通常是0.995
Adam很好用,通常讲者使用Adam
learning rate 怎么设置更好
其实这里很难说,开始的时候最好使用大一点的learning rate,但是到后期可以使用小一点的rate,因为系统能量太大不容易settle down
另一些凸优化方法,但是不细讲
Hessian Matrix,又译作海森矩阵、海瑟矩阵、海塞矩阵等,是一个多元函数的二阶偏导数构成的方阵,描述了函数的局部曲率。黑塞矩阵最早于19世纪由德国数学家Ludwig Otto Hesse提出,并以其名字命名。黑塞矩阵常用于牛顿法解决优化问题。
- Adam is a good default choice in most cases
- If you can afford to do full batch updates then try out
L-BFGS (and don’t forget to disable all sources of noise)
In practice
实际的大数据集不会采用 L-BFGS
adam 不会让你学习率变为0,因为他说leaky gradient;如果用adagrad就不一样了,learning rate可能降到0。
Evaluation: Model Ensembles
- Train multiple independent models
- At test time average their results
Enjoy 2% extra performance
这里x_test是对于现在参数x的一个指数衰减,使用数据集和测试集,结果总比x要好,像参数进行加权的集合(不好解释,想象碗状函数优化问题,在最低点周围不停跳动,最后做一个对这些值的,能够更接近最低点)
Regularization (dropout)
涉及small samples,在前向的时候,要随机将一些神经元置0
不仅在前向的时候,反向的时候也要用
都要乘以U1和U2,随机失活过滤器
防止过拟合,如果只用一半网络,表达能力就变弱了,偏差-方差均衡
一旦dropout,没有失活的神经元参数或者说神经元梯度才会被更新,因为一旦神经元被关闭,把输出值固定为0,就不会有梯度经过他,他对应的上一层神经元的权值也不会更新,相当于是sub-sampling
因为他的值在计算损失函数中没有用到,所以他的权值也就不更新了
在多次循环中我们会用相同的数据点训练不同的共有参数的模型—>这就是随机失活
每次前向的时候,我们sample,就会得到一个子网络
每一次循环中,我们先得到一个mini-batch,然后在神经网络中取样,得到那些没有失活的神经元,形成子网,然后前向+后向,然后得到梯度,一直重复这个过程
是否可以在不同层失活不同的比例,可以的,如果想更强的正则化,就失活多一点,比如一层有很多神经元,就可以多失活一点
也可以对每一个神经元进行一定概率的失活,叫做drop connect
这里需要补足training的0.5那部分系数,需要在test时激活函数也乘上这个系数,以减小输出值
也有一种方法是在training中将激活函数输出变大
inverted dropout实际中应用很多
这里的0.5不是绝对的,是期望
CNN
进入正题了,目前有一些很有名的网络,比如:
AlexNet,VGG-Net,LeNet,GoogleNet,ConvNet
AlexNet是2012年提出,但是跟1998年提出的LeNet差不多,差别就是一个用sigmoid一个用relu,而且更大更深,用gpu计算。
ConvNet对图像分类在行
第七讲:卷积神经网络详解
用一个5*5*3的卷积和做运算
—>得到一个28*28*3的卷积激励map
—>用不同卷积filter做运算,可以得到一个多层的卷积组,比如6个,就得到28*28*6的卷积组
—>这些会被feed到下一个卷积层
当然这个过程中要经过激励函数
通常filter都很小,一般3*3或者5*5等等
上图中,第二层卷积层的大小变成5*5*6,有10个,所以得到一个24*24*10的卷积组
在每一层这会得到不同的特征。
就是不同层的组合
步长不能是任意的,3的时候不允许
有时候会对图像做填补
作用就是,如果7*7的图像,用3*3的来filter,尺寸不会缩小
因为可能有很多层,如果缩小的太快,是不好的性质
参数还要加上bias
总结一下:
K总要是2的指数,为了方便计算,有些程序对于2指数有特殊优化
1*1的filter也是OK的,因为不仅是一个的,而是整个深度都参与卷积
filter总是偶数,奇数尺寸的滤波器有更好的表达,2*2也不是不行,但没3*3好
为什么填充的时候,只填充0,因为这样filter只会考虑输入的数据,点乘的时候,0不会对输出有贡献。即便是填充附近的数据。
每一层一般也不会用不同size的filter。
只有第一个卷积层能接触到原始数据,后面的都是接触前一个的数据
filter === kernel
在主流深度学习框架中也有体现:
站在神经元的角度来看这个问题:
每个神经元只管自己的一小块区域(对应于一个kernel),一块板上的所有neuron在一个激活映射中都share一个weight
一块版上的neuron有两个重要特性:
共享参数+局域连接
对于多个kernel可以理解为:
所有神经元全部以一个局域模式,共享参数,并关注着同一个数据体
如上图的5个neuron都看着同一块数据
共享参数+局域连接的作用:
从视觉上控制模型的能力,神经元平面上希望计算相似的东西,例如小的边缘,这样的功能是有意义的,也是一种控制过拟合的方式
pooling就是一种下采样
max pooling就是用几个里面的最大值代替,来进行下采样
当然也是有average pooling
这就是两种最常见的pooling技术
与Conv layer类似的是,pooling layer也有自己的定义,如下图
这里只有两个参数,另外有输入输出的定义
fc层就是一个neuron来计算分类得分
98年提出的LeNet
AlexNet,图显示不全,而且有两条路的原因是因为当时gpu发展没有那么好,就分了两个
第一层应该是227,而不是224,Alex原作者说的有问题
pooling layer没有参数,只有卷积层有参数
AlexNet完整的架构
依次为卷积-池化-norm,norm层是一个进行规范化的层,2012年前经常使用,现在不用了,因为对结果没有帮助
也会对整个BP
BP的时候特别注意:
因为参数共享,当用filter做卷积的时候,所有neuron共享参数,所有滤波器梯度都汇总到一个weight blob
第一次使用relu
用了data 增强,拿到图像后不是直接用,而是先预处理
用了dropout 0.5,只在最后几层用了
在监控准确率达到平台期,学习率就除以10,基本减少一两次,神经网络就收敛了
2013年冠军是ZFNet,也是在Alexnet上改进的
fc7已经成为一个名词:代表统计分数之前的最后一层
当然在每一个卷积层后有一个relu层
在fc层后也应该有一个relu层
2014年VGG提出,将top5 error率一下子刷到7%
全部的架构只使用 3*3 conv layer
2*2 max pooling layer
重复堆叠到16层,效果不错
架构如下图
我们注意到,过滤器在增加(更深),每个feature map在变小
224*224 —> 7*7
但是这一层深度不再是3通道,而是512个激活通道(通过512个过滤器得到)
最后是每张图片向前需要93m的内存,我们需要保存这个值,因为要做BP,回来需要update,所以要double这个值,组后是最小200m左右
内存消耗主要在前期,见下图,同时参数最多的时候在fc的时候
现在代替全链接层有—>average pooling技术
不直接全链接,而是改变他,成512个数,是通过average pooling对每个(feature map)取平均值得到512个数,效果几乎一样好,可以避免使用大量参数
GoogleNet使用这个方法
VGG有个很简单的线性结构,GoogleNet就复杂化了
其最大创新点是加入了inception module
GoogleNet用inception layer取代了卷积层
将7*7*1024降到1*1*1024
但是还是更多的人使用VGG,因为更好更统一的结构,人类的错误率差不多是5%,如果训练人可以降低到2%~3%
2015年的冠军是3.6%,来自于MSRA的residual network。
当然层数是越多越好
不过不是简单的堆叠
上图说明了,如果要增加层数,不要用naive方法,要用resnet方法
微软亚研院的resNet有152层,训练时间比较久,但是跑起来比VGGNet快
resnet,采用跳跃的连接,会通过一个大的因子压缩到一层 56*56的空间,剩下的150多层,都只作用在56*56的数组里,将很多信息打包到如此小的空间
resnet的工作原理如上图,需要加上输入的残差
原因就是,加法在BP的时候,梯度是直接分发给孩子,这样跳跃的网络就可以帮助跳过很多中间层,因此可以训练一个与原图像很像的图像,中间的层可以学习如何加入信号使得更有效
如何训练一个残差网络:
Alexnet用了0.01的初始学习率,因为残差网络有batch normalization,所以可以提高一点,没有使用dropout
残差网络也不用在加上的那个部分加权,最开始可以直接对结果产生影响
五、cs231n笔记
之所以将note部分单独列出来,是希望不破坏之前听课的笔记完整性,同时笔记部分有很多需要另记。
image classification notes
python介绍那章就直接skip了
Nearest Neighbor分类器
对于NN分类器有两种计算距离的方法,L1和L2
(1)L1距离,即逐个像素比较
例子如下:
(2)L2距离,从几何学的角度,可以理解为它在计算两个向量间的欧式距离。
L1和L2比较。比较这两个度量方式是挺有意思的。在面对两个向量之间的差异时,L2比L1更加不能容忍这些差异。也就是说,相对于1个巨大的差异,L2距离更倾向于接受多个中等程度的差异。L1和L2都是在p-norm常用的特殊形式。
k-Nearest Neighbor分类器
上面两种分类器不好的原因:
为什么只用最相似的1张图片的标签来作为测试图像的标签呢?这不是很奇怪吗
KNN原理:
使用k-Nearest Neighbor分类器就能做得更好。它的思想很简单:与其只找最相近的那1个图片的标签,我们找最相似的k个图片的标签,然后让他们针对测试图片进行投票,最后把票数最高的标签作为对测试图片的预测。所以当k=1的时候,k-Nearest Neighbor分类器就是Nearest Neighbor分类器。从直观感受上就可以看到,更高的k值可以让分类的效果更平滑,使得分类器对于异常值更有抵抗力。
KNN也有一个问题,因为很容易被背景主导,而不是图片本身的语义。