Почему Simple Backpropagation побеждают Нестерова и RMSProp - PullRequest
0 голосов
/ 31 октября 2018

Я пытался внедрить Neural Net самостоятельно, и это сработало довольно хорошо. Однако когда я опробовал разные алгоритмы оптимизации, результаты меня немного смутили. Может быть, что-то не так с моей реализацией?

Я ожидал, что Нестеров и RMSProp дадут лучшие результаты, чем простой метод backPropagation and Momentum. Но NoMomentum и Momentum Method каждый раз побеждают RMSProp и Nesterov. Я обновлял веса после каждого тренировочного экземпляра и выполнил 400 эпох из набора данных о диабете индейцев Пима.

First Run

Second Run

Вот блокнот Jupyter для тестовых прогонов: - Полный код

В сети три слоя, сигмоид используется как активация для скрытого слоя, а softmax используется в выходном слое для выходных прогнозов.

Прежде чем я представлю вам море неизвестных переменных, я хотел бы объяснить их использование: -

Wij: - Набор весов между входным и скрытым.

Wjk: -набор весов между скрытым и выходным.

dEdOLo: - Производная от ошибки w.r.t OutputLayerOuput

dOLoOLi: - Производная OutputLayerOutput w.r.t OutputLayerInput

dWij: - Набор производных весов Error w.r.t.

dWjk: - Набор производных весов Error w.r.t.

lWij: - Скользящее среднее для Wij.

lWjk: -Среднее значение для Wjk.

ILi: -входной слой ввода

ILo: -Входной слой вывода

HLi: -Ввод скрытого слоя

HLo: - Выход скрытого слоя

OLi: -входной слой ввода

OLo: -входной слой ввода

альфа: - Скорость обучения.

бета-версия: -Decay Constant.

Я попробовал: -

Импульсный метод

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)

Нестеров Метод: -

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)
...