梯度下降
1.梯度
在微积分里面,对多元函数的参数求∂偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。函数f(x,y), 分别对x,y求偏导数,求得的梯度向量grad f(x,y)或者▽f(x,y)=∂f/∂xi+∂f/∂yj。对于在点(x0,y0)的具体梯度向量就是▽f(x,y)的几何意义是函增加最快的方向,沿着梯度方向,容易找到函数的最大值
2.梯度下降
根据梯度向量可知沿着梯度向量相反的方向,就是函数减小最快的方向.
3.损失函数loss/cost function
损失函数是一个自变量为算法的参数,函数值为误差值的函数.同一个损失函数的两个参数(η,ε)设置的不同,会产生不同的拟合曲线,最后的结果也不相同。(η影响迭代次数,η小一些,迭代次数多,花费时间长,但找到的点接近极小值点,η大的话,花费时间短,但找到的值误差大,ε可以控制迭代次数,当Δx<ε时,停止迭代)
3.梯度下降法-步骤(一元函数)
1.假设函数y=f(x) 只有一个极小点。初始给定参数为 X0。从这个点如何搜索才能找到原函数的极小值点?
方法
1.首先设定一个较小的正数η,ε.
2.求当前位置处的各个偏导数:▽f(x)=∂f/∂x*i
3.修改当前函数的参数值,公式如下:xi+1=xi-η∂f/∂x(xi),其中-η∂f/∂x(xi)绝对值为Δx
4.如果参数变化量Δx小于ε,退出;否则返回2。
实例(y=(x-2.5)²+3)
1.首先设定一个较小的正数η=0.9,ε=0.01,初始给定参数为 X0=-4
2.▽f(x)=∂f/∂x=2x-5,在 X0=-4时,-η∂f/∂x(x0)=11.7,Δx>ε
3.修改当前函数的参数值,x1=x0-η∂f/∂x(x0)=7.7,-η∂f/∂x(x1)=-9.36,Δx>ε
修改当前函数的参数值,x2=x1-η∂f/∂x(x1)=-1.66,-η∂f/∂x(x2)=7.488,Δx>ε
修改当前函数的参数值,x3=x2-η∂f/∂x(x2)=5.828,-η∂f/∂x(x3)=-5.9904,Δx>ε
修改当前函数的参数值,x4=x3-η∂f/∂x(x3)=-0.1624,-η∂f/∂x(x4)=4.79232,Δx>ε
修改当前函数的参数值,x5=x4-η∂f/∂x(x4)=4.62992,-η∂f/∂x(x5)=-3.833856,Δx>ε
修改当前函数的参数值,x6=x5-η∂f/∂x(x5)=0.796064,-η∂f/∂x(x6)=3.0670848,Δx>ε
修改当前函数的参数值,x7=x6-η∂f/∂x(x6)=3.8631488,-η∂f/∂x(x7)=-2.45366784,Δx>ε
修改当前函数的参数值,x8=x7-η∂f/∂x(x7)=1.40948096,-η∂f/∂x(x8)=1.962934272,Δx>ε
修改当前函数的参数值,x9=x8-η∂f/∂x(x8)=3.37241523,-η∂f/∂x(x9)=-1.570347414,Δx>ε
修改当前函数的参数值,x10=x9-η∂f/∂x(x9)=1.802067816,-η∂f/∂x(x10)=1.2562779312,Δx>ε
修改当前函数的参数值,x11=x10-η∂f/∂x(x10)=3.0583457472,-η∂f/∂x(x11)=-1.00502234496,Δx>ε
修改当前函数的参数值,x12=x11-η∂f/∂x(x11)=2.0533233974,-η∂f/∂x(x12)=0.80401788468,Δx>ε
修改当前函数的参数值,x13=x12-η∂f/∂x(x12)=2.85734128208,-η∂f/∂x(x13)=-0.64321430774,Δx>ε
修改当前函数的参数值,x14=x13-η∂f/∂x(x13)=2.2141269743,-η∂f/∂x(x14)=0.51457144626,Δx>ε
修改当前函数的参数值,x15=x14-η∂f/∂x(x14)=2.72884118926,-η∂f/∂x(x15)=-0.3295313125,Δx>ε
修改当前函数的参数值,x16=x15-η∂f/∂x(x15)=2.3169270486,-η∂f/∂x(x16)=0.0411914141,Δx>ε
修改当前函数的参数值,x17=x16-η∂f/∂x(x16)=2.6464583611,-η∂f/∂x(x17)=-0.26362504998,Δx>ε
修改当前函数的参数值,x18=x17-η∂f/∂x(x17)=2.3828333111,-η∂f/∂x(x18)=0.21090004002,Δx>ε
...........
修改当前函数的参数值,x32=x31-η∂f/∂x(x31)=2.49485016944,-η∂f/∂x(x18)=0.009269695,Δx<ε
4.退出
代码实现如下:(附图)
运行结果如下:
7.700000000004707
-1.6599999999606894
5.8279999999828505
-0.16239999996558652
4.629919999973978
0.7960640000415111
3.8631487999643035
1.4094809600324645
3.3724152319707414
1.8020678144297122
3.0583457484625356
2.0533234012218884
2.8573412790176036
2.2141269767810314
2.7286984185734866
2.317041265136325
2.6463669878884524
2.3829064096867505
2.5936748722497107
2.4250601021953457
2.5599519182364396
2.452038465406762
2.5383692276697047
2.469304617858551
2.524556305711471
2.4803549554275364
2.5157160356554833
2.4874271714723264
2.510058262817253
2.491953389744509
2.506437288197109
2.4948501694406247
initial x = -4
arg min f(x) of x = 2.4948501694406247
f(x) = 3.0000265207547905