​2020腾讯广告算法大赛复赛已经落幕,决赛答辩终极一战即将在8月3日14:00深圳腾讯滨海大厦举行。了解决赛详情并预约直播观赛,请点击:

决赛来袭!十强战队齐聚,终极一战拉开帷幕!

外部赛场战况激烈,腾讯公司也联合码客开启了面向员工的内部赛道。其中,chizhu团队强势上分,夺得内部榜第一名的好成绩。作为初赛便跻身前七名的实力队伍,本次的复赛排名也是实至名归。今天,chizhu受邀来分享他们针对本次赛题提分点优化的解题策略,为决赛前的你提供一些灵感。

本次比赛的主要思路还是按照我之前分享的——

【王牌选手分享】一发问鼎!鹅厂大神上分思路,助你玩转初赛!

以下是我们对本次赛题的一些理解和思路:

01 赛题解读

本届腾讯广告算法大赛的题目是用户画像,即根据用户点击广告的序列预测用户的年龄和性别。

02 赛题分析

这个题目对于我而言再熟悉不过了,因为之前的易观赛和华为赛也是预测年龄和性别。我们团队有幸在这两个比赛都取得第一名的好成绩。针对此类型的赛题,我们团队磨合出了一种思路,即先把id看成一个词,然后把id拼接起来连成一个句子,于是我们的任务就变成了一个脱敏场景下的文本分类问题

03 词向量

回到正题,既然是文本分类,不可或缺的自然是文本表示——词向量。最常见的自然是word2vec,这里分享下个人的小经验:在数据量大的情况下采用skip-gram效果会好些,本次题目还有个重要参数window,实验发现从10提升到60可以提升将近3个千分点。我也尝试了fasttext词向量,不过同等参数下效果要差一个百分点。同时,词向量的维度也是一个提分点,我们尝试把维度从128提高到300维,也就是提升了将近4个千分点。我们之所以这么做,主要是因为本次赛题数据量大,参数大模型大效果会更好

04 模型搭建

我采用的主体模型如下:

Why not bert here?虽然bert在NLP届的霸主地位不可动摇,但我们考虑到了本次赛题的特殊性,最强的creative_id的词表共有300w+个,从头预训练一个bert的成本是非常高的。而且经过我的尝试,效果也不尽如人意。

模型详情:将creative_id,ad_id,adv_id序列输入emb层,emb层的参数冻结不做更新,然后将这四个序列对应的emb拼接起来,这样做的好处是可以增加词的表征能力,同时接下来就只需要一个LSTM往下接,对比分散的四个emb,可以减少参数量。之后输入2层双向LSTM,分别做最大池化然后将两个最大池化拼接,这个是类似于残差的思想,利用了上一层的信息,巩固记忆。

05 联合训练

直接用end2end一个模型解决age和gender。

定义双loss:


def custom_loss(data1, targets1,data2, targets2):''' Define custom loss function '''loss1 = nn.CrossEntropyLoss()(data1, targets1)loss2 = nn.CrossEntropyLoss()(data2, targets2)return loss1*0.5+loss2*0.5

此外,可以调节权重,看偏向哪个子任务。

06 提分点&结果

对于这次比赛,我觉得主要有三个提分点

  • w2v大参数:windoms要大60,emb_size也要大300。

  • LSTM大参数:从128改大到256,提升4个千分点。

  • 序列顺序无关性:在数据处理上对序列进行随机shuffle,训练的每个epoch我都进行了随机shuffle,这个可以提升3个千分点。同样对于测试集的序列可以用原始序列顺序和随机顺序序列做加权融合,这个可以提升1个千分点。

最终结果是我用了8个模型做系数加权融合,最后成绩为1.4801,也就是第11名。卡在前十名外,还是很遗憾的。

07 附:LSTM模型代码

最后附上LSTM模型代码:线上A榜1475。


########模型构造class TXModel(nn.Module):def__init__(self,embed_matrix1=embed_matrix1,embed_matrix2=embed_matrix2,# embed_matrix3=embed_matrix3,embed_matrix4=embed_matrix4,embed_matrix5=embed_matrix5,embed_matrix6=embed_matrix6,lstm_hidden_size=256):super(TXModel, self).__init__()self.embedding1 = nn.Embedding(*embed_matrix1.shape)self.embedding1.weight = nn.Parameter(torch.tensor(embed_matrix1, dtype=torch.float32))self.embedding1.weight.requires_grad = Falseself.embedding2 = nn.Embedding(*embed_matrix2.shape)self.embedding2.weight = nn.Parameter(torch.tensor(embed_matrix2, dtype=torch.float32))self.embedding2.weight.requires_grad = Falseself.embedding4 = nn.Embedding(*embed_matrix4.shape)self.embedding4.weight = nn.Parameter(torch.tensor(embed_matrix4, dtype=torch.float32))self.embedding4.weight.requires_grad = Falseself.embedding5 = nn.Embedding(*embed_matrix5.shape)self.embedding5.weight = nn.Parameter(torch.tensor(embed_matrix5, dtype=torch.float32))self.embedding5.weight.requires_grad = Falseself.emb_dense2 = nn.Linear(300,128)self.embedding_dropout = nn.Dropout2d(0.2)self.lstm = nn.LSTM(300+128*2+300, lstm_hidden_size, bidirectional=True, batch_first=True)self.lstm2 = nn.LSTM(lstm_hidden_size * 2, lstm_hidden_size, bidirectional=True, batch_first=True)self.dropout = nn.Dropout(0.2)self.relu = nn.ReLU()self.linear = nn.Linear(lstm_hidden_size*2,64 )self.classifier1 = nn.Linear(lstm_hidden_size*2*2,2 )self.classifier2 = nn.Linear(lstm_hidden_size*2*2,10 )def apply_spatial_dropout(self, h_embedding):h_embedding = h_embedding.transpose(1, 2).unsqueeze(2)h_embedding = self.embedding_dropout(h_embedding).squeeze(2).transpose(1, 2)return h_embeddingdef forward(self, x1,x2=None,x3=None,x4=None,x5=None,x6=None,attention_mask=None,head_mask=None,):h_embedding1 = self.embedding1(x1)h_embedding1 = self.apply_spatial_dropout(h_embedding1)h_embedding2 = self.embedding2(x2)h_embedding2 = self.apply_spatial_dropout(h_embedding2)h_embedding4 = self.embedding4(x4)h_embedding4 = self.apply_spatial_dropout(h_embedding4)h_embedding5 = self.embedding5(x5)h_embedding5 = self.apply_spatial_dropout(h_embedding5)h_embedding2 = self.emb_dense2(h_embedding2)h_embedding5 = self.emb_dense2(h_embedding5)h_embedding = torch.cat([h_embedding1,h_embedding4,h_embedding2,h_embedding5],-1)h_lstm1, hidden= self.lstm(h_embedding)h_lstm2, hidden= self.lstm2(h_lstm1)max_pool1, _ = torch.max(h_lstm1, 1)max_pool2, _ = torch.max(h_lstm2, 1)out =torch.cat((max_pool1,max_pool2 ), 1)out = self.dropout(out)out1 = self.classifier1(out)out2 = self.classifier2(out)return out1,out2

感谢chizhu团队的分享。每次比赛都能激发出选手们新的潜力,他们的宝贵经验也为大家的共同成长增添了新的养分。希望各位竞赛人能在每次竞技中都有所收获,不虚此行。

8月3日14:00腾讯广告算法大赛决赛即将启幕,算法王者巅峰对决,为你带来算法与技术激烈碰撞的盛筵。快点击**【文末链接】**,扫描报名页面底部二维码,预约线上直播观赛吧!

同时,欢迎选手们到“官网—个人信息”页面上传简历加入腾讯,就趁现在!

扫码加入大赛官方QQ群

或搜索群号:1094257162

和小伙伴一起解锁更多内容

点击下方链接,预约直播观赛:

2020腾讯广告算法大赛决赛观赛报名页

【复赛前排分享(一)】上分有路勤为径,大神教你剖析提分点相关推荐

  1. 【复赛前排分享(三)】高手上场第一招,这些赛事技巧你掌握了吗?

    2020腾讯广告算法大赛复赛已经落幕,决赛答辩终极一战即将在8月3日14:00深圳腾讯滨海大厦举行,了解决赛详情并预约直播观赛,请点击: <决赛来袭!十强战队齐聚,终极一战拉开帷幕!> 外 ...

  2. 刘一男词汇课(从abandon到abundant):书上有路勤为径,学海无涯“懂“作舟

    书上有路勤为径,学海无涯懂作舟  单词释义 abandon vt.丢弃,遗弃,放弃  a- 否定 band-布带 on          band n.带:波段:频带:箍 bandage n.绷带 b ...

  3. java注解接收上传文件,前台:Input type=file 后台获取文件内容用的是spring注解,当地环境上传图片是好的,发布到服务器上图片读取不到,求大神指点...

    当前位置:我的异常网» Java Web开发 » 前台:Input type="file" 后台获取文件内 前台:Input type="file" 后台获取文 ...

  4. 书山有路勤为径 学海无涯苦作舟(AI引领时代浪潮)

    书山有路勤为径 学海无涯苦作舟 AI模型是如何训练的? 数据准备 在训练AI模型之前,需要准备大量的数据集.数据集的质量和多样性直接影响模型训练的效果.数据集准备的主要工作包括: 数据清洗:清除数据中 ...

  5. 解读韩愈治学名联-书山有路勤为径,学海无涯苦作舟

    出处:中国唐代著名诗人.哲学家韩愈所写对联:"书山有路勤为径,学海无涯苦作舟". 解读:要登上知识的顶峰,勤奋就是上山的小路:要渡过无边学海,刻苦就是渡海的小船. 自身领会:现代知 ...

  6. 书山有路勤为径(一)

    书山有路勤为径(一) 这篇记录读书,激励多读些书吧 before2013 三国演义 作者:罗贯中 工作之前,除了教科书练习册外,乱七八糟书看了不少,有军事的,讲飞机坦克军舰:有天文的,讲亿万光年以外: ...

  7. 【复赛前排分享(二)】收好这份王牌优化指南,助你轻松上分无压力

    2020腾讯广告算法大赛复赛已经落幕,决赛答辩终极一战即将在8月3日14:00深圳腾讯滨海大厦举行,了解决赛详情并预约直播观赛,请点击: <决赛来袭!十强战队齐聚,终极一战拉开帷幕!> 外 ...

  8. 抖音怎么上传照片图集?抖音照片视频怎么制作?大神教你轻松搞定!

    抖音怎么上传照片图集?抖音照片视频或照片图集怎么制作?现在抖音上很多那种照片或图片做成的短视频,主题好,有音乐,还有文字或好看的切换效果.今天就请大神来教大家简单几步,轻松做一个好看的抖音照片图集!教 ...

  9. 那些在Youtube上呼风唤雨,收入数十万美元的大神们

    据说在起点写书的大神们年收入能达到数十万甚至百万人民币,在Youtube上也有一群大神能赚到一大笔.Business Insider最近报道了在Youtube上最红.收入最高的十位大神,他/她们的收入 ...

最新文章

  1. python处理pdf实例_Python实战-从菜鸟到大牛的进阶之路pdf_Python教程
  2. struts2 如何跳转html5,在线HTML编辑器——ueditor,跟struts2结合
  3. windows10配置php7.1+apache2.4+mysql5.7
  4. 前端学习(1716):前端系列javascript之页面配置下
  5. Selenium 特点
  6. 基于python的证件照_用20行python代码给证件照换底色
  7. Xamarin开发Android---提示、跳转、传递数值 (学习总结)
  8. python调用C语言ctypes详解
  9. Android开机程序(自定义哦!)
  10. 选择符/选择器 深入了解 全面的选择器学习
  11. 在删除 maven 聚合工程里面的一个子项目的时候,启动项目报错:XXXpom.xml does not exist
  12. 小知识·OTG工作原理
  13. 蛙人高频交易拆单策略—蛙人高频软件结构及使用说明
  14. Deep Homography Estimation - Pytorch实现
  15. 计算机二级C语言公共基础知识,以及习题总结(一)
  16. windows Internet Connection Sharing(ICS)服务的启动
  17. Win10锁屏壁纸图片保存
  18. 【人工智能 Open AI】解释一下 Raft 分布式一致性协议算法,并用伪代码实例说明。
  19. Weakly-Supervised Salient Object Detection via Scribble Annotations
  20. Shiro权限控制(二)

热门文章

  1. 最近30分钟合约市场爆仓1.03亿美元
  2. SAP License:CO第一夜-成本要素会计
  3. 将一个js项目改造成vue项目
  4. python小项目之头像右上角加数字
  5. bzoj千题计划227:bzoj1486: [HNOI2009]最小圈
  6. OpenCV中的图像插值示例
  7. 为什么有些人看了别人的总结、经验、教训,依然没有用。
  8. BZOJ_1629_[Usaco2007_Demo]_Cow_Acrobats_(贪心)
  9. DRUID连接池的使用
  10. WebStorm中Node.js项目配置教程(1)——创建项目