因为项目的需要,这周开始学习深度学习。为了了解深度神经网络,则需要从浅层网络学起,尤其是通过浅层神经网络的推导,掌握反向传播算法的实现原理。本文以一个3层神经网络为例,对从前向传播到反向传播的整个训练过程进行推导,并给出了python代码实现。
上图给出一个简单的三层神经网络,最左边一层为输入层 L1 ,中间层为隐藏层 L2 ,最右边一层为输出层 L3 。
本神经网络有参数 (W,b)=(W(1),b(1),W(2),b(2)) ,其中 W(l)ij 表示第 l 层第 j 个单元到第 l+1 层第 i 个单元之间的连接权值, b(l)i 表示第 l+1 层第 i 个单元的偏置项。我们用 z(l)i 表示第 l 层第 i 个单元的输入加权和,用 a(l)i 表示第 l 层第 i 个单元的激活值。则本例神经网络的计算步骤(前向传播步骤)如下:
前向传播过程的矩阵化表示为:
给定一个样本集 {(x(1),y(1)),...,(x(m),y(m))} ,包含 m 个样例,表示成矩阵的形式为 {X,y} ,其中 X 为2*m大小的矩阵,每一列为一个样例。使用softmax函数作为输出层激活函数的神经网络,目标函数可以表示为:
然后可以通过批量梯度下降法最小化目标函数来求得神经网络的最优参数 (W,b) ,参数更新的关键是求偏导数,梯度下降法每次迭代如下公式对参数 (W,b) 进行更新:
反向传播过程矩阵化表示为:
神经网络因其参数多,对数据的表达能力强,因此很容易过拟合。为了防止过拟合,措施之一是在原目标函数的基础上加上一项正则化项,也称为权重衰减项,用来减小权重的幅度,防止过拟合。需要注意的是在权重衰减项里面不使用偏置项 b(l) ,若对偏置项也施加和 W(l) 同样的约束,最后的效果和不添加任何正则化项的效果相同。权重衰减参数 λ 控制两项之间的相对重要性。
完整的反向传播过程矩阵化表示为:
根据前向传播和反向传播的矩阵化表示,批量梯度下降法的一次迭代的步骤的代码如下:
#Parameter setup
nn_input_dim = 2
nn_hdim = 3
nn_output_dim = 2
epsilion = 0.01 #learning rate
reg_lambda = 0.01 #regularization parameter
#Initialize the parameter to random values
W1 = np.random.randn(nn_hdim, nn_input_dim)/np.sqrt(nn_input_dim)
b1 = np.zeros((nn_hdim, 1))
W2 = np.random.randn(nn_output_dim, nn_hdim)/np.sqrt(nn_hdim)
b2 = np.zeros((nn_output_dim, 1))
#Forward propagation
z2 = W1.dot(X) + b1
a2 = np.tanh(z2)
z3 = W2.dot(a2) + b2
exp_scores = np.exp(z3)
probs = exp_scores/np.sum(exp_scores, axis=0, keepdims=True)
# Back propagation
delta3 = probs
delta3[y, range(num_examples)] -= 1
dW2 = delta3.dot(a2.T)
db2 = np.sum(delta3, axis=1, keepdims=True)
delta2 = W2.T.dot(delta3)*(1-np.power(a2, 2))
dW1 = delta2.dot(X)
db1 = np.sum(delta2, axis=1, keepdims=True)
# add regularization term
dW2 += reg_lambda*W2
dW1 += reg_lambda*W1
# gradient descent parameter update
W1 += -epsilion*dW1
b1 += -epsilion*db1
W2 += -epsilion*dW2
b2 += -epsilion*db2
对于下面这样数据库,使用隐藏层包含3个单元的网络训练出的结果为:
完整的python代码地址为:
https://github.com/dumengnanbuaa/neuralnetwork_python
参考内容:
1.https://github.com/dennybritz/nn-from-scratch/blob/master/nn-from-scratch.ipynb
2.http://ufldl.stanford.edu/wiki/index.php/UFLDL_Tutorial
3.台湾大学机器学习技法课程