想要训练个​​深度神经网络​​,也准备好了可以直接用的数据,要从哪里开始上手?

来自美国的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​​。

怎样构建深度学习模型?六步走,时刻小心过拟合 | 入门指南_调模型_02

只要写两行代码,就可以得到一个学习率的曲线。

怎样构建深度学习模型?六步走,时刻小心过拟合 | 入门指南_Cross_03

在损失还在​​明显下降​​的区域,选取学习率——

比如,最陡部分的旁边一点点,损失仍在剧烈下降,没有到平坦的地方。

上图的话,​​10-4​​就可以。

如果,模型训练还是很慢,或者效果不好的话,可以用​​Adam优化​​​,代替初始架构里的随机梯度下降 (​​SGD​​) 优化。

这时候,如果模型还是不能和训练集愉快玩耍,考虑一下​​学习率衰减 (Learning Rate Decay)​​ ——

有指数衰减,离散阶梯衰减 (Discrete Staircase Decay) ,甚至还有一些​​手动​​​方法,人类可以在​​损失​​不再下降的时候,自己把学习率 (α) 往下调。

其中,余弦型 (Cosine) 衰减,在一个回合 (Epoch) ​​开始​​​的时候,衰减最慢,​​中间​​​最快,​​结束​​时又最慢。