np.linalg.norm(x, ord=None, axis=None, keepdims=False) 求向量(矩阵)范数。
参数 | 说明 | 计算方法 |
---|---|---|
默认 | 二范数:$l_2$ | $\sqrt{x_{1}^{2}+x_{2}^{2}+\cdots+x_{n}^{2}}$ |
ord = 2 | 二范数:$l_2$ | $\sqrt{x_{1}^{2}+x_{2}^{2}+\cdots+x_{n}^{2}}$ |
ord = 1 | 一范数:$l_1$ | $\lvert x_{1} \rvert + \cdots + \lvert x_{n} \rvert $ |
ord=np.inf | 无穷范数 $l_{\infty}$ | $\max({\lvert x_{i}) \rvert}$ |
1 | >>> x = np.array([3, 4]) |
算法步骤
梯度检查(Gradient Checking)用于检查实现的反向传播算法是否正确。利用前向传播函数,通过公式
$$ \frac{\partial J}{\partial \theta} = \lim_{\varepsilon \to 0} \frac{J(\theta + \varepsilon) - J(\theta - \varepsilon)}{2 \varepsilon} $$
来计算导数的近似值,与反向传播计算得到的导数进行对比,来判断反向传播是否正确。
具体步骤如下:
- 首先计算导数的近似值
- $\theta^{+} = \theta + \varepsilon$
- $\theta^{-} = \theta - \varepsilon$
- $J^{+} = J(\theta^{+})$
- $J^{-} = J(\theta^{-})$
- $gradapprox = \frac{J^{+} - J^{-}}{2 \varepsilon}$
- 然后计算反向传播算法得到的导数grad
- 最后通过下面公式来对比两个值的差别大小,若很小,如小于$10^{-7}$,便认为反向传播算法的实现是正确的。
$$ difference = \frac {\mid\mid grad - gradapprox \mid\mid_2}{\mid\mid grad \mid\mid_2 + \mid\mid gradapprox \mid\mid_2} $$
当有很多个参数时,分别对每个进行梯度检查。算法步骤如下:
For each i in num_parameters:
- To compute
J_plus[i]
:- Set $\theta^{+}$ to
np.copy(parameters_values)
- Set $\theta^{+}_i$ to $\theta^{+}_i + \varepsilon$
- Calculate $J^{+}_i$ using to
forward_propagation_n(x, y, vector_to_dictionary(
$\theta^{+}$))
.
- Set $\theta^{+}$ to
- To compute
J_minus[i]
: do the same thing with $\theta^{-}$ - Compute $gradapprox[i] = \frac{J^{+}_i - J^{-}_i}{2 \varepsilon}$
1 |
|
注意,进行梯度检查是很耗时的,仅仅是用来检查反向传播的实现是否正确,所以我们在训练过程中不能加进去。而且梯度检查不能用在使用dropout的神经网络中,进行梯度检查时要关闭dropout。