本文来自以下内容:
- Hinton coursera《neural network for machine learning》课程主页
- Andrew Ng Coursera 机器学习
- 学堂在线 袁博 数据挖掘:理论与算法
原则上我会从什么开始?
A. 问题
B. 定义
C. 故事
D. 历史
关键问题
这三个问题中,你觉得关键问题是啥? 不知道的话, 逐个分析一下。
如何初始化权重矩阵(向量)?
继续分析
初始化权重一般是全部置0。
第二项 输出结果不对怎么办? 这个很明显就是要去更新 权重参数向量! 所以 这两个选项是同一个问题。
难道本质不是同一个问题吗?
A. 是同一问题
B. 否
最后一项
要更新 权重参数向量, 您现在有想到什么方法,之前学过,也许能用?
详细分析
来看看式子, 逻辑回归的迭代式: w=w+α∇wl(w) 其中: ∇l(w)=yT(y−h(x))l(w)=yTlog(h(Xw))+(1−yT)log(1−h(Xw))
而牛顿迭代法求解一次导J′(θ)=0时得到的极值, wn+1=wn−J′(wn)J″(wn)
J(w)=l(w)或=(h(x)-y)2
可以看到, 式子里都有 y , 也就是数据的label,
神经网络的哪里可以跟label比较?
A. 输入层
B. 隐藏层
C. 输出层
所以梯度下降和牛顿迭代直接用在神经网络上会有什么问题?
那怎么办?
总不能只管调整最后输出层的 权重向量吧?梯度下降法或牛顿迭代法应该只能调整传给输出层的权重向量~~~
反正隐藏层没有label标签可以比较,不能直接用梯度下降法。
不能直接用,那是否应该借鉴梯度下降牛顿法的思想,调整一下后使用?
A. 应该试试
B. 直接想新办法
试试又不会掉块肉
创新不是无根之萍,要善于从已有方法、 相似领域方法中进行微创新,多借鉴,多模仿,多改进,多尝试。即使爱因斯坦提出相对论也是基于前人很多工作,特别是数学上的~~~
我们来借鉴、分析下梯度下降法, 因为神经网络使用的是 sigmoid神经元,我们来看看对应的数学式。
模型: l(w)=yTlog(h(w∗x))+(1−yT)log(1−h(w∗x))
梯度下降法: w=w+α∇wl(w)∇l(w)=yT(y−h(w∗x))
可以总结出几个特点,请选出你认为在神经网络可能有用的特点。
A. 求梯度即求导或偏导
B. 迭代更新
C. 更新系数
D. 矩阵相乘
E. y-h(w*x)
差什么?
有梯度(导数), 有系数,要对权重向量(矩阵)更新,那差什么?
首先,∇l(w)=yT(y-h(w⋅x)) 里有y-h(w*x), 所以,我们得找新的梯度、导数。
对了,能理解为什么要梯度、导数吧?
A. 能
B. 否
否定后要提方案
OK, 首先肯定不能在隐藏层用损失函数了,那需要y标签数据,而隐藏层应该输出什么,没人知道。
那我们要先在已使用的函数里找一找有没有可用的函数、方案。 毕竟没有线索去创造一个新函数。
注: 很明显我是根据BP反向传播算法的结论来猜测、反推这些理由,希望和真正创造这方法时的思维比较相近。 但实际上是否一定要梯度、 真的没有线索来发现新方法函数吗?这倒不好说,读者如果发现了新的想法那绝对是意外之喜。
又一个显然,除了输出层的损失函数, 还有神经元的模型、函数, 本节使用的是sigmoid神经元,即sigmoid函数。
sigmoid函数能影响到权重矩阵(向量)的所有值吗?
A. 能
B. 否
对比一下
假设第k层(k>=1)有m个神经元,下一层k+1层有n个神经元
所以从k到k+1层的权重矩阵是维。
乘号请用 * 。
所以呢
第k层有m个神经元,下一层k+1层有n个神经元,即有n个sigmoid函数, 第k+1层第j个神经元记为: ak+1j=g(m∑i=1wki,n∗aki)
k+1层的每个神经元都有m个输入向量(偏置单元bias unit先不管),所以n个sigmoid都可以对m个输入向量求偏导, 所以可以看到每条权重边都跟sigmoid有关系, 那我们就可以试用sigmoid函数来代替原先梯度下降法里的函数。
sigmoid求偏导部分暂略。
OK?
已求出 sigmoid的导数,
调整了梯度下降法的计算式,可以直接使用了吗?
还要考虑系数
还记得梯度下降用梯度和 学习速率(系数)来更新权重向量吧?
神经网络中,这个学习速率能用常数吗?
A. 也许可以
B. 不可以
系数有什么问题
我不知道是否可以使用常系数(有兴趣的读者可以一试),但一定不好。
似乎显而易见,但为什么不好?
找呀找呀找系数
如图所示(暂时没有):
梯度可以看作是概率, 学习速率或系数其实是 Δx,所以二者相乘 = Δy。意味着 x的变化率对y的影响。
我们已经找到了梯度, 但还差 Δx, 不同层不同神经元不同边有不同的Δx。
读者觉得它应该是从何而来?
我跪了
扯不下去了, 赶紧结束这篇。Δx 可以理解成差异、 变化量等等,但终究是一个减法, Δ 这符号一般就用来表示“差”。
目前, 唯一的已知的“差”值 就是 数据实际的标签label 和 前向传播输出的差, 实际值和预测值的差别 y-aL, 就叫 误差。
所以要从输出层的这个Δx开始,往回一层层地更新权重矩阵。
反向传播为什么叫反向,不需要我这段解释, 很简单,对吗?
A. 对
B. 否
接下来
视频和文字各有不好,视频不好改,要重录, 文字不好做动画——特别是我不会做动画~~~
从输出层怎么反向到上一层呢?输出层的神经元通过突触(边)影响到上一隐藏层的神经元, 所以有两个数据了。
- 输出层L层神经元的误差 y-aL
- 上一层l层到输出层L层的边 的权重 wl
那系数就是这两货的乘积了,那梯度、求导再结合进来, 先明显应该使用输出L层的g(x)求导——事实上从这里看不出来, 用l层的g(x)求导,然后除一下,可能更符合逻辑关系——前一层的变化通过导数、斜率影响下一层。为什么在下一段。
推广
接上面的,为什么不用l层神经元的函数,很简单,输入层到第一个隐藏层这里怎么办? 输入层可没有这个函数~~~
如何推广到其他层? 其他层没有输出,不知道具体误差, 所以要利用下一层的误差, 下一层的误差则是来自下下一层,直到输出层的误差。
所以, 下面给出总结:
反向传播算法步骤
- 先计算输出层L层误差 y-aL
- 第l层l(w)使用sigmoid神经元的sigmoid函数 g(x)。
- 系数α 则是上一层的误差,反向乘以边的权重
- 第k层的误差 上面第2步的系数 乘上第1步函数的导数。
- 权重向量更新是 输出alj⋅δl+1i -- 有点乱
如图:
总结
在前一篇 神经网络前向传播 之后, 我们研究了如何更新神经网络里的权重(矩阵)。
借鉴 梯度下降法 的思想和数学式$ w = w + \alpha \nabla_w l(w) $进行改进, 进而得到 反向传播算法。
实验品,
测试读者对反向传播算法的掌握程度,步骤完毕请输入"证毕"或"Q.E.D.":
恭喜
不好意思, 本篇因为有点复杂, 捋顺整个逻辑比较难, 拖的时间太长, 又心情不好, 写不下去了~~中间关键步骤敷衍了事,草草结尾。
神经网络反向传播算法就是以上内容。 浅层神经网络一般讲完反向传播算法 就结束。 所以, 有兴趣的读者可以准备看 深度学习 了。