设计你的机器学习应用
训练/开发/测试集
1.原始机器学习:Train/test=7:3
进阶:Train/dev/test=6:2:2
现代大数据机器学习:Dev/test只要足够多就可以了
且train/dev/test中样本的分类要平均
2.没有test,只有train/dev是可以的
偏差/方差
High bias高偏差,欠拟合
High var高方差,过拟合
特征维度过多,无法可视化:通过train error和dev error得出
*为什么高方差是过拟合?
低方差 高方差
机器学习的基本方法
正则化你的神经网络
正则化
过拟合——>正则化
L2 √
L1 一般不用,会是模型稀疏
为什么正则化减少了过拟合
λ增加,w降低,又因为z=wx+b,则z很小(从正负逼近0),又tanh(激活函数)在0附近是线性的,所以神经元退化(非线性->线性),复杂边界也从非线性->线性
*如果没有非线性激活函数,无论多少层线性层都可以合并为一层简单的线性层
dropout正则化
dropout简化网络
*dropout知识堵住了输出,各节点的输入是正常的
对a=0而不是z=0,不要为了简化计算而将z置为0
之后进行a=a/keep_prob,keep_prob(存留率越大,失活的神经元越少),可取0.5
每次迭代时置为0 的神经元要不同
测试时不需要a=a/keep_prob这一步,且keep_prob=1
理解dropout
这样做的好处是使得神经网络不依赖于任何一个特征,在计算机视觉领域dropout很常用
有dropout时loss计算公式不明确,曲线可能不是很好,需要先关闭dropout确保loss曲线平稳下降再加入dropout
其他正则化策略
加大数据量(放大,对称,旋转)
Early stopping
缺点:同时优化了J和正则化,可能导致两个任务都没有完全做好
设计你的优化问题
标准化输入
x=(x−μ)/σ , 其中,σ是标准差
训练、测试时都使用训练时的μ、σ
梯度消失/爆炸
梯度消失与爆炸<->权重初始化
主要发生在深层神经网络中
深度网络的权重初始化
Xavier:tanh(
∗
s
q
r
t
(
1
n
L
−
1
*sqrt(\cfrac{1}{n^{L-1}}
∗sqrt(nL−11)),
n
L
−
1
n^{L-1}
nL−1指上一层神经元个数
He:Relu
一定程度上可以缓解欠拟合
梯度的数值近似
梯度检查:
g
r
a
d
a
p
p
r
o
x
i
=
d
θ
=
f
(
θ
+
ε
)
−
f
(
θ
−
ε
)
2
ε
gradapproxi=dθ= \cfrac{f(θ+ε)−f(θ−ε)}{2ε}
gradapproxi=dθ=2εf(θ+ε)−f(θ−ε)
所有w,b化为一个θ向量
梯度检查
∥
d
θ
g
r
a
d
a
p
p
r
o
x
i
−
d
θ
g
r
a
d
∥
2
∥
d
θ
g
r
a
d
a
p
p
r
o
x
i
∥
2
+
∥
d
θ
g
r
a
d
∥
2
\cfrac{\left \| dθ_{gradapproxi}-dθ_{grad} \right \|_2}{\left \| dθ_{gradapproxi} \right \|_2+\left \| dθ_{grad} \right \|_2}
∥dθgradapproxi∥2+∥dθgrad∥2∥dθgradapproxi−dθgrad∥2
结果为
1
0
−
7
10^{-7}
10−7时证明梯度正确
梯度检查应用的注意事项
梯度检查与dropout不能一起使用