想要训练个深度神经网络
,也准备好了可以直接用的数据,要从哪里开始上手?
来自美国的Harry Khanna,精心编织了一套六步法
。大家可以瞻仰一下,然后决定要不要行动。
整个过程中,过拟合
的问题时时刻刻都要注意。
1. 选个损失函数
选择怎样的损失函数,取决于需要解决怎样的问题。
如果是回归
问题,就可以用均方误差 (MSE)
损失函数。
如果是分类
问题,就用交叉熵 (Cross-Entropy)
损失函数。
只有两类
的话,要用二值交叉熵 (Binary Cross-Entropy)
。
如果遇到了不常见的问题,比如一次性学习 (One-Shot Learning)
,可能就要自行定制
一个损失方程了。
2. 选个初始架构
说到结构化学习
,比如预测销售情况
,从全连接
的隐藏层开始,是个不错的选择。
这一层的激活数 (Number of Activations) ,要在输入
神经元与输出
神经元的数量之间。
两者取个平均数,就可以。
像下面这样的取法,也可以。
Ni,是输入神经元数。
No,是输出神经元数。
Ns,训练集里的样本数。
a,尺度因子,在2到10之间选。
对计算机视觉领域的小伙伴来说,像ResNet这样的架构,就很友好。
3. 拟合训练集
这一步,最重要的超参数,是学习率 (Learning Rate)
(α) 。
不需要试错,fast.ai
的库里面,有一个 rate finder
。
只要写两行代码,就可以得到一个学习率的曲线。
在损失还在明显下降
的区域,选取学习率——
比如,最陡部分的旁边一点点,损失仍在剧烈下降,没有到平坦的地方。
上图的话,10-4
就可以。
如果,模型训练还是很慢,或者效果不好的话,可以用Adam优化
,代替初始架构里的随机梯度下降 (SGD
) 优化。
这时候,如果模型还是不能和训练集愉快玩耍,考虑一下学习率衰减 (Learning Rate Decay)
——
有指数衰减,离散阶梯衰减 (Discrete Staircase Decay) ,甚至还有一些手动
方法,人类可以在损失
不再下降的时候,自己把学习率 (α) 往下调。
其中,余弦型 (Cosine) 衰减,在一个回合 (Epoch) 开始
的时候,衰减最慢,中间
最快,结束
时又最慢。