Part 1
一.Activation Function激活函数
当激活函数是线性的时候,两层的神经网络就可以逼近所有的函数了。激活函数的作用就是给network加入非线性因素,因为线性模型尽管组合还是一个线性模型,对于数据的表达和分类效果不强。详情
常用的激活函数:
1.sigmoid函数存在三个问题:
1)当数据正太大和负太小时会陷入饱和,也就是梯度为0,这时候back propagation的时候数据为0,kill了这个gradients
2)sigmoid输出不是以0为中心的。这会导致数据进入神经元的时候是正的,那么w计算出的梯度也会始终都是正的。而我们通常使用这种zigzag path去逼近最佳向量。
3)exp计算比较非时间
2.tanh函数:比sigmoid好的地方是他是零均值的。
3.LeRU函数是今年受欢迎的一种函数,存在几个优点:
1)在正区域不会饱和
2)计算更方便
3)收敛起来比sigmoid/tanh更快
但是缺点是在负区域还是会饱和,并且很容易就die了。举个例子,一个非常大的梯度流过一个 ReLU 神经元,更新过参数之后,这个神经元再也不会对任何数据有激活现象了。实际操作中,learning rate较大时神经元容易die,较小时发生的较少。
4.Leaky-ReLU,P-ReLU,R-ReLU
这些都是ReLU的变体,为了解决dying ReLU的问题。最终效果众说纷纭。
5.Maxout:ReLU和Leaky-ReLU的泛化形式,不会饱和也不会die。缺点是参数被double了。
如何选择激活函数?
- 如果使用ReLU,那么一定要小心设置 learning rate,而且要注意不要让你的网络出现很多 “dead” 神经元,如果这个问题不好解决,那么可以试试 Leaky ReLU、PReLU 或者 Maxout.
- 最好不要用 sigmoid,你可以试试 tanh,不过可以预期它的效果会比不上 ReLU 和 Maxout.
- 很少会把各种激活函数串起来在一个网络中使用的。
二.数据预处理
常见的数据预处理方式有zero-centered(减去平均值)和normalized(归一化),也有进行PCA和whitening的。但是对于image来说,一般采取两种:
- 减掉mean image
- 减掉每个channel的mean
数据预处理可以很好的减低分类损失对于weight matrix的敏感度。比如下面,左边直线稍微摆动影响要比右边大很多。在深度学习中,也要保证第一层均值不为0,方差不为0
三.权值初始化
常见的权值初始化方式:随机小数。随机小数又有好几种设置:
- 全为0:代价函数将不会减少,而且训练效果和预测效果都不好。这是因为权值设置全为0的网络是对称的,也就是说任一层的每个神经单元将学习相同的权值,最终学习的结果也是线性的,因此效果甚至还没有单个线性回归分类的效果有效。
- 初始化为大值:代价函数非常大,几乎所有的神经都会饱和为1或-1,最终梯度值为0
通常我们会使用Xavier initialization。
W = np.random.randn(fan_in, fan_out) / np.sqrt(fan_in)
四.Batch Normalization
归一化操作通常在FC或conv层之后进行,在nonlinearity之前进行。
进行批量归一化的步骤是:
- 对数据的每一维都计算平均值E和方差R。这样当我们需要的时候也可以复原原来的数据
- 使用下面的公式进行归一化:
五.调控学习过程
学习过程:
- 预处理数据
- 选择框架,多少层,多少个neuron
- 通过增加正则项,看loss是否提高的方式来判断loss计算是否合理。
- 首先选择少量数据训练,保证能过拟合这些数据,然后再加全量数据
- 学习率选择:太小则loss更新很慢,太大loss会爆炸。通常的学习率在[1e-3,1e-5]之间。
六.Hyperparameter Optimization
当我们在进行参数调优时,Random Layout有时会比Grid Layout更有效,因为这样能增加达到较优值的可能性。
七.Fancier optimization
1.带冲量的SGD
前面我们使用了SGD来求得目标函数的最小值,但是SGD存在着一些问题:
- 当loss在一个方向上变化快,一个方向上变化慢的时候,梯度会进入到曲折中。
- 容易陷入局部最优解和鞍点
为了解决这个问题,提出了一种更有效的方法,就是在SGD的基础上加上一个冲量。
这里的rho是摩擦系数,通常取0.95或0.9。通过这种操作,在最小点和鞍点的时候,就算梯度为0,冲量也不为0,可以冲过最小点和鞍点。
还有更好的是Nesterov Momentum:
2.RMSProp
RMSProp是AdaGrad的变体,解决了AdaGrad对于局部最小值学习率逐渐下降直到为0的问题。
3.Adam算法:Adam是上面几种算法的集合。
4.learning rate decay
先不用decay,然后看看学习率,再加上学习率decay,观看效果
八.Regularition
正则是提高算法性能的方法。常见的有L2,L1和Elastic net.
但是这个正则法在大型神经网络中不能实现。大型网络中通常使用的是Dropout。
Dropout是在一个网络层(通常选择FC层)中随机的选择部分节点,将他们的激活函数设置为0。
这样的好处有两点:
- 通过将部分神经元置零,可以避免特征之间的互相适应,一定程度上减少了过拟合。
- 每一次Dropout都是一次随机选择,这样就相当于一个超级巨大的网络库进行训练。
但是Dropout在测试的时候就不是特别的好,因为需要减少这种随机性,否则会对测试结果造成不必要的改变。这样就需要一些处理。
先对简单的加以判断,对于一个简单的x+y--> a的网络,测试时我们就只想得到w1x+w2y的均值,但是在训练时由于Dropout选择不同,均值就只有1/2(w1x+w2y)。所以我们就想到能不能再测试的时候乘以,或者训练的时候除以dropout概率。当然更倾向于训练的时候除以概率,因为训练可以在高配置机器上长时间运行。
九.Transfer Learning迁移学习
迁移学习其实就是当我们遇到的问题和数据跟原有的一些问题和数据有联系的时候应该怎么利用好原来的数据。比如,当我们想要处理一些自己的动植物的图片,只要使用好ImageNet预训练的模型,在最上面加个线性分类器就行了。
cs231n assignment实现在这:https://github.com/oubindo/cs231n-cnn