当前位置: 首页 > news >正文

基于神经网络的短码长ISAC双功能信号联合优化设计

1. 项目概述:当信道编码遇见序列设计

在无线通信领域,我们有两个看似独立但都至关重要的“老朋友”:信道编码和序列设计。前者,比如我们熟知的Polar码、LDPC码,是通信工程师的“纠错利器”,通过在数据中加入精心设计的冗余,让信号在充满噪声和干扰的无线信道中“百折不挠”,确保信息能准确送达。后者,比如Zadoff-Chu序列、Golay互补序列,则是雷达和感知工程师的“测距法宝”,其核心在于信号本身具有近乎完美的自相关特性——简单说,就是信号和自己错开一定时间后,相关性几乎为零。这种特性让接收端能像用一把极其精确的尺子,通过计算回波信号的延迟,来测量目标的距离和速度。

然而,当通信和感知这两个功能被要求集成到同一个系统(ISAC)中,甚至共享同一段频谱、同一个硬件平台时,矛盾就出现了。我们不禁要问:能否设计一种信号,它既是一个优秀的“信使”(承载信息),又是一把精准的“尺子”(用于测距)?传统思路是“二选一”:要么用通信码字去做感知,结果发现短码长下自相关旁瓣太高,“尺子”刻度模糊不清;要么用完美的感知序列去承载信息,却发现这类序列数量太少,根本支撑不起高码率的通信需求,好比想用只有16个单词的字典写一篇长篇小说。

这正是我最近深入研究的一个前沿交叉点:利用机器学习,特别是神经网络,来设计一种面向ISAC的短码长双功能信号。我们的目标很明确:在有限的信号长度(例如32个符号)内,生成一个庞大的码本(例如对应16或32比特信息),其中的每一个码字,既要像传统信道编码一样能有效抵抗信道错误,又要像精心设计的雷达序列一样,拥有极低的自相关旁瓣。这不仅仅是简单的折中,而是试图让“鱼与熊掌”兼得。实验表明,在码率1/2、码长32的设定下,即使使用相对简单的全连接神经网络,学出的码字在误码率性能上能与同参数的Polar码媲美,而其自相关旁瓣却能降低惊人的24dB以上。这篇文章,我就来拆解一下这个项目背后的设计思路、实现细节以及我踩过的一些坑,希望能给同样对ISAC或AI赋能的通信设计感兴趣的朋友一些参考。

2. 核心挑战与设计思路拆解

2.1 传统方法的“两难困境”

在深入机器学习方案之前,我们必须先理解为什么传统方法在ISAC短码长场景下会“失灵”。这有助于我们明确机器学习需要攻克的具体目标。

2.1.1 路径一:用感知序列当通信码字这是最直观的想法。既然Zadoff-Chu (ZC)序列的自相关函数是理想的(旁瓣为零),那直接用它来映射信息比特不就行了?但问题在于“稀缺性”。对于一个给定长度N的序列,所有可能的序列组合是天文数字(对于复信号,是连续无穷的),但具有理想自相关特性的序列家族,其成员数量往往非常有限。以长度N=32的ZC序列为例,其数量只有16个。这意味着,如果我们用这16个序列来直接表示信息,最多只能传输log₂(16) = 4比特的信息。对应的码率仅为4/32 = 1/8。这对于现代通信系统来说太低了。高码率(如1/2)要求码本大小达到2^(rN) = 2^16 = 65536,这与16个序列的规模相差了三个数量级。因此,这条路走不通,它无法在保证理想感知性能的同时,满足通信的频谱效率需求。

2.1.2 路径二:用通信码字当感知序列另一个思路是,直接使用现有的高性能信道编码(如Polar码、LDPC码)产生的码字作为感知信号。理论上,如果码字足够长,并且码字符号是独立同分布的高斯随机变量,根据大数定律,其自相关函数会渐进趋于理想。但现实是骨感的。首先,实际通信系统使用的码字符号并非高斯随机变量,而是经过调制(如BPSK, QPSK, QAM)后的离散星座点,并且码字内部的符号由于编码结构而存在相关性。更重要的是,在短码长(例如N=32)场景下,大数定律尚未生效,这些结构化码字的自相关旁瓣仍然很高。我们的实验也证实了这一点:在相同码长码率下,Polar码+BPSK调制的码字,其自相关旁瓣中值在-15dB左右,而理想的感知需求往往要求旁瓣低于-30dB甚至更低。过高的旁瓣会在雷达处理中产生“鬼影”(虚假目标),严重影响感知精度。

注意:这里的关键是“短码长”。在长码长下,通信码字的随机性会自然带来较好的自相关特性,ISAC的设计挑战会小很多。但许多实际ISAC场景(如车联网V2X的周期性广播信号、物联网的短包通信)恰恰受限于短码长,因此本文聚焦于此,这也是问题最具挑战性的地方。

2.2 机器学习的设计哲学与损失函数构建

既然两条传统路径都遇到了根本性障碍,机器学习提供了一种“第三条道路”:端到端地联合优化通信与感知两个目标。我们不再分别设计编码器和序列,而是训练一个神经网络,让它直接学习从信息比特到复值码字的映射(编码器),以及从含噪接收信号回信息比特的映射(解码器)。整个系统被建模成一个“通信感知自编码器”。

整个设计的核心灵魂,在于损失函数(Loss Function)。它必须同时体现“通信要好”和“感知要好”这两个有时相互竞争的目标。我们采用的损失函数L是二者的加权和:

L = λ * L_sensing + (1 - λ) * L_comm

其中:

  • L_sensing(感知损失):定义为码字c所有非零滞后自相关值平方的平均值。公式为(1/(N-1)) * Σ_{l=1}^{N-1} |χ(l; c)|²。χ(l; c)是码字c在滞后l处的周期自相关函数(归一化后的内积)。这个值越小,说明码字的自相关旁瓣越低,感知性能越好。理想情况下,我们希望它为零。
  • L_comm(通信损失):采用标准的交叉熵损失函数,衡量解码器输出的比特概率分布与真实信息比特之间的差异。这个值越小,说明解码越准确,通信性能越好。
  • λ(权衡参数):一个在0到1之间的超参数。λ越大,表示在训练中越强调降低自相关旁瓣(优先感知);λ越小,则越强调降低误码率(优先通信)。λ=0.5表示两者权重相等。

通过调整λ,理论上我们可以在通信性能和感知性能之间进行权衡。但有趣的是,在我们的实验中(后文会详述),由于神经网络编码器可以输出任意复数值(而不局限于有限的调制星座点),它拥有极大的设计自由度。因此,我们发现在相当宽的λ范围内(例如λ=0.9),学出的码字在感知性能(低旁瓣)大幅提升的同时,通信性能(误码率)并没有出现明显损失。这暗示着,在短码长、复值码字的设定下,通信与感知的权衡可能并非一个“零和游戏”,神经网络找到了一个能同时优化两个目标的“帕累托前沿”区域。

2.3 网络结构选择:为何是简单全连接网络?

在众多复杂的神经网络架构(如CNN、RNN、Transformer)中,我们在这个初步探索性工作中,选择了最基础的多层感知机(MLP),即全连接网络。这主要基于以下几点考量:

  1. 证明概念的有效性:我们的首要目标是验证“用机器学习联合优化通信与感知”这一核心思想的可行性。一个相对简单的模型如果能够取得显著效果,那么该思路的潜力就得到了基本验证,后续可以再引入更复杂的结构进行提升。事实证明,简单的MLP已经能带来24dB的旁瓣降低,这足以说明方法的有效性。
  2. 避免过拟合与可解释性:短码长场景下,数据量(可能的码字数量)相对有限。过于复杂的模型容易过拟合到训练集上,导致在未见过的信息比特上泛化能力差。MLP结构简单,参数相对较少,有助于缓解这一问题。同时,简单的结构也便于我们分析和理解模型的行为。
  3. 聚焦核心矛盾:本研究的核心矛盾是通信指标(误码率)与感知指标(自相关旁瓣)的联合优化,而非探索最先进的神经网络编码架构。使用MLP可以将大家的注意力集中在损失函数设计、训练策略和性能评估上,而不是纠结于网络结构本身的“黑魔法”。

我们使用的编码器genc和解码器gdec结构对称,均为包含若干线性层、Tanh激活函数和批归一化层的堆叠。具体来说,对于K=16的信息比特,编码器将其映射为32维的复值码字(码率1/2)。网络中间层的维度适当扩大(例如2N=64),以增加模型的表达能力。

3. 实操要点:从模型训练到性能评估

3.1 训练策略与泛化难题

训练一个能生成“双功能”码字的神经网络,绝非简单地将数据丢进去跑几个epoch就行。其中最大的挑战来自于泛化(Generalization)

对于通信任务,我们希望训练好的编码器-解码器对,能够对所有可能的2^K条信息都进行正确编解码。然而,即使对于K=16这样较小的消息长度,所有可能的消息也有65536条。在训练时,我们通常只能使用其中一小部分(例如几千条)作为训练集。神经网络很容易“记住”这些训练消息对应的码字,但对未在训练中出现的“陌生”消息,其生成的码字可能具有糟糕的纠错或自相关特性。

为了解决这个“泛化鸿沟”,我们采用了两种关键策略:

3.1.1 课程学习与动态SNR在训练的不同阶段,我们使用不同的信道信噪比(SNR)。具体策略如下表所示:

消息长度K训练阶段信道SNR目的
16第1-200轮3 dB强制码字分离:在较低SNR下,噪声影响大,网络为了成功解码,必须让不同信息对应的码字在信号空间中彼此远离,这有助于形成良好的决策边界,提升泛化能力。
16第201-400轮6 dB优化高SNR性能:在码字已初步分离的基础上,提高SNR进行微调,旨在优化在高信噪比环境下的误码率性能。
32全部400轮3 dB专注码字分离:对于更长的消息,泛化问题更严峻。我们全程使用较低SNR,以最大化不同码字间的距离,为获得“块长度增益”创造可能。

3.1.2 串联码初始化对于K=32的情况,我们采用了一种巧妙的权重初始化方法,称为“串联码初始化”。其思想是:将一个K=32的消息m分成前后两半m0m1,各16比特。然后,用我们已经训练好的K=16的编码器,分别对m0m1进行编码,得到两个16维的码字c0c1,最后将它们拼接成一个32维的码字c = [c0, c1]

这个串联码的性能下限是明确的:它的误码率性能将与K=16的码持平。在神经网络实现上,这可以通过巧妙地设置K=32网络层的权重矩阵来实现(具体是将K=16网络的权重矩阵放在新权重矩阵的左上和右下分块,偏置向量重复拼接)。这样初始化后,K=32的网络从一开始就具备了一个“还不错”的通信性能起点,我们期望通过后续训练,能在这个起点上同时提升通信性能(获得块长度增益)和感知性能(降低旁瓣)。

3.2 评估指标与对比基线

训练完成后,我们需要一套严谨的指标来评估所学码字的性能,并与传统方法进行对比。

3.2.1 通信性能指标:误码率在独立的测试集(包含大量未见过的消息)上,模拟信号经过不同SNR的加性高斯白噪声(AWGN)信道,然后通过训练好的神经网络解码器进行解码,统计比特错误率(BER)。我们将结果与相同码长、码率的Polar码(采用比特交织编码调制BICM)进行对比。Polar码是当前5G标准中使用的先进信道编码,是通信性能的一个强力基线。

3.2.2 感知性能指标:自相关旁瓣水平对于学得的每一个码字,我们计算其周期自相关函数在所有非零滞后上的值,并求其平方的平均值(即损失函数中的L_sensing项),通常转换为分贝(dB)值进行展示。我们会统计整个码本(或大规模采样)的ACSL中值、分布等。对比基线有两个:

  1. Polar码+BPSK:代表传统通信码字的感知性能。
  2. Zadoff-Chu序列:代表理想感知序列的性能(旁瓣理论上为负无穷dB,数值计算中表现为极低的值)。

3.2.3 关键超参数一览以下是训练中使用的主要超参数,这些设置是经过多次实验调整后的结果,对复现实验至关重要:

超参数取值说明
优化器Adam自适应矩估计,深度学习中的默认选择,能有效处理稀疏梯度。
批量大小1000每次迭代用于计算梯度的样本数。较大的批量有助于稳定训练。
总训练轮数400对于本问题规模,400轮通常足以收敛。
编码器/解码器更新迭代数 (N_enc, N_dec)(10, 50)每轮训练中,先对编码器进行10次梯度更新,再对解码器进行50次更新。这种非对称更新有助于平衡两者学习速度。
学习率初始10⁻⁴,衰减因子0.9采用学习率衰减策略,如果损失函数在连续10轮内没有显著下降,则将学习率乘以0.9,最低不低于10⁻⁶。

3.3 实验结果深度分析

根据上述评估方法,我们得到了几个核心发现,这些发现揭示了机器学习方法在ISAC设计中的独特优势和现存挑战。

3.3.1 感知性能的巨大提升对于K=16(码本大小65536)的情况,我们评估了每一个码字的ACSL。结果显示,当权衡参数λ=0.9(即更侧重感知)时,机器学习所生成码字的ACSL中值达到了-40.08 dB。相比之下,采用BPSK调制的Polar码,其ACSL中值仅为-15.49 dB。这意味着,在保持码本大小(即通信码率)不变的前提下,机器学习将码字的自相关旁瓣降低了超过24 dB。这是一个质的飞跃,使得通信码字的感知可用性大大增强。当然,与理想ZC序列(ACSL接近-∞ dB)相比仍有差距,但ZC序列只有16个,而我们的码本有65536个,用可控的性能损失换来了4个数量级的码本规模提升,这对于支持实际通信速率是决定性的。

3.3.2 通信性能的无损保持一个令人惊喜的发现是,在λ=0.9的强感知约束下,学得码字的误码率性能与λ=0(只优化通信)时几乎完全一致,并且在低信噪比区域甚至优于Polar码,在高信噪比区域与Polar码性能匹配。这打破了我们对于通信-感知必然存在严格权衡的固有认知。其根本原因在于,神经编码器输出的码字符号可以是整个复平面上的任意点,而不局限于有限的调制星座(如BPSK的{+1, -1})。这种极大的自由度使得网络能够找到同时满足“码字间距离大”(利于通信)和“码字内自相关旁瓣小”(利于感知)的解决方案。如果限制码字为BPSK符号,这种“无损失”的联合优化很可能无法实现。

3.3.3 块长度增益的缺失与泛化挑战对于K=32,我们期望看到“块长度增益”,即由于码长增加带来的编码增益,表现为误码率曲线随SNR增加而下降的速度更快,或曲线整体左移。Polar码清晰地展示了这一特性:K=32的Polar码性能明显优于K=16。然而,我们训练的神经网络编码器(即使从串联码初始化开始)却未能展现出明显的块长度增益。其K=32的性能曲线与K=16的曲线几乎重合。

这揭示了当前基于神经网络的信道编码设计中的一个普遍性难题:在极高信噪比下对未见消息的泛化能力不足。即使消息长度仅为32比特,所有可能的消息也有约43亿条,训练集只能覆盖其中极小一部分。网络倾向于学习一种“平滑”的映射,但对于那些在训练中未出现过的、特定的消息组合,其生成的码字可能并未达到理论上的最优距离特性。串联码初始化提供了一个良好的起点,但似乎也陷入了一个局部最优,网络难以跳出这个“舒适区”去探索能带来块长度增益的、更具结构性的编码方案。图5中的训练损失曲线显示,在λ=0.9时,为了降低ACSL,通信损失在训练初期甚至有所上升,最终虽回落但并未显著低于起点,这印证了逃离局部最优的困难。

实操心得:这个现象告诉我们,在利用机器学习设计通信系统时,不能只关注最终的性能数字,更要关注其“可扩展性”。一个在短码长小规模下表现优异的神经网络,其结构或训练方法可能无法自然延伸到更长码长。未来的工作可能需要借鉴更多传统编码理论的结构性先验(如Turbo码的迭代结构、Polar码的极化思想),将其融入网络设计,或者采用更先进的课程学习、元学习策略来提升泛化能力。

4. 实现细节与代码核心解析

虽然完整的代码实现涉及大量细节,但理解几个核心模块的设计思路对于复现或改进这项工作至关重要。以下我将以伪代码结合关键说明的形式,解析最重要的部分。

4.1 神经网络编码器-解码器结构

我们使用PyTorch框架构建模型。编码器和解码器都是简单的多层感知机。

import torch import torch.nn as nn import torch.nn.functional as F class NeuralEncoder(nn.Module): def __init__(self, message_len=16, block_len=32, hidden_dim=64): super(NeuralEncoder, self).__init__() self.message_len = message_len self.block_len = block_len # 输入:message_len (比特), 输出:2*block_len (实部+虚部) self.fc1 = nn.Linear(message_len, hidden_dim) self.fc2 = nn.Linear(hidden_dim, hidden_dim) self.fc3 = nn.Linear(hidden_dim, hidden_dim) self.bn1 = nn.BatchNorm1d(hidden_dim) self.bn2 = nn.BatchNorm1d(hidden_dim) self.fc_out = nn.Linear(hidden_dim, 2 * block_len) # 输出实部和虚部 def forward(self, m): # m: [batch_size, message_len], 取值为0/1 x = m.float() x = F.tanh(self.fc1(x)) x = self.bn1(x) x = F.tanh(self.fc2(x)) x = self.bn2(x) x = F.tanh(self.fc3(x)) x = self.fc_out(x) # 将输出拆分为实部和虚部,并归一化功率 real_part, imag_part = x.chunk(2, dim=-1) c_complex = torch.complex(real_part, imag_part) # 功率归一化:确保每个码字的平均功率为1 power = torch.mean(torch.abs(c_complex)**2, dim=-1, keepdim=True) c_complex = c_complex / torch.sqrt(power) return c_complex class NeuralDecoder(nn.Module): def __init__(self, message_len=16, block_len=32, hidden_dim=64): super(NeuralDecoder, self).__init__() self.message_len = message_len # 输入:2*block_len (实部+虚部), 输出:message_len个比特的概率 self.fc1 = nn.Linear(2 * block_len, hidden_dim) self.fc2 = nn.Linear(hidden_dim, hidden_dim) self.fc3 = nn.Linear(hidden_dim, hidden_dim) self.fc_out = nn.Linear(hidden_dim, message_len) def forward(self, y): # y: [batch_size, block_len] 复数,拼接为实部+虚部 y_flat = torch.cat([y.real, y.imag], dim=-1) x = F.tanh(self.fc1(y_flat)) x = F.tanh(self.fc2(x)) x = F.tanh(self.fc3(x)) logits = self.fc_out(x) # 输出每个比特的logits return logits # 用于计算交叉熵损失

关键点解析

  1. 复数处理:PyTorch原生支持复数张量。编码器输出两倍于块长度的值,分别作为实部和虚部,然后组合成复数码字。解码器输入复数接收信号,我们将其拆分为实部和虚部并拼接,作为全连接网络的输入。
  2. 功率归一化:在编码器最后,我们对生成的复数码字进行功率归一化,确保每个码字的平均功率为1。这是为了满足通信系统中的功率约束,使得不同SNR下的性能比较具有意义。
  3. 激活函数:使用Tanh作为激活函数,其输出范围在(-1,1),有助于稳定训练,并自然地让码字符号集中在零附近,这在一定程度上有利于形成低自相关的特性。

4.2 自定义损失函数的实现

损失函数是联合优化的核心,需要同时计算感知损失和通信损失。

def autocorrelation_loss(codewords): """ 计算一个批次码字的自相关损失 (L_sensing)。 codewords: [batch_size, block_len] 复数张量 """ batch_size, N = codewords.shape # 计算每个码字的能量 energy = torch.sum(torch.abs(codewords)**2, dim=-1, keepdim=True) # [batch_size, 1] # 初始化总相关值 total_corr = torch.tensor(0.0, device=codewords.device) # 计算所有非零滞后l的自相关值 for l in range(1, N): # 循环右移l位 shifted = torch.roll(codewords, shifts=l, dims=-1) # 计算内积 corr = torch.sum(codewords * shifted.conj(), dim=-1) # [batch_size] # 归一化并累加平方幅度 normalized_corr = corr / energy.squeeze() total_corr += torch.sum(torch.abs(normalized_corr)**2) # 计算平均损失 loss = total_corr / (batch_size * (N - 1)) return loss def combined_loss(encoder, decoder, messages, snr_db, lambda_param=0.5): """ 组合损失函数。 messages: [batch_size, message_len] 0/1比特 snr_db: 当前训练信噪比 (dB) lambda_param: 权衡参数 λ """ # 1. 编码 codewords = encoder(messages) # [batch_size, block_len] # 2. 过信道 (AWGN) snr_linear = 10 ** (snr_db / 10.0) noise_power = 1.0 / snr_linear # 码字功率已归一化为1 noise_std = torch.sqrt(noise_power / 2) # 复噪声,实部虚部独立 noise_real = torch.randn_like(codewords.real) * noise_std noise_imag = torch.randn_like(codewords.imag) * noise_std received = codewords + torch.complex(noise_real, noise_imag) # 3. 解码 logits = decoder(received) # [batch_size, message_len] # 4. 计算通信损失 (二元交叉熵) comm_loss = F.binary_cross_entropy_with_logits(logits, messages.float()) # 5. 计算感知损失 sensing_loss = autocorrelation_loss(codewords) # 6. 组合损失 total_loss = lambda_param * sensing_loss + (1 - lambda_param) * comm_loss return total_loss, comm_loss, sensing_loss

关键点解析

  1. 自相关损失计算:这里计算的是周期自相关。我们使用torch.roll函数实现循环移位。对于每个滞后l,计算原始码字与移位后码字的内积,并除以码字能量进行归一化。最后对所有非零滞后的归一化相关值平方求平均。这个计算是批处理的,效率较高。
  2. 信道模拟:我们模拟了复加性高斯白噪声(AWGN)信道。噪声的实部和虚部是独立的零均值高斯随机变量,方差由设定的SNR(dB)转换得到。注意因为码字功率归一化为1,所以噪声功率就是1/SNR_linear。
  3. 损失组合:最终损失是感知损失和通信损失的加权和。通过调整lambda_param,可以控制优化的侧重点。

4.3 串联码初始化的实现

对于K=32的网络,我们利用训练好的K=16网络参数进行初始化。

def initialize_concatenated_code(encoder_32, decoder_32, encoder_16, decoder_16): """ 用K=16网络的参数,初始化K=32网络的参数,实现串联码。 假设网络结构是对称扩展的(即32网络的层维度是16网络的两倍)。 """ with torch.no_grad(): # 初始化编码器 # 假设第一层: fc1_16: Linear(16, hidden), fc1_32: Linear(32, 2*hidden) # 我们希望 fc1_32.weight = block_diag(fc1_16.weight, fc1_16.weight) # fc1_32.bias = concat(fc1_16.bias, fc1_16.bias) fc1_16_weight = encoder_16.fc1.weight.data # [hidden_16, 16] fc1_16_bias = encoder_16.fc1.bias.data # [hidden_16] hidden_16 = fc1_16_weight.size(0) encoder_32.fc1.weight.data[:hidden_16, :16] = fc1_16_weight encoder_32.fc1.weight.data[hidden_16:, 16:] = fc1_16_weight encoder_32.fc1.bias.data[:hidden_16] = fc1_16_bias encoder_32.fc1.bias.data[hidden_16:] = fc1_16_bias # 类似地初始化其他层... (fc2, fc3, fc_out) # 对于中间层,例如fc2_16: Linear(hidden, hidden), fc2_32: Linear(2*hidden, 2*hidden) # 需要构建一个块对角矩阵 fc2_16_weight = encoder_16.fc2.weight.data # [hidden_16, hidden_16] encoder_32.fc2.weight.data[:hidden_16, :hidden_16] = fc2_16_weight encoder_32.fc2.weight.data[hidden_16:, hidden_16:] = fc2_16_weight fc2_16_bias = encoder_16.fc2.bias.data encoder_32.fc2.bias.data[:hidden_16] = fc2_16_bias encoder_32.fc2.bias.data[hidden_16:] = fc2_16_bias # 输出层:fc_out_16: Linear(hidden, 32), fc_out_32: Linear(2*hidden, 64) # 注意输出是实部虚部拼接,所以维度是2*block_len fc_out_16_weight = encoder_16.fc_out.weight.data # [32, hidden_16] encoder_32.fc_out.weight.data[:32, :hidden_16] = fc_out_16_weight encoder_32.fc_out.weight.data[32:, hidden_16:] = fc_out_16_weight fc_out_16_bias = encoder_16.fc_out.bias.data # [32] encoder_32.fc_out.bias.data[:32] = fc_out_16_bias encoder_32.fc_out.bias.data[32:] = fc_out_16_bias # 解码器初始化逻辑类似,方向相反... # ... print("Concatenated code initialization for K=32 complete.")

关键点解析: 这种初始化方式确保了:当输入一个32比特的消息[m0, m1]时,编码器前16个输出是m0经过K=16编码器的结果,后16个输出是m1经过K=16编码器的结果。这严格实现了串联码的定义,为K=32网络的训练提供了一个强力的、性能有保障的起点。

5. 常见问题、挑战与未来方向

在实际复现和研究过程中,我遇到了不少典型问题,也看到了这个方向未来发展的诸多可能。

5.1 训练不稳定与超参数敏感

问题描述:在早期实验中,经常遇到训练损失剧烈震荡、不收敛,或者优化过程陷入糟糕的局部最优(例如,所有码字都收敛到同一个点,自相关损失很低但通信损失极高)。

排查与解决

  1. 损失权重λ的选择:λ是平衡感知与通信的关键。如果λ过大(如>0.99),网络会过度优化自相关,导致码字失去多样性,通信性能崩溃。如果λ过小(如<0.1),则感知性能提升有限。需要通过网格搜索,找到在目标码长和码率下性能均衡的点。在我们的设定中,λ=0.5到0.9是一个比较稳健的范围。
  2. 学习率与优化器:Adam优化器相对稳健,但初始学习率至关重要。10⁻⁴是一个不错的起点。我们采用了学习率衰减策略,当验证损失平台期时自动降低学习率,这对后期微调很有帮助。
  3. 批归一化(BatchNorm)的使用:在编码器中加入批归一化层,可以显著稳定训练过程,缓解内部协变量偏移。但要注意,在测试/推理时,要使用训练阶段统计的滑动平均均值和方差。
  4. 梯度裁剪:在训练初期,由于损失函数包含自相关项(其梯度可能很大),偶尔会出现梯度爆炸。对梯度范数进行裁剪(如设置max_norm=1.0)可以避免训练崩溃。

5.2 泛化能力不足与过拟合

问题描述:这是神经网络用于信道编码的“阿喀琉斯之踵”。模型在训练集上表现完美,但在测试集(尤其是高SNR下)的误码率远高于传统编码,或者学到的码本只对训练集中出现的消息模式有效。

应对策略

  1. 数据增强与噪声注入:在训练时,不仅要在固定的SNR下添加噪声,还可以在一个SNR范围内随机采样噪声功率。这相当于对模型进行了“噪声增强”,迫使它学习更鲁棒的特征。我们采用的动态SNR策略(先低后高)也是一种课程学习式的数据增强。
  2. 模型正则化:除了权重衰减(L2正则化),还可以在损失函数中加入对码字本身的约束,例如鼓励码字符号的峰均比(PAPR)不要过高,这既符合实际发射机的要求,也可能作为一种正则项提升泛化。
  3. 利用编码结构先验:这是最有潜力的方向。未来的网络设计不应是“白板一块”,而应融入传统编码的智慧。例如,可以设计神经网络来学习“Turbo码”中的交织器、或“Polar码”中的信道极化变换,将可解释的结构与神经网络的非线性拟合能力结合。我们采用的“串联码初始化”就是引入结构先验的一种简单尝试。
  4. 更先进的训练范式:元学习(Meta-Learning)或课程学习(Curriculum Learning)可以用于设计更智能的训练流程。例如,先让网络学习简单的任务(如K=8),然后逐步增加消息长度K和SNR的难度,引导网络学习可扩展的编码规则。

5.3 计算复杂性与实时性考量

问题描述:神经网络编码器-解码器在训练和推理时的计算量远大于传统的代数编码(如Polar码编码)和经典解码算法(如置信传播BP)。这对于资源受限的终端或对时延极其敏感的场景是一个挑战。

优化思路

  1. 网络轻量化:探索更高效的网络架构,如深度可分离卷积、注意力机制的简化版本,在保持性能的同时大幅减少参数量和计算量。
  2. 知识蒸馏:训练一个大型、高性能的“教师网络”,然后用它来指导训练一个小型、高效的“学生网络”。学生网络可以学习模仿教师网络的输入-输出映射,从而在损失少量性能的情况下获得速度提升。
  3. 硬件专用加速:利用神经网络推理专用硬件(如NPU、TPU)或FPGA进行加速。神经网络的并行计算特性非常适合在这些硬件上高效实现。
  4. 离线学习,在线查表:对于短码长、固定码率的场景,一个可行的方案是:在云端或设计阶段,用神经网络生成整个码本(即所有2^K个消息对应的码字),并将其存储为一张巨大的查找表。在实际设备中,编码过程简化为根据输入消息索引查找表,这虽然增加了存储开销,但编码速度极快。解码器可能仍需保留神经网络,或同样用查找表+最近邻搜索的方式实现。

5.4 未来研究方向展望

基于当前工作的局限性和挑战,我认为以下几个方向值得深入探索:

  1. 面向更复杂信道与场景:当前工作基于简单的AWGN信道。未来的研究需要将模型扩展到更真实的信道模型,如多径衰落信道、相位噪声信道等。损失函数中也需要纳入更多感知指标,如多普勒容限、模糊函数特性等。
  2. 联合波形与调制设计:本文的码字是“基带”的复值序列。在实际系统中,还需要进行脉��成形、上变频等操作。可以探索端到端的神经网络,直接优化射频波形,同时考虑功率放大器非线性、带外辐射等硬件损伤。
  3. 与MIMO和波束赋形结合:在MIMO-ISAC系统中,需要设计空-时-频多维信号。神经网络可以用于联合优化发射波束赋形权重和每个流上的编码序列,以实现通信速率和感知波束图性能的全局最优。
  4. 可解释性与理论分析:当前神经网络编码器仍是一个黑盒。我们需要发展新的理论工具来分析学得码字的数学特性(如最小距离分布、自相关函数分布),建立其性能的理论边界,从而增加工程应用的信心。
  5. 标准化与生态构建:虽然处于早期,但学术界和工业界可以开始探讨基于机器学习的ISAC波形设计的潜在标准。开源高质量的代码库和基准数据集,将极大地推动该领域的发展。

这项工作只是一个起点,它打开了利用数据驱动方法统一通信与感知设计的大门。尽管面临泛化、复杂度等挑战,但其展现出的性能潜力,特别是在打破传统权衡方面的能力,令人鼓舞。随着算法、硬件和理论的共同进步,神经网络的“学习”能力有望为我们设计下一代智能无线系统提供前所未有的灵活性和性能上限。

http://www.jsqmd.com/news/881284/

相关文章:

  • 华硕天选一代无线网卡断网
  • Windows Server 2019真实渗透实战:从WebShell到域控的完整红队链路
  • 机器学习预测暗物质晕形成时间:随机森林与CNN在天体物理中的应用
  • Go-File安全加固手册:防止未授权访问的8个关键配置
  • UE5 GAS实战:用一张曲线表格(Curve Table)搞定RPG游戏中的等级成长与回复效果
  • 小型本地LLM框架在教育领域的应用与实现
  • Java NIO 1.0 架构基石:SelectorProvider 源码深度剖析与 SPI 工厂模式
  • 开源社区贡献者画像分析:核心与外围贡献者的行为差异与影响
  • Elastic stack 技术栈学习(七)—— kibana中索引的基本操作(创建、删除、更新、查看)以及文档的基本操作
  • vue-axios-github实战:从零开始掌握前端登录拦截与路由守卫核心技术
  • 2024火狐Burp证书配置失效原因与NSS信任链修复指南
  • 【表达式】JAVA解析数学表达式 parsii 计算数学公式 表达式规则引擎 动态脚本语言
  • 鬼泣5附历代合集(内附绅士mod)2026最新官方正版免费下载 一键转存 永久更新 (看到速转存 资源随时走丢)
  • FCEUX终极指南:如何用NES模拟器重温经典并深入调试
  • ARM SME架构下BFloat16矩阵运算优化实践
  • Unity 2022+ 接入Tap广告联盟SDK避坑指南:从Gradle配置到实机测试全流程
  • 电子信息工程专业打工人的蓝桥杯嵌入式竞赛时记
  • 从安装到精通:BetterTweetDeck完整使用手册(2023最新版)
  • 网盘下载加速神器LinkSwift:告别龟速下载的5分钟完整指南
  • vczh_toys Linq库进阶:复杂数据处理的8个实用案例指南
  • 别再等电池报废!用Python+Sklearn,仅需100次循环数据就能预测电池寿命(附完整代码)
  • ComfyUI终极UI增强指南:7个免费工具让你的AI绘画效率翻倍
  • 可视化数据集构建指南:从概念到实践,驱动图表智能生成与理解
  • gcvis高级功能:自定义图表、数据导出与API集成终极指南
  • wolkenkit数据存储配置:PostgreSQL、MySQL、MongoDB实战指南
  • Unity 2022 LTS + Photon Fusion 2:手把手教你搭建第一个多人联机Demo(含完整代码)
  • 时间序列预测实战:从LightGBM到GNN与强化学习的算法选型指南
  • 海尔智能家居设备接入HomeAssistant:打造一体化智能家居控制中心
  • 机器学习解码结直肠癌基因协同作用:从WNT通路到联合治疗新靶点
  • 2026年4月头部火锅品牌推荐,地摊火锅/重庆火锅/成都火锅/社区火锅/牛肉火锅/美食/附近火锅,火锅品牌推荐 - 品牌推荐师