最近正在学习吴恩达老师的深度学习课程,学习这些课程使我对博士期间读论文遇到的各种深度学习概念有了更深入的理解,本博客希望对于吴老师课程中主要概念进行整体性地记录,并加入自身研究中的一些认识,以便在以后工作中查阅以及复习之用。
神经网络与深度学习
- 线性拟合,参数 w , b w, b w,b,结果 z z z, w w w维度对应输入向量 x x x的维度
- 逻辑回归以及 S i g m o i d Sigmoid Sigmoid函数,结果 a a a
- 理解线性组合函数与非线性激活函数
g
(
z
)
g(z)
g(z)结合构成神经元
z = w x + b a = g ( z ) z=wx + b \\ a=g(z) z=wx+ba=g(z) - 损失函数: l o s s = − ( y l o g a + ( 1 − y ) l o g ( 1 − a ) ) loss = -(yloga + (1-y)log(1-a)) loss=−(yloga+(1−y)log(1−a))
- 梯度下降:基于 d w , d b dw, db dw,db更新 w , b w, b w,b,参数:学习率 α \alpha α
- 链式法则,计算图,反向传播
如何计算dz,da,dw,db
- 结构化数据以及非结构化数据,人类与机器处理这两种数据的不同
- 向量化与广播(从一个向量到一组向量)
- 深度神经网络中,第
l
l
l层神经网络有
n
[
l
]
n^{[l]}
n[l]个神经元,计算每一层参数的维度:
W : ( n [ l ] , n [ l − 1 ] ) W: (n^{[l]}, n^{[l-1]}) W:(n[l],n[l−1]), b : ( n [ l ] , 1 ) b: (n^{[l]}, 1) b:(n[l],1)
可以理解为前一层神经元输出,正好是下一层的输入向量,对于下一层每个神经元,w维度与前一层神经元数量相同。
- 每一层结果的维度:
Z
,
A
:
(
n
[
l
]
,
m
)
Z, A: (n^{[l]}, m)
Z,A:(n[l],m)
每一列代表一个数据实例
- 不同的激活函数:
s
i
g
m
o
i
d
sigmoid
sigmoid,
t
a
n
h
tanh
tanh,
r
e
l
u
relu
relu,
r
e
l
u
l
e
a
k
y
relu_{leaky}
reluleaky
如果使用线性激活函数,多层神经网络等价于一层神经网络
- 随机初始化:如果全部初始化为0,那么每层中每个神经元都是对称的,它们对应的参数在梯度下降计算中也是相同的。
- 为什么需要深度?减少神经元数量,每一层逐渐进行特征抽象
- 参数与超参数。参数可以学习,超参数需要人工设置。
优化深度神经网络
- 训练集、验证集、测试集
- 偏差与方差。偏差大是指Training Error 与 Bayes Error相差大,方差大是指Test Error与Training Error相差大。偏差和方差的比较是相对的。偏差大表示训练不充分或者网络结构太简单,方差大表示存在过拟合问题
- 解决偏差大:使用更复杂的网络结构、更多神经元、更多层,训练更长时间
- 解决方差大:增加训练数据、正则化、Early Stopping
- 正则化:L2、L1、Dropout
为什么正则化能够解决方差大的问题:避免某个特征权重过高,避免学习离群点的特征,使网络更简单。
- Dropout应用时:训练时对每一层采用一定的概率随机dropout神经元,测试和应用时不dropout神经元
- Normalization Input: 将原始数据减去均值
μ
\mu
μ,再除以方差
σ
2
\sigma^{2}
σ2
μ = 1 m Σ x x : = x − μ σ 2 = 1 m Σ x 2 x : = x / σ 2 \mu = \frac{1}{m}\Sigma x \\ x:=x-\mu \\ \sigma^{2} = \frac{1}{m}\Sigma x^2 \\ x:= x / \sigma ^ 2 μ=m1Σxx:=x−μσ2=m1Σx2x:=x/σ2
好处:能够选择更大的学习率,如果权重之间差距过大,那么学习率只能选择较小的值,否则无法保证cost函数经过一轮之后是下降的
- 梯度消失和梯度爆炸:W取值大于1或者小于1,在深度过高时,其计算的值要么趋于无穷大,要么趋于0.
- 选择合适的W初始值。前一层神经元越多(即下一层输入数据的特征越多,每个神经元权重分量越多),为了确保下一层神经元计算的Z值不要太大,选择w越小。
[文章](https://blog.csdn.net/red_stone1/article/details/78208851])有讲解
- 梯度检查:可以采用导数的定义查看梯度计算是否正确
- batch梯度下降:在整个训练集上进行训练,每次进行一次梯度下降
- mini-batch 梯度下降:将训练集进行划分成若干等份,每份子集进行一次梯度下降。
适用于训练集过大的情况。
- Epoch:在训练集上完整地训练一次被称为一次epoch
- SGD:每次针对一个测试实例进行梯度下降
- 不同训练场景下,cost函数变化:Batch 平稳下降,mini-batch震荡下降
- 怎样减小震荡下降的幅度? 在梯度下降基础上,引入新的优化算法
- 动量梯度下降算法:基于指数加权平均,使W、b变化尽可能平滑
- RMSprop:也是使W,b并尽可能平滑,每次梯度下降时
d
w
d_w
dw要除以
S
w
\sqrt{S_{w}}
Sw
S w = β S d w + ( 1 − β ) d w 2 S_{w} = \beta S_{dw} + (1-\beta)d_w^2 Sw=βSdw+(1−β)dw2 - Adam优化算法:动量梯度下降与RMSprop结合
- 学习率递减:随着epoch增加, α \alpha α逐渐减小
- 局部最小值问题 与鞍点
- 随机化选择超参数进行Tuning:尝试更多的超参数组合,避免网格化超参数tuning
不同种类超参数的重要性不同,对于每个超参数都要尽量尝试更多的取值,并在tuning过程中逐步缩小范围
- linear scale vs log scale 进行超参数取值
- Batch Normalization:在神经网络每一层,对
Z
Z
Z进行标准化处理后,通过两个可以训练的参数
γ
\gamma
γ和
β
\beta
β来自由设置
Z
Z
Z的方差和均值。
从原论文中有以下公式:
μ : = 1 m Σ x i σ 2 : = 1 m Σ ( x i − μ ) 2 x ^ : = x − μ σ 2 + ϵ y ^ : = γ x ^ + β \mu := \frac{1}{m}\Sigma x_i \\ \sigma^2 := \frac{1}{m}\Sigma(x_i-\mu)^2 \\ \hat{x} := \frac{x-\mu}{\sqrt{\sigma^2 + \epsilon}} \\ \hat{y} := \gamma\hat{x} + \beta μ:=m1Σxiσ2:=m1Σ(xi−μ)2x^:=σ2+ϵx−μy^:=γx^+β
好处:Z的方差和均值可以控制,那么每一层神经元参数相对独立的,那么前面一层神经元参数变化太大不会影响到后面的神经元参数。因此能够加速神经网络训练。Batch Normalization还有轻微正则化效果。
-
对单个测试实例使用batch normalization:基于指数加权平均估计测试实例的 μ \mu μ和 σ \sigma σ
-
多分类问题:softmax分类器,假设是三分类问题, z 1 z^1 z1, z 2 z^2 z2, z 3 z^3 z3分别代表三个神经元的线性组合函数结果,并基于以下公式计算对应分类的概率
y 1 ^ = e z 1 e z 1 + e z 2 + e z 3 \hat{y^1} = \frac{e^{z^{1}}}{e^{z^{1}} + e^{z^{2}} + e^{z^{3}}} y1^=ez1+ez2+ez3ez1 -
多分类问题的loss函数:
l o s s = − 1 m Σ y i l o g y i ^ loss = -\frac{1}{m}\Sigma y_ilog\hat{y_i} loss=−m1Σyilogyi^ -
深度学习框架