算法工程师实习—月总结

来源:互联网 发布:linux 进程cpu使用率 编辑:程序博客网 时间:2024/05/17 23:59

 

实习思考

一、对于搜索广告的理解?

二、为什么求解离线全局分配最优解问题?

         1.通过与全局最优解的比确定算法的效率,判断其可以提升的空间

         2.预警作用。防止在线算法性能不稳定,时好时坏。

3.全局最优解释抽取一定量的广告,而不是当日全部的广告

三、为什么调研在线分配问题,在线分配问题的背景与意义?

1.      实现全局资源最优分配,效率最大化

2.      了解全局流量模式,以实现全局最优

四、Pacing为什么能优化目标?

支出预算与预测的可用的流量成比例

增加campaigns的寿命,获得了更多样化的受众群体

让预算不足的广告主参与竞价,但不参与展示。

Pacing主要针对预算不足的广告主。

五、现在做的事情:

1.      使用了预算pacing,优化ctr,可以在前面的时间出ctr较小但cpm较大的,通过后面的大的ctr来弥补。

2.      使用matching,不考率预算,通过cpm和ctr的结合,最大化ctr。

六、q*bid为什么能提升效率?

         放量数据,7的广告是后来加上去的。

         广告主与平台的博弈,有些cpm比较低的广告,能出而不出。

 

一.问题描述

在给出的数据中,每一行代表一次搜索,每次搜索中有一些广告,他们有state、ctr(点击率)、CPM(每千次展示的收益)三个值。其中,state 含义:0(意味着真实展现的广告), 7(未展现广告) ,8(不相关广告)。它们对应着的平均ctr、CPM和就是我们的基线指标。

    你需要通过一些方法,全局的挑选出最优的广告展现,注意,每次搜索(每一行)最多有三个广告位,即最多有3条广告被展现。保证平均ctr不变的情况下(可以稍微有下降),能最大化CPM:

   1. 通过搜索法、动态规划法或贪心或剪枝等任意方法,找到最优解,并分析复杂度;(程序最好用python实现)

2. 寻求近似解法,并尽量将复杂度下降为O(n)级,n为搜索次数,并给出与最优解的差;

3. 假设数据逐个到达,模拟在线分配的情景,提出在线分配的方法,并给出与最优解的差。

二.本周解决问题(第一周):

1.计划:按计划应该解决问题1

2.实际完成工作

(1)按照给定数据计算,计算出基线数据:

广告展现数目为: 85620

所有展示的cpm的: 1455788.4363229985

平均点击率: 0.10293753710453114

(2)以q*bid(即ctr*cpm) 对广告进行排序,对于一行有超过三个广告的查询,优先展示q*bid较高的广告,同时对q*bid进行阈值限制,防止点击率太低。对于一行查询只有一个广告或两个广告的查询,对q*bid进行阈值限制,不能达到阈值的广告,若ctr大于avr_ctr,则全部予以展示。实现了在ctr不降的情况下,比基线cpm提升了6.296个百分点

(3)考虑ctr和cpm的权重问题,以q*bid2(即ctr*cpm2) 对广告进行排序,比基线cpm提升了7.328个百分点

(4)继而尝试以q*bid3(即ctr*cpm3) 对广告进行排序,比基线cpm提升了7.481个百分点

(5)未完成工作原因:一是难点分析中的问题没有找出解决方案,二是本身积累不够,以前解决的问题类似于背包问题等,一方面最大化装入背包价格,一方面占用体积,可以用价格/体积衡量性价比,对物品进行排序。而现在面临的问题,平均ctr的变化牵扯到每一个入选的广告,每行的广告可以选取n个(n<=3),无法对每行的数据都进行准确的排序。问题一,我会在实习时间之外继续思考,寻求解决办法。下周主要分析解决问题二。

3.难点分析:

         动态平衡:选取广告越多,cpm总和会越大,但是,如果选取广告数太多,将点击率太低的广告加入,会造成平均ctr的下降。因此,全局最优解需要平衡cpm总和与平均ctr,而且,每一行可以选择0,1,2或3条广告,以一行有10个广告主为例,在没有任何过滤机制的情况下,有C(10,0)+ C(10,1)+ C(10,2)+ C(10,3)种选法。

         枚举算法困难性:对于暴力枚举,首先想到对每行数据进行排序,以简化枚举复杂度。由于每行数据排序比较困难,ctr排名高的,cpm排名不一定高,导致对于有20个广告主的一行查询,都很有可能选不出来满足ctr与cpm都在前十的top十。

         剪枝问题:如此大规模的枚举,剪枝策略如何定义?当处理完前N行数据时,不同的枚举方法得到了不同的平均点击率和cpm,又会出现排序的问题,导致只能剪掉极少数的cpm和ctr均比较低的结果。另一个剪枝策略是对当前的ctr能否达标进行预估,用(当前所有展示的ctr的和+未枚举的可能出现的ctr的和)/总的广告展示条数>ctr_thr。

 

三.本周解决问题(第二周):

1.计划:调研遗传算法解决问题二的方法

2.实际完成工作

(1)了解遗传算法的原理及其适用的问题。

查阅的相关资料中,遗传算法有效的解决了0-1背包问题,一维装箱问题,TSP问题,以及一般的线性规划问题。对于遗传算法对这些问题的求解过程,我都简单进行了了解分析,起初认为咱们要求解的全局最优化问题不适合遗传算法。因为遗传算法的交叉、变异过程无法应用于我们的问题,理由如下:每一行的广告数据都有其独立性,因为存在每一行选择展示的广告不能超过三个的限制。因此,交叉和变异过程无法使用。

之后又了解了蚁群算法,模拟退火算法等启发式算法,调研发现,蚁群算法,模拟退火算法对于求最短路径问题比较有效,模拟退火算法对一些组合优化问题也比较有效。但是对于解决类似于背包问题,这两种方法都不如遗传算法。

(2)遗传算法解决全局最优化问题的初步构想

后来看了一些用遗传算法解决简单问题的小程序,有一些启发,初步想到了一种方法,

1.      全局遍历所有广告,对于广告主数目大于3的行,选三个ctr和cpm都排在前三的广告(考虑到有些行难以选出三个最优,对于这种情况选取q*bid最大的三个),加入展示队列。这样的做法虽然极有可能远离最优解,但是极大的简化了运算。对于广告主数目为1,2或3的行,将所有广告全部加入广告队列。在遍历广告的过程中,将ctr*cpm太低并且ctr<thr的广告对应的ctr和cpm记录下来can_del[][],方便后面的删除操作。

2.      之后要考虑的是如何删除掉点击率低,且cpm也低的广告,进而在cpm降低尽可能少的情况下,删除ctr低的广告以提高点击率。此时,对于删除can_del[][]中的记录,可以考虑遗传算法。

3.      初步估计,can_del[][]中的记录是数以万计的,起初,可以编码为全1,之后,可以用遗传算法的交叉和变异去处理,进而选取出满足ctr>thr的结果。

初步构想如上,但是实施过程中很可能存在一些别的问题,如编码太长等问题(万位二进制)。还需要进一步去解决。

3下周工作计划

实现上述构想的算法,解决可能出现的问题。

 

四.本周解决问题(第三周):

1.实际完成工作

(1)对问题一求解:

基本思想:求出欲求得全局最优解情况下,每一行所有可能选取广告的情况,在进行指数级别枚举之前,提前剪枝,去除不可能的情况。之后从每一行选取一个返回结果,找出符合点击率要求的cpm总和最大的解,即为最优解。

(2)具体过程:

以行为单位,算出了每行查询可能返回的最优解。结果存入文件。格式如下:


第一行[3          0.1974013        8.648088]代表选取了三个广告,三个广告点击率和为0.1974013,cpm和为8.648088。[0,0,0]代表不从这一行选取广告。十万行数据大概运行了5小时。

 

剪枝策略1:主要是利用一行中ctr>thr的广告数目num来作为返回的参照,例如,如果num>=3,则该行必返回三个广告的组合,此时可以完全排除1个广告或两个广告的组合。当num=2或1时,同理。num=0时,可以返回一个广告,两个广告组合,三个广告组合,或0个广告,即所有可能出现的情况。

剪枝策略2:对每一组返回的结果,进行比较,如返回[3,1,2],必然没有[3,2,3]效果好,故剔除[3,1,2]

(3)对上述文件的处理,采用枚举法,第一行与第二行各选一个广告,返回所有可能结果,筛选剪枝,得到的结果与第三行重复上述处理,以此类推。(完成了一部分,还有些问题)

2.存在问题

         实际操作过程中,还存在一些问题,比如没有记下来选取的广告所在的行列,很多问题,在编写程序之前没有意识到,工作进度与预期不符等。

3.下周计划

完善程序中的一些问题,尤其是记录选取的广告所在的行列

五.本周解决问题(第四周):

1.实际完成工作

(1)继续对问题一求解:

         修复之前存在的问题,计算前50行的最优解(假设平均每行10条广告,复杂度为2500),用时11小时。

(2)考虑并行处理

         要求全局最优解,以目前的调研以及所想的方法中,只能枚举解决,由于每个广告只有入选和不入选两种情况,因此,对于n条广告,在不进行剪枝的情况下,复杂度为(2n)。考虑并行处理,设有m个处理器同时处理,则所消耗时间降为(2n/m),其并行处理的效果甚者不如剪枝减掉一个广告(2n-1)。每增加一个广告,计算量翻倍。所以,并行处理并不能能给该问题的解决带来质的飞跃。

(3)重新考虑近似最优解

         在解决m行的最优解问题时,进行分组,求局部最优,进而得到局部最优的组合,逼近全局最优。且分组越少,复杂度越高,越逼近最优解。以1000个广告为例,在解决1000个广告的最优解问题时,可以分为5组,每组200个广告,对每组数据求得一个局部最优解,将5组的5个局部最优解组合,得到全局最优解。复杂度由(21000降为2200*5)。

         对于100行数据,分组为1时,得出的是100行的最优解,分组为100时,相当于对每行求最优解,分组粒度的大小对所得最优解的结果有很大影响。工作中发现,分组很小时,比如每行一块的时候,增大分块,能明显缩小与最优解的差。随着分块变大,基本不再明显变化,随着分组变大,越来越逼近最优解。

2.下周计划

完善求全局最优问题现有工作,继续调研在线匹配问题在工业界的应用。