本文用作《深度学习21天实战caffe笔记》的备忘,请结合原书食用~
前言
- Caffe框架以“层”为单位对深度神经网络的结构进行了高度的抽象。
- Caffe由贾杨清开发。
- 卷积神经网络发明者Geoffrey Hinton在20世纪70年代提出深度学习理论,随着NVIDIA GPU的广泛使用才大量应用。
- 深度学习年代久远,当时受限于计算能力不足和数据集匮乏陷入低谷,直到云计算、大数据时代到来才突飞猛进。
第一天 什么是深度学习
- 带“学习”功能的机器:“看”未知系统的输入-输出对(训练样本),自动得算法,可举一反三(泛化)。
- 训练样本 D=z1,z2,z3⋯zn D = z 1 , z 2 , z 3 ⋯ z n , zi z i 位输入-输出对。
- 惩罚函数 L(f,Z) L ( f , Z ) ,参数为学到的规则 f f 和独立于的验证样本集,返回值为实数标量,称为惩罚值或损失。目标是 L(f,Z) L ( f , Z ) 尽量小。
- 机器学习需要三份数据:
- 训练集:机器学习的样例
- 验证集:机器学习阶段,用于评估得分和损失是否满足要求
- 测试集:机器学习结束之后,实战阶段评估得分。;
- 深度学习:由多个处理层组成的计算模型,可通过学习获得数据的多抽象层表示。
- 机器学习三大牛:Geoffrey Hinton, Yann LeCun, 和 Youshua Bengio。
第二天 深度学习的过往
- 传统机器学习需要手动提取特征,比较繁琐且往往需要领域专家设计特征。
- 分类问题中,高层特征能强调重要的类别信息,而抑制无关的。如图像中从低到高的特征:边缘->图案->图案组合。深度学习自动在高维数据中发现复杂结构。
监督学习
- 监督学习中的数据是带有标签(label)的。
- 训练过程中需要不断更新权值(参数)向量,方法是:计算梯度向量,表示每个权值增加一个微小值时目标函数的变化量,之后权值向量根据梯度向量的相反方向调节。
- 经典更新方法——随机梯度下降(Stochastic Gradient Descent, SGD):输入少量样本,计算输出和误差,计算样本的平均梯度,根据梯度调节平均值。
- 线性分类器:高于阈值就分为一类,否则另一类。
- 深度学习核心优势:自动学习好的特征,很多个模块,每个都能计算非线性输入-输出映射。
反向传播算法
反向传播算法通过计算目标函数相对于多层网络权值的梯度,进行链式求导,从而调整参数。
下面举一个网络的例子,下图的左、右分别代表了该网络的前向传播和反向传播的过程
前向传播
先看左图前向传播的计算过程:
Input -> H1
取H1中的一个结点
j
j
,其值。
其中
zj
z
j
是input中三个结点
x1,x2,x3
x
1
,
x
2
,
x
3
的函数,也就是说
j
j
的由
xi
x
i
决定。
这里的
zj=∑iwijxi
z
j
=
∑
i
w
i
j
x
i
,其中
wij
w
i
j
为权重。
函数
f
f
是一个激活函数(如ReLU),它对进行非线性变换,得到输出
yj
y
j
。
H1->H2和H2->Output
类似的,令H2、Output中的结点为
k
k
和,我们可以得到:
yk=f(zk),zk=∑jwjkyj
y
k
=
f
(
z
k
)
,
z
k
=
∑
j
w
j
k
y
j
yl=f(zl),zl=∑kwklyl
y
l
=
f
(
z
l
)
,
z
l
=
∑
k
w
k
l
y
l
反向传播
再来看右图反向传播的计算过程,它分为两步;
1. 计算每层的梯度:对于每层,我们计算它对这一层的输出结点误差的梯度,也就是求对后一层的输入误差的加权和。
2. 应用链式求导法则,将误差梯度传到这一层的输入结点。
例如,若Output units中的结点 l l 的代价函数(loss function)为,其中 tl t l 是我们想要的输出, yl y l 是目前的输出,我们现在求这个loss function对 zl z l 的梯度:
E
E
对于的偏导数为
yl−tl
y
l
−
t
l
,又因为
yl=f(zl)
y
l
=
f
(
z
l
)
,所以
∂E∂zl=∂E∂yl∂yl∂zl=(yl−tl)f′(zl)
∂
E
∂
z
l
=
∂
E
∂
y
l
∂
y
l
∂
z
l
=
(
y
l
−
t
l
)
f
′
(
z
l
)
。
这里运用了链式求导法则,将
E
E
对的偏导拆成了两个偏导的乘积,我们只需要分别计算这两个因子,将它们相乘就能得到想要的结果。
同理,要计算loss function对H2的梯度,应用链式求导法则的可得:
∂E∂yk=∑l∂E∂zl∂zl∂yk=∑lwkl∂E∂zl
∂
E
∂
y
k
=
∑
l
∂
E
∂
z
l
∂
z
l
∂
y
k
=
∑
l
w
k
l
∂
E
∂
z
l
,这里的
∂E∂zl
∂
E
∂
z
l
我们之前刚刚计算过,直接用就好。
后面两层的梯度计算同理。
卷积神经网络
卷积神经网络(ConvNet)如今应用广泛,它包含了卷积操作。ConvNet有4个基本特征;局部互联、共享权值、下采样和使用多个卷积层。
在ConvNet,数据会使用不同的卷积核经过卷积层得到特征图,从而提取到前一层的局部连接特征;使用激活函数(如ReLU)使网络具有非线性表达能力;通过下采样层(池化层)将相似特征融合,并减少参数量。
这种卷积-非线性-池化的组合构成了一组单元,ConvNet中可以有若干个这样的单元相连接。
ConvNet成功用在了图像处理中的多种任务上,如分割、分类等。
第三天 深度学习工具汇总
- Caffe实现了CNN,适合做特征提取,它提供了面向命令行、MATLAB和Python的接口。
- Torch目前已经进化到已经Pytorch,使用Python接口,很流行也很有潜力。
- MXNet目前在快速发展,提供了ndarray接口和symbolic接口。
- TensorFlow由Google支持,目前资料最多。
- Theano往往用于教学和研究,不够高效,不适合线上部署。
- CNTK由微软提出,对Windows支持最好,不建议初学者入门使用。