反向传播中的数学理解
2017-12-03 17:41
393 查看
前言
梯度的直观解释
用链式法则计算f(x)
公式与代码
1.前言
在人工神经网络这篇文章中,除了介绍简单的神经网络,还举了一个非常详细的关于反向传播算法的传播过程,但这一次,希望通过更加直观的例子,来了解反向传播,同时会用到链式法则。深入理解反向传播的过程及其中的微妙变化,有助于我们更好的理解神经网络和调试我们的代码。
我们这次的核心问题就是:给定一个函数f(x),其中x是一个输入向量,希望求得这个函数对应的梯度∇f(x),它代表了方向,也是模型学习的方向。
其中f(x)一般对应着算法使用的损失函数,而x则代表了输入的训练数据和神经网络的权重,正如你所知,训练数据是给定不变的,但是权重是可以改变的,我们通过调整权重参数,让神经网络学习出一套分类的判定标准。在实际应用中,我们会使用BP算法来求出参数w对应的梯度,然后调整(更新)参数,让这组参数能更好的分类。
但有时,我们想要看一下我们的神经是什么样子的,也可以对x对梯度。
2.梯度的直观解释
假设有一个函数f(x,y)=xy,如果你学过微积分,一定知道对x求偏导,就是把除了x以外的所有参数,无论是y,还是w都当成参数处理,只对x求一次导就OK了。
f(x,y)=xy→∂f∂x=y∂f∂y=x
定义:其实导数定义的就是一个函数的在一点处的变化率。
df(x)dx=limh →0f(x+h)−f(x)h左边表达的是将f(x)对x求偏导,右边可以发现,当h很大的时候,就是两间的斜率表示了,如图,可以得到lPQ这条线,当h →0,两点间的距离慢慢减少,最后两点可以近似认为是一个点的时候,就是与这条曲线相切了,就可以得到绿色这条线了。其实积分,积分,用的就是逼近原理。
那导数代表了什么呢?
The derivative on each variable tells you the sensitivity of the whole expression on its value.
翻译过来就是:导数反应了每个变量对函数值的影响程度。
我们先前说了梯度代表了方向,那梯度和导数的关系是怎么样的呢?
其实∇f就是用偏导数表示的向量(有方向的),用上一个函数就是:∇f=[∂f∂x,∂f∂y]=[y,x]用图像表示就是:
3.用链式法则计算f(x)
为了理解链式法则,我们先用一个简答的例子:f(x,y,z)=(x+y)z,这个式子依然很简单,我们可以把这个公式分成两部分:q=x+y,f(q,z)=qz,这两个式子和第一个式子是等价的。
先前我们已经知道怎么计算偏导数了:∂f∂q=z,∂f∂z=q但是,q=x+y也是一个函数,对他也求导数:∂q∂x=1,∂q∂y=1但我们最后关心的不是q的偏导数,我们最后关系的是f对x,y,z三个的偏导数,所以f对x求偏导就有:∂f∂x=∂f∂q∂q∂x=z∗1分别对y,z求偏导,就可以得到对应的梯度了。
用更复杂的例子,sigmoid函数大家都挺熟悉的:σ(x)=11+e−x→dσ(x)dx=e−x(1+e−x)2=(1+e−x−11+e−x)(11+e−x)=(1−σ(x))σ(x)
4.公式与代码
我们写代码的人可能最怕的就是看到一大堆的数学公式了,但是我们并不需要自己手动算他们,所以知道他们怎么用代码写出来就OK了,举个例子:f(x,y)=x+σ(y)σ(x)+(x+y)2你可能会感觉这个公式还是挺复杂的,但只要你学会拆分,就一点都不难了。
参考
cs231n
梯度的直观解释
用链式法则计算f(x)
公式与代码
1.前言
在人工神经网络这篇文章中,除了介绍简单的神经网络,还举了一个非常详细的关于反向传播算法的传播过程,但这一次,希望通过更加直观的例子,来了解反向传播,同时会用到链式法则。深入理解反向传播的过程及其中的微妙变化,有助于我们更好的理解神经网络和调试我们的代码。
我们这次的核心问题就是:给定一个函数f(x),其中x是一个输入向量,希望求得这个函数对应的梯度∇f(x),它代表了方向,也是模型学习的方向。
其中f(x)一般对应着算法使用的损失函数,而x则代表了输入的训练数据和神经网络的权重,正如你所知,训练数据是给定不变的,但是权重是可以改变的,我们通过调整权重参数,让神经网络学习出一套分类的判定标准。在实际应用中,我们会使用BP算法来求出参数w对应的梯度,然后调整(更新)参数,让这组参数能更好的分类。
但有时,我们想要看一下我们的神经是什么样子的,也可以对x对梯度。
2.梯度的直观解释
假设有一个函数f(x,y)=xy,如果你学过微积分,一定知道对x求偏导,就是把除了x以外的所有参数,无论是y,还是w都当成参数处理,只对x求一次导就OK了。
f(x,y)=xy→∂f∂x=y∂f∂y=x
定义:其实导数定义的就是一个函数的在一点处的变化率。
df(x)dx=limh →0f(x+h)−f(x)h左边表达的是将f(x)对x求偏导,右边可以发现,当h很大的时候,就是两间的斜率表示了,如图,可以得到lPQ这条线,当h →0,两点间的距离慢慢减少,最后两点可以近似认为是一个点的时候,就是与这条曲线相切了,就可以得到绿色这条线了。其实积分,积分,用的就是逼近原理。
那导数代表了什么呢?
The derivative on each variable tells you the sensitivity of the whole expression on its value.
翻译过来就是:导数反应了每个变量对函数值的影响程度。
我们先前说了梯度代表了方向,那梯度和导数的关系是怎么样的呢?
其实∇f就是用偏导数表示的向量(有方向的),用上一个函数就是:∇f=[∂f∂x,∂f∂y]=[y,x]用图像表示就是:
3.用链式法则计算f(x)
为了理解链式法则,我们先用一个简答的例子:f(x,y,z)=(x+y)z,这个式子依然很简单,我们可以把这个公式分成两部分:q=x+y,f(q,z)=qz,这两个式子和第一个式子是等价的。
先前我们已经知道怎么计算偏导数了:∂f∂q=z,∂f∂z=q但是,q=x+y也是一个函数,对他也求导数:∂q∂x=1,∂q∂y=1但我们最后关心的不是q的偏导数,我们最后关系的是f对x,y,z三个的偏导数,所以f对x求偏导就有:∂f∂x=∂f∂q∂q∂x=z∗1分别对y,z求偏导,就可以得到对应的梯度了。
用更复杂的例子,sigmoid函数大家都挺熟悉的:σ(x)=11+e−x→dσ(x)dx=e−x(1+e−x)2=(1+e−x−11+e−x)(11+e−x)=(1−σ(x))σ(x)
4.公式与代码
我们写代码的人可能最怕的就是看到一大堆的数学公式了,但是我们并不需要自己手动算他们,所以知道他们怎么用代码写出来就OK了,举个例子:f(x,y)=x+σ(y)σ(x)+(x+y)2你可能会感觉这个公式还是挺复杂的,但只要你学会拆分,就一点都不难了。
x = 3 # example values y = -4 # forward pass sigy = 1.0 / (1 + math.exp(-y)) # sigmoid in numerator #(1) num = x + sigy # numerator #(2) sigx = 1.0 / (1 + math.exp(-x)) # sigmoid in denominator #(3) xpy = x + y #(4) xpysqr = xpy**2 #(5) den = sigx + xpysqr # denominator #(6) invden = 1.0 / den #(7) f = num * invden # done!
参考
cs231n
相关文章推荐
- 神经网络反向传播的数学原理
- 对正向传播、反向传播和精度检查的理解
- 深度学习与计算机视觉系列(5)_反向传播与它的直观理解
- DL反向传播理解
- 反向传播与它的直观理解
- 机器学习:一步步教你理解反向传播方法
- cs231n关于反向传播的理解
- 一张图理解训练的BP反向传播
- 深度学习与计算机视觉系列(5)_反向传播与它的直观理解
- 理解back propagation反向传播
- CNN的反向传播推导与理解
- 深度学习与计算机视觉系列(5)_反向传播与它的直观理解
- 神经网络反向传播的数学原理
- 初学者——从NN到RNN,深刻理解以softmax为激活函数的反向传播,有代码
- 深度学习与计算机视觉系列(5)_反向传播与它的直观理解
- 双层神经网络与逻辑回归正反向传播数学公式简要推导
- 神经网络反向传播的数学原理
- 对BP神经网络的正向传播与反向传播的理解
- 理解反向传播(BackPropagation)算法(之一)
- 深度学习与计算机视觉系列(5)_反向传播与它的直观理解