我试图独自实现神经网络,效果很好。但是,当我尝试使用不同的算法进行优化时,结果令我有些困惑。也许我的实施出现问题?
我希望Nesterov和RMSProp会比简单的backPropagation和Momentum方法给出更好的结果。但是NoMomentum和Momentum方法每次都击败了RMSProp和Nesterov。我在每次训练后都更新了权重,并做了400个纪元的Pima印度糖尿病数据集。
这是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)