深度学习之神经网络11大常见陷阱及对策
。然后将学习率设置得比这个值低一点点——这很可能非常接近最佳学习率了。
为什么?
许多深度学习框架默认会启用梯度裁剪。这个选项可以防止训练过程中过度优化,它会在每个步骤中强制改变权重,让权重发生最大限度的改变。这可能有用,特别是当数据中含有许多异常值的时候,因为异常值会产生很大的错误,从而导致大的梯度和权重更新。但是,默认开启这个选项也会让用户很难手动找到最佳的学习率。我发现大多数深度学习的新手都因为梯度裁剪的原因将学习率设得太高,使得整体训练行为变慢,也使改变学习率的效果不可预测。
还需要注意
如果你正确清理了数据,删除了大部分异常值并且正确设置学习率,那么你实际上并不需要梯度裁剪。在关闭梯度裁剪后,如果你发现训练错误偶尔会爆发,那么你完全可以重新打开梯度裁剪这个选项。但是,需要记住,训练错误频发的原因几乎总是表明你数据的一些其他异常——裁剪只是一种临时的补救方法。
在最后一层使用了错误的激活函数
问题描述
在最后一层使用激活函数,有时可能意味着你的网络无法产生所需的全部范围的值。最常见的错误是在最后一层使用ReLU,从而导致网络只能输出正值。
怎样解决?
如果你做一个回归,那么在绝大多数时候你不会想在最后一层使用任何类型的激活函数,除非你确切地知道你想要输出的值的种类是什么。
为什么?
再想想你的数据值实际代表什么,以及它们在标准化以后的范围。最可能的情况是,你的输出值为unbounded正数或负数——在这种情况下,你不应在最终层使用激活函数。如果你的输出值只在某些范围内有意义,例如由0-1内的概率组成,那么最终层应该有使用特定的激活函数,例如Sigmoid激活函数。
还需要注意
在最后一层使用激活函数有许多需要注意的地方。也许你知道你的系统最终会将输出裁剪到 [-1,1]。那么,将这个裁剪过程添加到最终层的激活当中就是有意义的,因为这将确保你的网络错误函数不会惩罚大于1或小于-1的值。但是,没有错误也意味着这些大于1或小于-1的值也不会有梯度——这在某些情况下会使你的网络无法训练。或者,你可能会尝试在最后一层使用tanh,因为这个激活函数输出的值的范围是 [-1, 1],但这也可能带来问题,因为这个函数的梯度在1或-1附近变得非常小,而为了产生-1或1可能使你的权重变得非常大。一般来说,最好保险起见,不要在最后一层使用激活函数。有时候聪明反被聪明误。
网络里有坏的梯度
问题描述
使用ReLU激活函数的深层网络通常会受所谓"死神经元"的影响,而后者是由不良梯度引起的。这可能会对网络的性能产生负面影响,在某些情况下甚至完全无法训练。
怎样解决?
如果你发现训练误差经过多个epoch后都没有变化,可能是使用了ReLU激活函数,让所有的神经元都死掉了。尝试切换到另一个激活函数,例如leaky ReLU或ELU,然后再看看是否还存在这样的情况。
为什么?
ReLU激活函数的梯度对于正值为1,负值为0。这是因为当输入小于0时,输入的一个很小变化不会影响输出。短期看,这可能不是一个问题,因为正值的梯度很大。但是,层与层可以叠在一起,负的权重可以将那些梯度很大的正值变为梯度为0的负值;通常情况下,一些乃至所有隐藏单元对于成本函数都具有零梯度,无论输入是什么。在这种情况下,我们说网络是"死的",因为权重完全无法更新。
还需要注意
任何具有零梯度的运算(如裁剪、舍入或最大/最小),在被用于计算成本函数相对于权重的导数时,都将产生不良梯度。如果它们在符号图里有出现,那么一定要非常小心,因为它们往往会带来意外的问题。
没有正确地初始化网络权重
问题描述
如果你没有正确地初始化你的神经网络权重,那么神经网络根本就不太可能训练。神经网络中的许多其他组件都有某些正确或标准化的权重初始化,并将权重设置为零,或者使用你自己的自定义随机初始化不起作用。
怎样解决?
"he","lecun"或"xavier"的权重初始化都是很受欢迎的选择,在几乎所有情况下都能很好地工作。你选一个就好(我最喜欢的是"lecun"),当你的神经网络正常运作以后,你也可以自由地进行实验呀。
为什么?
你可能已经知道,可以使用"小的随机数"初始化神经网络权重,但事情并没有那么简单。所有上述初始化都是使用复杂和详细的数学发现的,这些数学基础说明了它们为什么用起来最好。更重要的是,围绕这些初始化构建了其他神经网络组件,并根据经验使用它们进
- 机器学习算法盘点:人工神经网络、深度学习(07-02)
- 2016年人工智能与深度学习领域的十大收购(07-26)
- AI/机器学习/深度学习三者的区别是什么?(09-10)
- 深度学习的硬件架构解析(10-18)
- 麻省理工科技评论评选的14大医疗领域突破科技(上)(10-14)
- 探秘机器人是如何进行深度学习的(09-18)