神经网络
误差逆传播法(error BackPropagation简称BP)
参考机器学习 周志华 P101
f(x)表示跃阶函数
$$
f(x) = \frac{1}{1+e^{-x}}
$$
这里暂时只考虑单层隐藏层的神经网络(又名“单隐层网络”或者是“两层网络”),只要包含隐藏层的都叫多层网络。
Input layer共d个节点 ,一条训练数据进入,共有d个属性,将$x_i$传给每一个对应的输入节点
那么Input layer节点的输出就是: $x_i$
Input layer和hidden layer之间相连的边的权值就是:$V_{ih}$表示第i个输入节点连接第h个隐藏层节点边的权值。
Hidden layer共q个节点
第h个hidden layer节点有以下几个参数表示
Hidden layer输入:$\alpha_h = \sum_{i=1}^dV_{ih}x_i$
Hidden Layer阈值:$\gamma_h$
Hidden layer输出:$b_h = f(\alpha-\gamma_h)$
hidden layer和Output layer之间相连的边的权值就是:$W_{ih}$表示第h个隐藏层节点连接第j个输出层节点边的权值。
Output layer共l个节点
第j个Output layer节点有以下几个参数表示
Output layer输入:$\beta _j = \sum_{i=1}^qW_{ij}b_i$
Output layer阈值:$\theta _j$
Output layer输出:$\hat{y_j^k} = f(\beta_j-\theta_j)$ 表示在第k次训练数据进入对神经网络进行调整时候在第j个输出元得到的输出值
Output layer实际应该输出:$y_j^k$表示在第k次数据进入对神经网络进行调整时候在第j个输出元得到的实际值
那么在第k次训练数据得到的均方误差表示如下
$$
E_k = \frac{1}{2} \sum_{j=1}^{l}(\hat{y_j^k}-y_j^k)^2
$$
这里一共有4种类型的未知数,输入层到隐藏层的连接权值V,隐藏层的阈值$\gamma$,隐藏层到输出层的连接权值W,输出层的阈值$\theta$。
根据梯度下降原则,将其中一个参数作为变量考虑,其他参数都作为固定的常数的情况下,我们就可以得到当前变量对于$E_k$的导数,这就是当前参数梯度下降的向量方向。
那么对应的任意参数v的更新估计公式就是:
$$
v \leftarrow v+\Delta v
$$
因为将任意一个参数作为位置数,其他位置固定,求导出来的都是一个常数,所以可以理解为在定义域上单调,一定能找到一个下降的位置。
$$
\Delta W_{hj} = - \eta \frac{\partial {E_k}}{\partial {W_{hj}}}
$$
这个的计算我们可以一步步微分推导,依据如下的式子自下而上推导得到:
$$
\begin{aligned}
hidden \space layer输入: & \alpha_h = \sum_{i=1}^d{V_{ih}x_i} \quad & (1) \\
hidden \space layer输出:& b_h = f(\alpha_h - \gamma_h) \quad & (2) \\
output \space layer输入: & \beta_j = \sum_{i=1}^q{W_{ij}b_i} \quad & (3) \\
output \space layer输出:& \hat {y_j^k} = f(\beta_j - \theta_j) \quad & (4) \\
总的误差:& E_k = \frac{1}{2}\sum_{j=1}^l(\hat {y_j^k}-y_j^k)^2 \quad & (5) \\
\end{aligned}
$$
那么很容易就得到:
$$
\frac{\partial {E_k}}{\partial {W_{hj}}} = \frac{\partial {E_k}}{\partial {\hat {y_j^k}}}\frac{\partial {\hat {y_j^k}}}{\partial \beta_j}\frac{\partial \beta_j}{\partial {W_{hj}}} \\
\frac{\partial \beta_j}{\partial {W_{hj}}} = b_h \\
Sigmoid函数有个很好的性质就是:f^{‘}(x) = f(x)(1-f(x)) 所以可得\\
g_j = -\frac{\partial {E_k}}{\partial {\hat {y_j^k}}}\frac{\partial {\hat {y_j^k}}}{\partial \beta_j} = -(\hat {y_j^k} - y_j^k)f^{‘}(\beta_j-\theta_j) = \hat {y_j^k}(1-\hat {y_j^k})({y_j^k}-\hat {y_j^k})
$$
根据上述式子很容易得到:
$$
\Delta W_{hj} = \eta g_j b_h
$$
同理可得
$$
\Delta \theta_j =\frac{\partial {E_k}}{\partial \theta_j} = \frac{\partial {E_k}}{\partial {\hat {y_j^k}}}\frac{\partial {\hat {y_j^k}}}{\partial \theta_j} = -\eta g_j \\
\begin{aligned}
\Delta V_{ih} = \sum_{j=1}^l -\eta \frac{\partial {E_k}}{\partial V_{ih}} & = \sum_{j=1}^l -\eta \frac{\partial {E_k}}{\partial {\hat {y_j^k}}}\frac{\partial {\hat {y_j^k}}}{\partial \beta_j}\frac{\partial \beta_j}{\partial {b_{h}}}\frac{\partial {b_{h}}}{\partial \alpha_h}\frac{\partial \alpha_h}{\partial V_{ih}} \\
& = \sum_{j=1}^l \eta g_j W_{hj}b_h(1-b_h)x_i \\
& = \eta b_h(1-b_h)x_i \sum_{j=1}^l g_j W_{hj} \\
\end{aligned}
\\
\begin{aligned}
\Delta \gamma_h = \frac{\partial {E_k}}{\partial \gamma_h} & = \sum_{j=1}^l -\eta \frac{\partial {E_k}}{\partial {\hat {y_j^k}}}\frac{\partial {\hat {y_j^k}}}{\partial \beta_j}\frac{\partial \beta_j}{\partial {b_{h}}}\frac{\partial {b_{h}}}{\partial \gamma_h} \\
& = - \sum_{j=1}^l \eta g_jW_{hj}b_h(1-b_h) \\
& = - \eta b_h(1-b_h) \sum_{j=1}^l g_jW_{hj} \\
\end{aligned}
$$
这里很重要的一点是再求后面两个参数的微分的时候要注意的是其参数受到所有输出层的$\hat y_j^k$的影响,所以要加一个$\sum_{j=1}^l$。
令
$$
\begin{aligned}
e_h & = - \frac{\partial E_k}{\partial b_h}\frac{\partial b_h}{\partial \alpha _h} \\
& = - \sum_{j=1}^l \frac{\partial E_k}{\partial \beta_j} \frac{\partial \beta_j}{\partial b_h}f^{‘}(\alpha_h - \gamma_h) \\
& = \sum_{j=1}^l w_{hj}g_jf^{‘}(\alpha_h - \gamma _h) \\
& = b_h(1-b_h)\sum_{j=1}^l{w_{hj}g_j}
\end{aligned}
$$
那么将$e_j$代入$\Delta V_{ih},\Delta \gamma_h$中就是
$$
\Delta V_{ih} = \eta e_h x_i \
\Delta \gamma_h = - \eta e_h \\
$$
那么整个基本的BP算法的工作流程就可以描述如下:
输入:训练集 $D = {(x_k, y_k)}_{k=1}^m$,学习率$\eta$
过程:
1.在(0,1)范围内随机初始化网络中所有连接权和阈值
repeat
for all $(x_k,y_k) \in D$ do
根据当前参数和式计算当前样本的输出$\hat y_j^k$
根据上述推论计算输出层神经元的梯度项$g_j$
根据上述推论计算隐藏神经元的梯度项$e_h$
根据上述推论更新连接权$W_{hj},V_{ih}$与阈值$\theta _j , \gamma_h$
end for
Until 达到停止条件
输出:连接权与阈值确定的多项层前馈神经网络