Posts

Showing posts from June, 2019

反向传播公式推导

Image
在计算机科学家(也很可能是数学家)在提出DL在计算机上可行的时候,(我相信) 算力友好的计算Cost functon 对每个参数的导数($\frac{\partial C}{\partial w_{j k}^{l}}$ 和 $\frac{\partial C} { \partial b_{j}^{l}}$)是非常重要的一点。 符号表示 为此,这里引入了中间变量$\delta_{j}^{l}$ 定义为在$l^{th}$层的第$j^{th}$个神经元上的误差: $\delta_{j}^{l} \equiv \frac{\partial C}{\partial z_{j}^{l}}$ 这里$z_j^l$指的是第$l^{th}$层的第$j^{th}$个神经元的激活函数的带权输入: $z_{j}^{l}=\sum_{k} w_{j k}^{l} a_{k}^{l-1}+b_{j}^{l}$ 看起来更直观的做法可能会把激活函数输出作为引入变量来推导,但是事实是用$z_j^l$来表示会更方便。 从$\delta_j^L$ 出发: 大写的$L$表示最后一层,即输出层的误差,计作BP1 $\delta_{j}^{L}=\frac{\partial C}{\partial a_{j}^{L}} \sigma^{\prime}\left(z_{j}^{L}\right)$ BP1 是按分量构成的表达式,如果重写为用矩阵表示,计作BP1a,即: $\delta^{L}=\nabla_{a} C \odot \sigma^{\prime}\left(z^{L}\right)$ 其中$\nabla_{a}C$ 是一个向量,元素为$ \partial C / \partial a_{j}^{L} $   既然最后一层的误差已经可以表示,那对于中间层呢? 先给出结论,下式记作BP2 : $\delta^{l}=\left(\left(w^{l+1}\right)^{T} \delta^{l+1}\right) \odot \sigma^{\prime}\left(z^{l}\right)$ 证明: BP2的核心就是把$\delta_j^l$ 和 $\delta_j^{l+1}$ 关联起来,证明

牛顿法以及用牛顿法求极值

Image
牛顿法 牛顿法经常作为一个和梯度下降做对比的求解机器学习收敛结果的方法。需要明确的是首先牛顿法本身是作为求解函数零点问题的一种方法。具体做法是:当想要求解  $ f(\theta)=0 $ 时,如果$f$可导,那么可以通过迭代公式: $ \theta :=\theta-\frac{f(\theta)}{f^{\prime}(\theta)} $ 来迭代求得零点。 需要注意的是,牛顿法根据选取的初始值的不同,有可能会不收敛!通常选取在零点附近作为初始值。 牛顿法求函数零点 牛顿法之所以能work,是因为利用了泰勒展开。 我们把$ f(x)=0 $在$x_0$处展开且展开到一阶,得到$f(x)=f\left(x_{0}\right)+f^{\prime}\left(x_{0}\right)\left(x-x_{0}\right)$  所以目标就变成了要让:$f\left(x_{0}\right)+f^{\prime}\left(x_{0}\right)\left(x-x_{0}\right)=0$ 所以就变成了:$x=x_{1}=x_{0}-\frac{f\left(x_{0}\right)}{f^{\prime}\left(x_{0}\right)}$ 因为$f(x)=f\left(x_{0}\right)+f^{\prime}\left(x_{0}\right)\left(x-x_{0}\right)$ 并非处处相等,而是只在$x_0$附近可以这么认为,这里求得的$x_1$并不能让$f(x) = 0$,只能说$f(x_1)$的值比$f(x_0)$更接近于0,所以这就可以用迭代来逼近了! 这里来插入一下如果自变量不是一个单变量的泰勒展开式,假设函数$f(x,y)$ 那么它在$(x0,y0)$处的一阶泰勒展开计作$L(x,y)$写作: $L(x,y) = f(x_0,y_0) + f_x(x_0,y_0)*(x-x_0) + f_y(x_0,y_0)*(y-y_0)$ 牛顿法求极值 在机器学习中,问题就不是求零点,而是希望求loss function的最小值,于是可以写作求$\ell^{\prime}(\theta)=0$ 同理,这种情况下的迭代过程就是: $ \theta :=\theta-\