美文网首页
反向传播求导

反向传播求导

作者: 0xFFFFFG | 来源:发表于2019-07-30 17:31 被阅读0次

(教材)
dz^{[2]} = a^{[2]}-y
dW^{[2]} = dz^{[2]}a^{[1]T}
db^{[2]} = dz^{[2]}
dz^{[1]} = W^{[2]T}dz^{[2]} * g^{[1]\prime }(z^{[1]})
dW^{[1]} = dz^{[1]}x^{T}
db^ {[1]} = dz^{[1]}
其中*表示逐元素乘积
向量化后:
dZ^{[2]}=A^{[2]}-Y
dW^{[2]}={\frac{1}{m}}dZ^{[2]}{A^{[1]}}^{T}
db^{[2]} = {\frac{1}{m}}np.sum(dZ^{[2]},axis=1,keepdims=True)
\underbrace{dZ^{[1]}}_{(n^{[1]}, m)} = \underbrace{W^{[2]T}dZ^{[2]}}_{(n^{[1]}, m)}*\underbrace{g[1]^{'}(Z^{[1]})}_{(n^{[1]}, m)}
dW^{[1]} = {\frac{1}{m}}dZ^{[1]}x^{T}
db^{[1]} = {\frac{1}{m}}np.sum(dZ^{[1]},axis=1,keepdims=True)

(自己推导)
ReLU:
forward: Y = Y(X) = X \rightarrow \left[ X^{(i,j)}\gt0?X^{(i,j)}:0 \right] \\ backward: dX = {dX}(dY,X) =\left[ {X}^{(i,j)} \gt 0 ? {dY}^{ (i,j) } : 0 \right]

class Relu(AbstractLayer):
    def __init__(self):
        self.mask = None

    def forward(self, X):
        self.mask = (X <= 0)
        out = X.copy()
        out[self.mask] = 0
        return out

    def backward(self, dY):
        dX = dY
        dX[self.mask] = 0
        return dX

Sigmoid:
forward: Y = Y(X) = \left[\frac{1}{1+e^{-X^{(i,j)}}}\right] \\ backward: {dX} = dX(dY,Y) =dY*(1-Y)*Y

class Sigmoid(AbstractLayer):
    def __init__(self):
        self.Y = None

    def forward(self, X):
        self.Y = 1. / (1. + np.exp(-X))
        return self.Y

    def backward(self, dY):
        return dY * (1 - self.Y) * self.Y

Affine:
init: W \in R ^{h \times n},b \in R ^{h \times 1} \\ forward: Y \in R^{h \times m}=Y(W,b,X\in R^{n \times m})=W \cdot {X} + b \\ backward: \left\{\begin{array}{lcl} dW=dW(dY,X)=dY\cdot{X^T}\\ db=db(dY)=\sum_{axis=1}dY\\ dX=dX(W,dY)=W^T\cdot{dY}\\ \end{array} \right.

class Affine(AbstractLayer):
    def __init__(self, W, b):
        self.W = W
        self.b = b
        self.Y = None
        self.X = None
        self.m = None

    def forward(self, X):
        self.X = X
        self.m = X.shape[1]
        self.Y = np.dot(self.W, X) + self.b
        return self.Y

    def backward(self, dY):
        dW = np.dot(dY, self.X.T)
        db = np.sum(dY, axis=1, keepdims=True)
        dX = np.dot(self.W.T, dY)
        return dW, db, dX

LogCost:
forward: L = L(\hat{Y},Y) = -\frac{1}{m}\sum_{i,j}(Y^{(i,j)}*\log{\hat{Y}^{(i,j)}} + (1-Y^{(i,j)})*\log{(1-\hat{Y}^{(i,j)})}) \\ backward: d\hat{Y}=d\hat{Y}(\hat{Y},Y)=-\frac{1}{m}(\frac{Y}{\hat{Y}}-\frac{1-Y}{1-\hat{Y}})

class LogCost(CostLayer):

    def forward(self, Y_hat, Y):
        m = Y.shape[1]
        return -(1. / m) * np.sum(Y * np.log(Y_hat) + (1. - Y) * np.log(1. - Y_hat))

    def backward(self, Y_hat, Y):
        m = Y.shape[1]
        return -(1./m)*(Y / Y_hat - (1. - Y) / (1. - Y_hat))

相关文章

  • 反向传播求导

    (教材)其中*表示逐元素乘积向量化后: (自己推导)ReLU: Sigmoid: Affine: LogCost:

  • 神经网络

    神经网络的正向&&反向传播 通过正向传播后得到的误差来进行反向传播,反向传播时通过求导的方式更新权值,获得误差更小...

  • 深度学习面试题

    一、神经网络基础问题 (1)Backpropagation(反向传播) 后向传播是在求解损失函数L对参数w求导时候...

  • Pytorch学习笔记三——自动求梯度

    PyTorch提供的autograd包能够根据输入和前向传播过程自动构建计算图,并执行反向传播(链式求导)。 to...

  • pytorch autograd与逻辑回归

    一、torch.autograd 自动求导 1.backward方法 每次反向传播时,计算图都会被释放掉。reta...

  • PyTorch学习笔记(三):自动求导Autograd

    现代神经网络依靠反向传播(Back Propogation)算法来对模型进行优化,其本质是大规模链式求导。因此,能...

  • TensorFlow反向传播

    反向传播,只有在训练场景下才会用到。主要用的是反向链式求导的方法,即先从正向的最后一个节点开始,计算此时结果值与真...

  • 2019-03-18机器学习——梯度消失和爆炸

    反向传播的迭代公式为 其中f是激活函数,常用sigmoid激活函数求导为 导数值域都小于1,误差经过每一层传递都会...

  • 梯度消失和梯度爆炸

    1、简介在反向传播的过程中,需要对激活函数进行求导,如果导数大于1,那么会随着网络层数的增加梯度更新将会朝着指数爆...

  • 手推CNN,DNN算法流程和反向传播

    DNN 反向传播 DNN算法流程 卷积层反向传播 池化层反向传播 C NN算法流程

网友评论

      本文标题:反向传播求导

      本文链接:https://www.haomeiwen.com/subject/hxuerctx.html