激活函数
Sigmoid函数
一般采用交叉熵代价函数
tf.nn.sigmoid_cross_entropy_with_logits() 来表示跟sigmoid搭配使用的交叉熵
Softmax函数
一般采用对数似然函数
tf.nn.softmax_cross_entropy_with_logits() 来表示跟sigmoid搭配使用的交叉熵
防止过拟合
增加数据集
正则化方法
Dropout(去掉一个权值很小的神经元)
交叉熵
可以使网络迭代更少的次数,达到一个更好的结果
Optimizer
tf.train.GradientDescentOptimizer
tf.train.AdadeltaOptimizer
tf.train.AdagradOpyimizer
tf.train.AdagradDAOptimizer
tf.train.MomentumOptimizer
tf.train.AdamOptimizer
tf.train.FtrlOptimizer
tf.train.ProxinmalGradientDescentOptimizer
tf.train.ProximalAdagradOptimizer
tf.train.RMSPropOptimizer
各种优化器对比:
标准梯度下降法:
标准梯度下降先计算所有样本汇总误差,然后根据总误差来更新权值
随机梯度下降法(SGD):
随机梯度下降随机抽取一个样本来计算误差,然后更新权值
批量梯度下降法:
批量梯度下降算法是一种折中的方案,从总样本中选取一个批次(比如一共有10000个样本,随机选取100个样本作为一个batch),然后计算这个batch的总误差,根据总误差来更新权值。
Momentum:
当前权值的改变会受到上一次权值改变的影响,类似于小球向下滚动的时候带上的惯性。这样可以加快小球的向下的速度
NAG(Nesterov accelerated gradient):
NAG在TF中跟Momentun合并在同一个函数tf.train.MomentumOptimizer中,可以通过参数配置启动。
在Momentun中小球会盲目地跟从下坡的梯度,容易发生错误,所以我们需要一个更聪明的小球,这个小球提前知道它要去哪里,它还要知道走到坡底的时候速度慢下来而不是又冲上另一个坡。
Adagrad:
它是基于SGD的一种算法,它的核心思想是对比较常见的数据给予它比较小的学习率去调整参数,对于比较罕见的数据给予它比较大的学习率去调整参数。它很适合应用于数据稀疏的数据集(比如一个图片数据集,有10000张狗的图片,10000张猫的图片,只有100张大象的图片)。
Adagrad主要的优势在于不需要人为的调节,它可以自动调节,它的缺点在于,随着迭代次数的增多,学习率也会越来越低,最终会趋向于0
RMSprop:
RMS(Root Mean Square)是均方根的缩写
RMSprop借鉴了一些Adagrad的思想,不过这里RMSprop只用到了前t-1次梯度平方的平均值加上当前梯度的平方的和的开平方作为学习率的分母。这样RMSprop不会出现学习率越来越低的问题,而且也能自己调整学习率,并且可以有一个比较好的效果。
Adadelta(常用):
使用Adadelta我们甚至不需要设置一个默认的学习率,在Adadelta不需要使用学习率也可以达到一个非常好的效果。
Adam(常用):
就像Adadelta和RMSprop一样Adam会存储之前衰减的平方梯度,同时它也会保存之前衰减的梯度。经过一些处理之后再使用类似Adadelta和RMSprop的方式更新参数。
(注:一般学习率调的比较小,比如1e-4或1e-6)