算法衰减
‘壹’ 神经网络中自适应的梯度下降优化算法(二)
Adagrad算法可以针对不同的参数自适应的采用不同的更新频率,对低频出现的特征采用低的更新率,对高频出现的特征采用高的更新率,因此,对于稀疏的数据它表现的很好,很好的提升了SGD的鲁棒性,在Google的通过Youtube视频识别猫的神经网络训练中有很好的表现。
梯度更新规则:
g(t,i)表示在t时刻目标函数对θ(i)的偏导数。SGD的每个参数的更新过程如下:
Adagrad的每个参数更新过程如下:
G(t)是一个对角矩阵,对角线上的每个元素是t时刻前所有θ(i)的梯度的平方和。ε通常取值在1e-8量级,它的存在是为了避免除数为0。一个有趣的现象是,如果没有平方根操作,算法的表现就非常糟糕。
Adagrad的主要缺点是,它的分母是平方梯度的累积,它的值会一直增加,最终导致学习率衰减到非常小,从而使得学习算法无法进行下去。
TensorFlow实现:
tf.train.AdagradOptimizer(learning_rate, initial_accumulator_value=0.1, use_locking=False, name='Adagrad')
Adadelta算法主要解决Adagrad的缺陷,它不再累加过去所有的梯度,而是仅累积过去固定个数的梯度。
Adadelta不是采用平方梯度的简单累加,而是采用 历史 平方梯度的衰减的平均。
γ通常等于0.9
分母相当于梯度的均方根(root mean squared, RMS),即将所有值平方求和,求其均值,再开平方,就得到均方根值。
梯度更新规则:
将学习率η设置为
,我们就不需要提前设定学习率。
RMSprop是Geoff Hinton提出的一种自适应学习率的方法,它与Adadelta方法都是为了解决Adagrad学习率急剧下降问题的。它与Adadelta方法是一致的。
梯度更新规则
超参数设定值:
Hinton建议设定γ=0.9, 学习率η=0.001。
TensorFlow实现:
tf.train.RMSPropOptimizer.__init__(learning_rate, decay, momentum=0.0, epsilon=1e-10, use_locking=False, name='RMSProp')
Adam也是对不同的参数自适应设置不同的学习率。它对 历史 梯度和 历史 平方梯度同时采用指数梯度衰减(exponentially decaying average)。
梯度更新规则
Adam作者观察到,如果m(t)和v(t)初始化为零向量,并且衰减率很小时(比如β1和β2都非常接近于1时),在开始的迭代中,m(t)和v(t)总是向零偏移,所以需要做偏移校正。
然后用校正后的值进行梯度更新:
Adam作者建议β1=0.9,β2=0.999,ε=10^{-8}
,在实践中,Adam比其它算法的效果要好。
TensorFlow实现:
tf.train.AdamOptimizer(learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-08, use_locking=False, name='Adam')
Adam更新规则中的梯度缩放与 历史 梯度的L2范数成反比。
我们可以把这个规则泛化到Lp范数。
当p值增大的时候,Lp的值往往会变得不稳定,所以在实践中L1和L2使用的比较普遍。但是Adamax作者发现L∞可以收敛到一个稳定值。
然后我们可以采用u(t)代替
来更新Adam中的梯度。
同时u(t)不需要做零偏校正。默认取值建议:
‘贰’ 关于热度算法
热度算法基本原理
需要了解的是,热度算法也是需要不断优化去完善的,基本原理:
新闻热度分 = 初始热度分 + 用户交互产生的热度分 – 随时间衰减的热度分
Score = S0 + S(Users) – S(Time)
新闻入库后,系统为之赋予一个初始热度值,该新闻就进入了推荐列表进行排序;随着新闻不断被用户点击阅读,收藏,分享等,这些用户行为被视作帮助新闻提升热度,系统需要为每一种新闻赋予热度值;同时,新闻是有较强时效性的内容,因此新闻发布之后,热度必须随着新闻变得陈旧而衰减。
新闻的热度就在这些算法的综合作用下不断变化,推荐列表的排序也就不断变化。
初始热度不应该一致
上面的算法为每一条入库的新闻赋予了同样的热度值,但在现实使用后发现行不通,例如娱乐类别比文化类别受欢迎程度本身就高很多;或者突发了严重的灾害或事故;或是奥运会期间,体育类别的关注度突然高了起来;而此时如果还是每条新闻给同样的热度就不能贴合实际了。
解决办法就是把初始热度设置为变量:
(1)按照新闻类别给予新闻不同的初始热度,让用户关注度高的类别获得更高的初始热度分,从而获得更多的曝光,例如:
(2)对于重大事件的报道,如何让它入库时就有更高的热度,我们采用的是热词匹配的方式。
即对大型新闻站点的头条,Twitter热点,竞品的头条做监控和扒取,并将这批新闻的关键词维护到热词库并保持更新;每条新闻入库的时候,让新闻的关键词去匹配热词库,匹配度越高,就有越高的初始热度分。
这样处理后,重大事件发生时,Twitter和门户网站的争相报道会导致热词集中化,所有匹配到这些热词的新闻,即报道同样事件的新闻,会获得很高的初始热度分。
用户行为分规则不是固定不变的
解决了新闻入库的初始分之后,接下来是新闻热度分的变化。先要明确用户的的哪些行为会提高新闻的热度值,然后对这些行为赋予一定的得分规则。例如对于单条新闻,用户可以点击阅读(click),收藏(favor),分享(share),评论(comment)这四种行为,我们为不同的行为赋予分数,就能得到新闻的实时用户行为分为:
S(Users) = 1*click + 5*favor + 10*comment + 20*share
这里对不同行为赋予的分数为1,5,10,20,但这个值不能是一成不变的;当用户规模小的时候,各项事件都小,此时需要提高每个事件的行为分来提升用户行为的影响力;当用户规模变大时,行为分也应该慢慢降低,因此做内容运营时,应该对行为分不断调整。
当然也有偷懒的办法,那就是把用户规模考虑进去,算固定用户数的行为分,即:
S(Users) = (1*click + 5*favor + 10*comment + 20*share)/DAU * N(固定数)
这样就保证了在不同用户规模下,用户行为产生的行为分基本稳定。
热度随时间的衰减不是线性的
由于新闻的强时效性,已经发布的新闻的热度值必须随着时间流逝而衰减,并且趋势应该是衰减越来越快,直至趋近于零热度。换句话说,如果一条新闻要一直处于很靠前的位置,随着时间的推移它必须要有越来越多的用户来维持。
我们要求推荐给用户的新闻必须是24h以内,所以理论上讲,衰减算法必须保证在24h后新闻的热度一定会衰减到很低,如果是线性衰减,当某些新闻突然有大量用户阅读,获得很高的热度分时,可能会持续排名靠前很久,让用户觉得内容更新过慢。
参考牛顿冷却定律,时间衰减因子应该是一个类似于指数函数:
T(Time) = e ^ (k*(T1 – T0))
其中T0是新闻发布时间,T1是当前时间。
而由于热度的发展最终是一个无限趋近于零热度的结果,最终的新闻的热度算法也调整为:
Score = ( S0(Type) + S(Users) ) / T(Time)
其他影响因素
很多新闻产品会给用户“赞”,“踩”或“不在推荐此类”的选项,这些功能不仅适用于个性化推荐,对热度算法也有一定的作用。
新闻的推送会造成大量的打开,在计算热度的时候需要排除掉相关的影响。类似于这样的因素,都会对热度算法产生影响,因此热度算法上线后,依然需要不断地“调教”。建议把所有的调整指标做成可配项,例如初始热度分,行为事件分,衰减因子等,从而让产品和运营能实时调整和验证效果,达到最佳状态。