声明: 此笔记为吴恩达(Andrew Ng)的深度学习课程学习后的总结,会根据自己的学习进度更新。
深度学习的实用层面( Setting up your ML application)
1.Train/dev/test sets
- Applied ML is a highly iterative proess(需要不断的调整并迭代,如下图)
-
Train/dev/test sets(关于数据的分配)
- Previous era(小数量) : 60% / 20% /20%
- Big data(大数据) :99.5% / 0.4% /0.1%
(1).不是唯一的分配法,注意分布量的比较及可,有时不需要用到test时,可以只需训练集和验证集(train/dev)此时验证集通常被大众叫做“测试集”
(2).注意训练和测试的数据要符合同分布
2.Bias/Variance(偏置/方差)
-
偏置和方差的影响
- 高偏置(high bias) 时趋于线性区分及欠拟合(underfitting)
- 高方差(high variance)时对于此训练集的区分可能很好,但过拟合了(overfitting)
- 找到刚刚好,就需要取权衡偏置和方差【这也许就是玄学的第一个验证点了】
-
何为高偏置/高方差?
- Train set erro(训练集错误率):① 1% ② 15% ③ 15% ④ 0.5%
- Dev set erro(验证集错误率) :① 11% ② 16% ③ 20% ④ 1%
- ①:high variance ②:high bias ③:high variance,high bias ④:low variance,low bias
3.Basic “recipe” for ML(关于机器学习调整的基本方法)
- 浅谈如何解决高方差与高偏差
-
解决高方差:正则化(regularization)
-
min J(w,b)
J ( w , b ) = 1 m ⋅ ∑ i = 1 m L ( y ^ ( i ) , y ( i ) ) + λ 2 m ⋅ ∣ ∣ w ∣ ∣ 2 2 J(w,b) = \frac 1 m \cdot \sum_{i=1}^{m} L(\hat {y}^{(i)},y^{(i)}) + \frac{\lambda}{2m} \cdot ||w||^2_2 J(w,b)=m1⋅i=1∑mL(y^(i),y(i))+2mλ⋅∣∣w∣∣22
L 2 r e g u l a r i z a t i o n : ∣ ∣ w ∣ ∣ 2 2 = ∑ j = 1 n x ⋅ w j 2 = w T ⋅ w L2 \ regularization : ||w||_2^2 = \sum_{j=1}^{n_x} \cdot w_j^2 = w^T \cdot w L2 regularization:∣∣w∣∣22=j=1∑nx⋅wj2=wT⋅w
lamda的值要靠试,玄学之二
-
-
正则化利于预防过拟合的原因
- 当lambda足够大的时候,w在向后传播的时候,dw会减小,则导致W趋近于0,相当于一个复杂的网络每一层只有一个单元起作用,如下图:
-
Dropout regulation
-
每一层选择一个概率,这个概率就是该层神经元起作用的比例,如图:
-
如何应用dropout?以第三层神经网络举例:
#伪代码示例 keep_prob = 0.8 d3 = np.random.rand(a3.shape[0],a3.shape[1]) < keep_prob a3 = np.multply(a3,d3) a3 = a3 / keepz_prob
- drop-out是如何工作的?
-
不能依赖任何某一个特征,因为特征有可能被随机清除,所以需要通过这个方式积极的传播开,drop-out也将产生说所权重得平方范数得效果(翻译过来,有些不太精准)
-
对于不同层drop-out可能都有所不同,比如某一层过拟合较为严重就设得更小。
-
-
-
其他防止过拟合的方法
- 增加数据量,例如图片数据,可以进行裁剪、反转、倒置等进行扩充有限数据。
- 提前结束训练的迭代,代价函数会随着迭代的增加而减小,但是验证集的误差可能会在某一个点开始增大,如图:
4.Setting up your optimization problem(优化问题)
-
归一化输入
特征之间的范围差异过大,会导致超参数难以去调整,在梯度下降时会需要特别小的学习率去进行,而归一化之后代价函数更易优化并且会更快的进行优化,如图所示:
-
梯度消失与梯度爆炸
假设了激活函数g(Z)=Z,b=0,如果权重W比“1”大一点,例如“1.5”,激活函数就会出现指数级增长,比“1”小一点,例如“0.5”,激活函数就会出现指数级下降,相对应L层的其他超参数也会出现指数级的变化,假设有150层,而梯度下降的步长会特别小,那么训练周期会特别长
-
解决梯度消失或爆炸:权重初始化的技巧
以单神经元为例子:
Z = W 1 X 1 + W 2 X 2 + . . . + W n X n Z = W_1X_1+W_2X_2+ ... +W_nX_n Z=W1X1+W2X2+...+WnXn
l a y e r n — > S m a l l e r W i layer \ n \ —> Smaller \ W_i layer n —>Smaller Wi
V a r ( W i ) = 2 n Var(W_i) = \frac 2 n Var(Wi)=n2
W [ l ] = n p . r a n d o m . r a n d n ( s h a p e ( ) ) ⋅ n p . s q r t ( 2 n [ l − 1 ] ) W^{[l]} = np.random.randn(shape()) \cdot np.sqrt(\frac{2}{n^{[l-1]}}) W[l]=np.random.randn(shape())⋅np.sqrt(n[l−1]2)
-
如何计算梯度的数值逼近
用双边的公差作为Δ而不是单边(很简单的微分知识) -
梯度检验(gradient checking)
如图: