1.learning rate 是调参的重要一项。过大,会造成跳过了极值点、找不到极值点、在极值点附近徘徊。以y=x^2,x=5为例,learning rate 设为1,则无论多少轮迭代,值都不会下降。一直在x=5,-5徘徊。而learning rate 过小效率极低。收敛时间过长。
2.tf提供tf.train.expontntial_decay(lr,global_step,epoch_size,decay_rate,staircase)可以指数级减小学习率。 lr=lr*decay_rate^(global/epoch_size)
3.另一个技巧是,在每次迭代的最后,使用估计的模型参数检查误差函数(error function)的值。如果相对于上一次迭代,错误率减少了,就可以增大学习率,以5%的幅度;如果相对于上一次迭代,错误率增大了(意味着跳过了最优值),那么应该重新设置上一轮迭代ωj 的值,并且减少学习率到之前的50%。http://www.willamette.edu/~gorr/classes/cs449/momrate.html有相关介绍
从文件读学习率模块:
def get_learning_rate_from_file(filename, epoch):#设置学习率方法
with open(filename, 'r') as f:
for line in f.readlines():
line = line.split('#', 1)[0]
if line:
par = line.strip().split(':')
e = int(par[0])
lr = float(par[1])
if e <= epoch:
learning_rate = lr
else:
return learning_rate
由此可以设定epoch区间的学习率
4.batch_size与learning rate 的问题
根据我们选择的成本函数F()不同,问题会有区别。当平方误差和(Sum of Squared Errors)作为成本函数时, ∂F(ωj) / ∂ωj 会随着训练集数据的增多变得越来越大,因此学习率需要被设定在相应更小的值上。
解决此类问题的一个方法是将学习率λ 乘上1/N,N是训练集中数据量。这样每部更新的公式变成下面的形式:
ωj = ωj - (λ/N) * ∂F(ωj) / ∂ωj
相关内容可参考: Wilson et al. paper “The general inefficiency of batch training for gradient descent learning”
另外一种解决方法是:选择一个不被训练集样本个数影响的成本函数,如均值平方差(Mean Squared Errors)
5.
归一化输入向量在机器学习问题中是一个通用的方法。在一些应用中,由于使用距离或者特征方差,要求必须归一化输入向量,因为如果不归一化将导致结果会严重被具有大方差的特征和不同的尺度影响。归一化输入能够帮助数值最优方法(例如,梯度下降法)更快,更准确地收敛。
尽管有一些不同的归一化变量的方法,[0,1]归一化(也叫做min-max)和z-score归一化是两种最为广泛应用的。
XminmaxNorm = (X - min(X)) / (max(X) - min(X));
XzscoreNorm = (X - mean(X)) / std(X);