正则化
定义:正则化就是在计算损失函数时,在损失函数后添加权重相关的正则项。
作用:减少过拟合现象
正则化有多种,有L1范式,L2范式等。一种常用的正则化公式
\[J_{regularized} = \small \underbrace{-\frac{1}{m} \sum\limits_{i = 1}^{m} \large{(}\small y^{(i)}\log\left(a^{[L](i)}\right) + (1-y^{(i)})\log\left(1- a^{[L](i)}\right) \large{)} }_\text{cross-entropy cost} + \underbrace{\frac{1}{m} \frac{\lambda}{2} \sum\limits_l\sum\limits_k\sum\limits_j W_{k,j}^{[l]2} }_\text{L2 regularization cost}\]
使用正则化,需要分别在计算损失函数和反向传播计算导数时做相应的修改。
上述正则化对应的反向传播公式需添加一项:
\[\frac{d}{dW} ( \frac{1}{2}\frac{\lambda}{m} W^2) = \frac{\lambda}{m} W\]
dropout
定义:dropout是指在每次迭代训练时随机从网络结构中去掉部分节点
作用:减少过拟合
注意:只在训练时使用dropout,测试时不使用
实现方法:给每一层节点都设置一个保留概率keep_prob
- 前向传播:
- 定义一个和每一层输入相同结构的mask,随机初始化为0-1之间的小数
- mask中小于keep_prob的,置为1(节点保留),否则为0(节点丢弃)
- 该层输入 = 该层输入 * mask / keep_prob
- 反向传播:
- dA = dA * mask / keep_prob
梯度校验
定义:通过比较反向传播梯度值与双边近似梯度值校验反向传播过程是否正确
作用:深度神经网络的前向传播实现相对简单,而反向传播相对复杂,容易出现差错。故用前向传播的结果近似计算梯度值,并与梯度值做比较。如果误差足够小,则认为反向传播计算是正确的。
梯度近似公式:
\[ \frac{\partial J}{\partial \theta} = \lim_{\varepsilon \to 0} \frac{J(\theta + \varepsilon) - J(\theta - \varepsilon)}{2 \varepsilon}\]
梯度差异公式:
\[ difference = \frac {\| grad - gradapprox \|_2}{\| grad \|_2 + \| gradapprox \|_2 }\]
- \(\varepsilon\)一般取1e-7,如果最终差异小于1e-7认为是正确,大于1e-3认为错误,介于之间需要仔细确认。
- 梯度校验非常耗时,训练时不进行校验,只在需要验证时运行。
- 如果使用drop_out想进行梯度校验,先将keep_prob置为1,即关闭drop_out,校验无误后再打开drop_out