手机网站端域名怎样做解析,安徽淮南,书店网站规划与建设,加强人社局网站建设2.3 代价函数的直观理解I
让我们通过一些例子来获取一些直观的感受#xff0c;看看代价函数到底是在干什么。 2.4 代价函数的直观理解II 代价函数的样子类似于等高线图#xff0c;则可以看出在三维空间中存在一个J(θ0,θ1)使得最小的点。 通过这些图形#xff0c;我希望你…2.3 代价函数的直观理解I
让我们通过一些例子来获取一些直观的感受看看代价函数到底是在干什么。 2.4 代价函数的直观理解II 代价函数的样子类似于等高线图则可以看出在三维空间中存在一个J(θ0,θ1)使得最小的点。 通过这些图形我希望你能更好地理解这些代价函数J所表达的值是什么样的它们对应的假设是什么样的以及什么样的假设对应的点更接近于代价函数的最小值。
我们将介绍梯度能够自动地找出能使代价函数最小化的参数和的值。 2.5 梯度下降
梯度下降是一个用来求函数最小值的算法我们将使用梯度下降算法来求出代价函数J(θ0,θ1)的最小值。
梯度下降背后的思想是开始时我们随机选择一个参数(θ0θ1~~~θn)的组合计算代价函数然后我们寻找下一个能让代价函数值下降最多的参数组合。我们持续这么做直到到到一个局部最小值local minimum因为我们并没有尝试完所有的参数组合所以不能确定我们得到的局部最小值是否便是全局最小值global minimum选择不同的初始参数组合可能会找到不同的局部最小值。 想象一下你正站立在山的这一点上站立在你想象的公园这座红色山上在梯度下降算法中我们要做的就是旋转360度看看我们的周围并问自己要在某个方向上用小碎步尽快下山。这些小碎步需要朝什么方向如果我们站在山坡上的这一点你看一下周围你会发现最佳的下山方向你再看看周围然后再一次想想我应该从什么方向迈着小碎步下山然后你按照自己的判断又迈出一步重复上面的步骤从这个新的点你环顾四周并决定从什么方向将会最快下山然后又迈进了一小步并依此类推直到你接近局部最低点的位置。
批量梯度下降batch gradient descent算法的公式为 其中是学习率learning rate它决定了我们沿着能让代价函数下降程度最大的方向向下迈出的步子有多大在批量梯度下降中我们每一次都同时让所有的参数减去学习速率乘以代价函数的导数。 在梯度下降算法中还有一个更微妙的问题梯度下降中我们要更新和 θ0,θ1当j0和j1时会产生更新所以你将更新j(θ0)和J(θ1)。实现梯度下降算法的微妙之处是在这个表达式中如果你要更新这个等式你需要同时更新θ0和θ1我的意思是在这个等式中我们要这样更新
θ0:θ0 并更新θ1: θ1。
实现方法是你应该计算公式右边的部分通过那一部分计算出和的值然后同时更新θ0和θ1。
让我进一步阐述这个过程 当人们谈到梯度下降时他们的意思就是同步更新。
在接下来的视频中我们要进入这个微分项的细节之中。我已经写了出来但没有真正定义如果你已经修过微积分课程如果你熟悉偏导数和导数这其实就是这个微分项 2.6 梯度下降的直观理解
梯度下降算法如下 描述对赋值使得按梯度下降最快方向进行一直迭代下去最终得到局部最小值。其中是学习率learning rate它决定沿着能让代价函数下降程度最大的方向向下迈出的步子有多大。 对于这个问题求导的目的基本上可以说取这个红点的切线就是这样一条红色的直线刚好与函数相切于这一点这条直线的斜率正好是这个三角形的高度除以这个水平长度现在这条线有一个正斜率也就是说它有正导数因此我得到的新的θ1θ1更新后等于θ1)减去一个正数乘以learning rate。
这就是梯度下降法的更新规则 让我们来看看如果learning rate太小或太大会出现什么情况
如果learning rate太小了可能会很慢因为它会一点点挪动它会需要很多步才能到达全局最低点。
如果learning rate太大那么梯度下降法可能会越过最低点甚至可能无法收敛下一次迭代又移动了一大步越过一次又越过一次一次次越过最低点直到你发现实际上离最低点越来越远所以如果太大它会导致无法收敛甚至发散。
因此如果你的参数已经处于局部最低点结果是局部最优点的导数将等于零因为它是那条切线的斜率。那么梯度下降法更新其实什么都没做它不会改变参数的值。它使得不再改变也就是新的等于原来的这也解释了为什么即使学习速率保持不变时梯度下降也可以收敛到局部最低点。
我们来看一个例子这是代价函数。 我想找到它的最小值首先初始化我的梯度下降算法在那个品红色的点初始化如果我更新一步梯度下降也许它会带我到这个点因为这个点的导数是相当陡的。现在在这个绿色的点如果我再更新一步你会发现我的导数也即斜率是没那么陡的。随着我接近最低点我的导数越来越接近零所以梯度下降一步后新的导数会变小一点点。然后我想再梯度下降一步在这个绿点我自然会用一个稍微跟刚才在那个品红点时比再小一点的一步到了新的红色点更接近全局最低点了因此这点的导数会比在绿点时更小。所以我再进行一步梯度下降时我的导数项是更小的θ1更新的幅度就会更小。所以随着梯度下降法的运行你移动的幅度会自动变得越来越小直到最终移动幅度非常小你会发现已经收敛到局部极小值。
回顾一下在梯度下降法中当我们接近局部最低点时梯度下降法会自动采取更小的幅度这是因为当我们接近局部最低点时很显然在局部最低时导数等于零所以当我们接近局部最低时导数值会自动变得越来越小所以梯度下降将自动采取较小的幅度这就是梯度下降的做法。所以实际上没有必要再另外减小。 2.7 梯度下降的线性回归
在以前的视频中我们谈到关于梯度下降算法梯度下降是很常用的算法它不仅被用在线性回归上和线性回归模型、平方误差代价函数。在这段视频中我们要将梯度下降和代价函数结合。我们将用到此算法并将其应用于具体的拟合直线的线性回归算法里。
梯度下降算法和线性回归算法比较如图 对我们之前的线性回归问题运用梯度下降法关键在于求出代价函数的导数即 则算法改写成 我们刚刚使用的算法有时也称为”批量梯度下降”指的是在梯度下降的每一步中我们都用到了所有的训练样本在梯度下降中在计算微分求导项时我们需要进行求和运算所以在每一个单独的梯度下降中我们最终都要计算这样一个东西这个项需要对所有个训练样本求和。 批量梯度算法代码与设计 import matplotlib.pyplot as pltx_data[1.0,2.0,3.0]
y_data[2.0,4.0,6.0]mlen(x_data)
# 默认w的权值随着梯度下降而修正
w1.0
#学习率
learning_rate0.01def forward(x):return x*wdef cost(x_data,y_data):cost0.0total_cost0for x,y in zip(x_data,y_data):y_testforward(x)cost(y_test-y)*(y_test-y)total_costtotal_costcostreturn total_cost/m# 计算新的w的修正
def gradiedent(x_data,y_data):grad0.0for x,y in zip(x_data,y_data):gradgrad2*x*(x*w-y)return grad
epoch_list[]
cost_list[]print(训练前,4,forward(4))
for epoch in range(100):y_costcost(x_data,y_data)# 在当前w权重下计算w的修正值grad_valgradiedent(x_data,y_data)w w - learning_rate * grad_valprint(轮次,epoch,w,w,loss,y_cost)epoch_list.append(epoch)cost_list.append(y_cost)
print(训练后,4,forward(4))#绘制损失loss与权重w之间的函数图像
plt.plot(epoch_list,cost_list)
plt.ylabel(Loss)
plt.xlabel(w)
plt.show()
结果 随机梯度算法代码与设计 import matplotlib.pyplot as plt# 随机梯度下降法和梯度下降法的主要区别在于
# 1、损失函数由cost()更改为loss()。cost是计算所有训练数据的损失loss是计算一个训练函数的损失。
# 对应于源代码则是少了两个for循环。
# 2、梯度函数gradient()由计算所有训练数据的梯度更改为计算一个训练数据的梯度。
# 3、本算法中的随机梯度主要是指每次拿一个训练数据来训练然后更新梯度参数。
# 本算法中梯度总共更新100(epoch)x3 300次。梯度下降法中梯度总共更新100(epoch)次。x_data[1.0,2.0,3.0]
y_data[2.0,4.0,6.0]mlen(x_data)
# 默认w的权值随着梯度下降而修正
w1.0
#学习率
learning_rate0.01def forward(x):return x * w# 随机梯度算法
def loss(x_val,y_val):y_cost forward(x_val)return (y_cost-y_val)*(y_cost-y_val)def gradiedent(x,y):return 2 * x*(forward(x) - y)epoch_list[]
loss_list[]print(训练前,4,forward(4))for epoch in range(100):for x,y in zip(x_data,y_data):gradgradiedent(x,y)ww-learning_rate*gradprint(x:,x,y,y,grad,grad)lloss(x,y)# 疑问此处仅选择最后一次并没有达到随机的效果print( loss, l)print(进程轮数,epoch,w,w,loss,l)epoch_list.append(epoch)loss_list.append(l)print(训练后,4,forward(4))
# 绘制epoch_list与loss_list的图像
plt.plot(epoch_list,loss_list)
plt.ylabel(Loss)
plt.xlabel(epoch_list)
plt.show()
结果