Я пытался внедрить Neural Net самостоятельно, и это сработало довольно хорошо. Однако когда я опробовал разные алгоритмы оптимизации, результаты меня немного смутили. Может быть, что-то не так с моей реализацией?
Я ожидал, что Нестеров и RMSProp дадут лучшие результаты, чем простой метод backPropagation and Momentum. Но NoMomentum и Momentum Method каждый раз побеждают RMSProp и Nesterov. Я обновлял веса после каждого тренировочного экземпляра и выполнил 400 эпох из набора данных о диабете индейцев Пима.
Вот блокнот 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)