分治法——可能会错过取更好的值。 数据集和维度越大,成本也越大。
我们会找更好的算法。 一种梯度下降算法。
梯度:梯度,正文用g代替。
所以:
坡度下降总是朝着下降速度最快的方向。
如果都不在任意辅助线的上方或下方,则为非凸函数。 如果损失函数是上图的曲线,则容易被局部最有利的点钩住。 那么为什么深度学习最常见的是梯度下降算法,是因为非凸函数在真正的深度学习中很少见。 你想解决的最大问题是马鞍。
importnumpyasnpimportmatplotlib.pyplotaspltx _ data=[ 1.0,2.0,3.0 ] y _ data=[ 2.0,4.0,6.0 ] w=1.01 deta=0 ys ) : y_pred=forward(x ) x ) cost=(y_pred-y ) * * 2返回成本/len ) xs yinzip(xs, ys ) 3:grad=2*x* ) x*w-y ) returngrad/len ) xs ) print(predict ) beforetraining ) 360 ), 4前向(4) ) cost _ list=[ ] epoch _ list=[ ] forepochinrange (100 ) :cost_val=cost ) y_data,y_data
PLT.plot(Epoch_list,cost_list ) PLT.ylabel ) cost (PLT.xlabel ) epoch (PLT.show ) ) ) ) ) ) )
训练结果必须收敛,发散后训练失败,常见原因是学习率a过大,参加再训练。
这个时候还是没有解决鞍点问题
***引入随机坡度下降*** (结构梯度距离) SGD
cost所有样本的损失函数,loss是一个样本的损失函数,随机梯度的下降在样本中很快在一个样本中计算。
引入随机噪声有可能跨越马鞍,继续推动样品前进,这被证实是非常有效的方法。
importnumpyasnpimportmatplotlib.pyplotaspltx _ data=[ 1.0,2.0,3.0 ] y _ data=[ 2.0,4.0, 6.0]w=1.01deeta=0.01 y ) : y _ pred=前向(x ) Lossi=(y_pred-y ) * * 2返回lossi def sgradient (x ) x, y65:grad=2*x*(x*w-y ) returngradprint('predict ) beforetraining ) : ',4,forward(4) ) ) forepord y ) grad_val=sgradient(x,y ) w-=a*。。
坡度下降效率高。 我可能找不到最好的地方。
梯度下降运算性能过高,不能并行化,时间空间复杂度高。
在实际应用中,采用间歇式随机梯度下降(batch )作为折中方式,性能越高越好,时间复杂度越低越好。
将每个样本分组,用随机梯度下降法学习。
MiNi-Batch是主流。