1.CNN中优化器选择
- 随机/批量梯度下降:批量梯度下降就是计算一个batch的梯度并统一更新。
- Momentum:当前权值的改变会受到上一次权值改变的影响,类似于小球向下滚动的时候回带上惯性,因此可以加快小球向下的速度。
- Nesterov:使得Momentum中的小球更加聪明,会大致计算小球的下一个位置来指导小球的方向。
- Adagrad:基于SGD(随机梯度下降)的一种。适合用于类别分布不均的问题。对于数据集中比较常见的数据会给予较小的学习率,对于数据集中的比较罕见的数据会给予较大的学习率。其优点为不需要人为调整学习率;其缺点为随着迭代次数增多,学习率会越来越直到为0。
- RMSprop:基于Adagrad改进了其缺点,使得不会出现越来越低的问题。
- Adadelta:甚至不需要设置一个默认的学习率,也可达到一个较好的效果。
- Adam:像Adadelta和Adagrad和RMSprop一样会存储之前衰减的平方梯度,同事也保存之前衰减的梯度。
2.CNN中权重初始化策略
- Gaussian:均值为0,标准差0.01的高斯分布。
- Xavier:每一层输出的方差尽可能相等。
- msra:由于Xavier推导的时候假设激活函数是线性的,而msra适合relu等非线性激活单元。
若用全0的值初始化权重,则每个神经元节点的值多相等,在反向传播时,每个权重的梯度为输入该节点的值与上一层梯度的乘积,所以导致同等更新不具有差异性。
3.CNN中损失函数选择
回归损失
- L1 Loss & L2 Loss
用L1能够对异常值更鲁棒。用L2能够更快的收敛。
L2比L1能更快速的收敛的原因在于接近与目标值的时候,L2曲线更加平滑。
L1比L2对异常值更加鲁棒的原因,是因为当出现异常值时,L2对异常值反应后的error会比L1大,因为一个是平方级的,一个是绝对值。这会导致用L2更新参数时,由于异常值的Loss大导致参数更新方向往异常值偏。所以说L1对异常值更加鲁棒。
L1和L2都存在的问题
若我们的真实目标集中有90%是150,10%是0-30。若我们用L1来做,会使得大部分的预测值为150(趋向于中位数)。而用L2来做,会使得有很多的预测值在0~30之间,这两种情况都不是我们希望见到的。
- Huber loss
基于L1,L2损失函数的问题,因此提出了huber loss,其相当于利用超参数delta的范围将L1和L2组合起来。当残差比delta大时,HuberLoss就趋向于L1loss。当残差比delta小时,HuberLoss就趋向与L2loss。因此当delta趋向0时候,为L1loss;当delta趋向很大时,为L2loss。HuberLoss的好处就是结合了L1/L2的好处,但有个问题是要去学习或定义它的超参数delta。
- Log_cosh Loss
预测误差的双曲余弦的对数log(cosh(yip−yi))log(cosh(yip−yi)),该loss的优点在于当x很小时,函数接近与x^2/2;当x很大时,函数接近与abs(x)-log(2)。所以说这个loss有Huberloss的所有的优点且不像Huberloss不仅要有超参数且并不是处处二次可微。为什么需要2d derivative呢?因为类似于XGBoost这种算法利用2d 可微函数对优化更有利。但这种loss函数对非常大的异常值仍然存在不友好的问题。
- Quantile Loss
用来回归interval(间隔)而不是精准的回归到一个point(点)。
分类损失
- HingeLoss
hige_y_val = tf.maxmim(0., 1.-tf.mul(target,x_vals))
- 两类交叉熵损失函数
xentropy_y_val = tf.mul(target,tf.log(x_vals)) - tf.mul((1. - target), tf.log(1. - x_vals))
xentropy_y_out = sess.run(xentropy_y_val)
- sigmod交叉熵损失函数
- 加权交叉熵损失函数
- softmax交叉熵损失函数
- 稀疏softmax交叉熵损失函数
网友评论