ScriptBoy's Blog

一个曾经的脚本男孩


  • 首页

  • 分类

  • 标签

  • 归档

  • 关于

深度强化学习DRL在推荐系统应用的思考

发表于 2020-04-03 | 分类于 推荐系统/推荐算法 | | 阅读次数:
字数统计: 567 | 阅读时长 ≈ 1

问题描述

最近一段时间,一直忙着调研强化学习,特别是深度学强化学习如何和推荐系统相结合。在看个半个月强化学习相关书籍和资料后,开始找寻RL For RecSys相关的paper,刚开始一搜,觉得还挺多嘛,入手应该不难。像Google、Microsoft、阿里、京东均有发表,特别是京东,好几篇,当时就觉得挺激动,不过细阅后,发现实际在生产线上落地过的,应该只有前三者,而且也是ABTest状态,京东是线下用模拟器跑的,感觉说服力不够。所以,实际上,能供参考的有效资料并不是特别丰富,很多细节估计得靠上线后去把握,去琢磨。

背景描述

目前我所参与的推荐系统和算法的开发,是作用于一款Feed流形式的资讯类app,目前线上的模型有LR、GBDT+LR、各种DNN等,做各种召回、排序的同事也挺多,在重排这快,目前还是以策略和人工规则为主,各个公司应该也都差不多,比如类目打散、类目限制、强插、强出等等,比较复杂,比较臃肿,但是重排也是特别重要的一块,在这里,物品多样性的控制显的尤为重要。推荐系统从抽象的来说,就是准确率和多样性的一个综合,在不同的上下文环境,不同的用户,这个比例的控制对用户体验,对指标,有着巨大的影响。所以,很自然的想到,如果想在重排这块做点工作,强化学习是个值得深入的方向。虽然也看到有阿里论文介绍针对List-Wise优化的监督学习方法,不过在公司现有的业务状况下,首先还是考虑了用强化学习去控制重排中的各种参数,比如排序多模型融合时候的融合参数,类目数量的个性化控制,是否要插入视频,插入几个视频等等,这些场景应用和公司本身业务联系更紧密。

心得体会

待补充

为什么逻辑回归是sigmoid形式

发表于 2019-01-28 | 分类于 机器学习 | | 阅读次数:
字数统计: 516 | 阅读时长 ≈ 1

最近在公司面试应聘者机器学习基础的过程中,比较喜欢问面试者一个问题,就是逻辑回归是sigmoid形式,sigmoid的结果是真实的概率吗,为什么可以把它当作一个probability来处理。印象中是没有一个人可以比较深入回答的,绝大部分的回答都是sigmoid函数可以映射在0、1之间,但是0、1之间的数值和概率有啥关系呢?比较少人去深入了解这个。

知识的深度可以挖掘很多层,我觉得这个问题可以从广义线性模型来展开。GLM假设预测值的分布属于指数分布,而二分类问题可以看作是伯努利分布,伯努利分布又属于指数分布的一种。

伯努利分布:
$$
p(y,\eta)=b(y)exp(\eta^{T}T(y)-a(\eta))
$$
伯努利分布:
$$
p(y,\eta)=\pi^{y}(1-\pi)^{1-y}
$$
π表示正样本的概率,对上述分布做一下转换:
$$
p(y:\pi)=exp(y*log(\frac{\pi}{1-\pi})+log(1-\pi))
$$
因为上面提到伯努利属于指数分布一种,所以对用上式和GLM的一一对应,可以得到:
$$
log(\frac{\pi}{1-\pi})=\eta^{T}=x^{T}\theta
$$
所以,可以得到:
$$
\pi=\frac{exp(x^{T}\theta)}{1+exp(x^{T}\theta)}
$$
而π表示正样本的概率,所以sigmoid可以在一定的假设条件下表示成概率。

总结:逻辑回归模型之所以是sigmoid的形式,源于我们假设y服从伯努利分布,伯努利分布又属于指数分布族,经过推导,将伯努利分布变成指数分布族的形式后。我们发现伯努利分布的唯一参数Φ与指数分布族中的参数η具有sigmoid函数关系,于是我们转而求η与x的关系,此时,我们又假设η与x具有线性关系。
至此,在两个假设条件下,找到了我们要用的模型的样子,也就是逻辑回归。

无意找到的2008年的一篇水文

发表于 2019-01-28 | 分类于 人生感悟 | | 阅读次数:
字数统计: 2.1k | 阅读时长 ≈ 7

无意在QQ网盘里找到的2008年高三时候扯的一篇博客还是啥来着,不知道是自己写的还是抄的,随便看看了,好low,哈哈。

                                                       几种入侵方法的分析及防御方法


随着现在互联网的不断发展,人们可以在网上做的事情愈来愈多,从最初的简易BBS到E-mail,从在线聊天到网上购物,涉及到的方面也越来越多,尤其是个人隐私以及重要的数据,甚至包括金融财产方面的资料。可能就在我们上网冲浪不经意的一瞬间,电脑系统已经被病毒木马等侵入,个人的数据也不知不觉中被发送给了黑客,想一想这是多么恐怖的事情。而我,也在几年间的上网冲浪中遇到过许多次的系统被入侵的事件,这里,我就讲讲几种常见的入侵方法以及防御方法。
阅读全文 »

Tensorflow serving python客户端碰到的性能问题以及解决办法

发表于 2019-01-28 | 分类于 Tensorflow | | 阅读次数:
字数统计: 321 | 阅读时长 ≈ 1

问题描述

在为灰度算法写tf serving的py客户端时,预测1000条样本,竟然要1200ms,发现预测的时间其实很短,不到5ms,95%的时间耗在了tf.make_tensor_proto这个方法上。

BTW:java api似乎没有碰到这个问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
def tf_serving(ids_list, vals_list):
req = predict_pb2.PredictRequest()
req.model_spec.name = 'deepfm'
req.model_spec.signature_name = 'serving_default'
start = time.time()
req.inputs['feat_ids'].CopyFrom(
tf.make_tensor_proto(ids_list, shape=[len(ids_list), 145], dtype=tf.int64))
req.inputs['feat_vals'].CopyFrom(
tf.make_tensor_proto(vals_list, shape=[len(vals_list), 145], dtype=tf.float32))
end = time.time()
print(end - start)
response = STUB.Predict(req, 10.0)
return response.outputs['prob'].float_val

解决方法

方法1:

这个方法有比较明显的效果,同样1000条样本,数据处理时间能降到400ms。

1
2
3
4
5
from tf.contrib.util import make_tensor_proto
...
req.inputs['feat_ids'].CopyFrom(
make_tensor_proto(ids_list, shape=[len(ids_list), 145], dtype=tf.int64))
...

方法2:

直接导入相关模块,这个方法有非常明显的效果,数据时间能降到10ms左右。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
def tf_serving(ids_list, vals_list):
req = predict_pb2.PredictRequest()
req.model_spec.name = 'deepfm'
req.model_spec.signature_name = 'serving_default'

start = time.time()
dims = [tensor_shape_pb2.TensorShapeProto.Dim(size=len(ids_list)),
tensor_shape_pb2.TensorShapeProto.Dim(size=145)]
tensor_shape_proto = tensor_shape_pb2.TensorShapeProto(dim=dims)
tensor_proto_ids = tensor_pb2.TensorProto(
dtype=types_pb2.DT_INT64,
tensor_shape=tensor_shape_proto)
for ids in ids_list:
for id in ids:
tensor_proto_ids.int64_val.append(id)
tensor_proto_vals = tensor_pb2.TensorProto(
dtype=types_pb2.DT_FLOAT,
tensor_shape=tensor_shape_proto)
for vals in vals_list:
for val in vals:
tensor_proto_vals.float_val.append(val)
req.inputs['feat_ids'].CopyFrom(tensor_proto_ids)
req.inputs['feat_vals'].CopyFrom(tensor_proto_vals)
end = time.time()
print(end - start)
response = STUB.Predict(req, 10.0)
return response.outputs['prob'].float_val

纪念下小站第零天建立

发表于 2019-01-28 | 分类于 人生感悟 | | 阅读次数:
字数统计: 222 | 阅读时长 ≈ 1

很早前就想申请个比较有意义的域名,想了很久都挤不出来,这几天吧,不知道是不是打通了任督二脉,古人云解铃还须系铃人,问问自己为啥我要投身IT呢,因为我喜欢呀,啥时喜欢的呢,那当然是高中时候当脚本小孩搞破坏的时候拉,对,就是那段不爱读书,却喜欢钻研电脑,那段去网吧不打游戏,却喜欢去钻研各种破解、入侵之类的东东时光[灰鸽子,手狗头]。因为当时不会编程,只能玩各种大神写好的黑客工具,所以称之为“脚本男孩”,这个域名就这样想好了。ok,以后有时间要常常维护这个小站,毕竟,三天打网两天晒鱼是不行滴,坚持才是王道。

ScriptBoy

5 日志
4 分类
7 标签
© 2020 ScriptBoy
由 Hexo 强力驱动
|
主题 — NexT.Gemini v5.1.4