改善深层神经网络week1学习笔记

1.Initialization

Zero initialization

即初始化为0。如果将w权重矩阵和b偏置矩阵都使用Zero initialization则会产生以下的结果:

算法对每个测试样里都会输出0,因此准确率在0.5左右,与随机猜测无异。总体来说,因为没有“打破对称性”,每个神经元都做着一样的事情,所以说会产生如上结果。一般地,将b零初始化,w随机初始化。

Random initialization

即随机初始化np.random.randn(..,..)

作业中将权重矩阵W采用了np.random.randn(..,..) * 10的方法进行初始化,结果如下:

由于初始权重较大损失开始较大,糟糕的初始化可能会导致梯度爆炸或者梯度消失,进而减缓算法速度,初始化过大的权重也会减缓算法速度。

He initialization

该方法适用于ReLU activation,相较于随机初始化,本方法在后面乘以代码如下:

parameters['W' + str(l)] = np.random.randn(layers_dims[l], layers_dims[l-1]) * (2./layers_dims[l-1])**0.5

运行结果:

这也是本次作业中推荐使用的初始化方法。

2.Regularization

正则化为了处理过拟合的情况,在模型过于复杂时惩罚模型的复杂度

L2 Regularization

方法如下:

即在原来的cost后面加上了一个L2正则cost。当正则化因子 \lambda 设置的足够大的情况下,为了使代价函数最小化,权重矩阵 W 就会被设置为接近于0的值,则相当于减小了很多神经元的影响。

假设神经元中使用的激活函数为 g(z)=\tanh(z) ,在加入正则化项后:

当 \lambda 增大,导致 W^{[l]} 减小, Z^{[l]}=W^{[l]}a^{[l-1]}+b^{[l]} 便会减小,由上图可知,在 z 较小的区域里, \tanh(z) 函数近似线性,所以每层的函数就近似线性函数,整个网络就成为一个简单的近似线性的网络,从而不会发生过拟合。

L2 regularization 是决策边界更加平滑,如果\lambda过大,可能会造成边界过于平滑而导致高偏差。

L2 regularization基于权重较小的模型比权重较大的模型工作效果更好这一观点,因此在cost中采用平方项来使得权重取较小的值。

Dropout

该方法在每一次迭代中随机关闭一些神经元来减少神经元的影响,编码中采取了一个mask矩阵D来实现。利用D与A相乘来消除一部分神经元的影响,同时注意要对未被消除影响的神经元进行规模复原。编码如下:

# LINEAR -> RELU -> LINEAR -> RELU -> LINEAR -> SIGMOID
    Z1 = np.dot(W1, X) + b1
    A1 = relu(Z1)
    ### START CODE HERE ### (approx. 4 lines)       
    D1 = np.random.rand(A1.shape[0], A1.shape[1])   # Step 1: initialize matrix D1 = np.random.rand(..., ...)
    D1 = D1<keep_prob               # Step 2: convert entries of D1 to 0 or 1 (using keep_prob as the threshold)
    A1 = A1*D1                      # Step 3: shut down some neurons of A1
    A1 = A1/keep_prob               # Step 4: scale the value of neurons that haven't been shut down
    ### END CODE HERE ###

值得注意的是:dropout只用于训练集,要在前向传播和后向传播中同步运用。

Dropout 缺点:dropout的一大缺点就是其使得 Cost function不能再被明确的定义,以为每次迭代都会随机消除一些神经元结点,所以我们无法绘制出每次迭代 J(W,b) 下降的图。

另外,regularization方法会导致训练集准确率下降,因为它限制了过拟合能力,但是会在测试集上有更好表现。

3.Gradient Checking

这里主要是讲的检验梯度的方法。这里给出了一个变量gradapprox,用了双边逼近的原理,计算方法如下:

然后将gradapprox与后向传播算出的grad计算误差:

误差低于一定的阈值则判定为正确。

至于作业中估计设置错误来造成梯度检验错误的地方在这里:

把这个莫名其妙的4改成1就行了。。。

值得一提的是作业中有个定义好的函数,对parameter进行操作时得到的结果示意图如下:

这是作业给出的示意图,但是实际结果是下方的values为(num_parameters, 1)的矩阵,如下:

这一点作业中似乎没有说的清楚,所以在后面计算时,theta实际上是包含所有参数的列为1的矩阵,即对所有参数都单独进行了的运算,然后进行向量的误差计算。

猜你喜欢

转载自blog.csdn.net/stezio/article/details/81092584