跳到主要内容

3.0 【补充】深度学习相关基础速览

本节定位说明:本节不是一门迷你深度学习课程,而是一份专门为本章"按需配备"的词汇表与直觉手册。所有内容都严格限定在第三章直接用到的概念范围之内。读者不必在这里追求完整的深度学习知识体系——带着本节的基本印象进入 3.1 节,遇到不熟悉的词汇再回来查阅,是完全合理的学习节奏。


进入第三章之前,我们需要先做一次"装备检查"。

前两章的工具是线性代数和统计信号处理——特征值分解、协方差矩阵、最优滤波器。这些工具背后的逻辑非常清晰:先建立物理模型,再用数学推导出算法,每一步都有明确的来由。而第三章将要介绍的方法,底层逻辑有所不同:不是从物理模型推导算法,而是用数据训练网络,让网络自己学习输入到输出的映射关系

这种"让数据说话"的范式有一套自己的语言和工具,就是深度学习。如果你之前从未接触过,也没有关系——本节会用最少的篇幅把第三章必须用到的核心概念讲清楚,帮你建立足够的直觉,顺利读完后续内容。


3.0.1 神经网络在做什么:前向传播

要理解深度学习,先要理解一件事:神经网络本质上是一个带参数的函数

给它一个输入 x\mathbf{x}(比如一个向量或矩阵),它经过一系列数学操作之后,输出一个结果 y^\hat{\mathbf{y}}(比如一个角度、一组概率值)。这个从输入到输出的计算过程,称为前向传播(forward propagation)。

最简单的情形是这样的。设输入向量为 xRn\mathbf{x} \in \mathbb{R}^n,网络有一个"层"(layer),包含一个权重矩阵 WRm×n\mathbf{W} \in \mathbb{R}^{m \times n} 和一个偏置向量 bRm\mathbf{b} \in \mathbb{R}^m,则该层的输出为:

h=f(Wx+b)\mathbf{h} = f(\mathbf{W}\mathbf{x} + \mathbf{b})

其中 f()f(\cdot) 是一个激活函数(activation function),它的作用是引入非线性——如果没有激活函数,不管堆叠多少层,整个网络等价于一个线性变换,表达能力非常有限。常见的激活函数有:

  • ReLUf(x)=max(0,x)f(x) = \max(0, x),负数归零,正数保留,计算简单,是目前最常用的隐藏层激活函数;
  • Sigmoidf(x)=1/(1+ex)f(x) = 1/(1+e^{-x}),将任意实数压缩到 (0,1)(0, 1) 区间,适合输出"概率";
  • Tanhf(x)=(exex)/(ex+ex)f(x) = (e^x - e^{-x})/(e^x + e^{-x}),将输出限制在 (1,1)(-1, 1) 区间,第三章的回归方法会用到它来归一化预测的角度值。

把多个这样的层串联起来,就构成了多层网络。每一层的输出作为下一层的输入,信息逐层变换,最终流向输出层产生预测结果。这就是前向传播的全部含义:信息从输入端向输出端单向流动,经历一系列线性变换与非线性激活。


3.0.2 训练是怎么回事:损失函数与梯度下降

网络有了结构,但参数 W\mathbf{W}b\mathbf{b} 从哪里来?答案是从数据中学习——这个过程称为训练(training)。

训练的逻辑很简单,分三步:

第一步,定义损失函数(loss function)。 损失函数衡量网络的预测值 y^\hat{\mathbf{y}} 与真实标签 y\mathbf{y} 之间的差距。差距越大,损失越高;差距越小,损失越低。训练的目标,就是调整参数让损失尽可能小。在 DOA 估计中,常见的损失函数有两类:

  • 均方误差(MSE),用于回归任务:
LMSE=1Ni=1Ny^iyi2\mathcal{L}_{\text{MSE}} = \frac{1}{N} \sum_{i=1}^{N} \|\hat{\mathbf{y}}_i - \mathbf{y}_i\|^2

适合直接预测角度数值的场景,惩罚预测值与真实角度之间的差距。

  • 交叉熵(Cross-Entropy),用于分类任务。单信源用 Softmax + 交叉熵:
LCE=1Ni=1Nd=1Dpidlogqid\mathcal{L}_{\text{CE}} = -\frac{1}{N}\sum_{i=1}^{N}\sum_{d=1}^{D} p_{id} \log q_{id}

其中 pidp_{id} 是第 ii 个样本在第 dd 个类别上的真实标签(0 或 1),qidq_{id} 是网络预测的概率。多信源改用 Sigmoid + 二元交叉熵(BCE),细节在 3.4 节展开。

第二步,反向传播(backpropagation)计算梯度。 损失函数关于每个参数的偏导数,就是梯度——它告诉我们"调整哪个方向能让损失下降"。反向传播是高效计算这些梯度的算法,本节不展开推导,只需知道:这个过程由深度学习框架(PyTorch、TensorFlow)自动完成,写代码时只需调用 loss.backward() 即可。

第三步,用优化器更新参数。 最基础的方式是随机梯度下降(SGD):沿梯度的反方向,小步迈进。实践中更常用 Adam 优化器,它能自适应调节每个参数的学习步长,收敛更稳。

这三步循环往复——前向传播算损失、反向传播算梯度、优化器更新参数——每经历一轮全部训练数据,称为一个 epoch。通常需要数十到数百个 epoch,网络才能收敛到一个较好的状态。

用一张示意图来概括这个流程:

训练数据 (x, y)


前向传播 ──→ 预测值 ŷ
│ │
│ 损失函数 L(ŷ, y)
│ │
└──── 反向传播 ←──┘

梯度 ∂L/∂W

优化器更新 W ← W - lr·∂L/∂W

下一轮迭代

训练完成之后,把训练集以外的新数据输入网络,只执行前向传播产生预测,称为推理(inference)。这时参数已经固定,网络不再学习。


3.0.3 四种网络结构速览

第三章及后续复现实验将用到四种典型的网络结构,这里分别给出一段话的直觉介绍,不做深入推导。

MLP:多层感知机

多层感知机(Multilayer Perceptron,MLP)是最基础的神经网络形式,由多个全连接层(fully connected layer)串联而成。所谓"全连接",是指上一层的每个神经元都与下一层的每个神经元相连,没有例外。

MLP 的输入是一个向量,输出也是一个向量。它的特点是结构简单、参数直接,适合处理"把特征向量映射到预测值"这类任务。在 DOA 估计中,一个典型的 MLP 做法是:把协方差矩阵的实部和虚部展开成一个长向量作为输入,通过若干全连接层,最终输出角度预测或分类概率。

MLP 的局限是:它把输入当成一个没有内部结构的平铺向量,无法显式利用输入数据的空间排列关系。

CNN:卷积神经网络

卷积神经网络(Convolutional Neural Network,CNN)的核心是卷积层(convolutional layer)。卷积层用一个小尺寸的滤波器(kernel)在输入数据上滑动扫描,提取局部特征——可以理解为一种"局部模式检测器"。

CNN 天然适合处理有空间结构的数据,例如图像(像素之间有相邻关系)。在 DOA 估计中,协方差矩阵是一个 M×MM \times M 的二维矩阵,具有明确的结构——行列坐标对应不同阵元对之间的相关性,相邻阵元对的相关性在空间上是连续变化的。把协方差矩阵当作一张"图像"输入 CNN,卷积层就可以自动提取矩阵中的局部相关模式,比 MLP 更能利用数据的内在结构。

一个标准的 CNN 模块通常是:卷积层 → 批归一化(Batch Normalization) → 激活函数(ReLU) → 池化层(可选)。多个这样的模块叠加之后,再接全连接层输出最终预测结果。

深层 CNN 在训练时可能遇到梯度消失问题——网络层数越多,梯度在反向传播过程中越容易衰减至零,导致前面的层几乎无法更新。**残差网络(ResNet)**通过引入"跳跃连接"(skip connection)解决了这一问题:将某一层的输入 x\mathbf{x} 直接加到该模块输出 F(x)F(\mathbf{x}) 上,得到 o=g(F(x)+x)o = g(F(\mathbf{x}) + \mathbf{x}),让梯度可以绕过卷积层直接回传。这个设计使得网络可以堆叠到数十乃至数百层而不退化。第四章将要复现的 IQ-ResNet 就是基于 ResNet18 改造的 DOA 估计网络,以原始 IQ 数据为输入,利用残差结构提取阵列快拍中的方向特征。

RNN:循环神经网络

循环神经网络(Recurrent Neural Network,RNN)是专门为序列数据设计的网络结构。它的核心想法是:处理序列中第 tt 步的输入时,不仅利用当前输入 xt\mathbf{x}_t,还把上一步产生的隐状态(hidden state)ht1\mathbf{h}_{t-1} 一并输入,产生新的隐状态 ht\mathbf{h}_t

ht=f(Whht1+Wxxt+b)\mathbf{h}_t = f(\mathbf{W}_h \mathbf{h}_{t-1} + \mathbf{W}_x \mathbf{x}_t + \mathbf{b})

这里 ht\mathbf{h}_t 可以理解为网络到第 tt 步为止积累的"记忆",它会被带入下一步继续参与计算。整个序列处理完毕后,以最终隐状态(或所有步骤隐状态的汇总)作为后续全连接层的输入,产生预测结果。

RNN 在 DOA 估计中的自然对应是:把阵列各快拍按时间顺序逐步送入网络,让隐状态逐步积累快拍间的统计信息,最终用于方向预测。这种方式不需要事先计算协方差矩阵,直接从时序 IQ 数据中学习,对快拍数较少的场景有一定优势。

实践中,基础 RNN 存在"长程梯度消失"的问题——序列较长时,早期快拍的信息难以保留到最终输出。LSTM(Long Short-Term Memory,长短期记忆网络)通过引入门控机制(输入门、遗忘门、输出门)显式控制信息的保留与遗忘,是目前最常用的 RNN 变体。第 3.7 节的最小可运行示例将给出一个基于 LSTM 的 DOA 估计代码,与 CNN 版本并排对比。

Transformer:自注意力网络

Transformer 是近年来深度学习领域影响最大的结构,最初为自然语言处理设计,现已广泛应用于信号处理、计算机视觉等领域。它的核心机制是自注意力(self-attention):对于输入序列中的每个元素,网络会计算它与序列中所有其他元素的相关性权重,并以此加权聚合信息。

直觉上,自注意力做的事情是:"我在处理这个位置的特征时,序列中哪些其他位置的信息对我最有帮助?"它能捕捉序列内任意两个位置之间的长程依赖关系,而不受距离限制。相比之下,CNN 的卷积核只关注局部邻域,RNN 虽能建模序列依赖但受梯度消失所限,Transformer 则在原理上没有这两个约束。

在 DOA 估计中,阵列的多个阵元可以被视为一个空间序列,Transformer 的自注意力机制能够建模任意两个阵元之间的空间相关性。第 3.9 节的拓展内容中会对此有更多讨论。


3.0.4 关键词速查表

为了方便在阅读后续各节时随时查阅,这里把本章涉及的核心术语集中整理如下:

术语简要含义
前向传播(forward propagation)输入数据经过网络各层,逐层计算直到输出预测结果的过程
损失函数(loss function)衡量预测值与真实标签差距的函数,训练的目标是最小化它
MSE(均方误差)回归任务常用损失函数,惩罚预测值与真实值的平方差
交叉熵 / BCE分类任务常用损失函数,单信源用 CE,多信源用 BCE
epoch训练数据被完整遍历一轮称为一个 epoch
batch(批次)每次参数更新使用的训练样本子集,大小称为 batch size
全连接层(fully connected / linear layer)每个输入神经元与每个输出神经元均相连,MLP 的基本单元
卷积层(convolutional layer)用小尺寸滤波器扫描输入提取局部特征,CNN 的基本单元
残差连接(skip connection)ResNet 的核心设计,将输入绕过若干层直接加到输出上,缓解梯度消失
ResNet带残差连接的深层 CNN,可堆叠更多层而不退化,第四章复现的核心结构
隐状态(hidden state)RNN 中逐步积累的"记忆"向量,携带序列历史信息传入下一时间步
LSTM带门控机制的 RNN 变体,能更有效地保留长程序列信息
ReLU激活函数,f(x)=max(0,x)f(x)=\max(0,x),隐藏层最常用
Sigmoid激活函数,输出值域 (0,1)(0,1),多标签分类输出层常用
Tanh激活函数,输出值域 (1,1)(-1,1),角度回归归一化常用
Softmax将一组实数转换为概率分布(和为 1),单标签分类输出层常用
自注意力(self-attention)Transformer 的核心机制,建模序列内任意两个位置之间的相关性
MLP多层感知机,由全连接层叠加构成的基础网络结构
CNN卷积神经网络,擅长提取有空间结构数据的局部特征
RNN / LSTM循环神经网络及其门控变体,擅长处理时序或序列数据
Transformer基于自注意力的网络,擅长捕捉长程依赖关系
训练集 / 验证集 / 测试集训练用于调整参数,验证集用于调整超参数,测试集用于最终性能评估
推理(inference)模型训练完成后,对新数据只做前向传播产生预测的过程
过拟合(overfitting)网络在训练集上表现好,但在新数据上性能差,说明泛化能力不足

3.0.5 一点心理建设

看到这些新术语,部分同学可能会感到有点茫然,这完全正常。深度学习的背景知识如果系统学习,需要一整门课程;但我们的目标不是"精通深度学习",而是"能读懂和动手做 DOA 估计的深度学习实验"。

有一个好消息:第三章的代码实现大量依托 PyTorch 框架,它已经把前向传播、反向传播、优化器等细节封装得非常完善。你只需要知道"网络在做什么",而不必自己去实现"网络是怎么算的"。本节四种结构的认知准备,加上第三章后续各节对任务和数据的详细讲解,就足以支撑你顺利完成第三章的全部实验——3.7 节将给出基于 CNN 和 RNN(LSTM)的两个最小可运行示例,帮你把这里的抽象概念落地成可以跑通的代码。

带着这份装备,让我们正式进入第三章的正文——从"为什么需要深度学习来做 DOA 估计"开始。