周末偷懒了w新的一周继续~
这节课主要将训练神经网络,讲到训练不可避免的要讲的就是激活函数了
6.1 激活函数
放了几个用的比较多的
首先是sigmoid,sigmoid激活函数有三个问题
1)梯度消失,sigmoid函数只有0附近的极小区域能够有效的保留梯度
2)sigmoid非零中心,这会导致训练效率比较低
3)因为引入了exp()的计算,计算代价比较大(当然和卷积相比无足轻重了)
然后就有了tanh
tanh解决了零对称的问题,但是依旧存在梯度消失的问题,所以引入了ReLU
ReLU在正值区域不存在梯度消失,并且计算简单,而且收敛速度更快,大概会快6倍,同时神经生物学的现象更相符。这么看确实很好用,然而他还是非零对称,并且它的负区间永远无法激活。所以就有了一些对ReLU的改进
嘛一个固定系数的Leaky ReLU和一个alpha系数的参数整流器,PReLU,至于下面这个ELU我还是第一次见,真的有人用这个嘛。。。
至于Maxout。。。我就当没见过好了
感觉说的比较明朗了,就用ReLU,或者变种就好了
6.2 数据预处理
讲完激活函数就正式进入训练步骤的讲解了
数据预处理,给的两个例子分别是零均值化和标准化,然后讲到图像的一般是按照三通道分别减去均值做中心化
6.3 权重初始化
权重如果不进行有效的初始化,训练效率和训练效果都不好,从业者的第一个思路是小的随机数权重,这样对小型网络是完全ok的,但是对深层网络效果不佳
当然课程也举了个深层网络的例子来看看效果,一个十层的,每层五百个神经元,激活函数为tanh的深层网络
从下图可以看出,随机初始权重最终很快就使得输入的标准差缩小,最终全变成零了,相当于没啥用
如果换成随机的较大初始权重
会发现由于激活函数的特性,直接趋于饱和了,导致梯度变成0,权重无法更新。可见初始权重是比较重要的,权重过小网络崩溃,权重过大网络饱和。然后就提到了Xavier的初始化,一般是使得前向和后向传播的过程中每层的的方差相同,不过一般实际应用只考虑前向
而由于激活函数特征不同,ReLU的情形和tanh这种也不一样,它往往伴随着半数的神经元失活,这部分讲课讲的不是很清晰,所谓提出的解决办法/2针对的应该是权重
当然上面只是两个简单的思路,还有一大堆别的方法
说实话这部分TA讲的有点一般了
6.3 批归一化
说实话这部分讲的实在是不太好,批归一化是为了让数据呈现高斯分布,但是没有具体讲明白,比如对于sigmoid或者tanh这样的函数,由于高斯分布能够保证有个有效的训练和收敛或者什么的,但是另一方面强行高斯分布也未必是最好的选择,所以BN还有尺度因子和平移因子,他这个直接这么讲有点太简单了
这里大概讲了一下BN一般的位置放在激活和全连接层之间
这里主要讲的尺度因子和平移因子,不过感觉整个思路讲的不是很不清晰
然后给出来算法上的具体公式,讲了讲流程,先算mini-batch均值和方差,然后归一化,再添加尺度和平移,从而控制网络训练的梯度变化,另一方面使得网络的鲁棒性也更强
6.4 观察学习过程
有了网络,准备了一堆trick,接下来要讲怎么当一个真正的调参侠了,冲!
第一步:数据预处理
第二步:选择网络结构
确认一下自己设计的破烂损失函数
然后试训开冲
试完了正式开始训练,拿上所有的训练数据,正则化一下,确认一下学习率
然后在太慢和太菜里面反复横跳确认最后的学习率
6.5 超参数优化
问就是交叉验证
整个例子
然后验证的时候随机采样和网格采样,可以看出了随机对目标的特征刻画的更好一些
好家伙下节课全是重头戏的trick
监控损失曲线和精度曲线来进行调整
还要看看你的权重是不是在乱冲
喜闻乐见的总结,下课
好家伙出差最后一周写的开头,回来打杂两周才补完发出来