汇编语言SUB
目标函数是衡量预测值和实际值的相似程度的指标。通常我们希望得到使代价尽可能小的参数集,而这意味着你的算法性能不错。函数的最小可能代价被称为最小值。有时一个代价函数可以有多个局部极小值。幸运的是在参数空间的维数非常高的情况下,阻碍目标函数充分优化的局部最小值并不经常出现,因为这意味着对象函数相对于每个参数在训练过程的早期都是凹的。但这并非常态,通常我们得到的是许多鞍点,而不是真正的最小值。
找到生成最小值的一组参数的算法被称为优化算法。我们发现随着算法复杂度的增加,则算法倾向于更高效地逼近最小值。我们将在这篇文章中讨论以下算法:
随机梯度下降法
动量算法
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:
免责声明:本站发布的教育资讯(图片、视频和文字)以本站原创、转载和分享为主,文章观点不代表本网站立场。
如果本文侵犯了您的权益,请联系底部站长邮箱进行举报反馈,一经查实,我们将在第一时间处理,感谢您对本站的关注!
新励学网教育平台
海量全面 · 详细解读 · 快捷可靠
累积科普文章数:18,862,126篇