| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 第二届无线通信AI大赛参赛总结 -> 正文阅读 |
|
[人工智能]第二届无线通信AI大赛参赛总结 |
??参加了第二届无线通信AI大赛 基于 AI 的信道状态信息反馈 题 ,最后仅得第13名,不论成绩好坏,毕竟花了几个星期时间,还是应该做个梳理总结。 一、赛题简介1.数据和任务??赛题数据是来自多小区多用户的 32T4R 的 MIMO 信道特征信息,总共有60万个样本,每个样本包含768个数据,包括12条子带,每个子带长度32,每个位置又都包含实部和虚部,也就是说768 = 12 x 32 x 2 。任务是开发编码-解码算法,编码器用于UE(手机端),把每个样本的数据分别压缩到48bits和128bits,然后发送到BS(基站)后再用解码器解码,要求解码后的数据和原数据有尽量高的相似性。评价指标是12条子带的余弦相似性的平均值。部分数据可视化后如下: 2.比赛达到的效果??比赛参赛人数378人,不算很多,但由于已经是第二届了,和第一届赛题也比较像,前排选手也都非常专业,做的应该比较充分了。下表给出了非AI方法当前最优的Type II码本方法的效果和本次比赛基于AI方法的效果的对比。
*注:Type II码本使用的是49bits 二、使用的方法1.数据处理??发现用一维(沿32长度这个维度)傅里叶变换把数据变换到频域,再进行编码-解码,解码后再傅里叶逆变换回原时域信号,用这种方法可以大大加快训练收敛速度,而且训练最终精度也好一些。 ??我分析其原因是,原时域信号存在一定的周期性,编码压缩的过程实际上就是要去掉重复冗余的信息,把主要的特征信息提取出来,进行傅里叶变换到频域实际上是做了同样的工作,自然减轻了神经网络学习处理的任务量,加快了训练收敛速度。当然,神经网络本身是一种强大的万能拟合工具,不进行数据预处理,往往神经网络也能自己学会必要的数据预处理过程,但这加大了网络学习的难度。 ??数据处理是我在本题中提分最有效的一个措施,所以说的多一些。 2.网络结构??这方面没有什么新的思路和太多可说的,就是在此领域经典网络CRNet基础上又杂糅进了多种常规模块,如SE模块等,又做了多个不同参数尺寸的网络并联,最后又加入了transformer并联,把各个子网络的结果cat起来输入一个1x1卷积层保证输出尺寸是bs x 2 x 32 x 12,然后再flatten之后接全连接层和量化层,解码的过程几乎是上述过程逆过来,只不过解码器在基站端运行有更好的硬件算力,所以使用了更大参数量的网络。 3.损失函数??我直接使用了评价指标,即各子带余弦相似性均值,做为损失函数。我还尝试了MSE和NMSE等其他损失函数,效果都没有这个直接用相似性做为损失函数效果好。实际上,MSE / NMSE是一个更强的条件,当MSE小时,相似性肯定小,但相似性小时,MSE不一定小,所以用相似性做为损失函数降低了网络收敛的难度。 4.量化层??举办方提供的baseline里给出了量化层的设计,默认是2比特量化,就是一个浮点数均匀切成四段,再量化为两个比特。我尝试了多种修改思路都没有用,只有混合比特量化有一点点用处。我在48bits任务中使用了一半1比特一半2比特量化,也就是说网络输出为32长度的浮点数据,其中一半用1比特量化为16bits,另一半用2比特量化为32bits,最后合起来总共是48bits;对于128bits任务,我把网络输出设置为72长度浮点数,其中16长度用1比特,56长度用2比特。 三、一些失败的尝试??这次比赛我总共投入了三个星期的时间,这个题目的灵活性很高,在这三个星期时间内我尝试过非常多的方案,但几乎都没有奏效,往往是每天早上一觉醒来想到一个非常激动人心的方法,努力一天实现之后失望的发现并没有什么卵用,也因此浪费了很多时间,造成最后失利。这些方案虽然无效,但毕竟花了时间去做,也记录在这里,给大家避坑。 1.聚类法预编码??压缩编码任务本质上是要把某一类相近的样本编成相同的码,这和聚类是类似的,我自然想到用聚类的思路去试一试。当然我们不可能全部用聚类,那样即使48bits任务也需要聚成2的48次方类,类别太多了,样本数也不够。但我们也许可以将其中部分比特拿出来用聚类做,比如拿出7个比特可以存储126类,8个可以存储256类,等等。在解码的时候这部分比特可以直接解算为每个类的聚类中心点。剩余的比特存储的信息可以再用深度学习的方法来学习每个样本再怎么从聚类中心去修正。我做了简单的试验,即使用Kmeans进行简单的聚类(对此任务,kmeans并不是最好的),仍可以观察到聚类所用的少数比特可以存储更多的信息,如下表:
??从这个观察出发,我认为占用少数bits存储聚类信息,可以更高效的编码。然而剩下的难题是,怎么用深度学习网络来学习使用剩余的比特存储每个样本和聚类中心之间的修正关系呢?我尝试了若干种方案都没有奏效的,后来实在没时间只好放弃。 2.多种量化层设计??如果我们去掉量化层可以观察到非常明显的效果上升,所以量化层肯定是造成了很多信息损失,如何改进量化层呢?我在这方面也花了很多时间去尝试,但基本都失败了,除了上面提到的混合比特法能比固定某个比特好一点点,其他我还尝试了以下方案,按说这些方案在上届比赛或神经网络量化方法研究中都是有效方法,但我在本比赛中试验,没有发现有效的。 ??二是尝试了把量化层前面的数据整形用的激活函数sigmoid换成DSQ(可微软量化)。由于量化的时候使用了强制截断,比如把0.59截断为0.5,这产生了信息损失,我设想如果让量化前的输出就已经向各个量化点靠拢,截断误差就会变得更小,是不是效果就更好了?因此我想到把sigmoid换成DSQ,也就是一种软化的阶梯函数,如下图。但试验下来效果也不好,我分析是:虽然DSQ的输出的数据分布是靠近量化点的,但DSQ的输入其实还是没怎么变,这样截断误差虽然小了,但这个截断误差如果还原到网络输出层其实还是没变。也就是说这个截断误差的缩小并没有发生在网络层。把这个代码记录在这里,说不定以后别的地方有用。
??三是尝试了给量化层加入可学习部分,弥补量化损失。也就是加入一个小的MLP网络,以解码器反量化层后的输出为输入,输出和编码器的量化层前的输出进行逼近,这样等于用网络学习弥补量化层的一些信息损失。这一招是从上届比赛一个开源代码中学的,但本题中我试验无效。 3.训练花样??我还尝试了多种训练花样,都没用,比如(1)先不用量化层,训练充分,再加入量化层训练;(2)先训练差不多后,固定编码器,专门再训练解码器;(3)对其中的难例进行增强训练;(4)难例和易例用分类网络分类,然后再用不同的网络训练。 四、总结与思考??本题我没有充分学习文献,就匆忙尝试了很多新奇的想法,最后所有的尝试都失败了之后,才学了一些上届比赛分享的代码拼凑了一个研究并不充分的网络,所以最后成绩也不是很好。实际上回头想想我之前参加的比赛,基本上凡是充分调研文献,在前人基础上又改进的成绩都还可以,凡是自己创新,尝试新方法的,成绩都不太好。这也充分说明了创新是很难的,我目前还不具备在短短的比赛期间内完成高价值创新的能力,创新必须是在充分学习前人已有知识的基础上再开展的,创新必须是在扎实的理论基础和强大的动手实现能力基础上完成的,这都是我目前还欠缺的,需要继续努力。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/1 12:42:36- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |