4.3 最简单的学习法:双向试错法(冷热法)
从本质上来看,神经网络的学习就是为了调整各种特征的权重值,以使得误差最小。如果从第一条数据输入开始,你就开始不断地调整各种特征的权重值,那么随着学习的数据量增多,最终权重越来越接近最优值附近。此时我们就说神经网络已经学习完成了。这一点和动物的学习是很类似的,通过不断地练习,最终掌握一种技能。比如婴儿学步就类似这种方法。
再回到最简单的单节点神经网络上来。
我们在上一节中,进行了一次学习,得到的误差值是0.3025。那接下来我们将knob_weight 变化,即:
knob_weight *= 1.01
pred = input * knob_weight
error = (pred - goal_pred)**2 # 误差
print(error1)
或:
knob_weight *= 0.99
pred = input * knob_weight
error2 = (pred - goal_pred)**2 # 误差
print(error2)
这样我们在第二步学习了两次,分别计算出它们的误差值,然后与第一次学习的误差比较。保留误差值小的那个knob_weight, 舍弃误差变大的knob_weight。如此重复这个过程就可以递推得到最优的knob_weight。
上面的过程我们可以写成如下的python程序:
knob_weight = 0.5
input = 0.5
goal_pred = 0.8
pred = input * knob_weight
error = (pred - goal_pred)**2 # 误差
times = 0
while True:
times += 1
temp_weight1 = knob_weight*0.99
temp_weight2 = knob_weight*1.01
pred1 = input * temp_weight1
pred2 = input * temp_weight2
error1 = (pred1 - goal_pred)**2
error2 = (pred2 - goal_pred)**2
if error1 < error and error2 > error:
error = error1
knob_weight = temp_weight1
elif error1 > error and error2 < error:
error = error2
knob_weight = temp_weight2
else:
break
print("运行次数为:", times)
print("最优权重为:%f, 误差为: %f"%(knob_weight, error))
上面的程序非常简单,循环118次后,可以很容易学习到权重knob_weight为1.60016,这已经和真实的结果1.6非常接近了。但是,聪明的你也许会看出上面的学习方法的局限性。在上面的程序中,判断语句中的条件是不完备的,比如碰到误差都减小的情形,上面的学习程序的选择是停止学习。这显然是不太好的。这种冷热学习法的局限是碰到参数空间中的一个极限点就会停下来,而且它有大量的重复计算。如果改变上面的程序,让它是条件完备的,也即碰到误差同时减小时,就搜索两个路径。这样的学习对于复杂问题会碰到指数级别的计算量。所以这个学习算法虽然简单,却有很多的弊端,无法利用它来学习复杂问题。