Java教程

神经网络与误差反向传播

本文主要是介绍神经网络与误差反向传播,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

目录
  • 1 神经网络
    • 1.1 神经元
    • 1.2 前馈网络
    • 1.3 梯度下降
    • 1.4 误差反向传播

1 神经网络

大量结构简单的、功能接近的神经元节点按一定体系架构连接成的模拟大脑结构的网状结构。用于分类、模式识别、连续值预测。建立输入与输出的映射关系.

1.1 神经元

生物神经元之间相互连接,传递信息。树突进行输入,细胞体处理,轴突进行输出到下一神经元。
人工神经元包含:输入\(x\)(考虑权重\(w\)),混合输入(线性混合 \(w_i x_i\)),之后判断是否达到阈值\(b\) 然后进行非线性映射\(f\)(激活函数, 仿生,达到阈值放电,低于阈值为0),输出一个值\(y\)到下一层。
image
为了推导方便,把\(b\)当作权重的一部分,\(f\) 为激活函数,有式子:

\[f\left(\sum\limits_{i=1}^d w_i x_i\right)=f(\mathbf{w}^t \mathbf{x})=y \]

image

常见传统神经网络激活函数
sigmod: \(f(z)=\frac{1}{1+e^{-z}}\),把\((-\infty, \infty)\)映射到\((0,1)\). 基本上函数的输入小于-5就非常接近0,大于5非常接近1
image

双曲正切函数: \(f(z)=tanh(z)=\frac{e^z-e^{-z}}{e^z+e^{-z}}\), 把\((-\infty, \infty)\)映射到\((-1,1)\)
image
数学基础: 链式求导\((f(g(x)))^\prime = f^\prime (g(x)) g^\prime(x)\); 或者\({\mathrm{d}y\over \mathrm{d}x}={\mathrm{d}y\over \mathrm{d}z}\bullet{\mathrm{d}z\over \mathrm{d}x}\)
对激活函数引入变量 \(y\)
\(f(z)=\frac{1}{1+e^{-z}}\) 令 \(f(z)=y\), 求导 \(f^\prime(z)= y(1-y)\)
\(f(z)=tanh(z)=\frac{e^z-e^{-z}}{e^z+e^{-z}}\), 令\(f(z)=y\), 求导 \(f^\prime (z) = 1-y^2\)
其它关键问题
层数:传统浅层网络一般3到5层。层起到了提取特征的效果。一般有输入层、隐含层和输出层。
优化方法:梯度下降;BP后向传播(链式规则)

1.2 前馈网络

单向多层。同一层的神经元之间没有相互连接,层间信息只沿一个方向进行。第一层为输入层,最后一层为输出层。
Delta学习规则 \(\Delta w_{ij} = a\cdot(d_i-y_i)x_j(t)\)
\(\Delta w_{ij}\) 是神经元 \(j\rightarrow i\)的连接权重增量; \(x_j\) 是输入,是神经元 \(j\) 的状态;\(d_i\) 是 \(i\) 的期望输出;\(y_i\) 是 \(i\) 的实际输出;\(a\) 是学习的步长,是学习速度的常数
神经网络调权重有点像多项式拟合?最终把系数拟合出来。多项式拟合?,是多组输入,多组输出,调整系数(输出与实际值接近)。神经网络是一组输入、多组输出,调整权重(要求实际输出与期望输出接近)。

目标函数 目标函数以\(\mathrm{w}\)为自变量,初始输入 \(\mathbf{x}\), 实际输出 \(\mathbf{z}=(z_1,\dots,z_c)\) 与 期望输出 \(\mathbf{t}=(t_1,\dots,t_c)\) 越接近越好,即:

\[J(\mathbf{w})={1 \over 2}\parallel \mathbf{t-z}\parallel^2 = {1\over 2}\sum\limits_{k=1}^c(t_k-z_k)^2 \]

目标要这个函数值尽量小,能够接近0更好。系数 \({1\over 2}\) 是为计算方便,为了求导时消掉幂2。函数为各输出误差的平方的累加和。

1.3 梯度下降

上面的式子求最小值不方便求导,也可以对二维的情形可视化看到比较复杂。可以用梯度下降方法求最小值,沿梯度方向往下,到目标函数变化很少,即达到局部最小值。思路:先确定一个初始点,将\(\mathbf{w}\)的值,按照梯度下降(负方向)的方向调整\(\Delta\mathrm{w}=-\eta\frac{\partial J}{\partial\mathrm{w}}\),就会使唤\(J(\mathbf{w})\) 往更低的方向变化,直到目标\(J(\mathbf{w})\) 变化较少。
\(m+1\) 步的权重为:\(\mathrm{w}(m+1)=\mathrm{w}(m)+\Delta\mathrm{w}(m)=\mathrm{w}(m)-\eta\frac{\partial J}{\partial \mathrm{w}}\)
步骤: (1)计算梯度方向,(2)沿梯度方向下降 (3) 步长,学习速率
(4) 持续迭代。要求目标函数处处可导。

输出层的权重改变量\(\frac{\partial J}{\partial w_{kj}}\)
image

如图第\(k\)次迭代后,最后一个隐藏层\(H\)的结果,即对输出层的输入为\(\mathrm{y}\),对输出层的权重为\(\mathrm{w_k}\),\(k\in[1,c]\),输出层的对应这个输入的结果为\(z_k\)
输出层与之相对应的输出单元的总的输入:\(net_k=\sum\limits_{j=1}^{n_H}w_{kj}y_j\), \(\color{darkgray}{\frac{\partial net_k}{\partial w_{kj}}}=y_j\)
输出\(z_k\) 有:\(z_k\propto f(net_k)=f\left(\sum\limits_{j=1}^{n_H}w_{kj}y_j\right)\), \(f\) 为激活函数
寻找 \(J\) 与 \(w_{kj}\) 的函数关系:
\(\frac{\partial J}{\partial w_{kj}}=\color{green}{\frac{\partial J}{\partial net_k}}\color{darkgray}{\frac{\partial net_k}{\partial w_{kj}}}\)
\(\color{green}{\frac{\partial J}{\partial net_k}}=\color{red}{\frac{\partial J}{\partial z_k}}\color{darkorange}{\frac{\partial z_k}{\partial net_k}}=\color{red}{-(t_k-z_k)}\color{darkorange}{f^\prime (net_k)}\)
令: \(\delta_k = (t_k-z_k)f^\prime(net_k)\)(残差)
\(\frac{\partial J}{\partial w_{kj}}=\color{red}{-(t_k-z_k)\color{darkorange}{f^\prime(net_k)\color{darkgray}{y_j}}}=-\delta_k y_j\)

所以:\(J\longrightarrow z_k \longrightarrow net_k\longrightarrow w_{kj}\)
\(J(\mathbf{w})={1 \over 2}\parallel \mathbf{t-z}\parallel^2 = {1\over 2}\sum\limits_{k=1}^c(t_k-z_k)^2\)
\(\frac{\partial J}{\partial w_{kj}}=\color{red}{\frac{\partial J}{\partial z_k}}\color{darkorange}{\frac{\partial z_k}{\partial net_k}}\color{darkgray}{\frac{\partial net_k}{\partial w_{kj}}}=\color{red}{-(t_k-z_k)}\color{darkorange}{f^\prime (net_k)}\color{darkgray}{y_j}\)

隐藏层的权重改变量\(\frac{\partial J}{\partial w_{ji}}\)
image
对于隐藏层的某一神经元 \(y_j\) 往输出层有输出\(\mathrm{z}\),也接收来自在输入层的输入\(\mathrm{x}\). 其中来自\(x_i\)的输入权重为\(w_{ji}\), 输出到 \(z_k\) 的权重为 \(w_{jk}\), \(i\in[1,d]\).

隐藏层的某一神经元\(y_j\) 来自输入层的总的输入:
\(net_j=\sum\limits_{i=1}^{d}w_{ji}x_i\), \(\color{darkyellow}{\frac{\partial net_j}{\partial w_{ji}}}=x_i\)

寻找 \(J\) 与 \(w_{ji}\) 的关系:
首先\(J\) 与 隐藏层神经元的输出\(\color{darkorange}{y_j}\) 有关系,再看隐藏层的输出\(\color{darkorange}{y_j}\)与隐藏层的接收\(\color{darkgray}{\frac{\partial net_j}{\partial w_{ji}}}\)有关系
所以有:
\(\frac{J}{\partial w_{ji}}=\color{darkorange}{\frac{\partial J}{y_j}}\color{darkgreen}{\frac{\partial y_j}{\partial net_j}}\color{darkgray}{\frac{\partial net_j}{\partial w_{ji}}}\)
\(\color{darkgreen}{\frac{\partial y_j}{\partial net_j}}=g^\prime(net_j)\), \(g\) 为 \(y_j\) 神经元的激活函数,可以与 输出层的 \(f\) 相同,也可以不同

考察 \(\color{darkorange}{\frac{\partial J}{y_j}}\):
由 \(J(\mathbf{w})={1 \over 2}\parallel \mathbf{t-z}\parallel^2 = {1\over 2}\sum\limits_{k=1}^c(t_k-z_k)^2\):
\(\color{darkorange}{\frac{\partial J}{y_j}}=\frac{\partial \left[ {1\over 2}\sum\limits_{k=1}^c(t_k-z_k)^2\right] }{\partial y_j} = -\sum\limits_{k=1}^c(t_k-z_k) \frac{\partial z_k}{y_j}\), \(\sum\) 表示 \(y_j\) 输出到的所有 \(\mathrm{z}\);
上式中 \(\frac{\partial z_k}{y_j}=\frac{\partial z_k}{\partial net_k}\frac{\partial net_k}{\partial y_j}=f^\prime (net_k) w_{kj}\),其中 \(f\) 为输出层相应神经元的 激活函数,输出层的总输出 \(net_k=\sum\limits_{j=1}^{n_H}w_{kj}y_j\), \(\frac{\partial net_k}{\partial y_j}=w_{kj}\)

\(\color{darkorange}{\frac{\partial J}{y_j}= -\sum\limits_{k=1}^c(t_k-z_k) f^\prime (net_k) w_{kj} = -\sum\limits_{k=1}^c \delta_k w_{kj}}\)

\(\frac{J}{\partial w_{ji}}=\color{darkorange}{\frac{\partial J}{y_j}}\color{darkgreen}{\frac{\partial y_j}{\partial net_j}}\color{darkgray}{\frac{\partial net_j}{\partial w_{ji}}} = \color{darkorange}{-\sum\limits_{k=1}^c \delta_k w_{kj}} \color{darkgreen}{g^\prime(net_j)} \color{darkgray}{x_i}\)
令 \(\delta_j=\color{darkgreen}{g^\prime(net_j)} \color{darkorange}{\sum\limits_{k=1}^c \delta_k w_{kj}}\) (隐藏层的残差)

\(\frac{J}{\partial w_{ji}}=-\delta_j \color{darkgray}{x_i}\)

1.4 误差反向传播

误差传播迭代的形式化表达

输出层

\(\frac{\partial J}{\color{blue}{\partial w_{kj}}}=-\delta_k \color{purple}{y_j}\)
\(\color{blue}{w_{kj}: 隐含层 \longrightarrow 输出层的权重}\)
\(\color{purple}{y_j: 输出层单元的输入,也是隐藏层神经元的输出}\)
\(\delta_k=(t_k-z_k)\color{darkorange}{f^\prime(net_k)}\)
\((t_k-z_k): 人为定义的实际输出层误差\)
\(\color{darkorange}{f^\prime(net_k): 输出层激活函数的导数;net_k 各隐含层输出的加权和}\)

隐含层
\(\frac{J}{\color{blue}{\partial w_{ji}}}=-\delta_j \color{purple}{x_i}\)
\(\color{blue}{w_{ji}: 输入层 \longrightarrow 隐含层的权重}\)
\(\color{purple}{x_i: 最初的人为实际输入}\)
\(\delta_j=\color{darkgreen}{g^\prime(net_j)}\color{darkorange}{\sum\limits_{k=1}^c \delta_k w_{kj}}\)
\(\color{darkorange}{\sum\limits_{k=1}^c \delta_k w_{kj}}: 各输出层传播来的误差\)
\(\color{darkorange}{w_{kj}: 隐含层 \longrightarrow 输出层的权重}\)
\(\color{darkgreen}{g^\prime(net_j): 隐含层激活函数(可以与输出层相同,也可以不同)的导数;net_j 各输入的加权和}\)

总结
权重增量 = -1*学习步长*目标函数对权重的偏导数
\(\Delta\mathrm{w}(m)=-\eta\frac{\partial J}{\partial \mathrm{w}}\)
目标函数对权重的偏导数=-1*残差*当前层的输入
\(隐含层 \longrightarrow 输出层\)
\(\frac{\partial J}{\partial w_{kj}}=-\delta_k y_j\)
\(输入层 \longrightarrow 隐含层\)
\(\frac{J}{\partial w_{ji}}=-\delta_j x_i\)
残差=当前层激活函数的导数*上层反传来的误差
\(隐含层 \longrightarrow 输出层\)
\(\delta_k=\color{darkorange}{f^\prime(net_k)}(t_k-z_k)\)
\(输入层 \longrightarrow 隐含层\)
\(\delta_j=\color{darkgreen}{g^\prime(net_j)}\color{darkorange}{\sum\limits_{k=1}^c \delta_k w_{kj}}\)

上层反传来的误差=上层残差的加权和
\(隐含层 \longrightarrow 输出层\)
\((t_k-z_k): 人为定义的实际输出层误差\)
\(输入层 \longrightarrow 隐含层\)
\(\color{darkorange}{\sum\limits_{k=1}^c \delta_k w_{kj}}: 各输出层传播来的误差\) 误差反向传播 BP

这篇关于神经网络与误差反向传播的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!