近年来,大语言模型火得一塌糊涂,写文案、敲代码、做图样样都行。于是很多人开始琢磨:能不能把大模型用在工业故障诊断上?
国内外研究团队已在该方向取得诸多进展:
西南交通大学团队提出的 DiagLLM 发表于《中国科学:信息科学》(SCI 一区);北京科技大学的 KG-SR-LLM 发表于 SCI 期刊《Sensors》;清华大学团队研发的 MaintAGT 在通用测试集上达到 ISO 三级振动分析师水平;华南理工大学的 FaultGPT、中国矿业大学的 FD-LLM 等工作也相继发表。相关成果覆盖中文核心、EI、SCI 等多个层级,呈现出蓬勃发展的态势。
然而,在实际落地中一个核心问题始终绕不开:
振动信号不是自然语言,而且用上亿参数的大模型训练开销太大!
直接将连续振动数值序列输入大模型,既不符合其预训练阶段的文本输入范式,也会面临序列过长、噪声干扰严重、物理语义不明确等诸多挑战。
具体而言:
-
序列长度问题:一段 1 秒的振动信号通常包含上万个采样点,直接输入大模型会导致序列长度急剧膨胀,计算开销巨大且关键特征被稀释。
-
噪声干扰问题:工业现场采集的振动信号往往夹杂大量环境噪声,原始数据中有效故障特征与干扰信息混叠,大模型难以直接区分。
针对这一痛点,本项目提出了一种更契合机械信号特性的技术路线:先将连续振动信号编码为紧凑的故障符号语言,再通过轻量级 Llama 模型学习符号模式与故障类别之间的映射关系,从而实现大模型在工业故障诊断场景下的高效适配。
项目名称:
TF-SAX-Llama
全称可以理解为:
Time-Frequency SAX enhanced Lightweight LLM for Bearing Fault Diagnosis
核心思想一句话概括:
"
连续机械振动信号 → 时频双域 SAX 符号语言 → 物理特征符号 → Llama-1B + LoRA → 轴承故障分类
一、为什么这个思路值得做?
传统轴承故障诊断方法里,常见做法包括:
-
直接用 1D-CNN 读取原始振动;
-
把信号转换成时频图,再用 2D-CNN 或 ViT;
-
提取人工特征,再接 SVM、MLP、随机森林等分类器;
-
用 Transformer、Mamba 等模型直接建模序列。
这些方法都能做,但它们通常存在一个问题:
模型读到的是数值,而不是一种更高层次的"故障语言"。
而 TF-SAX-Llama 的出发点是:
机械振动信号虽然是连续数值,但故障模式本身往往具有结构性,例如周期冲击、幅值突变、包络谱峰值变化、冲击强度增强等。
如果我们能把这些结构压缩成一组离散符号,再交给大语言模型,那么模型学习的就不再是原始波形点,而是:
TIME SAX 符号模式
FREQ SAX 符号模式
RMS / Kurtosis / Crest 等物理状态符号
这就让轴承诊断任务更接近一种"故障符号阅读理解"。
二、整体框架
整个方法流程如下:
原始振动信号
├── 时域分支:Raw waveform → Z-normalization → PAA → SAX
├── 频域分支:Hilbert envelope → Envelope spectrum → SAX
└── 物理分支:RMS / Kurtosis / Crest → 等级符号化
最终组合成 Fault Symbolic Prompt
↓
本地 Llama-1B
↓
LoRA 参数高效微调
↓
故障分类结果
【图 1 整体方法框架图】

三、创新点 1:不是让 Llama 直接读原始振动s数据,而是读"故障符号语言"
本项目没有把 Llama 当成普通的数值序列模型使用。原始窗口长度经过SAX后,得到分支SAX符号,再加上少量 Prompt 标签和物理状态描述,实际 Llama tokenizer 后平均长度约为:
| 数据集 | TIME SAX | FREQ SAX | 总 SAX 符号 | 平均 Token 长度 | 最大 Token 长度 |
|---|---|---|---|---|---|
| CWRU 西储大学 | 64 | 64 | 128 | 约 166.50 | 168 |
| 江南大学 | 64 | 64 | 128 | 约 166.51 | 168 |
这比直接输入 2048 个连续数值更紧凑,也更符合 Llama 对离散符号序列的建模习惯。
【图 2 :原始振动 + PAA + SAX 符号化示意图】

四、创新点 2:时域 SAX + 包络频谱 SAX,兼顾冲击形态与故障频率信息
只看原始时域波形,能够捕捉冲击和波形形态,但轴承故障诊断中,频率结构同样重要。
因此本项目设计了双分支 SAX:
1. Time-SAX
2. Freq-SAX
这样可以把包络频谱的形态也转换成符号序列,让 Llama 同时看到:
-
时域冲击模式;
-
频域包络结构;
-
不同故障类型对应的符号组合。
【图 3 :包络频谱图】

【图 4 预留:TIME SAX 与 FREQ SAX 符号序列图】
当前项目已生成示例图:

五、创新点 3:加入物理特征符号,补偿 SAX 标准化后的幅值信息损失
标准 SAX 在处理时通常会进行 Z-normalization。
这一步有利于消除量纲差异,但也可能削弱振动幅值、冲击强度等物理信息。
所以项目额外从未经 Z-score 标准化的原始窗口中提取:
-
RMS:反映整体能量;
-
Kurtosis:反映冲击性;
-
Crest Factor:反映峰值冲击强度。
但这些物理特征并不直接以小数形式输入 Llama,而是离散成等级符号:
LOW
MEDIUM
HIGH
VERY_HIGH
最终 Prompt 中会出现类似:
<RMS> HIGH
<KURTOSIS> VERY_HIGH
<CREST> HIGH
这种设计有两个好处:
-
保留机械诊断里非常重要的幅值和冲击信息;
-
让输入形式保持"符号语言",不破坏 Llama 的文本建模习惯。
六、最终输入给 Llama 的 Prompt 长什么样?
本项目默认使用紧凑 Prompt,避免大量无关自然语言占据上下文。
示例:
Bearing vibration diagnosis.
<TIME>
D E D E E D E D E D E D D E ...
<FREQ>
H H H H H H H H G F F E E F ...
<RMS> MEDIUM
<KURTOSIS> LOW
<CREST> LOW
Classify the fault.
注意,这里不会在 Prompt 中泄露真实标签。
标签只作为分类目标参与训练。
在我的代码中,会直接将提示词生成一个表格,方便查阅:

七、模型训练方式:Llama-1B + LoRA,不做全参数微调
本项目使用本地 Llama-1B 作为主干模型,并通过 LoRA 做参数高效微调。
- Llama-1B 是 Meta Llama 系列中的轻量级大语言模型,参数规模约为 10 亿级别。相比 7B、13B 等更大的模型,1B 模型对显存和算力要求更低,更适合在个人 GPU 或普通实验环境中进行 LoRA 微调。本项目使用的是 Llama-3.2-1B-Instruct,它是指令微调版本,适合处理结构化文本 Prompt。在本项目中,Llama-1B 并不是直接读取原始振动数值,而是读取由 Time-SAX、Freq-SAX 和物理特征符号共同构成的故障诊断 Prompt。Llama-1B模型在本地大约只有4个G左右的空间,训练需要英伟达显卡,并不会要求过多算力。我的电脑是4060ti,8G显卡,运行此模型非常快,毫无压力!关于此模型的下载方式,我放在代码介绍里了。
实际训练中,模型参数统计如下:
| 数据集 | 总参数量 | 可训练参数量 | 可训练比例 |
|---|---|---|---|
| CWRU 10 分类 | 1,236,707,328 | 872,448 | 0.0705% |
| 江南大学 4 分类 | 1,236,682,752 | 860,160 | 0.0696% |
可以看到,虽然底座是 1B 级别的大语言模型,但真正参与更新的参数不到 0.1%。
这也是 LoRA 的意义:
保留大模型的符号建模能力
同时大幅减少训练参数量与模型保存体积
八、实验设置
本项目当前包含两个数据集实验。
1. CWRU 西储大学轴承数据集
采用 DE 端信号。
当前设置为 10 分类任务,每类 400 个窗口样本,总计 4000 个样本。
类别包括:
-
Normal
-
Ball_007_1797
-
Ball_014_1797
-
Ball_021_1797
-
IR_007_1797
-
IR_014_1797
-
IR_021_1797
-
OR_007_1797
-
OR_014_1797
-
OR_021_1797
数据划分:
每类 train: 280
每类 val: 60
每类 test: 60
2. 江南大学轴承数据集
当前实验设置只使用 600 转工况。
设置为 4 分类任务,每类 400 个窗口样本,总计 1600 个样本。
类别包括:
-
Normal
-
Ball
-
Inner
-
Outer
数据划分:
每类 train: 280
每类 val: 60
每类 test: 60
3. 防止数据泄漏
项目中特别注意了一个轴承故障诊断里很容易被忽略的问题:
不能先切窗口再随机划分训练集和测试集。
因为同一条长振动记录中相邻窗口非常相似,如果随机打散,会造成严重的数据泄漏。
本项目采用:
原始记录 / 连续记录块
→ 先做 group split
→ 再分别滑窗
训练集、验证集、测试集之间的 group 没有交集。这个设计让实验结果更可信。
九、实验结果展示
下面结果为当前项目在本地配置下得到的参考结果。
1. CWRU 10 分类结果
CWRU 10 分类任务中,模型在测试集上取得了非常高的识别效果。
测试集指标如下:
| 指标 | 结果 |
|---|---|
| Accuracy | 100.00% |
| Macro Precision | 100.00% |
| Macro Recall | 100.00% |
| Macro-F1 | 100.00% |
| Weighted-F1 | 100.00% |
这说明 TF-SAX-Llama 对 CWRU 中不同故障直径、不同故障部位的符号模式具有较强区分能力。从结果上看,时频双域 SAX 符号能够较好地保留不同故障严重程度对应的模式差异。
【图 5 :CWRU 混淆矩阵】

【图 6 :CWRU 训练损失曲线】

【图 7 :CWRU 验证准确率 / Macro-F1 曲线】


2. 江南大学 600 转数据结果
江南大学这个数据的难度比较高,因此本项目采用这个数据来验证一下TF-SAX-Llama 模型的效果。江南大学数据集只选用 600 转工况,进行 4 分类实验。
测试集指标如下:
| 指标 | 结果 |
|---|---|
| Accuracy | 92.92% |
| Macro Precision | 93.18% |
| Macro Recall | 92.92% |
| Macro-F1 | 92.83% |
| Weighted-F1 | 92.83% |
分类报告中可以看到:
-
Normal 类识别效果较好,F1 约为 95.73%;
-
Inner 类和 Outer 类整体表现稳定;
-
Ball 类相对更难,说明滚动体类在该数据设置下与其他类别存在一定符号模式交叠;
-
即便如此,整体 Macro-F1 仍能达到 92% 以上。
这组结果说明,该方法并不是只在 CWRU 这类常用公开数据上有效,在另一套轴承数据上同样能够得到较好的分类表现。
【图 8 :江南大学轴承数据混淆矩阵】

【图 9 预留:江南大学训练损失曲线】

【图 10 预留:江南大学验证准确率 / Macro-F1 曲线】


十、代码截图
这份代码不仅包含模型训练,还包含完整实验流程。

主要功能包括:
-
CWRU 数据自动读取;
-
江南大学数据自动读取;
-
MATLAB
.mat文件扫描; -
CWRU DE 端信号选择;
-
江南大学 600 转工况筛选;
-
严格 group split,避免窗口泄漏;
-
Time-SAX 自实现;
-
Envelope Spectrum + Freq-SAX;
-
RMS / Kurtosis / Crest 物理特征符号化;
-
Fault Symbolic Prompt 自动构建;
-
本地 Llama-1B 加载;
-
LoRA 参数高效微调;
-
训练日志保存;
-
测试指标输出;
-
混淆矩阵绘制;
-
训练曲线绘制;
-
SAX 可视化;
-
单样本预测;
-
消融实验入口;
-
SAX 参数敏感性实验入口;
-
Symbol Masking Importance 可解释性分析。
十一、项目核心点总结
一句话总结:
"
这不是一个简单把 Llama 套到轴承数据上的项目,而是把机械振动信号先转换成时频双域符号语言,再利用 Llama 学习故障符号组合规律。
核心点包括:
-
方法新:SAX 符号化 + Llama 故障诊断;
-
结构清晰:Time-SAX、Freq-SAX、Physical Symbols 三分支;
-
实验完整:CWRU 与江南大学两个数据集;
-
结果直观:自动输出混淆矩阵、训练曲线、分类报告;
-
训练轻量:LoRA 微调,训练参数不到 0.1%;
-
可解释:支持 Symbol Masking Importance;
-
工程完整:配置化、脚本化、可直接运行。
代码获取!
代码环境配置起来并不复杂,实在配不好的可以后台私信,免费帮你远程配置!
获取此代码方式:关注 :g~z~h~ 《淘个代码》