Skip to content

Latest commit

 

History

History
714 lines (406 loc) · 30.1 KB

学习笔记:斯坦福大学计算机视觉公开课.md

File metadata and controls

714 lines (406 loc) · 30.1 KB

目录

学习笔记:斯坦福大学李飞飞机器视觉公开课

学习笔记:斯坦福大学李飞飞机器视觉公开课

CV历史回顾 目录

k近邻与线性分类器 目录

k近邻 目录

显示编程

def predict(image):
	# ???
	return class_lable

数据驱动

超参数与超参数的选择 目录

5折验证

线性分类器 目录

应用实例:用神经网络描述图片,CNN+RNN

  • 卷积神经网络:用于计算机视觉
  • 循环神经网络:适用于排序问题

损失函数 目录

总体损失函数:

思考:

python代码

但是这个损失函数其实是有问题的!!!

当我们在一个数据集中找到一个使损失函数为0的W,那么这个W是唯一的吗?

不唯一,当找到一个满足使损失函数为0的W时,对其进行线性缩放,可以得到一系列的W空间,并且根据这个损失函数它们的工作方式都相同,它们都满足使损失函数为0

正则化 目录

L2 regularization的例子:

Softmax Classifier 目录

计算损失函数示例:

Softmax vs. SVM 目录

最优化 目录

数值梯度方法代码:

  • approximate
  • very slow to evaluate

运算速度慢,且求得的数值并不准确

解决方法:牛顿-莱布尼茨微积分

梯度下降法代码:

Mini-bacth Gradient Descent 目录

only use a small portion of the training set to compute the gradient

代码:

Loss over mini-batch goes down over time

建议:一开始选用一个比较大的学习率,然后随着迭代次数的增加,逐渐将学习率调小

神经网络初步 目录

反向传播 目录

计算图与计算图导数 目录

该部分请参考《学习笔记:神经网络与深度学习》

实例 目录

要用到的导数公式:

Back propagation过程:

计算图中不同计算单元在梯度流动中的作用:

  • add gate: gradient distributor——每个输入分配相同的梯度
  • max gate: gradient router——较大值的局部梯度为1,较小值局部梯度为0
  • multi gate: gradient… “switcher”?

前向/反向传播伪代码:

深度学习开源框架中的例子 目录

Torch 目录

Caffe 目录

向量化与Jacobian矩阵的稀疏性 目录

雅克比矩阵(一阶偏导数以一定方式排列成的矩阵)可能存在一定的稀疏性,则可以不需要将整个矩阵求出来,从而提高算法效率

雅克比矩阵稀疏性的例子:

反向求梯度获得Jacobian matrix,其元素值要么是1,要么是0,则只需要观察那些小于0的输入,然后将这些维度上的梯度置为0

神经网络 目录

从线性分类器到神经网络 目录

训练神经网络 目录

激活函数 目录

历史上,一开始使用的是tanh函数,2012年 ReLU 函数开始流行(让神经网络快很多,推荐作为默认选择),

构建神经网络 目录

增加隐含层神经元数,带来非线性分类性能的提升

加入正则化(对高维度W进行惩罚,防止过拟合)

神经网络训练细节 目录

训练中的错误认识:小训练集照样可行 目录

迁移应用过程:

在ImageNet的预训练已经有人做好了,并且已经将自己训练好的模型(CNNs的权值数据)上传至 Caffe model zoo

神经网络发展回顾 目录

(1) 1957年:Frank Rosenblatt —— Perceptron,感知器

其激活函数使用的是二进制阶梯函数,没有微分运算,也就不能进行反向传播

没有提出损失函数的概念,也没有反向传播的概念,只有以下特定的学习法则:

(2) 1960年:Widrow and Hoff —— Adaline/Madaline,适应性神经元

将感知器整合成一个多层次的感知器网络

(3) 1986年,突破性进展:Rumelhart et al —— 第一次用清晰的公式很好地阐述了反向传播的概念

找到了一个让人信服的原则,通过反向传播可以对神经网络进行训练

不幸的是,当时他们将神经网络设计得更深时,与其他机器学习工具包相比,它们的工作效果并不好

随后该领域沉寂了近20年

(4) 2006年,该领域研究复兴:Hinton and Salakhutdinov —— nature上发表论文,第一次建立神经网络模型

训练步骤:

  • 首先是逐层进行预训练,使用RBM(受限玻尔兹曼机)

    不是在单通道中对所有的层都经过反向传播,相对于在训练第一层时使用一个无监督的目标,然后在此基础上训练第二层,接着训练第三层,第四层...

  • 第一步训练完成后把它们整合起来,然后进行反向传播和细调

此时,人们已经能够对神经网络进行训练了,但依然没有很多人注意到这个领域,直到2010年至2012年

(5) 2010-2012年,深度学习兴起

  • 2010年

    将神经网络用在GMM-HMM语音识别模型中,将其中一部分改变成神经网络的一些东西,很好地提高了识别效果

  • 2012年

    机器视觉的图像识别领域:由Alex Krizhersky等人实现的网络在ImageNet挑战赛中碾压其他对手

Activation Function 目录

1. sigmoid

  • 会导致在反向传播算法中出现梯度趋于0的问题 —— 梯度弥散(消失)

  • sigmoid函数的输出不是关于原点中心对称的,输出在(0,1)范围内

    Q:当网络中每个神经元的输出都为正值,且为(0,1)时,会发生什么?

由于网络中每个神经元的输出都为正值,且为 (0,1) ,即 0< li <1

则可推出 dli / dli-1 = li-1 * (1 - li-1) > 0

则反向传播的初始梯度dL / dln 的正负取值会直接全盘影响整个网络中的dwi的正负取值,要么全为正,要么全为负

  • 和其他函数相比,该函数中exp( )的计算很耗时

2. tanh —— Yan LeCun 在1991年提出

关于原点中心对称

梯度依然可能饱和

3. ReLU —— max ( 0 , x ) ,Krizhevsky 在2012年提出

相比sigmoid,收敛速度快了6倍

原因:

  • Does not saturate (in +region)
  • Very computationally efficient —— 只是进行比较操作而已
  • Converges much faster than sigmoid/tanh in practice (e.g. 6x)

缺点:不是关于原点中心对称

4. Leaky ReLU $nbsp;$nbsp;$nbsp; f(x) = max( 0.01x, x )

5. Exponential Linear Units (ELU) 2015

6. Maxout "Neuron" 2013年,由Goodfellow提出

数据预处理 目录

归一化方法在图像处理中并不常用,但0中心化应用很多

它们在图像处理中并没有应用

在图像处理中用到的数据预处理方法只有中心化,例如:

初始化权值 目录

简单随机初始化 目录

探索更合适的初始化方法:Xavier 目录

情况一:随机初始化 X 0.01 目录

  • 先看逐层的输出的均值与方差的变化趋势

由于激活函数选择的是tanh,所以神经元输出的均值会归于0左右

其方差一开始是1,接下来的层中逐渐下降到0

  • 再分别统计每层的输入(或输出)的分布情况

第一张图是合理的,数据处于-1到1之间

然后这些数据分布开始“坍缩”,最终只分布在0上,即在这个网络中,最终所有的以tanh为激活函数的神经元,输出都是0

分析原因:

情况二:随机初始化 X 1.0 目录

情况三:Xavier 目录

W = np.random.randn(fan_in,fan_out)/np.sqrt(fan_in)

基本规则:一些大的标准差,基本上是靠谱的初始化方法

从图中可以看出,tanh神经元的输出在-1到1之间,其分布更有意义,数值在作业区间内没有出现饱和的情况

其方差会下降得更快

看数据分布:

第一层中,能看出一些分布,但是在之后的层中,分布越来越窄,并趋向于0,即在这种初始化方式下,越来越多的神经元没有被激活

Xavier初始化方法不适用于ReLU网络

针对ReLU网络的Xavier方法调整 目录

在Xavier方法中,前向传播时,经过神经元的激活函数ReLU,一半的贡献被设置为0,直观上来看,输出的方差分布减半

这样处理后,我们得到了针对ReLU输出的合理分布

若没有这个因子2,激活函数的输出分布会以指数级收缩

比较有无因子2两种情况下,损失函数的收敛情况:

数据驱动 目录

Batch Normalization 目录

该部分可以参考 《学习笔记:改善深层神经网络——Batch正则化》

基本主旨:让神经网络的每一层、一批数据的每个特征维度,都有粗略的单位高斯激活(unit gaussian activation)

保证每一列(代表一个维度的特征)的每个单位都是 unit gaussian

执行Batch Normalization的位置:

测试时BN操作稍有不同,其γ和β的获得:

  • 基于整个训练集一次性算出来;
  • 在训练过程中,基于各个mini-batich的均值和方差,进行指数加权平均,如下图:

Babysitting the Learning Process 目录

Double check the loss 目录

例子:两层神经网络,进行10类别的判别,最后使用的是softmax分类器

先初始化权值:由于使用的是两层的浅层网络,采用原始的权值初始化方法即可

然后进行前向传播,得到损失(loss)

  • 1st check: 取消正则化,来检查损失值是否正确

期望的损失值应该为-log(1/10),想知道原因请点 这里

  • 2nd check: 启动正则化,预期损失值会上升

因为在原始函数里多加了一个新的项 —— 正则化项

完整性检查 目录

对于一个神经网络,尝试使用训练数据的一小部分进行训练,测试神经网络是否可以得到一个过拟合(overfit)的模型 —— 网络的训练可以正常进行,即反向传播应该在正常工作,学习率的设置也比较合理

取20个训练样本和20个标签,然后保证模型基于这一小部分数据训练,最终可以得到损失值基本为0,即实现完全过拟合

学习率的调整 目录

学习率太低的情况:

学习率太高的情况:

超参数优化 目录

策略一:粗糙到精细 目录

粗糙到精细化的思想:

  • First stage: only a few epochs to get rough idea of what params work
  • Second stage: longer running time, finer search … (repeat as necessary)
  • 最后选出一个表现最好的参数

coarse search

finer search

策略二:网格搜索 目录

使用一个固定的步长,在学习率和正则化系数上每一步取一个值

但是,其性能不如随机取值好

前提条件:在超参数优化过程中,经常发生的是,一个超参数的重要性会远远高于另一个

具体原因没有听懂,未知待解!

观察损失函数变化形式 目录

损失函数的变化趋势并不是期望中的指数化,而有点接近于线性函数——可能原因:学习率太低了
一开始有一个很高的平稳值,然后在某一个时间点,突然开始下降——可能原因——初始值选的不好。

一个错误的初始值会让梯度值在一开始就接近于0,使得损失函数在一开始几乎没有下降,直到运动到某一个点的梯度才有了明显的变化

观察准确率变化形式 目录

评估参数更新比例 目录