我在b站学ML(十)

为神经网络拟合参数

代价函数

回顾下逻辑回归算法的代价函数:

我在b站学ML(十)_第1张图片

在神经网络中使用的代价函数是逻辑回归算法中使用的代价函数的一般化形式:

m:训练集的数量

K:分类问题中输出层的神经元的数量

(h_{\Theta }(x))_{i}:表示第 i 个输出层神经元的输出,h_{\Theta }(x)是一个K维向量

L:神经网络的层数

sl:第 l 层的神经元数量

sl+1:s(l +1),第 l +1 层神经元的数量

第一个求和项求得是输出层每个神经元计算的代价函数值的和

第二个求和是正则化项的求和,每一层每个神经元每个参数矩阵(权重矩阵)的和

可以结合这样一个模拟的四层神经网络来理解,K=4,L=4,s1=3,s2=s3=5,s4=sL=4

我在b站学ML(十)_第2张图片

我在b站学ML(十)_第3张图片

代价函数最小化

反向传播算法

假设目前训练集的数量只有一个,先用向前传播算出神经网络每一层的输出值(关于向前传播在https://blog.csdn.net/After__today/article/details/81835011中有介绍)

我在b站学ML(十)_第4张图片

接下来使用反向传播算法计算偏导数项\frac{\partial J(\theta )}{\partial \Theta _{j,i}^{(l)}}

这里引入一个误差变量 \delta _{i}^{l} 来表示第 l 层的第 i 个神经元激励值的误差,\delta _{i}^{l}会对着算法的迭代一步步更新

这里 \delta 的下标和视频中相反是因为视频中的下标与上一节课的写的反的,这里按上一节课的下标来写就好

我在b站学ML(十)_第5张图片

在这个神经网络中,第四层的 \delta 计算化简得到的直观的是第四层的激励减去训练样本中的真实值

误差 \delta _{j}^{(4)} 的具体计算步骤

这里的\delta _{j}^{(4)}实际是计算\frac{\partial J(\theta )}{\partial z_{i}^{(l)}}的值(计算到最后就会发现),利用链式法则对偏导数项做处理

\frac{\partial J(\theta )}{\partial z_{i}^{(4)}}=\frac{\partial J(\theta )}{\partial a_{i}^{(4)}}\cdot \frac{\partial a_{i}^{(4)}}{\partial z_{i}^{(4)}}

右边第一项:

简化代价函数,忽略求和项和正则化项来求它的偏导

J(\theta )=-y^{(i)}\cdot log(a_{i}^{(l)})-(1-y^{(i)})\cdot log(1-a_{i}^{(l)}) (输出层中h_{\Theta }(x)就等于a^{(l)}

所以\frac{\partial J(\theta )}{\partial (a_{i}^{(4)})}=-\frac{y^{(i)}}{a_{i}^{(4)}}+\frac{1-y^{(i)}}{1-a_{i}^{(4)}}= \frac{a_{i}^{(4)}-y^{(i)}}{a_{i}^{(4)}-(a_{i}^{(4)})^2}

右边第二项:

a_{i}^{(4)}=g(z^{(4)}),所以\frac{\partial a_{i}^{(4)}}{\partial z_{i}^{(4)}}={g}'(z^{(4)})=\frac{e^{(-z)}}{(1-e^{(-z)})^2}

这里g(z)\cdot (1-g(z))恰好也等于这个式子,因此可以用这个式子来替换求导,即a_{i}^{(4)}\cdot (1-a_{i}^{(4)})

所以,\frac{\partial J(\theta )}{\partial z_{i}^{(4)}}= \frac{a_{i}^{(4)}-y^{(i)}}{a_{i}^{(4)}-(a_{i}^{(4)})^2}\cdot a_{i}^{(4)}\cdot (1-a_{i}^{(4)})=a_{i}^{(4)}-y^{(i)}

对于输出层前的每一层的\delta ^{(l)}的计算:

这里没写下标代表对层整体计算,其实就是对每层的每个单元的误差求和

\delta ^{(l)}=\frac{\partial J(\theta )}{\partial (z^{(l)})}=\frac{\partial J(\theta )}{\partial (z^{l+1})}\cdot \frac{\partial (z^{l+1})}{\partial (z^{(l)})}=\delta ^{l+1}\cdot \frac{\partial [\Theta ^{(l)}\cdot g(z^{(l)})]}{\partial (z^{l+1})}=\Theta ^{(l)}\cdot \delta ^{l+1}\cdot {g}'(z^{(l)})

\delta ^{(l)}=\Theta ^{(l)}\cdot \delta ^{l+1}\cdot a^{(l)}\cdot (1-a^{(l)})

最后回到计算最初的代价函数:

\frac{\partial J(\theta )}{\partial \Theta _{j,i}^{(l)}}=\frac{\partial J(\theta )}{\partial z_{i}^{(l+1)}}\cdot \frac{\partial z_{i}^{(l+1)}}{\partial \Theta _{j,i}^{(l)}}

很容易我们可以看出右边第一项就是上面计算的\delta _{i}^{(l+1)}

右边第二项z_{i}^{(l+1)}=\Theta _{1,j}^{(l)}\cdot a_{1}^{(l)}+\Theta _{2,j}^{(l)}\cdot a_{2}^{(l)}+......,所以\frac{\partial z_{i}^{(l+1)}}{\partial \Theta _{j,i}^{(l)}}=a_{i}^{(l)}

所以得出代价函数求偏导的最终结果:\frac{\partial J(\theta )}{\partial \Theta _{j,i}^{(l)}}=\delta _{i}^{(l+1)}\cdot a_{i}^{(l)}

计算到这里就可以理解上面计算 \delta 的计算为什么是 \frac{\partial J(\theta )}{\partial z_{i}^{(l)}} 了。

反向传播算法的实现:

我在b站学ML(十)_第6张图片

(这里下标 (i,j) 和上一节课写反的,表达意思相同)

首先有m个训练集,\Delta表示全局误差,每一层对应一个\Delta ^{(l)}

遍历训练集,对每一个(x^{(i)}, y^{(i)}),设定输出层激励a^{(1)}=x^{(i)},接下来用前向传播计算每一层的激励值

使用训练集的y^{(i)}来计算网络输出层的\delta ^{(L)}

有了输出层的\delta ^{(L)},根据前面的每一层\delta的计算公式计算\delta ^{(L-1)},...,\delta ^{(2)},不计算\delta ^{(1)}是因为不需要考虑输入层的误差项

最后用\Delta ^{(l)}来累计前面计算的偏导数项。

然后得到最终的代价函数求偏导数的结果(左边为计算过程,右边是证明过程很复杂=。=),就可以应用在梯度下降法等算法的优化上了。

我在b站学ML(十)_第7张图片

回顾一下向前传播的过程以及与反向传播的比较

我在b站学ML(十)_第8张图片

再来看反向传播的过程,很容易可以发现其实两者的计算方法是一样的,只是方向相反

我在b站学ML(十)_第9张图片

 

你可能感兴趣的:(机器学习,神经网络,BP算法)