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。当正则化因子 设置的足够大的情况下,为了使代价函数最小化,权重矩阵 就会被设置为接近于0的值,则相当于减小了很多神经元的影响。
假设神经元中使用的激活函数为 ,在加入正则化项后:
当 增大,导致 减小, 便会减小,由上图可知,在 较小的区域里, 函数近似线性,所以每层的函数就近似线性函数,整个网络就成为一个简单的近似线性的网络,从而不会发生过拟合。
L2 regularization 是决策边界更加平滑,如果过大,可能会造成边界过于平滑而导致高偏差。
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不能再被明确的定义,以为每次迭代都会随机消除一些神经元结点,所以我们无法绘制出每次迭代 下降的图。
另外,regularization方法会导致训练集准确率下降,因为它限制了过拟合能力,但是会在测试集上有更好表现。
3.Gradient Checking
这里主要是讲的检验梯度的方法。这里给出了一个变量gradapprox,用了双边逼近的原理,计算方法如下:
然后将gradapprox与后向传播算出的grad计算误差:
误差低于一定的阈值则判定为正确。
至于作业中估计设置错误来造成梯度检验错误的地方在这里:
把这个莫名其妙的4改成1就行了。。。
值得一提的是作业中有个定义好的函数,对parameter进行操作时得到的结果示意图如下:
这是作业给出的示意图,但是实际结果是下方的values为(num_parameters, 1)的矩阵,如下:
这一点作业中似乎没有说的清楚,所以在后面计算时,theta实际上是包含所有参数的列为1的矩阵,即对所有参数都单独进行了的运算,然后进行向量的误差计算。