绪
理论上,只要训练样本足够多,神经网络可以拟合原始数据分布。
遇到神经网络不收敛问题,可以
(1)先检查下输入数据(归一化,数据量);
(2)然后,检查模型优化方法(学习率,优化器(优先Adam这些自适应学习率));
(3)最后是,检查模型结构设计(模型是否太简单,已经拟合好数据了,设计更深的网络看loss能否再下降;)等等,欢迎补充。
1. learning rate设大了
0.1~0.0001.不同模型不同任务最优的lr都不一样。
比如像 ReLu 激活函数,如果学习率过大,会导致一些单元函数值小于0,不可恢复地“致死”,因为后续反向传播这些单元的梯度都会等于0!
Q: 我现在越来越不明白TensorFlow了,我设置训练次数很大的时候,它一开始就给我“收敛”到一个值,后面的值都一样?
A: 模型batch_size设置问题?网络过拟合了?
2. 归一化
一般需要事先对数据进行 归一化、标准化。归一化是把数值压缩到0~1,比如减去最小值,再除以最大值与最小值之差。标准化是,压缩到一个分布, 比如 每列减去 该列的均值,然后每列除于该列的标准差,获得标准正态分布。
python sklearn 的 StandardScaler
可以实现标准化。
3. 数据处理
首先,确保数据打乱(shuffle),(数据不打乱,网络极大可能拟合前面几个batch的样本分布);然后,确保 标签 y与loss是搭配的,比如,分类模型的交叉熵 cross entropy,pytorch中target是类别,不需要one-hot,模型输出是logit,不需要softmax;keras和TensorFlow的cross entropy可能会不一样,还得看具体的API定义。
4. 损失函数
在分类中,常用交叉熵损失函数,一定要注意真实标签的维度,比如,要求标签是2维的[[0,1,0],[0,0,1]]
,是否传入1维,如[1,2]
.
这个需要在官网确认API的输入格式。
最近开通了个公众号,主要分享深度学习,比如推荐系统,风控,NLP等算法相关的内容,感兴趣的伙伴可以关注下。
公众号相关的学习资料会上传到QQ群596506387,欢迎关注。
参考: