初学者:搭建神经网络的基础常识
因为随机初始化结果不同,可能每次训练的结果不同
神经网络实现分类
- 准备数据
- 搭建网络+参数优化
该网络的输入为4,输出为3类。w1和b1的维度必须满足x*w1+b。
- acc/loss可视化
学习率
学习率过小:收敛慢
学习率过大:无法收敛到最优解
除了设置合理的学习率外,可以使用指数衰减学习率
激活函数
sigmoid函数:
容易梯度消失,因为求导范围在[0,0.25]之间,经过多次相乘后趋于0。
relu函数:
- 改进随机初始化,避免过多负数特征送入relu函数内,造成神经元死亡。
- 设置更小的学习率,减少参数分布发生巨大变化,避免训练过程中产生负数进入relu。
损失函数
交叉熵损失CE:
两个概率分布之间的距离,距离越近损失越小。
tf.losses.categorical_crossentropy(y_,y) # 计算y_和y的交叉熵损失值
tf.nn.softmax_cross_entropy_with_logits(y_,y) # 先softmax修改概率分布,再计算交叉熵损失函数
过拟合
正则化缓解过拟合,用在损失函数中
反向用于更新参数
loss_regularization.append(tf.nn.l2_loss(w)) # l2正则化
优化器
梯度下降法,用于参数更新
求导得当前梯度,计算一阶动量mt,二阶动量Vt。
SGD: 无moment
SGDM: 含moment(一阶动量)
mt:各时刻梯度方向的指数滑动平均值
β
\beta
β:接近于1的超参数
Adagrad: 含二阶动量
可以对模型中的每个参数分配自适应学习率
RMSProp: 含二阶动量
Vt使用指数滑动平均值计算,表示过去一段时间的平均值
Adam: 结合SGDM一阶动量和RMSProp二阶动量
计算mt和Vt,在计算修正后的偏差,用偏差进行更新。
从实验结果来看,Adam大法效果最好,但耗时。