之前我们学习了怎样用计算图表示一个函数;神经网络——score function、loss function;CNN——用convolutional layer表达空间结构,conv layer的activation maps来自不同filter的卷积;通过最优化的方法得到参数值;更新的时候我们用的方法是mini-batch SGD.其方法是我们先=随机得到一组weights,在训练集上随机采样得到一批数据,在computational graph上forward prop计算loss,然后back prop计算梯度,更新我们的weights,直到我们的loss小于误差。
这节课我们将学习训练NN的一些细节。
包括哪些东西呢?
1.one time setup
激活函数的选取;预处理;权重初始化;正则化;梯度检查
2.training dynamics
检查调整学习过程;参数更新;超参数的最优化
3.评估模型效果
Activation functions
常见的激活函数:
这些函数是不是用哪个都可以呢?他们之间有什么区别呢?可不可以对这些函数进行修改呢?下面我们一一探讨。
首先我们看到近些年常用的激活函数都是非线性的,这一点符合神经细胞输出复杂的特性。
sigmoid函数
1.sigmoid将所有输入x压缩到[0,1]之间,如果x正的比较大,输出为1;x负的比较大,输出接近0;如果x在0附近,输出类似于一个线性函数。
2.sigmoid曾经十分流行,你可以把它看成是一个有饱和的激活率的神经元。
缺点:
1.容易kill gradient
比如,当x=-10时,梯度=0,反向传播时参数就没有更新,x=10时类似。只有当x在0附近时,能得到一个合适的梯度。
2。输出不是以0为中心的
f(WiXi + b)
当x都是正数或负数的时候,loss对w的导数(DL/DF * DF/DW)就全为正或负,这样当你在更新W的时候,所有Wi都朝着同一个方向更新,要么都增加要么都减少。
这是一种非常低效的更新方式,下图中蓝色是最优的W的向量,要找到这个W,我们要经过很多迭代才能到达。
![](https://i-blog.csdnimg.cn/blog_migrate/80465005ef7e28d7a02ba3ee5b4a0cce.png)
这也引出了一个问题——我们总是希望zero-mean data!
3.exp() 计算上较复杂。
tanh(x)
输出范围是[-1,1],是zero-center了。但是仍然存在killgradient的问题。
ReLU ——Rectified Linear Unit,2012年首次被使用
这是我们在之前的CNN中使用的函数。
1.在+ region没有饱和的问题了
2.计算也快,max(0,x)
3.在实际中比sigmoid和tanh收敛更快,大概快6倍
4.输出更接近生物学上的神经元than sigmoid
缺点:
1.不是zero-center的
2.当x<0时,仍然会饱和,kill gradient
存在dead ReLU的情况:
当你的learning rate很高的时候,一开始的时候ReLU还是OK的,但是由于你的更新步长很大,weights会跳的很高,back prop的数据流就被阻塞了。
在训练的时候,就会出现这种情况:一开始模型更新好好的,从某个点开始,开始变坏直至死掉。这时候你停下来测试一下你的神经网络,给一批输入数据,你会发现有大约10%-20% 的结点死掉了。
这是一个问题,但并没有完全阻碍ReLuctant训练网络。
什么时候导致dead ReLu?
当输入数据使得weights下降的时候会出现。