赞
踩
讲真,之前学吴恩达的机器学习课时,还手写实现过后向传播算法,但如今忘得也一干二净。总结两个原因:1. 理解不够透彻。2. 没有从问题的本质抓住后向传播的精髓。今天重温后向传播算法的推导,但重要的是比较前向传播和后向传播的优缺点,以及它们在神经网络中起到了什么不一般的作用,才让我们如此着迷。
反向传播由Hinton在1986年发明,该论文发表在nature上,高尚大的杂志啊。
简单说说吧,反向传播主要解决神经网络在训练模型时的参数更新问题。神经网络如下图:
反向传播算法需要解决每条边对应的权值如何更新,才能使得整个输出的【损失函数】最小。如果对神经网络还不了解,建议先学习了什么是神经网络,再阅读以下内容。
这里推荐几篇关于神经网络的文章,总体来说不错:
关于反向传播算法有种不太恰当的比方,对于每个输出结点,给定一个输入样例,会得到一个预测值,而这个预测值和真实值之间的差距我们当作误差(欠的钱),是谁影响了欠债的多少呢?很明显,在神经网络模型中,只有待求的参数
所以我们有了最基础的微分表达式,也是反向传播所有推导公式的源泉,那为什么这个敏感度就能更新权值呢?其实
所以梯度下降的更新算法有
那么
我很讨厌一上来就来了一堆反向传播的公式以及各种推导。这样没错,简单直接,理解了觉得自己还很牛逼,结果过了一段时间怎么又忘了公式的推导,还得重新推一遍。而理解反向传播的精髓并非这些公式的推导,而是它弥补了前向算法的哪些不足,为啥它就被遗留下来作为神经网络的鼻祖呢?解决了什么问题,如何优雅的解决了该问题?从哪些角度能让我们构建出反向传播算法才是应该去学习和理解的。
我们先来建个简单的神经网络图吧,注意,这里只是帮助理解反向传播算法的构建过程,与真实的神经网络有一定的差距,但其中的分析过程是大同小异的。
此外这三篇文章写的不错,【推导】【本质】【实现】都有了:
如图所示:
为了简化推导过程,输入层只使用了一个特征,同样输出层也只有一个结点,隐藏层使用了两个结点。注意在实际神经网络中,大多数文章把z1和h1当作一个结点来画图的,这里为了方便推导才把两者分开。
所以我们有:
假定给了输入x,我们就能根据这一系列公式求得y,接下来我们需要定义损失函数了,使用平方误差函数(只针对一次输入):
到这里你能看出什么?不着急,我们再求一个
从中,我们可以看到一些模式(规律),实际上
结论:每条关系边对应于一个偏导!!!什么是关系边?Okay,就是中间变量如
z1,h1 都与w1 有关系,连接这些结点的边。
咱们继续细化上述公式,目前来看,这跟反向传播八竿子打不着。的确就这些性质不足以引出反向传播,不着急,继续往下看。
因为偏导数中的每个函数映射都是确定的,所以我们可以求出所有偏导数,于是有:
很有意思,式中
宏观上,其实可以考虑一个非常大型的神经网络,它的参数
继续看图:
假设我们加入第二个特征
对比一波
有什么不同么,眼神不好的还以为没有区别,实际上就最后一个偏导的分母发生了变化,而我们刚才也总结出了一个重要结论,每个偏导代表一条边,所以对于
所以即使我们用输入
学过动态规划的可能一下子就能理解反向传播的精髓了,如果我们有个中间变量
这和递归记忆化搜索(自顶向下)以及动态规划(自底向上)的两种对偶形式很像,为了解决重复子问题,我们可以反向传播,如果能够定义出合适的子状态,且得出递推式那么这件事就做成了。
Okay,再来对比下
两个式子,找找相同的,只有前两部分是一样的,所以可以令
求
求
从图上来理解的话,
既然这么定义了,我们可以同样定义第二层的误差
对应地
哈哈哈,对比一波
别迷糊了,它们都属于同一种形式,写算法就好些很多,而
这就对了吗?不,离真正的反向传播推导出的公式还差那么一点点,继续看图:
我们按照关系边的概念,可以知道
所以对
此时再看看完整的反向传播公式推导吧,或许就明白其中缘由了。参考链接:http://blog.csdn.net/u014313009/article/details/51039334
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。