神经网络中权重的更新
update of weights in a neural network
我正在尝试为 AND 示例的情况编写感知器学习规则。在图形上我们将有:
其中x0=1的值,更新权重的算法为:
并且我在 Python 中制作了以下程序:
import math
def main():
theta=[-0.8,0.5,0.5]
learnrate=0.1
target=[0,0,0,1]
output=[0,0,0,0]
x=[[1,0,0],[1,0,1],[1,1,0],[1,1,1]]
for i in range(0,len(x)):
output[i]=evaluate(theta,x[i])
for j in range(0,100):
update(theta,x,learnrate,target,output)
def evaluate(theta,x):
r=theta[0]*x[0]+theta[1]*x[1]+theta[2]*x[2]
r=1/(1+math.exp(-r))
return r
def update(theta,x,n,target,output):
for i in range(0,len(x)):
for j in range(0,len(x[i])):
delta=n*(target[i]-output[i])*x[i][j]
theta[j]=theta[j]+delta
print theta
r=evaluate(theta,x[i])
print r
print "\n"
if __name__=="__main__":
main()
当我 运行 程序时出现问题,对于第一组 theta 值:
theta=[-0.8,0.5,0.5]
我得到了值:
[-7.869649929246505, 0.7436243430418894, 0.7436243430418894]
0.000382022127989
[-7.912205677565339, 0.7436243430418894, 0.7010685947230553]
0.000737772440166
[-7.954761425884173, 0.7010685947230553, 0.7010685947230553]
0.000707056388635
[-7.90974482561542, 0.7460851949918075, 0.7460851949918075]
0.00162995036457
括号项是更新后的theta值,而其他值是评估的结果。在这种情况下,对于最后一种情况,我的结果应该非常接近 1,而对于另一种情况,我的结果应该非常接近 0,但这并没有发生。
当我使用这个值时:
theta=[-30,20,20]
他们巧妙地接近最后一个数据集,而其他数据集为 0:
[-30.00044943890137, 20.0, 20.0]
9.35341823401e-14
[-30.000453978688242, 20.0, 19.99999546021313]
4.53770586567e-05
[-30.000458518475114, 19.99999546021313, 19.99999546021313]
4.53768526644e-05
[-30.000453978688242, 20.0, 20.0]
0.999954581518
甚至当我尝试另一组时:
theta=[-5,20,20]
我的成绩不如之前的:
[-24.86692245237865, 10.100003028432075, 10.100003028432075]
1.5864734081e-11
[-24.966922421788425, 10.100003028432075, 10.000003059022298]
3.16190904073e-07
[-25.0669223911982, 10.000003059022298, 10.000003059022298]
2.86101378609e-07
[-25.0669223911982, 10.000003059022298, 10.000003059022298]
0.00626235903
我是不是遗漏了某些部分或者这个实现有什么问题?我知道还有另一种使用导数的算法,但我想实现这个幼稚的案例。
谢谢
问题在于您没有在权重更改后重新计算输出,因此误差信号保持不变,并且权重在每次迭代中都会以相同的方式更改。
修改代码如下:
def update(theta,x,n,target,output):
for i in range(0,len(x)):
output[i] = evaluate(theta,x[i]) # This line is added
for j in range(0,len(x[i])):
delta=n*(target[i]-output[i])*x[i][j]
theta[j]=theta[j]+delta
print theta
r=evaluate(theta,x[i])
print r
print "\n"
你应该会发现它收敛得更好。
我正在尝试为 AND 示例的情况编写感知器学习规则。在图形上我们将有:
其中x0=1的值,更新权重的算法为:
并且我在 Python 中制作了以下程序:
import math
def main():
theta=[-0.8,0.5,0.5]
learnrate=0.1
target=[0,0,0,1]
output=[0,0,0,0]
x=[[1,0,0],[1,0,1],[1,1,0],[1,1,1]]
for i in range(0,len(x)):
output[i]=evaluate(theta,x[i])
for j in range(0,100):
update(theta,x,learnrate,target,output)
def evaluate(theta,x):
r=theta[0]*x[0]+theta[1]*x[1]+theta[2]*x[2]
r=1/(1+math.exp(-r))
return r
def update(theta,x,n,target,output):
for i in range(0,len(x)):
for j in range(0,len(x[i])):
delta=n*(target[i]-output[i])*x[i][j]
theta[j]=theta[j]+delta
print theta
r=evaluate(theta,x[i])
print r
print "\n"
if __name__=="__main__":
main()
当我 运行 程序时出现问题,对于第一组 theta 值:
theta=[-0.8,0.5,0.5]
我得到了值:
[-7.869649929246505, 0.7436243430418894, 0.7436243430418894]
0.000382022127989
[-7.912205677565339, 0.7436243430418894, 0.7010685947230553]
0.000737772440166
[-7.954761425884173, 0.7010685947230553, 0.7010685947230553]
0.000707056388635
[-7.90974482561542, 0.7460851949918075, 0.7460851949918075]
0.00162995036457
括号项是更新后的theta值,而其他值是评估的结果。在这种情况下,对于最后一种情况,我的结果应该非常接近 1,而对于另一种情况,我的结果应该非常接近 0,但这并没有发生。
当我使用这个值时:
theta=[-30,20,20]
他们巧妙地接近最后一个数据集,而其他数据集为 0:
[-30.00044943890137, 20.0, 20.0]
9.35341823401e-14
[-30.000453978688242, 20.0, 19.99999546021313]
4.53770586567e-05
[-30.000458518475114, 19.99999546021313, 19.99999546021313]
4.53768526644e-05
[-30.000453978688242, 20.0, 20.0]
0.999954581518
甚至当我尝试另一组时:
theta=[-5,20,20]
我的成绩不如之前的:
[-24.86692245237865, 10.100003028432075, 10.100003028432075]
1.5864734081e-11
[-24.966922421788425, 10.100003028432075, 10.000003059022298]
3.16190904073e-07
[-25.0669223911982, 10.000003059022298, 10.000003059022298]
2.86101378609e-07
[-25.0669223911982, 10.000003059022298, 10.000003059022298]
0.00626235903
我是不是遗漏了某些部分或者这个实现有什么问题?我知道还有另一种使用导数的算法,但我想实现这个幼稚的案例。
谢谢
问题在于您没有在权重更改后重新计算输出,因此误差信号保持不变,并且权重在每次迭代中都会以相同的方式更改。
修改代码如下:
def update(theta,x,n,target,output):
for i in range(0,len(x)):
output[i] = evaluate(theta,x[i]) # This line is added
for j in range(0,len(x[i])):
delta=n*(target[i]-output[i])*x[i][j]
theta[j]=theta[j]+delta
print theta
r=evaluate(theta,x[i])
print r
print "\n"
你应该会发现它收敛得更好。