目录
[1.1. 有监督学习 (Supervised Learning)](#1.1. 有监督学习 (Supervised Learning))
[1.2. 无监督学习 (Unsupervised Learning)](#1.2. 无监督学习 (Unsupervised Learning))
[1.3. 强化学习 (Reinforcement Learning, RL)](#1.3. 强化学习 (Reinforcement Learning, RL))
[1.4. RLHF (Reinforcement Learning from Human Feedback)](#1.4. RLHF (Reinforcement Learning from Human Feedback))
[2.1. 有监督学习数据集 (Supervised Dataset)](#2.1. 有监督学习数据集 (Supervised Dataset))
[2.2. 无监督学习数据集 (Unsupervised Dataset)](#2.2. 无监督学习数据集 (Unsupervised Dataset))
[2.3. 强化学习数据集 (Reinforcement Learning Dataset)](#2.3. 强化学习数据集 (Reinforcement Learning Dataset))
[2.4. RLHF 数据集 (RLHF Datasets)](#2.4. RLHF 数据集 (RLHF Datasets))
[2.6 获取数据集的方式](#2.6 获取数据集的方式)
[2.6.2 手动自作](#2.6.2 手动自作)
[3.1. 明确问题与数据准备 (Problem & Data)](#3.1. 明确问题与数据准备 (Problem & Data))
[3.2. 划分数据集 (Dataset Splitting)](#3.2. 划分数据集 (Dataset Splitting))
[3.3. 网络架构设计 (Model Architecture)](#3.3. 网络架构设计 (Model Architecture))
[1. 架构是自己写的吗?](#1. 架构是自己写的吗?)
[2. 如何搭建:神经网络的"积木"逻辑](#2. 如何搭建:神经网络的“积木”逻辑)
[A. 输入层 (Input Layer)](#A. 输入层 (Input Layer))
[B. 特征提取层 (Feature Extraction / Backbone)](#B. 特征提取层 (Feature Extraction / Backbone))
[C. 分类层 (Classification Head)](#C. 分类层 (Classification Head))
[3. 从简单到复杂](#3. 从简单到复杂)
[级别一:入门级(类 LeNet-5)](#级别一:入门级(类 LeNet-5))
[级别二:工业级标杆(ResNet - 残差网络)](#级别二:工业级标杆(ResNet - 残差网络))
[级别三:硬件友好型(MobileNet / TinyML)](#级别三:硬件友好型(MobileNet / TinyML))
[4. 针对 FPGA 部署的架构设计建议](#4. 针对 FPGA 部署的架构设计建议)
[3.4. 编译模型 (Model Compilation)](#3.4. 编译模型 (Model Compilation))
[3.5. 模型训练 (Model Training)](#3.5. 模型训练 (Model Training))
[3.6. 模型评估与调试 (Evaluation & Tuning)](#3.6. 模型评估与调试 (Evaluation & Tuning))
[3.7. 模型保存与转换 (Deployment Preparation)](#3.7. 模型保存与转换 (Deployment Preparation))
本篇笔记总结了最近所学的机器学习的知识,包括机器学习模式、数据集类型、网络搭建全流程,作为在FPGA中部署神经网络的基础知识。
1.机器学习模式
1.1. 有监督学习 (Supervised Learning)
核心比喻:老师带着有标准答案的课本来教课。
在有监督学习中,模型接收的是带标签 (Labeled) 的数据。每一条输入数据 x 都有一个对应的正确答案 y。
-
工作原理:模型预测一个结果,然后将其与标准答案对比。如果错了,模型会通过损失函数(Loss Function)计算误差,并调整内部参数以减少下次的误差。其目标是学习一个映射函数 f(x) = y。
-
常见任务:
-
分类 (Classification):判断一张图片是猫还是狗。
-
回归 (Regression):预测明年的房价(连续数值)。
-
-
应用场景:垃圾邮件检测、人脸识别、医疗诊断。
1.2. 无监督学习 (Unsupervised Learning)
核心比喻:给学生一堆杂乱的乐高积木,让他们自己按颜色或形状分类。
模型处理的是没有标签 (Unlabeled) 的数据。它不知道这些数据"是什么",它的任务是发现数据内部潜藏的结构 或模式。
-
工作原理:模型通过计算数据点之间的相似度或分布特征,将相似的东西聚在一起,或者压缩数据的维度。
-
常见任务:
-
聚类 (Clustering):根据购买行为将客户分为不同的群体。
-
降维 (Dimensionality Reduction):简化复杂数据,提取核心特征(如 PCA)。
-
关联分析:发现"买尿布的人通常也会买啤酒"这种规律。
-
-
应用场景:用户画像分析、异常检测(如信用卡欺诈)、基因序列分析。
1.3. 强化学习 (Reinforcement Learning, RL)
核心比喻:驯兽师训练小狗,做对了给骨头,做错了不给。
强化学习不依赖静态的数据集,而是在交互中学习。
-
核心组件:
-
智能体 (Agent):学习者。
-
环境 (Environment):智能体所处的场景。
-
动作 (Action):智能体做出的行为。
-
奖励 (Reward):反馈信号(正奖或负罚)。
-
-
工作原理 :智能体在环境中采取行动,观察结果并获得奖励。它的目标是找到一种策略(Policy),使长期累积奖励最大化。
-
应用场景:自动驾驶、游戏 AI(如 AlphaGo)、机器人控制、量化交易。
1.4. RLHF (Reinforcement Learning from Human Feedback)
核心比喻:老师不再给标准答案,而是根据学生的作文写得"好不好看"来打分。
RLHF 是强化学习的一个特殊变种,也是让大语言模型(如 ChatGPT, Gemini)表现得像人类的关键技术。
-
为什么需要它?:对于"写一首优美的诗"这种任务,没有唯一的标准答案(有监督学习很难做),也很难写出公式化的奖励函数(强化学习很难写 Reward)。但人类可以轻易判断:A 写的诗比 B 写的更好。
-
训练步骤:
-
有监督微调 (SFT):用人类写好的高质量问答对模型进行初步训练。
-
奖励模型训练 (RM) :模型生成几个不同的回答,让人类进行排序(比如 A > C > B)。利用这些偏好数据训练一个"奖励模型",这个模型学会了模拟人类的品味。
-
近端策略优化 (PPO):用这个"奖励模型"去指导原始模型进行强化学习。如果模型说出人类喜欢的话,奖励模型就给高分。
-
-
作用:它解决了 AI 的**对齐(Alignment)**问题,确保模型生成的回答不仅逻辑正确,而且符合人类的价值观、安全且有用。
四者对比总结
| 维度 | 有监督学习 | 无监督学习 | 强化学习 | RLHF |
|---|---|---|---|---|
| 数据源 | 结构化的标签数据 | 原始无标签数据 | 动态环境反馈 | 人类偏好排序 |
| 反馈机制 | 直接对比标准答案 | 寻找数据内在联系 | 奖励信号 (Reward) | 模拟人类品味的奖励模型 |
| 学习目标 | 预测准确度 | 发现潜在模式 | 获取最大奖励 | 与人类意图/价值观对齐 |
2.数据集获取方式
这四种学习模式对数据的"胃口"完全不同。简单来说,它们的差异在于数据的加工深度 、反馈的及时性 以及人参与的方式。
2.1. 有监督学习数据集 (Supervised Dataset)
-
特征 :成对出现。每一条数据都必须由"输入 x"和对应的"标签 y"组成。(可以理解为图片+图片属于什么标签)
-
数据集构成 :
。
-
获取方式:
-
公开数据集 :如 ImageNet (图像分类)、MNIST (手写数字)、COCO(目标检测)。
-
人工标注:这是最常见的商业手段。通过数据标注公司(如 Scale AI、Appen)雇佣大量人力,手动给图片打框或给文字分类。
-
合成数据:利用已有的物理引擎或模拟器生成带标签的数据。
-
2.2. 无监督学习数据集 (Unsupervised Dataset)
-
特征 :原始且海量。只有"输入 x",没有任何人为标记的答案。
-
数据集构成 :
。
-
获取方式:
-
网络爬虫:从互联网抓取的文本(如 Common Crawl 数据集)、图片、视频。
-
日志记录:服务器产生的用户访问日志、传感器采集的原始信号(如你之前研究的卫星频谱原始数据)。
-
公共仓库 :Wikipedia 全文、GitHub 代码库等。
-
2.3. 强化学习数据集 (Reinforcement Learning Dataset)
-
特征 :交互式序列 。强化学习通常不需要预先准备好的"静态数据集",而是需要一个环境 (Environment)。
-
数据集构成 :由状态、动作、奖励组成的轨迹
。
-
获取方式:
-
仿真环境/模拟器:
-
OpenAI Gymnasium:经典的控制类环境(如倒立摆、走迷宫)。
-
MuJoCo:高级物理动力学模拟。
-
CARLA:自动驾驶模拟器。
-
-
离线强化学习 (Offline RL):如果无法实时交互,可以使用已有的历史运行记录(如工业机器人的历史操作日志)。
-
2.4. RLHF 数据集 (RLHF Datasets)
RLHF 并不是一种单一数据集,它通常包含三个阶段的不同数据:
-
SFT 数据集(有监督微调):
-
内容:人类写出的高质量"标准范文"。(例如:提问"如何写诗?",给出一个人类写的优美示例)。
-
获取:雇佣专业的"专家"来撰写回答。
-
-
RM 数据集(奖励模型/偏好数据):
-
内容 :排序/比较数据。模型给出 A 和 B 两个回答,人类勾选"A 比 B 好"。
-
获取:通过标注平台,让标注员对模型生成的多个结果进行打分或排序。
-
-
Prompt 数据集(提示词集):
- 内容:纯问题集。用于最后的强化学习训练,让模型面对这些问题不断生成新回答。
2.5四种模式对比表
| 模式 | 数据核心成分 | 数据成本 | 获取难点 |
|---|---|---|---|
| 有监督 | (x, y) 键值对 | 高(标注贵) | 标注的准确性和一致性 |
| 无监督 | 纯 x 原始数据 | 低(量大) | 数据的清洗和去重 |
| 强化学习 | (s, a, r, s') 序列 | 中(仿真成本) | 构建高精度的模拟环境 |
| RLHF | 人类偏好排序 (A > B) | 极高(专家成本) | 人类主观标准的一致性 |
2.6 获取数据集的方式
2.6.1公开数据集网站获取
Kaggle Datasets :Find Open Datasets and Machine Learning Projects | Kaggle

Hugging Face Datasets: Datasets -- Hugging Face

2.6.2 手动自作
(1)文件夹分割

(2)目标检测类型
通过labelim等工具手动标注。(这个我还没用过)


(3)图像分割
通过labelme进行图像分割来标注。


3.机器学习网络搭建流程
搭建一个机器学习(尤其是深度学习)网络是一个系统工程,通常遵循从数据到模型,再到部署的标准化流程。
3.1. 明确问题与数据准备 (Problem & Data)
行业里有一句话:Data is the new oil. 模型的上限由数据决定,算法只是在逼近这个上限。一切模型的基础都是数据。在开始写代码前,必须定义清楚任务。
-
定义任务 :确定是分类 (分类别)、回归 (预测连续值)还是聚类。
-
数据采集:从 Kaggle、Hugging Face 或传感器获取原始数据。
-
数据清洗:处理缺失值、异常值和重复数据。
-
特征工程:
-
归一化/标准化:将数据缩放到 [0, 1] 或均值为 0、方差为 1 的区间,防止梯度爆炸。
-
提取特征 :例如音频信号需要做 FFT(快速傅里叶变换)转为频谱图。比如做哨声识别 ,不能直接把波形丢进去,通常需要做 STFT(短时傅里叶变换) 转化为梅尔频谱图。
-
3.2. 划分数据集 (Dataset Splitting)
为了保证模型的泛化能力,必须将数据分为三部分:
| 数据集 | 占比 | 作用 |
|---|---|---|
| 训练集 (Train) | 70% - 80% | 给模型"看"和"学"的,用于更新网络权重和偏置。 |
| 验证集 (Val) | 10% - 15% | 训练期间调整超参数,监控是否过拟合。 |
| 测试集 (Test) | 10% - 15% | 最后用来考试的,模型之前从未见过,模型训练完成后,评估其实际表现。 |
3.3. 网络架构设计 (Model Architecture)
根据任务类型选择或设计神经网络结构。
-
选择框架 :目前主流是 PyTorch (灵活、好调试)或 TensorFlow/Keras(工程化强)。
-
定义架构:
-
选择层类型:
-
全连接层 (Dense/Linear):处理通用特征。
-
卷积层 (Conv2D):处理空间特征(图像、频谱图)。
-
循环层 (LSTM/GRU):处理时间序列(语音、文本)。
-
-
激活函数:给网络注入非线性。例如 :
-
ReLU:隐层最常用,解决梯度消失。
-
Sigmoid/Softmax:用于输出层分类。
-
-
-
初始化权重:随机给网络里的参数赋初值,好的初始化能让收敛快一倍。
架构一般是根据经典的模型来修改的。
决定神经网络的"长相"确实是整个开发过程中最具创造力的部分。简单来说:你可以完全"手搓"一个架构,也可以在巨人的肩膀上进行"微调"。
对于初学者或有特定硬件限制(如你的 FPGA 背景)的开发者,建议遵循从"借鉴成熟架构"到"自定义修改"的过程。
1. 架构是自己写的吗?
在实际开发中,通常有三种选择:
完全自定义 (Custom Architecture) :如果你有一个非常特殊的任务(比如在极其有限的资源下识别特定的哨声频率),你可以从头开始堆叠
Conv2d、ReLU和MaxPool。这就像用乐高积木拼出一个全新的造型。经典背骨 (Backbones):直接套用学术界公认的结构(如 ResNet, MobileNet)。这些结构经过了成千上万次实验验证,性能非常稳定。
迁移学习 (Transfer Learning):直接拿别人训练好的模型(已经在数百万张图片上学过如何提取特征),你只需要把最后一层"分类头"换成你自己的(比如换成识别"哨声"和"环境音")。
2. 如何搭建:神经网络的"积木"逻辑
一个标准的卷积神经网络(CNN)通常由三部分组成:
A. 输入层 (Input Layer)
你需要告诉网络数据的大小。如果你把哨声转成了
的梅尔频谱图,那么输入就是
(1, 64, 64)(1代表单通道)。B. 特征提取层 (Feature Extraction / Backbone)
这是网络的主体,负责从原始信号中提取特征(如线条、频率跳变等)。
卷积层 (Convolution):像一个放大镜,滑动观察局部特征。
激活层 (Activation):通常用 ReLU(x) = \\max(0, x),目的是给网络增加非线性能力。
池化层 (Pooling):压缩图片尺寸,减少计算量,同时保留最重要的信息。
C. 分类层 (Classification Head)
全连接层 (Linear/Dense):将提取到的二维特征"拍扁"成一维向量。
Softmax 层:将输出转化为概率(比如:哨声 95%,噪音 5%)。
3. 从简单到复杂
如果你要实现哨声识别,以下是三个级别的参考架构:
级别一:入门级(类 LeNet-5)
适合初学者和资源极其匮乏的 FPGA 部署。
结构:2个卷积层 + 2个池化层 + 2个全连接层。
优点:参数极少(几万个),计算非常快,FPGA 逻辑资源占用低。
参考代码 (PyTorch):
self.conv1 = nn.Conv2d(1, 16, kernel_size=3) # 提取基础频率特征 self.pool = nn.MaxPool2d(2, 2) self.conv2 = nn.Conv2d(16, 32, kernel_size=3) self.fc1 = nn.Linear(32 * 14 * 14, 128) self.fc2 = nn.Linear(128, 2) # 输出两类:有哨声,无哨声级别二:工业级标杆(ResNet - 残差网络)
如果你发现网络加深后反而学不动了,ResNet 是救星。
核心 :残差连接 (Shortcut Connection)。它允许信息跨层传递,解决了深层网络的梯度消失问题。
参考场景:如果你需要极高的识别准确率,且不介意稍大的计算量。
级别三:硬件友好型(MobileNet / TinyML)
这是最推荐你关注的方向,因为它专门为移动端和嵌入式(FPGA 可能借鉴其思想)设计。
核心 :深度可分离卷积 (Depthwise Separable Convolution)。
参考价值 :它将标准卷积拆分为两步,计算量直接下降到原来的
到
,且准确率下降很少。
4. 针对 FPGA 部署的架构设计建议
既然你熟悉 Verilog 和信号处理,在搭建架构时需要特别考虑"硬件友好性":
权重的定点化 (Quantization Friendly):在搭建时尽量选择简单的激活函数(如 ReLU),避免使用 Sigmoid 或 Tanh,因为后者在 FPGA 上需要消耗大量的查找表(LUT)或复杂的浮点计算。
避免巨大的全连接层:全连接层非常吃内存(BRAM)。尽量多用卷积层减少尺寸,最后接一个小的全连接层。
步长 (Stride) 代替池化 :有时直接在卷积层设置
stride=2来降维,比专门加一个Pooling层在硬件实现上更简洁。算力对齐:尽量让通道数(Channel)是 8、16 或 32 的倍数,这样在 FPGA 并行处理(PE 阵列)时效率最高。
搭建工具推荐
- 可视化工具 :使用 Netron。你可以下载别人的模型文件(.onnx 或 .h5),直接把文件拖进去,就能看到清晰的架构图。
网站地址:saved_model.pb
- 代码参考 :在 GitHub 搜索
Simple Audio Classification PyTorch,你会看到很多现成的、专门针对声音识别优化过的精简架构。
3.4. 编译模型 (Model Compilation)
在训练开始前,需要配置三个核心要素:
-
损失函数 (Loss Function) :衡量预测值
与真实值
的差距。
-
回归:均方误差
-
分类:交叉熵
-
-
优化器 (Optimizer):决定如何更新权重。
- 常用:Adam (自适应)、SGD (随机梯度下降)。
-
评价指标 (Metrics):如 Accuracy(准确率)、Recall(召回率)。
3.5. 模型训练 (Model Training)
模型开始在训练集上迭代。
-
正向传播:输入数据通过网络层,计算预测结果。
-
反向传播 :利用梯度下降法更新权重 W:
其中
是学习率(Learning Rate)。
-
超参数调节 :设置 Batch Size (每批处理样本数)和 Epochs(全量数据训练次数)。
3.6. 模型评估与调试 (Evaluation & Tuning)
观察训练曲线,判断模型状态:
-
欠拟合 (Underfitting):训练集和验证集准确率都很低。解决:增加模型复杂度、减少正则化。
-
过拟合 (Overfitting) :训练集表现极好,但验证集表现很差。解决:引入 Dropout 、L2 正则化或增加数据量。
3.7. 模型保存与转换 (Deployment Preparation)
-
格式导出 :将模型保存为
.pth(PyTorch)、.h5(TensorFlow) 或通用格式 ONNX。 -
量化/压缩:如果要在嵌入式设备或硬件(如 FPGA)上运行,通常需要将 浮点数转为 定点数。
