由一阶滤波器得到启发(采用本次采样值与上次滤波输出进行加权,得到有效滤波,使得输出对输入有反馈作用)
如下图,当γ增加,滤波器输出震荡减少。平均滤波器输出与平均滤波器输入相同,岁当当γ增加时,滤波器输入变慢。滤波器有助于减少震荡的书数目,同时仍然保持平均值。
动量MOBP
将动量滤波器加到参数的改变后,得到:
。
由于使用动量项,可以在维持算法稳定的基础上使用更高的学习速度,动量的另一个特征是当轨迹进入某一个一直的方向后,可以加速收敛。
python程序
import numpy as np
from math import e
import matplotlib.pyplot as plt
import scipy.io as sio
def logsig(x):
return 1/(1+e**(-x))
if __name__=="__main__":
W1=np.array([[2.0],[3.0]])
b1=np.array([[-1.],[1.]])
W2=np.array([[1.,1.]])
b2=np.array([[-1.]])
P=np.array([np.arange(-2,2,0.1)])
#P=np.array([[1]])
a0=P
T=logsig(np.dot(W2,logsig(np.dot(W1,P)+b1))+b2)
x = -2.0
y = 0.6
ep=300
W1[0,0]=x
W2[0,0]=y
n1 = np.dot(W1, P)+b1
a1 = logsig(n1)
n2 = np.dot(W2, a1)+b2
a2 = logsig(n2)
lr=1.5
mc=0.
xx=np.zeros([1,ep+1])
yy=np.zeros([1,ep+1])
ee = np.zeros([1, ep + 1])
E=T-a2
#print E
xx[0,0]=x
yy[0,0]=y
ee[0,0]=np.sum(E*E)
v1=np.zeros(W1.shape)
v2=np.zeros(W2.shape)
for i in range(1,ep+1):
s2=-2*E*(1-a2)*a2
s1=np.dot(W2.T,s2)*a1*(1-a1)
#print s1
#s2=-2*a2*(1-a2)*E
#s1=(1-a1)*a1*np.dot(W2.T,s2)
dW2 = np.dot(s2, a1.T)
dW1=np.dot(s1,a0.T)
#print dW1
v1 = mc * v1 - lr * dW1
v2 = mc * v2 - lr * dW2
newx=W1[0,0]+v1[0,0]
W1[0,0]=newx
xx[0,i]=newx
newy = W2[0, 0] + v2[0, 0]
W2[0, 0] = newy
yy[0, i] = newy
a1=logsig(np.dot(W1,a0)+b1)
a2=logsig(np.dot(W2,a1)+b2)
E=T-a2
ee[0,i]=np.sum(E*E)
print W1, W2
data=sio.loadmat('nndbp1')
p1=plt.subplot(121)
p2=plt.subplot(122)
x2=data['x2']
y2=data['y2']
E2=data['E2']
x2,y2=np.meshgrid(x2,y2)
p1.contour(x2,y2,E2)
#p1.plot(xx[0,1:80],yy[0,1:80])
p1.plot(xx[0,1:80],yy[0,1:80])
p2.plot(ee[0,1:50])
plt.show()
实验结果
上图,当mc=0,lr=1.5时,迭代约30次后收敛
mc=0,lr=2.5时出现震荡
mc=0.1,lr=2,5时,仅需10次就收敛了