欢迎访问我的个人博客:zengzeyu.com
前言
当你进入深度学习领域,准备好深度神经网络,开始进行训练时,遇到这样一个大部分新手都会遇到的问题:你的神经网络没法正常工作,而你不知道该如何去修正它。你去问你的老板或者导师,他们也不知道该如何处理,因为在深度神经网络面前,他们和你一样也是新手。那么现在该如何来处理呢?
幸运的是我来啦!我列出了几乎所有新手都会犯的错误,以及我自己和身边一些学生在同样情况下遇到过的问题:
- 没有对数据进行标准化处理(Normalize)
- 没有检查结果(Results)
- 没有对数据进行预处理(Preprocess)
- 没有使用正则化方法(Regularlization)
- Batch Size 取值过大
- 学习率(Learning Rate)设置有误
- 最后一层 Layer 使用了错误的激活函数(Activation Function)
- 网络结构中包含了有害的梯度(Bad Gradient)
- 初始化网络权重(Network Weights)有误
- 神经网络结构过深(Too Deep)
- 使用了错误数目的隐藏单元(Hidden Units)
数据预处理(Preprocess)
What?
大多数数据是难处理的,并且在我们看来大多数相同的数据可能有很多不同数字化表示方法(numerical representations)。以角色动画研究(character animation)为例,如果我们使用角色关节相对于动作捕捉场景中心的三维位置来表示数据,那么在不同位置面向不同方向做相同的一个动作就会得到不同的数据表示方法。而我们需要做的是以不同的方式来表示数据,例如在一个局部坐标系(local reference frame)中(比如相对于角色的中心),以便于相似的动作产生相差无几的数据表示。
How?
仔细思考你的特征(feature)代表了什么——是否可以用简单的转换方式,使我们看起来相似的物体得到相似的数据表达。是否有一个局部坐标系,使数据在这个局部坐标系中表达起来更自然,可能是更好的色彩空间或不同的格式?
Why?
神经网络只对他们接收的数据做了一些假设——但这其中重要的假设之一就是,数据所在的空间是微连续(somewhat continuous),即处于两个数据点中间个一个点,至少在某种程度上是两个数据点的一种混合,并且相邻的两个点在某种意义上代表着“相似的”东西。数据空间中分布着没有连续性的数据,或者表示相同事物的数据是分离的,会使学习任务编的更加困难。
And?
另一种数据预处理的思考方式,尝试减少所需要的数据复杂情况下的繁琐的组合操作(combinatorial explosion of data variations)。例如,如果训练角色动画数据的神经网络必须为每个位置和方向的角色学习相同的一组动作,那么网络中大量的能力就被浪费了,并且很多学习过程会被重复。