算法的优化
任何网络要想达到极好的效果都不是一簇而就的,需要一个迭代的过程,不断的调整参数,如果初始参数能够设置的很好,无疑能够极大的缩短这个过程。
数据集
对于数据集,大体可分为三类:训练集,交叉验证集,测试集
1、在机器学习时代,三者的比例为6:2:2,但随着数据的爆炸式的增长,训练集的比例占的越来越大,而其余两者只需要很少的数据进行验证即可。
2、当测试集跟训练集不匹配时,一个原则是验证集与测试集服从相同的分布,这样算法达到最优的速度最快
误差
高偏差:对训练集拟合较差
高方差:对训练集拟合较好,但对测试集拟合较差
1、如果偏差较高,我们要么采用规模更大的网络,要么延长训练时间,或者选择其他的网络结构,如果偏差降下来了,方差过高,此时可以尝试更多的数据,或者进行正则化,或者找到更合适的网络结构
2、以逻辑回归为例,通常正则化使用L2范数,即
λ2m||w||2
λ
2
m
|
|
w
|
|
2
,使用L1范数可以增加参数的稀疏程度
3、dropout:遍历结点,随机删除一些结点,之后训练网络,这样网络变得精简,训练也会消除过拟合,目前最有效的dropout算法是反向dropout算法,在去除一些结点后,激活值再除以这个保留概率。
4、另外几种正则化的方法:数据集扩增(通过翻转,变形等)、early stop(实质是过早的停止优化代价函数,这样就不会出现过拟合)
加速训练
1、归一化输入: x−μσ2 x − μ σ 2
梯度消失与梯度爆炸
梯度的计算遵循链式法则,如果前一层梯度变化过小,神经网络的深度如果过深,就会出现梯度消失,如果前一层梯度变化过大,就会出现指数级的增长,即梯度爆炸
解决的办法是对初始权证的调整:将每个神经元的权重向量按下面的方法进行初始化:w=np.random.randn(shape)/sqrt(1/n)