复赛已经结束了,决赛是不可能的,这辈子都不可能的,只能去复赛打个酱油混个绿卡这个样子

趁着机器学习的风,看到了华为的软件精英挑战赛,试了试水,要找工作了,简历上多点东西也好看一些。

毕竟华为说绿卡直接免笔试和面试,这岂不是美滋滋

华为的软件经营挑战赛每年都会有,不过最近机器学习实在太火,华为一改之前的网络和算法内容,直接换成了机器学习。

还想从去年的网络题目里学点东西来应付今年的比赛呢

题目描述

详细的题目描述如下

智能世界 · 云动

题目的主要内容是预测。现在云服务器已经被业界普遍使用,用户可以灵活的根据不同需求申请不同规格的虚拟服务器,但这给云服务器带来了新问题,用户到底什么时候会申请什么规格的机器以及如何在物理机器上合理分配虚拟机以求得最大的物理资源使用率,这次大赛的主题就是围绕这两个问题的解决方法进行的。

大赛会提供一定的虚拟服务器历史申请数据,要求参赛者从这些数据中训练出一定的模型用于预测未来某一个时间段内一些类型的虚拟机的申请数量,再根据这些虚拟机申请数量在物理服务器中分配虚拟服务器。

也就是说,大赛主要分为两个阶段,预测阶段和放置阶段。

赛题思路

和队友商量了一下,我先做预测部分,他做放置阶段,放置阶段相对而言简单一些,等他做好放置阶段再来和我一起讨论预测的事情。

「Andrew NG」大佬说过,机器学习这种事情,先别管那么多,撸个 basemodel 再来说话。

线性回归

首先我选择了线性回归模型作为最初的预测方式,选取一个月内每一天的数量作为输入特征,也即 31 维的输入。通过梯度下降法求得 Wb,最终预测出结果。

通俗一点讲,就是求得一个月内每一天虚拟器出现的数量,然后根据所要预测时间的每个月的日期 ( 1 - 31 号)出现次数来预测最终的数量。

模型非常简单,但是完成这个模型我还是花了一点时间,因为在训练模型之前还有一件事情需要做,原始数据还没有处理。大赛给的数据都是虚拟机出现的时间和类型,需要把这些数据处理成用于训练的规格。

为什么这里会花一些时间,因为华为不让用第三方库, numpy pandas 之类的全部不让用,矩阵运算都得自己手写,花时间不说,写完了性能还特别差

写完结合队友的放置模型,第一次提交得了 53 分,根据得分调节了一下 学习速率 α ,最终拿到了 72 分,这个成绩在当时能进前 10 的样子。调参把当天的 100 次提交次数全用完了哈哈哈

和队友讨论了一下,发现官方居然给了初步的赛题思路,也是线性回归,但是输入特征维数是 7 而不是我写的 31 。官方给的放置阶段的思路是贪心,先放置规格大的虚拟机,放不下了再考虑规格小的。另外听闻官方给的思路得分好像还不错,这个时候队友也完成了放置阶段的代码,决定一起试一下官方的解题思路。

磨了一两天才开始写新的线性回归模型,但是最终的结果并不好,分数还有没之前的高,但是队友写的得分就很高,初赛快结束的时候才发现代码有 bug,当然那个时候也已经不用线性回归模型了。

LSTM

实践最能磨砺人,模型到用时方恨少。 basemodel 的效果,降噪之后分数提升也不大,商量之后我打算试一试 「LSTM」。当然,这是在没有任何第三方库辅助下做种的艰难决定,我已经做好做不出来的准备了,不过大赛时间那么长,也足够用来试很多模型了。

这里说一下自己的感受,对于那种长时间的比赛,一定中途不能放弃,很多人都是开始那几天或者一周精力满满,排名变得很快,但是过了这阵子之后很多人就放弃了这个比赛,当然也有很多人是看书补充新的相关知识去了。

LSTM 的时候当然很无聊,上知乎搜了一下,发现一个很有意思的事情。
如何评价2018年华为软件精英挑战赛赛题? - 倪可塑的回答 - 知乎

期间排行榜刷的特别疯狂,我们名次很快降到了 30+,排行榜最高分达到了 96 ,之后华为修复了评分系统的 bug ,集体降了 8 分左右。

队友也尝试了 ARIMA 模型,最终能拿到83+的分数,再往上就上不去了。

LSTM 最终还是写出来了,但是跟之前写的线性回归一样,分数依旧上不去,怀疑之前切分数据等其他部分有 bug,花时间 review 了一下代码,果然有 bug 。。。 修复好 bug 之后先本地测试,发现预测率还不错,提交之后分数却一直上不了 80。

手写 LSTM 虽然超级麻烦,分数也不高,但的确对我理解 RNN 帮助很大,比起参赛之前只会直接调用第三方库好太多。

指数平滑

调试完 LSTM 之后比赛已经到了后期,还没有一个特别好的模型,最高分数还是队友线性模型拿的 79。跟别的队交流了一下,我和队友又瞄上了指数平滑,开始疯狂的写代码。

这次用的是二次指数平滑,再加上去噪,去噪主要用的是正态分布的 μ + 3σ 法则,现将数据正态化,之后根据数据 μ + 3σ 范围进行去噪 。结果出来还不错,调一调参数最高能拿到接近 83 的分数。

当然,在指数平滑模型之外我们还有一些 trick,比如填充物理服务器以增加放置阶段的分数,还有将预测结果进行一定比例放大等等。这些都是取巧的手段,并不建议使用

初赛正式用例跑出来的分数还不错,244.6 ,感觉64强应该没什么问题,就看看能不能冲一下进个 36 强。不过正式用例提交次数一天只有 5 次,一共也就 2 天。这次运气还不错,调整了一下指数平滑里面的 α 之后分数提升了 2 分,最后进了 36 强。

初赛成绩
初赛成绩

做到这里我和队友基本已经满足,毕竟 4 强并不是我等菜鸡的目标,能拿个华为的绿卡免技术笔试和面试已经很满足了。

复赛我和队友都没怎么搞,只是简单的根据复赛赛题修改了一下输入输出还有中间的一些处理,最终有了个分数不至于难看。

参赛感受

  • 决赛是不可能的,这辈子都不可能的,只能去复赛打个酱油混个绿卡这个样子

  • 一个人走得快,两个人走得远。整个比赛得好好感谢我的队友,方向基本以他为主,我在旁边打辅助。

  • 参加竞赛做个项目果然是提升能力的好法子,之前学习的时候都是纸上谈兵,到实际用的时候就一脸懵逼了,感谢自己和队友这一个月的努力。

  • 这次赛题给的特征过于稀疏,没有什么规律性,维度也只有一个,感觉能下手的地方不多,不知道大佬们用的是什么模型,特征又是怎么提取的,等赛后可以学习一波。

  • 顺便吐槽一下西北赛区的地狱模式,西北赛区的 64 强在其他赛区基本都可以进 36 强了。

  • 还剩几个月就要找工作了,感觉时间特别紧张。每年的招聘时间越来越靠前,以前都是 9 月份开始校招,暑假会开始有内推,现在 6 月份就有一些公司开始内推,算法和数据结构这些基础内容复习的时间越挤越少,还要应付实验室的项目,只能说自己好好加油了。