当前位置:新励学网 > 秒知问答 > 汇编语言SUB

汇编语言SUB

发表时间:2024-07-19 01:31:41 来源:网友投稿

目标函数是衡量预测值和实际值的相似程度的指标。通常我们希望得到使代价尽可能小的参数集,而这意味着你的算法性能不错。函数的最小可能代价被称为最小值。有时一个代价函数可以有多个局部极小值。幸运的是在参数空间的维数非常高的情况下,阻碍目标函数充分优化的局部最小值并不经常出现,因为这意味着对象函数相对于每个参数在训练过程的早期都是凹的。但这并非常态,通常我们得到的是许多鞍点,而不是真正的最小值。

找到生成最小值的一组参数的算法被称为优化算法。我们发现随着算法复杂度的增加,则算法倾向于更高效地逼近最小值。我们将在这篇文章中讨论以下算法:

随机梯度下降法

动量算法

RMSProp

Adam算法

随机梯度下降法

我的「Logistic回归深入浅出」的文章里介绍了一个随机梯度下降如何运作的例子。如果你查阅随机梯度下降法的资料(SGD),通常会遇到如下的等式:

资料上会说θ是你试图找到最小化J的参数,这里的J称为目标函数。最后我们将学习率记为α。通常要反复应用上述等式,直到达到你所需的代价值。

这是什么意思?想一想,假如你坐在一座山顶上的雪橇上,望着另一座山丘。如果你滑下山丘,你会自然地往下移动,直到你最终停在山脚。如果第一座小山足够陡峭,你可能会开始滑上另一座山的一侧。从这个比喻中你可以想到:

学习率越高意味着摩擦力越小,因此雪橇会像在冰上一样沿着山坡下滑。低的学习率意味着摩擦力高,所以雪橇会像在地毯上一样,难以滑下。我们如何用上面的方程来模拟这种效果?

随机梯度下降法:

初始化参数(θ,学习率)

计算每个θ处的梯度

更新参数

重复步骤2和3,直到代价值稳定

让我们用一个简单的例子来看看它是如何运作的!

在这里我们看到一个目标函数和它的导数(梯度):

我们可以用下面的代码生成函数和梯度值/30的图:

importnumpyasnp

defminimaFunction(theta):

returnnp.cos(3*np.pi*theta)/theta

defminimaFunctionDerivative(theta):

const1=3*np.pi

const2=const1*theta

return-(const1*np.sin(const2)/theta)-np.cos(const2)/theta**2

theta=np.arange(.1,2.1,.01)

Jtheta=minimaFunction(theta)

dJtheta=minimaFunctionDerivative(theta)

plt.plot(theta,Jtheta,label=r'$J(theta)$')

plt.plot(theta,dJtheta/30,label=r'$dJ(theta)/30$')

plt.legend()

axes=plt.gca()

#axes.set_ylim([-10,10])

plt.ylabel(r'$J(theta),dJ(theta)/30$')

plt.xlabel(r'$theta$')

plt.title(r'$J(theta),dJ(theta)/30$vs$theta$')

plt.show()

上图中有两个细节值得注意。首先注意这个代价函数有几个极小值(大约在0.25、1.0和1.7附近取得)。其次注意在最小值处的导数在零附近的曲线走向。这个点就是我们所需要的新参。

我们可以在下面的代码中看到上面四个步骤的实现。它还会生成一个视频,显示每个步骤的θ和梯度的值。

importnumpyasnp

importmatplotlib.pyplotasplt

importmatplotlib.animationasanimation

defoptimize(iterations,oF,dOF,params,learningRate):

computestheoptimalvalueofparamsforagivenobjectivefunctionanditsderivative

Arguments:

-iteratoins-thenumberofiterationsrequiredtooptimizetheobjectivefunction

-oF-theobjectivefunction

-dOF-thederivativefunctionoftheobjectivefunction

-params-theparametersofthefunctiontooptimize

-learningRate-thelearningrate

Return:

-oParams-thelistofoptimizedparametersateachstepofiteration

oParams=[params]

#Theiterationloop

foriinrange(iterations):

#Computethederivativeoftheparameters

dParams=dOF(params)

#Computetheupdate

params=params-learningRate*dParams

#appendthenewparameters

oParams.append(params)

returnnp.array(oParams)

defminimaFunction(theta):

returnnp.cos(3*np.pi*theta)/theta

defminimaFunctionDerivative(theta):

const1=3*np.pi

const2=const1*theta

return-(const1*np.sin(const2)/theta)-np.cos(const2)/theta**2

theta=.6

iterations=45

learningRate=.0007

optimizedParameters=optimize(iterations,

minimaFunction,

minimaFunctionDerivative,

theta,

learningRate)

这似乎运作得很好!您应该注意到,如果θ的初始值较大,则优化算法将在某一个局部极小处结束。但是如上所述,在极高维度空间中这种可能性并不大,因为它要求所有参数同时满足凹函数。

你可能会想「如果我们的学习率太大,会发生什么?」。如果步长过大,则算法可能永远不会找到如下的动画所示的最佳值。监控代价函数并确保它单调递减,这一点很重要。如果没有单调递减,可能需要降低学习率。

SGD也适用于多变量参数空间的情况。我们可以将二维函数绘制成等高线图。在这里你可以看到SGD对一个不对称的碗形函数同样有效。

importnumpyasnp

importmatplotlib.mlabasmlab

importmatplotlib.pyplotasplt

importscipy.stats

importmatplotlib.animationasanimation

defminimaFunction(params):

#BivariateNormalfunction

X,Y=params

sigma11,sigma12,mu11,mu12=(3.0,.5,0.0,0.0)

Z1=mlab.bivariate_normal(X,Y,sigma11,sigma12,mu11,mu12)

Z=Z1

return-40*Z

defminimaFunctionDerivative(params):

#Derivativeofthebivariatenormalfunction

X,Y=params

sigma11,sigma12,mu11,mu12=(3.0,.5,0.0,0.0)

dZ1X=-scipy.stats.norm.pdf(X,mu11,sigma11)*(mu11-X)/sigma11**2

dZ1Y=-scipy.stats.norm.pdf(Y,mu12,sigma12)*(mu12-Y)/sigma12**2

return(dZ1X,dZ1Y)

defoptimize(iterations,oF,dOF,params,learningRate,beta):

computestheoptimalvalueofparamsforagivenobjectivefunctionanditsderivative

Arguments:

-iteratoins-thenumberofiterationsrequiredtooptimizetheobjectivefunction

-oF-theobjectivefunction

-dOF-thederivativefunctionoftheobjectivefunction

-params-theparametersofthefunctiontooptimize

-learningRate-thelearningrate

-beta-Theweightedmovingaverageparameter

Return:

免责声明:本站发布的教育资讯(图片、视频和文字)以本站原创、转载和分享为主,文章观点不代表本网站立场。

如果本文侵犯了您的权益,请联系底部站长邮箱进行举报反馈,一经查实,我们将在第一时间处理,感谢您对本站的关注!