本文共 3249 字,大约阅读时间需要 10 分钟。
梯度下降
梯度下降算法不一定达到全局最优,并且消耗时间,因为其是在全部数据集上的损失和。因此采用随机梯度下降算法:其不是在全部数据集上优化损失函数,而是在每一轮迭代中,随机优化某一条训练数据上的损失函数;存在问题:某一条数据上损失函数更小,不代表在全部数据上损失函数更小,可能无法达到局部最优。实际应用;采用这两个算法折中,每次计算一小部分训练数据的损失函数,成为一个batch。每次使用一个batch可以大大减小收敛所需要的迭代次数,同时可以使得收敛到的结果更加接近梯度下降的效果。
学习率指数衰减
学习率既不能过大也不能过小,tensorflow采用一种学习率的设置方法——指数衰减法。tf.train.exponential_decay : 函数实现指数衰减学习率。先使用较大的学习率来快速得到一个比较优的解,随着迭代的继续逐步减小学习率,使得模型在训练后期更加稳定。tf.train.exponential_decay( learning_rate,初始学习率 global_step,当前迭代次数 decay_steps,衰减速度(在迭代到该次数时学习率衰减为earning_rate * decay_rate),一般为全部数据全部计算一次的step,相当于是全部数据数目/batch_size decay_rate,学习率衰减系数,通常介于0-1之间。 staircase=False,(默认值为False,当为True时,(global_step/decay_steps)则被转化为整数) ,选择不同的衰减方式。默认False,学习率为连续衰减学习率; 如果为TRUE,学习率为阶梯函数,这种场景下,每完整的过完一遍训练数据,学习率就减小一次,使得训练数据集中的所有数据对模型训练有相等的作用。 name=None)按照下面这个公式实现的:decayed_learning_rate = learning_rate * decay_rate ^ (global_step / decay_steps)
正则化
L1正则化与L2正则化:通过限制权重大小,使得模型不能拟合训练数据中的随机噪音;L1正则化让参数变得更加稀疏,也就是更多参数变为零,达到类似特征选取的功能;L2不会让参数变得稀疏,小到一定程度,其影响就可以忽略不计,模型不会强制其为零;L1不可导,L2可导;tf.contrib.layers.l2_regularizer(lambda)(w) : lambda为正则项的系数
import tensorflow as tffrom tensorflow.contrib.layers import l2_regularizerdef get_weight(shape, lambda1): #定义变量,并将其加入collection中 var = tf.Variable(tf.random_normal(shape), dtype=tf.float32) tf.add_to_collection('losses', l2_regularizer(scale=lambda1)) return varx = tf.placeholder(tf.float32, shape=(None, 2)) y = tf.placeholder(tf.float32, shape=(None, 1))batch_size = 8layer_dimension = [2, 10, 10, 10, 1]in_dimension = layer_dimension[0]n_layers = len(layer_dimension)cur_layer = xfor i in range(1, n_layers): out_dimension = in_layer[i] weight = get_weight([in_dimension, out_dimension], 0.001) bias = tf.Variable(tf.constant(0.1, shape=[out_dimension])) cur_layer = tf.nn.relu(tf.matmul(cur_layer, weight)+bias) in_dimension = out_dimension[i]mse_loss = tf.reduce_mean(tf.square(y - cur_layer))tf.add_to_collection('losses', mse_loss) #将mse_loss加入collection中loss = tf.add_n(tf.get_collection(key='losses')) #get_collection()将返回一个列表,而tf.add_n()是对列表进行求和,输入的对象是一个列表,列表里的元素可以是向量,矩阵。总结:定义weight时,使用容器,将weight加入collection中:tf.add_to_collection()计算完mse后也要将其加入collection;最后采用 tf.get_clollection()获得一个列表,损失函数的列表;tf.add_n()将其作和
momentum:
训练网络时,通常先对网络的初始权值按照某种分布进行初始化,如:高斯分布。初始化权值操作对最终网络的性能影响比较大,合适的网络初始权值能够使得损失函数在训练过程中的收敛速度更快,从而获得更好的优化结果。但是按照某类分布随机初始化网络权值时,存在一些不确定因素,并不能保证每一次初始化操作都能使得网络的初始权值处在一个合适的状态。不恰当的初始权值可能使得网络的损失函数在训练过程中陷入局部最小值,达不到全局最优的状态。因此,如何消除这种不确定性,是训练深度网络是必须解决的一个问题。 momentum 动量能够在一定程度上解决这个问题。momentum 动量是依据物理学的势能与动能之间能量转换原理提出来的。当 momentum 动量越大时,其转换为势能的能量也就越大,就越有可能摆脱局部凹域的束缚,进入全局凹域。momentum 动量主要用在权重更新的时候。 一般,神经网络在更新权值时,采用如下公式: w = w - learning_rate * dw 引入momentum后,采用如下公式: v = mu * v - learning_rate * dw w = w + v 其中,v初始化为0,mu是设定的一个超变量,最常见的设定值是0.9。可以这样理解上式:如果上次的momentum(v)与这次的负梯度方向是相同的,那这次下降的幅度就会加大,从而加速收敛。momentum是对学习速度的修正,学的方向对,下次就多学点,学的方向不对,下次就少学点;而weight decay是刚开始学习率大点,随着学习的深入,逐渐变小。
滑动平均优化器
tf.train.ExponentialMovingAverage(decay,num_step)参数:decay= min(decay,(1+num_steps)/(10+num_steps))decay :衰减率,一般设置为接近1;模型更加稳健;num_step :decay取上面两个的最小
转载地址:http://mkivz.baihongyu.com/