通常线性神经元架构的变体的反向传播方程

人工智能 机器学习 反向传播 多层感知器
2021-10-25 13:29:58

最近我在正常的线性神经层架构上遇到了一个变种:而不是Z=XW+B,我们现在有Z=(XA)W+B. 所以我们有一个“预偏见”A在乘以权重之前,这会影响最后一层的激活。我不明白反向传播方程dAdB(dW符合预期)。

这是它出现的原始论文(尽管论文本身实际上并不那么相关): http: //papers.nips.cc/paper/4830-learning-invariant-representations-of-molecules-for-atomization-能量预测.pdf

以下是神经网络完整代码的链接:http ://www.quantum-machine.org/code/nn-qm7.tar.gz

class Linear(Module):

    def __init__(self,m,n):

        self.tr = m**.5 / n**.5
        self.lr = 1 / m**.5

        self.W = numpy.random.normal(0,1 / m**.5,[m,n]).astype('float32')
        self.A = numpy.zeros([m]).astype('float32')
        self.B = numpy.zeros([n]).astype('float32')

    def forward(self,X):
        self.X = X
        Y = numpy.dot(X-self.A,self.W)+self.B
        return Y

    def backward(self,DY):
        self.DW = numpy.dot((self.X-self.A).T,DY)
        self.DA = -(self.X-self.A).sum(axis=0)
        self.DB = DY.sum(axis=0) + numpy.dot(self.DA,self.W)
        DX = self.tr * numpy.dot(DY,self.W.T)
        return DX

    def update(self,lr):
        self.W -= lr*self.lr*self.DW
        self.B -= lr*self.lr*self.DB
        self.A -= lr*self.lr*self.DA

    def average(self,nn,a):
        self.W = a*nn.W + (1-a)*self.W
        self.B = a*nn.B + (1-a)*self.B
        self.A = a*nn.A + (1-a)*self.A
1个回答

前向道具方程为:

Z=(XA)WB=XWAWB

所以导数为ZW,A,BX应该:

ZW=XAZA=WZB=1ZX=W

我不知道他为什么需要最后一个。第一个是,正如你所说,正如预期的那样。另外两个是错的,我不知道他为什么在实现中使用它们。