尽可能使用迁移学习。否则,对于已经是广泛研究的问题,先从复制网络结构开始。
一定要使用 early stopping(早停),两种方法:
使用 dropout 或许是个好主意。
ReLU 是理想的激活函数。它也有缺陷,因此使用 leaky ReLU 或 noisy ReLU 或许有性能提升,但是会有更多的参数要调。
要得到差不多可以接收的性能,至少需要每个类 5000 个数据(>=10M可以达到人类的水平或更好)
使用 GPU 能做到的最大的 batch size。
带动量和学习率衰减的随机梯度下降是个不错的开始。
学习率是最重要的超参数。如果时间有限,主要花时间来调它。
对于计算机视觉:
对于自然语言处理:
随机搜索通常比网格搜索更快的收敛到好的超参数设置。
调试策略:
第一部分 应用数学和机器学习基****础
1. 介绍
每个类别至少需要大概 5000 个样本才能得到可接受的性能。大概每类需要 10M 个样本才能达到人类水平或更好。
4. 数值计算
在深度学习中,我们通常会陷入局部最优而不是全局最优,这是由于复杂性和非凸优化的问题。
5. 机器学习基础
**第二部分 深度网络:**现代实践
ReLU 对于前馈神经网络而言是一个完美的激活函数。
在基于梯度的优化问题上,由于梯度消失的原因,交叉熵相比 MSE 和 MAE 更好。
ReLU 的优点:减少了梯度消失的概率,稀疏性,减少了计算量。
大的梯度帮助学习更快,但是任意大会导致不稳定。
网络结构应该通过实验和监视验证集误差来确定。
更深的模型减少了用于表示函数的神经元数量,也降低了泛化误差。
最好在每层中使用不同的正则系数,但是使用相同的权重衰减。
使用早停 early stopping。这是一个很好调的超参数,而且也减少了计算量。
模型平均(bagging, boosting 等)基本上总会提高预测性能,虽然提高了计算量。
mini-batch 的大小(batch size):大的 batch size 会提供更大的梯度,但是通常内存是个限制条件。
深度学习模型有多个局部最优,但这没太大关系,因为它们都有相同的代价。最主要的问题是局部最优的损失比全局最优的损失大得多。
梯度裁剪(clipping)用于解决梯度爆炸的情况。这在 RNN 中是个常见的问题。
绘制出目标函数随时间的变化曲线来选择学习率。
最优学习率通常高于前 100 次迭代后产生最佳性能的学习率。监视前几次迭代,选择一个比表现最好的学习率更高的学习率,同时注意避免不稳定的情况。
使用高斯和均匀分布来初始看起来没有太大影响。
没有一个优化算法明显由于其他,这主要取决于用户对超参数调整的熟悉情况。
对转化后的值(transformed value)而不是输入做批量归一化。在引入可学习的参数 β 下去掉偏置项。对于 CNN 在每个空间位置应用范围归一化(range normalization)。
太浅或太深的网络更难训练,但是他们有更好的泛化误差。
相对于一个强大的优化算法,选择容易优化的模型更重要。
池化对于控制不同大小的输入是非常有用的。
0 填充可以让我们独立的设置卷积核大小和输出大小,而不会让维度衰减变成一个受限因素。
对于测试准确率而言最优的 0 填充通常在:
一个潜在的验证卷积结构的方法是使用随机权重,并且只训练最后一层。
双向 RNN 在手写识别,语音识别和生物信息方面非常成功。
相比较 CNN 而言,RNN 用于图像通常更困难,但是可以让相同特征图中的特征进行远程横向交互。
无论何时 RNN 要表示长期依赖,长期交互的梯度要指数级别小于短期交互。
在回波状态网络中设置权重的技术可用于在完全可训练的 RNN 中初始化权重。初始光谱半径为 1.2,稀疏初始化性能良好。
实践中最有效的序列模型是门控 RNN,包括 LSTM 和 GRU。
设计一个容易优化的模型通常比设计一个强大的算法容易些。
正则参数鼓励“信息流”,并预防梯度消失,但是同样需要梯度裁剪来预防梯度爆炸。但是大量的数据例如语言建模对于 LSTM 而言就不是那么高效了。
在不确定的时候让模型拒绝决策也是很有帮助的,但是这之间也存在折中。收敛是机器学习算法可以响应的样本部分,和准确率之间也存在折中。
对于基线模型而言,ReLU 及其变种是理想的激活函数。
带动量和学习率衰减的 SGD 是基线优化算法中一个不错的选择。衰减方法包括:
另一个不错的基线优化算法是 Adam。
如果优化出现了问题,立马使用批量归一化。
如果训练集不足 10M,一开始就采用中等强度的正则项。
如果当前的问题已经被研究烂了,直接拷贝模型就是个不错主意,或许可以拷贝训练过的模型。
如果已知无监督学习对于你的应用很重要(例如 NLP 中的词嵌入),那么在基线中就把它包含进来。
决定什么时候收集更多的数据:
学习率是最重要的超参数,因为它以一种复杂的方式控制着模型的有效容量。如果时间有限,就调它。调其他的超参数需要监视训练和测试误差来判断模型是欠拟合还是过拟合。
只要训练误差很低,你总是可以通过收集更多数据来减低泛化误差。
网格搜索:通常在少于四个超参数时使用。
随即搜索:使用起来很简单,相比于网格搜索更快收敛到好的超参数。
通常不建议基于超参数来调整模型,因为它很少超过人类并且经常失败。
调试策略:
在分布式系统中,使用异步 SGD。每一步的平均提升是很小的,但是步骤速率加快也导致了整体的加快。
级联(cascade)分类器是目标检测中一个高效的方法。一个分类器有高召回率,另一个有高精确率,好的,结果有了。
集成方法中一个减少推理时间的方法是训练一个控制器来挑选哪个网络应该来做推理。
标准化像素尺度是计算机视觉中唯一一个强制的预处理步骤。
对比度归一化通常是一个安全的计算机视觉预处理步骤。
在 NLP 的实践中,分层 softmax 相比于基于采样的方法测试结果更差。
第三部分 深度学习研究
稀疏自动编码器在学习特征如分类等任务上表现不错。
自动编码器在学习隐含变量解释输入方面很有用。它们可以学到有用的特征。
虽然很多自动编码器只有一个编码/解码层,但它们有深度前馈网络一样的优点。
在深度学习中,一个好的表示可以让后续的学习任务更加容易。例如监督前馈网络:每一层都为最后的分类层学习一个更好的表示。
贪心的层间无监督训练对于分类测试误差有帮助,但是其他任务上不行。
在有些特征对于不同的任务设置有帮助的时候,迁移学习,多任务学习和域适应都可以通过表示学习来完成。
当一个很复杂的结构可以用更少的参数紧凑表示时,分布式表示相比于非分布式表示更具有统计优势。一些传统的非分布式算法能泛化是由于其平滑的假设,但是会受限于维度诅咒。
玻尔兹曼机的变种早已超过了最初的流行度。玻尔兹曼机对于观察变量就像一个线性预测器,但是对于未观察到的变量更加强大。
从一系列受限玻尔兹曼机中初始化一个深度玻尔兹曼机时,稍微修改下参数是很有必要的。
今天很少使用深度信念网络(DBN),因为其他算法已经超过它了,但是在历史上有重要地位。由于 DBN 是生成模型,一个训练过的 DBN 可以用于初始化一个 MLP 的权重来做分类。
【略去玻尔兹曼机的部分内容】
虽然变分自动编码器(VAE)很简单,但是它们通常能得到不错的结果,也是最后的生成模型之一。来自 VAE 的图像通常模糊,原因未知。
不收敛是 GAN 欠拟合(一个网络抵达局部最优,另一个抵达局部最大)的一个问题,但是这个问题的长度还不清楚。
虽然 GAN 有稳定性的问题,但是通常在精心选择的模型和超参数情况下效果很不错。
GAN 的一个变种 LAPGAN,从低分辨率开始不断加入细节,它的结果经常能骗过人类。
为了保证 GAN 的生成器不会在任意点变成0概率,需要在最后一层给所有图像加入高斯噪声。
在 GAN 的判别器中一定要使用 dropout,不这样做结果很差。
生成矩匹配网络的视觉样本令人失望,但可以通过将它们与自动编码器结合来改进。
在生成图像时,使用转置卷积操作通常会产生更真实的图像,相比于没有参数共享的全连接层使用更少的参数。
即使在卷积生成网络中上采样的假设不真实,但是生成的样本总体来说还是不错的。
虽然有很多使用生成模型的方法来生成样本,MCMC 采样,ancestral sampling 或把二者结合是比较流行的做法。
当比较生成模型时,预处理的改变(即使很小,很微妙)是完全不能接收的,因为它会改变分布从而根本上改变了任务。
如果通过观察样本图片来衡量生成模型,最好在不知道样本源的情况下去做实验。另外,由于一个差的模型也可能产生好的样本,必须确保模型不是仅仅复制了训练图片。使用欧氏距离来进行检查。
如果计算上可行的化,最好的衡量生成模型样本的方法是评估模型分配给测试数据的对数似然。这个方法也有缺陷,例如一个固定的简单图片(如空白背景)有很高的似然。
生成模型有很多用处,因此根据用途来挑选评估指标。