您可以在我的个人博客 blog.pengwill.info 获得更好的阅读体验。
思维导图
回顾
在Step3中,我们需要根据loss function,对参数θ进行优化,使用到的方法就是梯度下降算法。可以用如下的函数表示。
θ∗=argθminL(θ)
其中L表示loss function,θ表示待优化的参数。
优化的方法是使参数θ向其梯度方向减小,具体来说
θ:=θ−η∇L(θ)
η称为学习速率,是一个超参数,需要手动进行调整。
Tip1: 调整学习速率
learning rate 太小,loss下降太慢;learning rate太大,loss震荡或者增加。建议画出随着loss值随迭代次数变化的曲线,根据曲线进行调整。
learning rate调整建议
- 将learning rate随迭代次数逐渐减小。在刚开始时候希望收敛的步子大一点,而在后面的时候learning rate随迭代次数逐渐减小。比如 η=t+1η,其中t为迭代次数。
- 不同的参数设置不同的learning rate。
Adagrad
对每个参数设置不同的learning rate。在每次迭代时,将学习速率除以偏导和的均方根。
即
θi:=θi−ση∂θi∂L
其中σ为Loss function对θi偏导累计和的均方根。decay项(t+11)和原本σ中的项相消掉了。
Tip2: 随机梯度下降
传统梯度下降,迭代时需要根据所有的样本来更新loss function,进而根据loss function对参数的偏导更新参数。当样本非常多的时候,单次迭代就可能花费大量的时间。
随机梯度下降,迭代时选择一个样本点来更新loss function,再根据loss function对参数的偏导更新参数值。这样的优点是速度更快。但是由于样本中可能含有噪声,单次迭代不一定向函数减小最快的方向更新,甚至有可能迭代后loss值会增加。
Tip3: 特征缩放
采用特征缩放是为了避免数据大小或者数据的量纲不同对学习过程造成的影响。
假如当前的loss function为L(θ)=θ0+x1θ1+x2θ2。其中属性x1的变化范围为−1≤x1≤1,x2的变化范围为100≤x2≤1000。在学习过程中,因为∣x1∣≤∣x2∣,所以只要θ2略微变化一点,就会对L函数值造成很大影响;相反,θ1的变化对函数值造成的影响不大。
我们更加希望数据的每个属性的尺度都接近。
标准化
对数据的每一个特征值,减去特征的均值,除以特征的标准差,最后可以使这个特征的均值为0,方差为1。
梯度下降的数学原理
泰勒展开
若一元函数h(x)在x=x0处无限可导,则可以用多项式来逼近函数h(x)
h(x)=k=0∑∞k!h(k)(x0)(x−x0)k
二元函数的泰勒展开为:
h(x,y)=k=0∑∞k!∂x∂kh(x−x0)+k!∂y∂kh(y−y0)
梯度下降算法在计算损失函数值时候,实际上为在原来参数点的一阶展开,即
L(θ)≈L(a,b)+∂θ1∂L(a,b)(θ1−a)+∂θ2∂L(a,b)(θ2−b)
泰勒展开只在接近展开点的处的函数值是近似准确的,故需要对更新参数时加以限制,以保证在展开点附近。我们希望参数更新的时候,整体的函数值减小,即
L(θ)−L(a,b)≈∂θ1∂L(a,b)(θ1−a)+∂θ2∂L(a,b)(θ2−b)<0∂θ1∂L(a,b)(Δθ1)+∂θ2∂L(a,b)(Δθ2)<0∇L⋅Δθ<0
其中∇L是一个向量,当Δθ和∇L方向相反的时候,乘积为负值,且最大。故可以得出应该为梯度的反方向。同时需要注意,应该保证要在展开点的附近才可以,否则一阶泰勒展开不成立,则引入学习速率η,即:
∇L⋅ηΔθ<0
理论上需要保证无限接近展开点,计算出的值才是准确的,实际操作过程中,保证较小并且合适的学习速率就可以。