深度学习讲稿(20)

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非常接近了。但是,聪明的你也许会看出上面的学习方法的局限性。在上面的程序中,判断语句中的条件是不完备的,比如碰到误差都减小的情形,上面的学习程序的选择是停止学习。这显然是不太好的。这种冷热学习法的局限是碰到参数空间中的一个极限点就会停下来,而且它有大量的重复计算。如果改变上面的程序,让它是条件完备的,也即碰到误差同时减小时,就搜索两个路径。这样的学习对于复杂问题会碰到指数级别的计算量。所以这个学习算法虽然简单,却有很多的弊端,无法利用它来学习复杂问题。

你可能感兴趣的:(深度学习讲稿(20))