为什么简单反向传播击败了Nesterov和RMSProp

时间:2018-10-30 21:49:08

标签: python python-3.x neural-network backpropagation

我试图独自实现神经网络,效果很好。但是,当我尝试使用不同的算法进行优化时,结果令我有些困惑。也许我的实施出现问题?

我希望Nesterov和RMSProp会比简单的backPropagation和Momentum方法给出更好的结果。但是NoMomentum和Momentum方法每次都击败了RMSProp和Nesterov。我在每次训练后都更新了权重,并做了400个纪元的Pima印度糖尿病数据集。

First Run

Second Run

这是Jupyter笔记本进行测试:-Full Code

网络中共有三层,Sigmoid用于激活隐藏层,softmax用于输出层以进行输出预测。

在向您介绍未知变量的海洋之前,我想解释一下它们的用法:-

Wij:-输入和隐藏之间的权重设置。

Wjk:-隐藏和输出之间的权重集。

dEdOLo:-带有OutputLayerOuput的误差的导数

dOLoOLi:-带有OutputLayerInput的OutputLayerOutput的导数

dWij:-权重误差的导数集。

dWjk:-带权重误差的导数集。

lWij:-Wij的运行平均值。

lWjk:-Wjk的运行平均值。

ILi:-输入图层输入

ILo:-输入图层输出

HLi:隐藏层输入

HLo:隐藏层输出

OLi:-输出层输入

OLo:-输出层输入

alpha:-学习率。

beta:-衰减常数。

我尝试了:-

动量法

def bprop_momentum(self,ILi,Outpute,alpha,beta):
    self.dEdOLo=self.SEd(self.OLo,Outpute)
    self.dOLoOLi=self.OLo*(1-self.OLo)  
    self.dWjk=np.dot(self.HLo.T,(self.dEdOLo*self.dOLoOLi))
    self.dWij=np.dot(self.ILo.T,np.dot(self.Wjk,(self.OLo*(1-self.OLo)*self.dEdOLo).T).T*self.HLo*(1-self.HLo))
    self.lWij=beta*self.lWij+(1-beta)*self.dWij
    self.lWjk=beta*self.lWjk+(1-beta)*self.dWjk
    self.Wij-=(self.lWij*alpha)
    self.Wjk-=(self.lWjk*alpha)

Nesterov方法:-

def bprop_nesterov(self,ILi,Outpute,alpha,beta):
    self.dEdOLo=self.SEd(self.OLo,Outpute)
    self.dOLoOLi=self.OLo*(1-self.OLo)  
    self.dWjk=np.dot(self.HLo.T,(self.dEdOLo*self.dOLoOLi))
    self.dWij=np.dot(self.ILo.T,np.dot(self.Wjk-alpha*self.lWjk,(self.OLo*(1-self.OLo)*self.dEdOLo).T).T*self.HLo*(1-self.HLo))
    self.lWij=beta*self.lWij+(1-beta)*self.dWij
    self.lWjk=beta*self.lWjk+(1-beta)*self.dWjk
    self.Wij-=(self.lWij*alpha)
    self.Wjk-=(self.lWjk*alpha)

RMSProp方法:-

def bprop_rmsprop(self,ILi,Outpute,alpha,beta):
    self.dEdOLo=self.SEd(self.OLo,Outpute)
    self.dOLoOLi=self.OLo*(1-self.OLo)  
    self.dWjk=np.dot(self.HLo.T,(self.dEdOLo*self.dOLoOLi))
    self.dWij=np.dot(self.ILo.T,np.dot(self.Wjk,(self.OLo*(1-self.OLo)*self.dEdOLo).T).T*self.HLo*(1-self.HLo))
    self.lWij=beta*self.lWij+(1-beta)*(self.dWij*self.dWij)
    self.lWjk=beta*self.lWjk+(1-beta)*(self.dWjk*self.dWjk)
    self.Wij-=((self.dWij/(self.lWij**0.5 +0.000001))*alpha)
    self.Wjk-=((self.dWjk/(self.lWjk**0.5 +0.000001))*alpha)

0 个答案:

没有答案