MMGC(ACM Multimedia Grand Challenge)总结

MMGC(ACM Multimedia Grand Challenge)总结

前段时间参加了ACM Multimedia Grand Challenge的比赛,自己最近空闲时间也比较多,因此想写一篇博客来总结一下MMGC比赛中自己的心路历程 🙈。

2022年的MMGC是一个短视频传输中的优化比赛,比赛的介绍如下:

短视频是一种基于用户生成内容在网络社交平台上分享的新型视频形式。然而,值得注意的是,短视频公司在带宽上花了很多钱。在不降低用户体验质量(QoE)的前提下节省带宽开销已经成为一个重要的问题。在短视频应用中,用户以滑动观看的方式观看视频。为了保证用户的QoE,需要预加载当前视频和推荐队列中的视频。然而,如果用户滑动,下载但未查看的数据无助于提高用户QoE,这将导致浪费带宽。减少带宽浪费的挑战是将视频下载机制与用户观看行为和网络条件相匹配。这个问题很有挑战性,因为带宽节省与用户QoE改进相冲突。首先,某段视频的下载数据量难以确定,用户的观看行为是未知的,难以建模。此外,用户的浏览行为差异很大,受内容、浏览历史等诸多因素的影响。其次,不同视频的下载存在冲突,视频的下载顺序难以确定。最后,选择正确的比特率是非常具有挑战性的,因为网络是动态变化的,很难预测。我们将提供一个模拟器平台,一组视频轨迹,一组网络轨迹,以及一组通用的评估指标,挑战参与者可以使用这些指标来实现和评估他们的算法。我们希望该平台和数据集将成为研究人员相互基准算法的通用工具,从而为可重复性研究做出贡献。

MMGC(ACM Multimedia Grand Challenge)总结

比赛队伍需要根据时延,缓存大小,上一个下载的chunk的大小,最后一个视频是否结束,正在播放的视频,视频相关数据来写一个算法确定下一个下载的chunk是哪个,比特速率和系统睡眠时间。

看到比赛题目的时候我首先有了一些简单的初步的想法。首先是下一个下载的chunk,比较直观的理解是在当前视频还没有播放完时优先选择正在播放的这个视频的chunk,可能面临的一些问题是缓存的视频容量超出用户正在观看的视频进度过多,由于是短视频,用户可能会不看完当前视频就切换到下一个视频,造成缓存的浪费。因此用户在每一秒的留存率会较大地影响着chunk下载的选择,如果留存率较低,则可以优先下载下一个视频的chunk,减少缓存的浪费。比特速率是收到网络带宽影响的,比特速率越高,能够下载的视频就越高清,但是如果带宽不够则会造成用户需要等待视频下载,造成QoE下降。系统睡眠时间是在算法选择了不进行下载后的需要决定的,当系统超前用户观看进度缓存过多,系统可以选择睡眠避免浪费缓存。

比赛方给了high,medium,low,mixed四种网络状况的数据集,每种数据集有20个数据。数据集的量对于机器学习来说其实是较少的,我们队选择的是深度强化学习来进行优化。在这个问题中,让智能体与环境反复交互最终智能体能够有较好的策略来决定比特速率等等似乎是一个比较直接的思路。在比赛中我们使用了Tianshou这个深度强化学习框架,主要目的是为了快速的算法验证,测试不同算法在这个问题上的效果,所以我们并没有选择自己用pytorch重新写强化学习的算法。Tianshou我之前听说并且下载过,但是在之前学习的时候并没有使用过,主要原因是为了更好的学习DRL算法,而写一遍能够很好的加深理解。

一般而言,使用强化学习的框架时使用者需要将环境写成gym标准环境,Tianshou也不例外。在这之前我也写过强化学习环境,但是并没有写成标准gym环境,因此我们面临的第一个挑战就是标准的gym强化学习环境的编写,我一开始预计这一步不会化太长时间,后来改bug还改了挺久的。一个标准的gym环境必须包括step, reset, render, close, seed。一开始写环境的时候我漏掉了reset方法,导致天授一直跑不通,时间耽搁了好几天😭。在强化学习中需要定义状态空间,动作空间,奖励函数。由于主办方已经给出了最终用于计算QoE的式子,所以我们将奖励定义为放缩后的优化的目标函数。放缩的目的是避免奖励过大造成智能体学习困难。动作空间一开始定义为spaces.Discrete(4),当动作为0,1,2时,比特速率也对应的设定为0,1,2。当动作为3时智能体选择睡眠,睡眠时间定为1000ms。状态空间的定义为delay, rebuf, video_size, end_of_video, play_video_id。(状态空间和动作空间的定义后续还有改变)。

从一开始训练的结果来看,训练曲线确实是在上升的,观察曲线感觉训练的效果还不错,但是当把算法提交到主办方的测试系统里后发现取得的分数很低。通过阅读官方描述我们发现给我们的网络trace数据是由马尔科夫链生成的,但是主办方用的是真实的网络数据跑实验打分的。在比赛中我们需要面对的另一个问题是强化学习sim2real的问题。sim2real是强化学习老大难的问题了,我之前并没有太多相关的经验,这也是我们队最后得分不佳的主要原因之一。在比赛中我使用了SAC, D3QN, PPO进行试验,三种算法的效果都一般,无法很好地完成sim2real。为了解决sim2real我大概想了几种办法。一个是增加真实的数据集训练,一个是自己再生成一些符合一定统计意义的随机数据试验,一个是将给定的数据集拆分以增加trace个数(由于给定的trace时间很长远远超出实际用户完成所有视频观看的时间)。我做了第一个和第三个尝试,但发现效果都不太好。于是我又想着尝试下优化强化学习中的神经网络。在天授中默认的是MLP,我尝试了LSTM和1DCNN+MLP。在天授中本身有RNN结构的网络可以让我们使用,但是我经过尝试觉得里面有一个小bug,它的神经网络定义里面没有self.output_dim导致程序报错。天授的MLP里面有这个定义,所以没有问题。自定义神经网络的尝试最终的效果也一般,由于一天只给了3次提交机会,调试也比较困难。

时间一天天就这样过去了,在临近比赛结束前的几天我又有了一些新的思路。在程序中有一个Player类,在一开始由于这个类是一个object类,没法直接作为神经网络的输入,所以我没有把它算在状态空间里面。Player类本身有很多feature是对于算法优化很重要的,比如说用户在该视频每一秒的留存率,当前播放的chunk序号,剩余chunk数量等等。这些信息对于智能体的训练大概率是会有帮助的。于是我又将这些特征加入到了状态空间去。每一个视频的长度不一样,所以我只取了[当前时刻,当前时刻+5]这个范围的留存率,用于确保状态空间的维度固定。同时一开始我对于系统睡眠时间并没有优化,现在我将0-1000以100ms为颗粒度进行了划分。现在智能体的动作空间进一步增大,训练的难度也增加了,随之而来的优势是理论上可以有更好的表现。训练出来的效果还是一般,因此我又想着使用一些混合动作空间的算法,比如PDQN,MPDQN。混合动作空间的算法我之前没有接触过,天授里面也没有包含这类算法,比赛剩余时间只有几天了,实现起来的难度还是比较大。我在github上找到了一个实现,但是实现的代码和作者使用的强化学习环境耦合度过高,我花了较长时间进行修改,尽管已经改动了很多,但还是没能在比赛前全部改完。

整个比赛的过程大概就是这样,自己对于深度强化学习仍然掌握的不够,今后也需要多多加强,立个flag,接着要写一篇混合动作空间的博客🙌。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
青葱年少的头像青葱年少普通用户
上一篇 2022年6月1日 上午11:27
下一篇 2022年6月1日 上午11:29

相关推荐