1.训练样本的分布
交叉验证指的是训练集和验证集,为了防止在训练过程中受到部分训练样本的影响
一般当样本数目较少时,采用60/20/20的比例,60%的训练集,20%的验证集,20%的测试集
当样本数目较大时,一般可以采用2.5%的验证集和1%的测试集,其他都是训练样本。
很多情况下,我们会不适用测试集,这样的训练集叫做训练验证集
2.偏差和方差
当在训练集的准确度很高,在验证集或者测试集的准确度很差时,称为过拟合,即高方差
当在训练集的准确度很差时,称为欠拟合,即高偏差
一般较好的都是训练集的错误率在0.5%,测试集或者验证集的1%
高偏差的解决方法,采用更加大的神经网络进行训练
高方差的解决方法,使用更多的数据进行训练,提高模型的泛化能力,或者就添加正则化,防止过拟合的情况出现
3.正则化
L2 regulation 正则化:
加上 dw = (from backpop) + λ/m*w
w[l] = w[l] - dw * a a表示学习率
当λ 很大时, w[l]会变得很小
Z[l] = w[l]*A[l-1] +b[l]
当Z趋于很小时,tanh(Z)的值处于一个较小值,这个时候的方程趋于线性,防止了过拟合状况的出现
dropout 正则化
在参数进行更新时,随机的关闭一部分的神经元
d3 = np.random.rand(a3, shape[0], shape[1]) < keep-prob
a3 = np.multiply(a3, d3)
a3 / = keep-prob 保证期望值不变
dropout 会压缩权重,导致每个神经元的权重都接近,在我们查看损失函数的时候,一般都会先关闭dropout
import numpy as np a=[np.random.random() for x in range(6)] temp=(np.random.random()>0.5 for x in range(np.shape(a)[0])) temps = [] for i in temp: temps.append(i) a = np.multiply(a, temps)
其他正则化方法
数据扩增:水平翻转图片,进行随意的裁剪,
采用Eealy stop ,当损失函数的值出现多次上升时,停止迭代,取第一次上升时的前一次的参数
4.正则化输入
对样本参数采用归一化输入
首先去均值,使得数据的均值为0
然后处于样本的方差,使得样本的均值为0,方差为1, 可以使得各个参数的分布都处于一个接近的范围内
5.梯度消失或梯度爆炸
当g(Z) = Z
y = X * w[1]*w[2]*w[3]*w[4].....
当W[l]>1时,深度很深时, 激活函数以指数上升就会出现梯度爆炸
当W[l] < 1时,深度很深时, 激活函数以指数下降就会出现梯度消失
.梯度消失或梯度下降的初步解决方法
神经网络权重初始化
w[l] = np.random.randn(shape) * np.sqrt(2/n[l-1]) n[l-1] 表示当前层神经元的个数
6. 梯度检验
使用双边误差做梯度检验, 确保backpop正确
对参数进行梯度检测
dθapper[i] = (J(θ1, θ2, ...θi+ξ, ) - J(θ1, θ2, ...θi-ξ, )) / 2
check = (dθapper[i] - dθ) / (dθapper[i] + dθ) =10-7
可以检测神经网络的错误
import numpy as np def sigmoid(z): return 1./(1+np.exp(-z)) # 定义dA/dz函数的导数 def sigmoid_prime(z): return sigmoid(z) * (1-sigmoid(z)) def check_gradient(f, x0, epsilon): return (f(x0+epsilon) - f(x0-epsilon)) / 2.0 / epsilon x0 = np.array([1, 2, 3]) epsilon = 1e-4 print(sigmoid_prime(x0)) print(check_gradient(sigmoid, x0, epsilon))