深度学习 with Python(四)数值计算
四、数值计算
4.1 上溢和下溢
下溢:接近0的数被计算机四舍五入近似为0
上溢:极大的数被计算机近似为正无穷
使用softmax函数进行数值稳定
4.2 病态条件
4.3 基于梯度的优化方法
优化:最小化f(x)值
梯度下降法,就是利用负梯度方向来决定每次迭代的新的搜索方向,使得每次迭代能使待优化的目标函数逐步减小。梯度下降法是2范数下的最速下降法。
线性搜索法确定学习率P35
4.3.1 Jacobian 和 Hessian 矩阵
Jacobian 矩阵:对向量求一阶导
Hessian 矩阵:在一阶导矩阵的基础上求二阶导,几乎处处都是对称的
因为Hessian 矩阵是实对称的,我们可以将其分解成一组实特征值和一组特征向量的正交基。在特定方向d上的二阶导数可以写成d⊤Hd。当
当d是H的一个特征向量时,这个方向的二阶导数就是对应的特征值。对于其他的方向d,方向二阶导数是所有特征值的加权平均,权重在0和1之间,且与d 夹角越小的特征向量的权重越大。
最大特征值确定最大二阶导数,最小特征值确定最小二阶导数。
当附近的临界点是最小点(Hessian 的所有特征值都是正的)时牛顿法才适用,而梯度下降不会被吸引到鞍点(除非梯度指向鞍点)。
仅使用梯度信息的优化算法被称为一阶优化算法(first-order optimization algorithms),如梯度下降。使用Hessian 矩阵的优化算法被称为二阶最优化算法(second-order optimization algorithms),如牛顿法。
4.4 约束优化
在x的某些集合中找f(x)的最大或最小值
4.5 基于梯度的优化寻找线性最小二乘
梯度计算题例子
1先对原方程f求导得到梯度方程delta,代入x0;
2将代入后得到的点(delta0)代入新的方程f(x0-t(delta))(线搜索法)
3对新方程求导,算出导数为0时t的值(t为学习率)
4计算x1=x0-t*梯度方程(x0)
http://sofasofa.io/tutorials/python_gradient_descent/index.php
结果是成功了,不知道为啥添加了None
上面计算题的代码实现,不指定学习率,解方程最小值作为学习率。
from sympy import diff,symbols,solve
def gdddd(x0,n):
x=symbols('x')
y=symbols('y')
t=symbols('t')
allx=[]#迭代的点的列表
allx.append(x0)
def formu(x,y):
f=4*x**2-4*x*y+2*y**2
return f
f0=formu(x,y)
def gradfunc(x0,f0):
diff0=(diff(f0,x),diff(f0,y))#求导数方程,也就是梯度下降方向
delta0=(diff0[0].subs([(x,x0[0]),(y,x0[1])]),diff0[1].subs([(x,x0[0]),(y,x0[1])]))#求极值点
fai=formu(x0[0]-t*delta0[0],x0[1]-t*delta0[1])#代入极值点后的公式
t0=solve(diff(fai,t),t)#求学习率
x1=(x0[0]-t0[0]*delta0[0],x0[1]-t0[0]*delta0[1])#求迭代后的生成的点
allx.append(x1)
print(x1)
for i in range(n):
if n>=0:
xi=gradfunc(allx[i],f0)
allx.append(xi)
return allx
x0=(2,3)
gdddd(x0,2)