【论文导读】CTIN: Robust Contextual Transformer Network for Inertial Navigation

论文名称:CTIN: Robust Contextual Transformer Network for Inertial Navigation

会议:AAAI

时间:2020

围绕基于 IMU 的惯性导航定位展开,提出了一种基于 Transformer 架构的深度学习模型,用于从 IMU 数据中预测二维速度和轨迹

数据集

数据集名称 是否开源 是否仅 IMU 是否作者采集 备注
RIDI ✅ 开源 ✅ 仅 IMU RIDI GitHub
OxIOD ✅ 开源 ✅ 仅 IMU OxIOD 官网
RoNIN ✅ 开源 ✅ 仅 IMU RoNIN GitHub
IDOL ✅ 开源 ✅ 仅 IMU IDOL GitHub
CTIN ✅ 开源 ✅ 仅 IMU ✅ 作者采集 作者自行采集的新数据集,用于补充现有数据不足

所有数据集均为仅 IMU 采集,未融合 GNSS 或其他传感器,目的是测试纯 IMU 导航性能

主要工作

这篇论文还是通过预测速度,再积分获得位置,属于数据驱动的惯性导航

首次将 Transformer 架构引入 IMU 惯性导航任务

提出 CTIN 模型,融合空间-时序上下文信息 ,使用注意力机制提取 IMU 数据中的 空间关系与时序依赖

引入多任务学习(预测速度 + 估计不确定性)来提升鲁棒性,在多个公开数据集上实现 SOTA,并开放了一个新采集的数据集

深度学习模型:CTIN

模型整体结构

数据预处理与嵌入层 (Embedding)

空间编码器 (Spatial Encoder)

时序解码器 (Temporal Decoder)

两个任务头(MLP 分支):

  • Velocity Head:回归二维速度 v;
  • Covariance Head:回归 2×2 协方差 Σ

Embedding 层(输入 → 连续表征)

输入:长度为 m 的 IMU 窗口

α, ω\] ∈ ℝ\^{m×6}(3 轴加速度 + 3 轴角速度,已转到导航坐标系) #### Spatial Embedding Spatial Embedding 把单帧 IMU 6 轴原始测量"映射成高维空间特征,为 Encoder 提供纯传感器物理量的紧凑表达;它不含时序或位置信息,仅刻画**这一帧 IMU 数据本身在空间/通道上的模式** * Spatial Embedding 与 Temporal Embedding 是两个完全独立的子模块,都以同一 IMU 窗口 \[α, ω\] ∈ ℝ\^{m×6} 为原始输入 * 输入 X_{raw},经过 1 × 1 Conv,把 6 维 IMU 特征线性映射到 d_{model} 维,卷积核在时间维度上为 1,只在通道维做变换,输出 X_{conv} ∈ ℝ\^{m × d_{model}} * 对 X_{conv} 进行BatchNorm标准化,输出 X_{bn} ∈ ℝ\^{m × d_{model}} * 再进行ReLU非线性激活,得到 X_{relu} ∈ ℝ\^{m × d_{model}} * 最后进行全连接Linear,经过最终空间嵌入,进入下一步与 Temporal Embedding 相加;得到X\^{spat} ∈ ℝ\^{m × d_{model}} 即:**1×1 Conv → BN → ReLU → Linear → 得到 X\^{spat} ∈ ℝ\^{m×d_{model}}​** X\^{spat} 补充当前帧的静态物理量特征(即时序维度:前后帧如何互相影响) #### Temporal Embedding * 输入同上,经过1层双向 `LSTM`,把 6 维 `IMU` 序列编码成 d_{model} 维时序特征;hidden_size = d_model * 构建可学习的Positional Encoding(与序列位置相关的可训练向量),P∈ℝ\^{m × d_{model}}​,初始化使用标准正态分布 × 0.02(即**随机初始化**,接近 Xavier 小方差) * Positional Encoding 给 LSTM 输出的"内容特征"再补上"**我在序列的第几位**"这一信息,防止 Transformer 的自注意力层把"先/后"顺序搞混 * Bi-LSTM 本身理论上能感知顺序,但 CTIN 的后续模块是 **纯注意力** (Transformer)。注意力计算是"一袋子向量"操作------如果不显式告诉它"第 1 帧、第 2 帧......",模型就**无法区分时间先后** 。**可学习 Positional Encoding 就是"第 t 帧的位置身份证"** ,让***注意力层仍知道时间顺序*** * 将`H_lstm + P`逐元素相加,得到最终时间嵌入,输出 X\^{temp}∈ ℝ\^{m × d_model}​ * 这里使用"逐元素相加"而不是拼接。相加在 Transformer 中**足够表达位置信息** ,同时保持维度不变,计算量小。拼接会把通道数翻倍,后面***再做线性映射其实等价于"加权相加"*** ,不如直接相加高效 即:1 层 Bi-LSTM 提取局部时序特征,再加一段可学习的 Positional Encoding(与 Transformer 原版不同,这里是可训练向量),得到输出 X\^{temp} ∈ ℝ\^{m×d} 作为 Decoder 的 Query 初始值,也作为 Encoder 输入的一部分,使网络在后续空间-时序注意力计算里同时看到: * 这帧 IMU 的物理量(由 Spatial Embedding 提供) * 这帧在时间轴上的绝对/相对位置(由 Positional Encoding 提供) * 局部邻域的时序动态,领帧关系(由 Bi-LSTM 提供) Temporal Embedding 是把"**时序位置 + 时序上下文**"压缩进同一向量,与 Spatial Embedding 一起构成 CTIN 的完整输入表示(即空间维度:哪些通道/传感器彼此相关) #### 融合 X\^{spat} 与 X\^{temp} 逐元素相加 → Z₀ = X\^{spat} + X\^{temp} ∈ ℝ\^{m × d_{model}} 直接把 X\^{spat} 与 X\^{temp} 逐元素相加 → 得到最终输入序列,输出 X\^{temp} ∈ ℝ\^{m×d} ### Spatial Encoder(N 个相同 block 堆叠) * Spatial Encoder = **N 个相同的 Spatial Bottleneck Block** 串行堆叠,论文中 `N=4` * 每个Block内部保持 `ResNet-18 bottleneck` 的残差骨架,只是把卷积核换成了"局部+全局"两种自注意力模块 * 整个 Encoder 的输入是 Z₀ ∈ ℝ\^{m×d_model}(Embedding 层已处理过的 `IMU` 序列) * 输出是 E ∈ ℝ\^{m×d_{model}},供 Decoder 的交叉注意力使用 每个 Block 内部把 `ResNet-18` 的瓶颈单元改造成"双注意力"结构 #### 各Spatial Bottleneck Block完整数据流 以第I个Block为例(I=1...N),给出每一步的张量维度与数据来源 m = 时间窗长度,d = 基础通道数(论文里 d = 128 或 256),4d = 升维后的通道数 #### Block-1 输入 Z₀ ∈ ℝ\^{m × d} * 经过 **`Conv1×1` 提升通道数 (d→4d)** 输入Embedding层的`IMU`序列 ℝ\^{m × d},输出升维后的高维空间特征 ℝ\^{m × 4d} 把通道数从d扩到4d,提高特征容量,为后面两个注意力模块提供更大的子空间来刻画局部/全局关系。纯线性映射,不扩大时间维度,也不改变时间顺序 * 3×3 Local Multi-Head Self-Attention 输入上一步得到的4d空间特征,输出在3×3邻域内做局部注意力后的局部空间上下文特征 在领域3×3内做多头注意力,捕获"局部空间上下文"(哪几轴`IMU`信号在同一时刻互相耦合) * 1×1 Global Multi-Head Self-Attention 输入4d空间特征(同上),再次全局注意力,得到跨时间、跨通道的全局上下文特征 在整个m×4d特征图上做全局注意力,捕获"跨时间步、跨通道"的长程依赖(与前一步互补) * Fusion Gate(α 加权融合) 输入局部特征和全局特征 C₁ ∈ ℝ\^{m × 4d},C₂ ∈ ℝ\^{m × 4d}(Local 结果和 Global 结果),输出按学习到的权重融合后的综合空间特征 Y ∈ ℝ\^{m × 4d} 让网络自适应地决定当前位置更依赖局部还是全局信息 concat(C₁,C₂)→1×1 Conv→Sigmoid→逐通道加权求和 * 经过 **Conv1×1降低通道数 (4d→d)** 输入融合后的高维特征 Y ∈ ℝ\^{m × 4d},输出 Y′ ∈ ℝ\^{m × d} 把4d压缩回d,恢复原始通道数,保证残差相加时维度一致;同时起到信息瓶颈效果,只让最精炼的特征通过 * Residual + `LayerNorm` 残差用于缓解梯度消失,保持低层特征流通 `LayerNorm`用于稳定分布,加速收敛 Block-1的输出为 Z₁ ∈ ℝ\^{m × d} #### Block-2、Block3、Block4 输入为上一层输出,操作同Block-1 4 层全部经过后,Spatial Encoder 的最终输出为 E ∈ ℝ\^{m × d},直接送入 Temporal Decoder ### Temporal Decoder Temporal Decoder同样由N=4个完全相同的解码层(Decoder Layer)堆叠而成 #### Layer-1 第一层的整体输入为来自Encoder的输出 E ∈ ℝ\^{m × d}, `Temporal Decder`的同一E,因第一层没有历史,故Query也来自E,记作 Q₀ = E ∈ ℝ\^{m × d} 在Transformer Decoder中,真正用来产生Query的是上一次Decoder的输出(即"历史") * Masked Multi-Head Self-Attention 输入 Q = K = V = Q₀ ∈ ℝ\^{m × d} 让当前时间步只能"看"到自己及之前的时间步,防止未来信息泄露 输出 A_{1} ∈ ℝ\^{m × d} (经过掩码,防止未来信息泄露) * `Add & LayerNorm`(第一次) 输入 A_{1} ∈ ℝ\^{m × d},Q₀ ∈ ℝ\^{m × d}(这里表示 A_{1}与E​)​ 通过残差连接+归一化,稳定梯度、保持信息流 输出 S_{1} ∈ ℝ\^{m × d}​ * Multi-Head Cross-Attention(Encoder-Decoder Attention) 输入 Query = S₁ ∈ ℝ\^{m × d}, Key = Value = E ∈ ℝ\^{m × d} (来自 Spatial Encoder) 把Encoder的空间-时序特征E融合到Decoder当前表示中 输出 C₁ ∈ ℝ\^{m × d} * `Add & LayerNorm` (第二次) 输入:C₁ ∈ ℝ\^{m × d},S₁ ∈ ℝ\^{m × d} 再次残差+归一化,融合交叉注意力结果 输出:T₁ ∈ ℝ\^{m × d} * Position-wise Feed-Forward(两层 `MLP`) 输入:T₁ ∈ ℝ\^{m × d} 操作:`Linear(d → 4d) → ReLU → Dropout → Linear(4d → d)`,通过非线性变化,提高表达能力 输出:F₁ ∈ ℝ\^{m × d} * `Add & LayerNorm` (第三次) 输入:F₁ ∈ ℝ\^{m × d},T₁ ∈ ℝ\^{m × d} 通过最后的残差+归一化,得到本层最终输出 输出:Z_{dec}¹ ∈ ℝ\^{m × d} (Layer-1 的最终结果,将成为 Layer-2 的 Q₀) Transformer的"残差+归一化"遵循**每经过一个子层就做一次**的惯例 #### 第4个解码层之后 Decoder的4个解码层全部完成后,得到的张量不会再经过任何额外的Transformer层,而是直接同时送到两个 **独立的前馈头(Feed-Forward Heads)** 第四层输出维度 Z_{dec}⁴ ∈ ℝ\^{m × d} (m = 时间窗长度,d=128/256,与Encoder通道数相同),为融合了**全部空间-时序上下文的高维隐状态** ,每一行对应一帧IMU的"精炼表示",即包含**局部运动模式** ,也包含**全局轨迹依赖** 。Velocity / Covariance 头只需在这之上做一次**线性映射**即可得到所需的速度与不确定性 * Velocity Head 两层 MLP (d → 128 → 2) → ℝ\^{m × 2} 输出:每一帧的二维速度 ((v_x, v_y)) * Covariance Head 两层 MLP (d → 128 → 2) → ℝ\^{m × 2} 输出对应速度的不确定性对角方差 (σ*x², σ*y²) 两个头各自有一套**独立的权重参数** ,训练时通过***多任务损失***同时优化两个头 ### 补充:Query、Value、Key的作用 把输入向量拆成3个向量 * Query(Q):提出"我要查什么"; * Key(K):给出"我能提供什么索引"; * Value(V):给出"索引对应的实际内容"。 计算过程(缩放点积注意力) * 相似度矩阵:S = Q·Kᵀ / √dₖ 每对(query,key)的打分 * 权重:W=softmax(S) 概率化,行和为1 * 聚合:O=W·V 把Value按权重加权求和 ***每个位置用Query问所有Key:"谁跟我最相关?",再用得到的权重去取 Value*** 多头(Multi-Head)只是**把d维切成h份,并行做h次上述过程,再拼回 d 维,以捕获不同子空间关系** Transformer就是**用自注意力一次性建立序列中任意两位置的关系,并用残差、归一化、前馈网络保持深度可训练性** ### 补充:残差+归一化怎么做 设子层函数为 F(·)(例如 Self-Attention 或 Feed-Forward),输入为 x: * 残差 y = F(x) + x y的形状假设为(batch, m, d) * 层归一化 μ = mean(y, last_dim),在d这一维上求平均,返回形状 (batch, m, 1) * *last_dim就是 **张量最末尾的那一维**(也叫"特征维"或"通道维")* σ = std(y, last_dim),在d这一维上求标准差,返回形状 (batch, m, 1) z = (y − μ) / √(σ² + ε) \* γ + β ***通过广播机制把 μ、σ 扩展到与 y 相同形状,再逐元素做归一化*** γ、β 为可学习缩放和平移参数,ε 防除零 * 输出 z ∈ ℝ\^{same_shape_as_x},继续传给下一模块 在`Transfomer`中,每经过一个子层就执行一次"残差+`LayerNorm`"保持梯度顺畅、训练稳定 ## 模型对比情况 | 对比模型 | 简介 | 结果对比(ATE 指标) | |--------------|------------------|--------------------| | **R-LSTM** | RoNIN 中的 LSTM 变体 | CTIN 提升约 **34.7%** | | **R-ResNet** | RoNIN 中的 CNN 变体 | CTIN 提升约 **21.8%** | | **R-TCN** | RoNIN 中的 TCN 变体 | CTIN 提升约 **37.5%** | | **SINS** | 传统双积分法 | 误差极高,CTIN 显著优于 | | **PDR** | 基于步态的行人航位推算 | 长期漂移严重,CTIN 更稳定 | CTIN 是首个将 Transformer 引入纯 IMU 惯性导航的模型,通过空间-时序注意力机制与多任务学习,在多个开源与自建数据集上实现了轨迹预测的新 SOTA

相关推荐
骑驴看星星a3 小时前
皮尔逊相关(Pearson)和斯皮尔曼相关(Spearman)显著性检验
算法·数学建模·回归·线性回归
MT_1253 小时前
大小端存储的理解与判断方法
数据结构·算法
玩镜的码农小师兄3 小时前
[从零开始面试算法] (11/100) LeetCode 226. 反转二叉树:递归的“镜像”魔法
c++·算法·leetcode·面试·递归·hot100
喜欢吃豆4 小时前
LangGraph 深度解析(三):构建可观测、交互式 AI 智能体的流式架构权威指南
人工智能·python·算法·架构·大模型
玉木子7 小时前
机器学习(六)朴素贝叶斯分类
开发语言·人工智能·python·算法·机器学习·分类
明月(Alioo)7 小时前
机器学习进阶,一文搞定模型选型!
人工智能·算法·机器学习
Yyyy4827 小时前
test命令与参数
算法
耳总是一颗苹果9 小时前
数据结构---选择排序
c语言·数据结构·学习·算法·排序算法
战术摸鱼大师9 小时前
电机控制(一)-电机分类
算法·运动控制·电机控制