当前位置:首页 » 操作系统 » 算法衰减

算法衰减

发布时间: 2024-09-22 11:58:42

‘壹’ 神经网络中自适应的梯度下降优化算法(二)

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)

其他影响因素

很多新闻产品会给用户“赞”,“踩”或“不在推荐此类”的选项,这些功能不仅适用于个性化推荐,对热度算法也有一定的作用。

新闻的推送会造成大量的打开,在计算热度的时候需要排除掉相关的影响。类似于这样的因素,都会对热度算法产生影响,因此热度算法上线后,依然需要不断地“调教”。建议把所有的调整指标做成可配项,例如初始热度分,行为事件分,衰减因子等,从而让产品和运营能实时调整和验证效果,达到最佳状态。

热点内容
ftp错误无法获得远端文件夹信息 发布:2024-09-22 14:20:19 浏览:124
如何在安卓服看到白鸟 发布:2024-09-22 14:20:16 浏览:220
仿回车源码 发布:2024-09-22 14:01:14 浏览:518
mysql数据库索引原理 发布:2024-09-22 13:58:55 浏览:22
android照片旋转 发布:2024-09-22 13:53:39 浏览:443
编程大牛 发布:2024-09-22 13:49:08 浏览:720
为什么电脑弹出代理服务器错误 发布:2024-09-22 13:48:21 浏览:385
我的世界启动器推荐服务器地址 发布:2024-09-22 13:44:09 浏览:638
c语言中的unsignedchar 发布:2024-09-22 13:11:12 浏览:169
最好的加密移动硬盘 发布:2024-09-22 12:35:58 浏览:158