1 反向传播
1.0 损失函数
损失函数(loss function):刻画预测值和真实值差异的函数。
交叉熵(cross entropy):刻画两个概率分布间的距离,是分类问题中运用较广的一种损失函数,以预测值q刻画真实值p,评估两者的“差距”,交叉熵越小,两者概率分布越接近。
c
r
o
s
s
(
p
,
q
)
=
−
∑
x
p
(
x
)
l
o
g
q
(
x
)
cross(p,q)=-\sum_{x}p(x)logq(x)
cross(p,q)=−x∑p(x)logq(x)
1.2 softmax
softmax回归模型是logistic回归模型在多分类问题上的推广,多分类问题中,类标签y可以取两个以上的值,突破了二分类的限制,经典应用为MINIST手写数字分类。
s
o
f
t
m
a
x
(
y
)
i
=
y
i
′
=
e
y
i
∑
j
=
1
n
e
y
j
softmax(y)_i=y_i{'}=\frac{e^{y_i}}{\sum_{j=1}^{n}e^{y_j}}
softmax(y)i=yi′=∑j=1neyjeyi
神经网络中,原始输出经过softmax层回归后,原始输出被用作置信度产生新的输出,新的输出满足概率分布。将神经网络的输出转化成一个概率分布,因而可以使用交叉熵计算预测值与真实值概率分布之间的距离。
1.3 交叉熵损失函数
tf.nn.softmax_cross_entroy_with_logits(_sentinel=None, labels=None, logits=None, dim=-1, name=None)
功能:
计算logits和labels的分类交叉熵.
序号 | 参数 | 描述 |
---|---|---|
1 | _sentinel | 内置参数,不使用.位置参数 |
2 | labels | 概率分布,如图像的标签概率分布 |
3 | logits | log计算的估计值 |
4 | dim | 维度,-1表示维度的最后一个值 |
5 | name | 可操作变量名 |
2 学习率
学习率(learning rate):控制自变量更新幅度的变量,表示为η。如果η多大,导致损失函数极值附近波动,不能达到极值;η过小,导致收敛速度过慢,降低优化速度。
2.1 学习率设置
θ
n
+
1
=
θ
n
−
η
∂
∂
θ
n
J
(
θ
n
)
\theta_{n+1}=\theta_n-\eta\frac{\partial}{\partial\theta_n}J(\theta_n)
θn+1=θn−η∂θn∂J(θn)
学习率:用于更新参数
θ
\theta
θ并控制其变化速度,表示为
η
\eta
η.
学习率过大,导致参数变化幅度较大,可能导致参数在极值附近波动;
学习率过小,导致参数变化幅度过小,导致训练速度过慢,降低效率;
下表为经验设定,从0.001开始依次类推.
序号 | 经验值 |
---|---|
1 | 0.001 |
2 | 0.003 |
3 | 0.01 |
4 | 0.03 |
5 | 0.1 |
6 | 0.3 |
2.2 学习率衰减函数
tf.train.exponential_decay(learning_rate, global_step, decay_steps, decay_rate, staircase=False, name=None)
函数实现功能如下:
decayed_learning_rate=learning_rate*decay_rate^(global_step/decay_steps)
功能:计算值每轮优化时使用的学习率.
参数描述
序号 | 参数 | 描述 |
---|---|---|
1 | learning_rate | 初始学习率,预先设定的初始学习率 |
2 | global_step | 计算使用的数值,必须为正数 |
3 | decay_steps | 衰减速度,表示训练一遍数据需要的迭代次数 |
4 | decay_rate | 学习率衰减函数 |
5 | staircase | 若为True,global_step/decay_steps转为整数 |
6 | name | 操作变量名,默认为ExponentialDecay |
使用说明
tf.train.exponential_decay函数可以通过设置参数staircase选择不同的衰减方式,staircase默认为False,该情况下学习率连续衰减,staircase为True时,学习率为阶梯状衰减。
学习率连续衰减:不同的训练数据有不同的学习率,当学习率减小时,对应的训练数据对模型训练结果的影响相应减小。
3 正则化
过拟合:当模型过于复杂,该模型可以很好的"记忆"每个训练数据中随机噪声的部分而"忘记"要去"学习"训练数据中的通用趋势,即该模型可100%跟随训练数据,而忽略了训练数据的变化趋势,降低了泛化能力和迁移能力.
为避免过拟合问题,常用方法为正则化(regularization).正则化即在损失函数中加入刻画模型复杂程度的指标.
如损失函数为
J
(
θ
)
J(\theta)
J(θ),在优化时不直接优化
J
(
θ
)
J(\theta)
J(θ),而是优化
J
(
θ
)
+
λ
R
(
w
)
J(\theta)+\lambda R(w)
J(θ)+λR(w).其中,
R
(
w
)
R(w)
R(w)刻画模型的复杂程度,而
λ
\lambda
λ表示模型复杂损失在总损失中的比例,
θ
\theta
θ表示神经网络中所有参数,权重
w
w
w和偏置
b
b
b,一般而言,模型复杂度只由权重
w
w
w决定.常用刻画模型复杂度的函数
R
(
w
)
R(w)
R(w)有两种,
L
1
L1
L1和
L
2
L2
L2.
其中,
L
1
L1
L1为
R
(
w
)
=
∣
∣
w
∣
∣
1
=
∑
i
∣
w
i
∣
R(w)=||w||_1=\sum_i|w_i|
R(w)=∣∣w∣∣1=i∑∣wi∣
L
2
L2
L2为
R
(
w
)
=
∣
∣
w
∣
∣
1
2
=
∑
i
∣
w
i
2
∣
R(w)=||w||_1^2=\sum_i|w_i^2|
R(w)=∣∣w∣∣12=i∑∣wi2∣
正则化基本思想是通过限制权重大小,使模型不能任意训练数据中的随机噪音。两种正则化区别如下:
(1)
L
1
L1
L1正则化会使参数变稀疏,
L
2
L2
L2正则化不会;参数变稀疏指更多的参数变为0,可达到类似特征选取的功能。
(2)
L
1
L1
L1正则化计算公式不可导,
L
2
L2
L2正则化公式可导;在计算损失函数偏导数是,对含有
L
2
L2
L2正则化损失函数的优化更加简洁,优化带
L
1
L1
L1正则化损失函数则较为复杂。
实际应用中,优化方法为
L
1
L1
L1和
L
2
L2
L2共用:
R
(
w
)
=
∑
i
α
∣
w
i
∣
+
(
1
−
α
)
w
i
2
R(w)=\sum_i\alpha|w_i|+(1-\alpha)w_i^2
R(w)=i∑α∣wi∣+(1−α)wi2
Tensorflow中对应函数:
tf.contrib.layers.l1_regularizer()
tf.contrib.layers.l2_regularizer()
4 滑动平均模型
滑动平均模型是使模型在测试数据上更加健壮(robust)。在采用随机梯度下降算法训练神经网络时,使用滑动平均模型在诸多应用中都可在一定程度上提高最终模型在测试数据上的表现。
Tensorflow中对应函数:
tf.train.ExponentialMovingAverage(decay, num_updates, zero_debias, name)
功能:使用指数衰减保持变量的滑动平均值.
序号 | 参数 | 描述 |
---|---|---|
1 | decay | 衰减率 |
2 | num_updates | 变量更新时,使用的参数 |
3 | zero_debias | 若为True,初始化滑动平均值 |
4 | name | 可操作变量名 |
在初始化滑动平均模型时,需要提供一个衰减率(decay),用于控制模型更新速度。函数对每个变量会维护一个影子变量(shadow variable),该影子变量的初始值即为相应变量的初始值,每次运行变量更新时,影子变量的值会更新为:
shadow _variable=decay*shadow_variable+(1-decay)*variable
其中,
shadow_variable为影子变量,variable为待更新变量,decay为更新率。
decay决定了模型的更新速度,decay越大模型越趋于稳定。实际应用中,decay一般设成趋近于1的值,如0.999,0.9999。为使模型在训练前期可以加快更新速度,ExponentialMovingAverage提供了num_updates参数动态设置decay的大小。每次更新的衰减率为:
m
i
n
{
d
e
c
a
y
,
1
+
n
u
m
u
p
d
a
t
e
s
10
+
n
u
m
u
p
d
a
t
e
s
}
min\left\{ decay,\frac{1+num_updates}{10+num_updates} \right\}
min{decay,10+numupdates1+numupdates}