1.关于参数的初始化
1.1 避免W的零初始化,W初始化为零会导致对称性,即不同神经元做的工作类似,从削弱神经元的影响,在最极端的情况下即所有层的Wl都初始化为零,则原神经网络退化为线性回归,这是个非常不好的现象,所以通常对W使用随机初始化以打破对称性,而b可以零初始化因为b的影响较小
1.2避免W的初始化值过大,会导致神经网络表现不好,如cost下降慢等现象
1.3He初始化非常适用于以RelU为主要激励函数的神经网络架构,He初始化的具体操作为:加一个尾项
for l in range(1, L + 1):
### START CODE HERE ### (≈ 2 lines of code)
parameters['W' + str(l)] = np.random.randn(layers_dims[l],layers_dims[l-1])*np.sqrt(2./layers_dims[l-1])
parameters['b' + str(l)] = np.zeros((layers_dims[l],1))
2关于正则化
正则化主要用于减小high variance即高偏差的现象,在建立一个神经网络后,若训练集的表现很好但验证机表现很差,则说明出现了过拟合现象,引起了high variance,通过正则化可以较好的减轻影响
2.1 L2正则化
L2正则化是在代价函数后加一个正则项,具体形式见手写笔记,而在code实现过程中,计算cost需要加一项:
cross_entropy_cost = compute_cost(A3, Y) # This gives you the cross-entropy part of the cost
### START CODE HERE ### (approx. 1 line)
L2_regularization_cost = (1./m*lambd/2)*(np.sum(np.square(W1)) + np.sum(np.square(W2)) + np.sum(np.square(W3)))
### END CODER HERE ###
cost = cross_entropy_cost + L2_regularization_cost
在计算梯度集backward——propagation时有需要添加尾项:
dW3 = 1./m * np.dot(dZ3, A2.T) + lambd/m * W3
2.2dropout正则化
dropout的原理是使神经元以一定概率随机不起作用,从而减小对某一特征的依赖性,以减小过拟合
使用dropout正则化时前向传播计算A和反向传播计算dA乘上相应的dropout矩阵并除以keep_prob保证Z的期望值不变
具体操作如下:
前向传播:
Z1=np.dot(W1,X)+b1
A1=relu(Z1)
D1=np.random.randn(A1.shape[0],A1.shape[1])<keep_prob
A1=np.multiply(A1,D1)
A1=A1/keep_prob
反向传播:
dA1 = np.dot(W2.T, dZ2)
dA1 = dA1 * D1
dA1 = dA1 / keep_prob
3关于梯度检验
梯度检验如是为了减少bug的出现,验证梯度计算过程是否正确