赛题
赛题背景
无线电地图的概念是无线通信系统满足智能城市、智能工厂等6G潜在场景的关键工具。无线电地图在基站选址、用户调度、传输策略优化等方面具有广阔的应用空间。然而构建准确的无线电地图往往需要处理海量的数据,因此基于AI的方法比传统非AI方法更加合适。
本赛题期望通过AI方法,利用神经网络的学习能力,挖掘用户位置和无线电信号强度之间的内在联系,完成无线电地图的构建。更进一步的,将考虑通过分布式学习架构,利用分布在不同地理位置的用户设备的数据,共同完成地图构建。此时,如何有效地协调设备间的数据、模型交互,以较低通信开销为代价,提升分布式学习系统的训练效率和模型精度,是面向6G的智能无线通信系统最重要的研究问题之一。
本赛题的设计将针对无线电地图构建问题,透过分布式学习方法,探究6G智能网络的关键技术,并引导其研究方向。
赛题任务
本赛题任务为基于分布式学习和推理的无线电地图构建。在约400米x 400米的地图中部署4个基站,大致位置如图1所示。训练数据集中每个样本的数据结构为<位置坐标,信号强度>。其中位置坐标由在该地图范围内随机均匀撒点获得;信号强度数据为对应位置坐标处的用户与4个基站之间的下行信号强度,根据用户与各基站之间的无线环境不同,用户不能保证与4个基站之间都是可达的,每个用户有至少一个可达基站,且可能有多个(至多4个)可达基站,不可达的基站对应的信号强度设置为整数0。
如图2所示,将上述地图均匀划分为25个区域。系统中有9组用户,每组用户在不同的区域内活动(即可获得该区域内的训练样本)。用户组ID和其活动区域的对应如下表。每组用户包含10个用户,每个用户组中的10个用户虽然在同样的地图区域中活动,但数据样本各不相同。地图中共有90个用户,由于活动范围差异,每个用户的数据样本数量略有不同。
各用户基于其活动区域内的数据训练本地模型。中心节点每个回合选择5个用户上传它们的本地模型,并对本地模型进行聚合并下发给所有用户,即分布式(联邦)训练。
指定分布式训练的总轮次数上限为500轮(一次本地模型上传+一次全局模型下发算作一轮),每轮训练分布式节点的本地训练回合数上限为10个回合。选手需自行设计节点选择算法、神经网络结构、模型上传下发时的稀疏化算法。训练完成后,通过测试集评估其信号强度估计误差,测试集的数据样本同样在该地图范围内随机均匀撒点获得。
数据介绍
训练集包括25个区域内的共125000条<位置, 信号强度>数据样本,并且按照上述用户与区域对应表划分给90个用户。测试集包括整个地图中约6000个随机位置点的数据。
训练集中包含90个数据文件,分别对应90个用户,每个数据文件对应该用户所能访问的数据样本,用户之间由于隐私保护需求不能共享或传递这些数据样本,每个数据样本包含<位置, 信号强度>信息,其中,位置信息指示了当前样本点的用户位置,信号强度信息指示了当前样本点的用户到4个基站的信号强度,当某个基站对于当前用户不可达时,该基站的信号强度设置为0。选手可以以任意比例从训练集中分割出校验集用于校验。
测试集只有一个文件,每个数据样本的格式同样是<位置, 信号强度>。测试集用于打分,不对选手开放。
评测标准
对方案性能(信号强度估计误差)、上行通信(本地模型上传)开销、下行通信(全局模型下发)开销分别进行评估。
其中,信号强度估计误差的得分为:,其中NMSE为真实信号强度和算法估计信号强度的归一化均方误差,NMSE大于1时记为1。信号强度估计误差越低者排名越高。赛事网站将实时发布方案性能(信号强度估计得分)排行榜,供选手参考。
本赛题还需综合考虑上/下行通信开销。上/下行通信开销的定义为:上行通信开销为所有轮次的上行通信开销之和。每轮的上行通信开销为所有本轮训练被调度的用户上行发送的神经网络参数(或梯度)的数量之和。下行通信开销为所有轮次的下行通信开销之和。每轮的下行通信开销为基站发送给所有本轮被调度的用户的神经网络参数(或梯度)的数量之和。鼓励各队选手在方案上传后,在微信交流群中公开各自统计的上/下行通信开销作为参照。
本赛题的最终排名由主办方依据选手最终上传的方案代码,分别统计方案性能、上/下行通信开销排名,并将三项排名的名次进行加权平均值作为最终排名,三项排名的权重为4:4:2。加权平均值相同的,按照信号强度估计得分、上行通信开销、下行通信开销的顺序参考子项排名,确定最终名次。
1、四个基站的预测网络分开
class DoraNet(nn.Module):
def __init__(self,test=False):
super(DoraNet, self).__init__()
self.test=test
self.mlp = nn.Sequential(
nn.Linear(2+2,256),
nn.ReLU(),
nn.Linear(256,1024),
nn.ReLU(),
nn.Linear(1024,256),
nn.ReLU(),
nn.Linear(256, 1)
)
def distance(self, x, y, center):
d = torch.sqrt((x-center[0])**2 + (y-center[1])**2).reshape((-1,1))
return d
def tanh(self, x, y, center):
t = torch.div(x-center[0], y-center[1]).reshape((-1,1))
return t
def elu(self, x, y):
d = torch.sqrt(x**2 + y**2).reshape((-1,1))
return d
def forward(self, pos):
center1 = (80, 80)
center2 = (80, 280)
center3 = (280, 80)
center4 = (280, 280)
if len(tuple(pos.shape)) == 1:
pos = pos.reshape((1,-1))
d1, d2, d3, d4 = self.distance(pos[:,0],pos[:,1],center1), self.distance(pos[:,0],pos[:,1],center2), self.distance(pos[:,0],pos[:,1],center3), self.distance(pos[:,0],pos[:,1],center4)
t1, t2, t3, t4 = self.tanh(pos[:,0],pos[:,1],center1),self.tanh(pos[:,0],pos[:,1],center2),self.tanh(pos[:,0],pos[:,1],center3),self.tanh(pos[:,0],pos[:,1],center4)
pos1 = torch.cat([pos, d1, t1], -1)
pos2 = torch.cat([pos, d2, t2], -1)
pos3 = torch.cat([pos, d3, t3], -1)
pos4 = torch.cat([pos, d4, t4], -1)
pathloss1 = self.mlp(pos1)
pathloss2 = self.mlp(pos2)
pathloss3 = self.mlp(pos3)
pathloss4 = self.mlp(pos4)
pathloss = torch.cat([pathloss1, pathloss2, pathloss3, pathloss4], -1)
return pathloss
收敛效果:
2、去除数据量小的客户端
1到90个客户端分为9个组,从左下方到右上方,每个组10个客户端,一个组中的客户端的(y1,y2,y3,y4)的分布是相似的,如下:
去除 [21,..,30], [51,..,60], [81,..,90] 的客户端,训练1000个round:
数据类型没有要求;中心节点可以获知ue的活动区域(即所属用户组)、ue数据的统计信息(样本数量或数据分布),不能获知任何形式的用户数据