做安卓开发这几年,一个特别明显的感受是:AI与机器学习不再是算法团队或者后端同学专属的话题。现在的招聘 JD 里开始出现“了解端侧推理”“熟悉 TFLite 模型集成”“能接入大模型 API”之类的描述,产品需求里也越来越频繁地出现“智能识别”“自动分类”“AI 生成”这些词。很多安卓开发者不是不愿意接触 AI,而是被一堆术语拦在门外:特征、标签、训练、推理、过拟合、量化、TensorFlow Lite、ONNX、ML Kit……每个词单独看都能查到解释,连在一起就不知道跟自己的 APK 有什么关系。
这篇文章不打算讲数学推导,也不准备让你从零手搓神经网络。我要做的是把安卓开发者最容易碰到的 AI 与机器学习基础术语一次讲清,并且按照“概念 — 部署 — 集成 — 排查”的顺序,告诉你每个术语在真实项目里意味着什么。
1. 先分清 AI、机器学习、深度学习,再看安卓开发者关心哪一层
1.1 三层概念:目标、方法和分支
AI(人工智能)是最上层的目标,指的是让机器表现出类似人类的智能行为。机器学习是实现 AI 的一种主流方法,核心思路是让程序从数据里自动学习规律,而不是靠人工规则一条条写死。深度学习又是机器学习的一个分支,它用多层神经网络处理复杂数据,图像识别、语音识别、大语言模型基本都是深度学习的成果。
三者的关系可以理解为:人工智能是你要去的地方,机器学习是交通工具,深度学习是其中一条高速公路。
安卓开发者要区分这三层,不是因为考试要考,而是因为落地难度完全不同。如果需求只是做一个简单的关键词分类,机器学习里的朴素贝叶斯、逻辑回归就够用;如果需求是实时识别图片里的物体,基本就要上深度学习模型。很多项目失败,不是模型不够好,而是需求方把“AI 功能”想得太笼统,开发者没有把问题拆到具体方法层。
1.2 算法、模型、权重、架构,术语先对齐
团队协作时,这四个词经常被混用,但它们的含义差别很大:
- 算法:解决问题的计算方法,比如决策树、卷积神经网络(CNN)都算算法。
- 模型:算法在数据上训练之后得到的结果,通常表现为一个文件。
- 权重:模型文件里最重要的数值,训练过程就是在不断调整这些数值。
- 架构:模型的整体结构设计,比如多少层、每层做什么操作。
我举一个安卓开发者熟悉的类比:算法像设计模式,模型像写好的 APK 文件,权重像 APK 里的资源文件,架构像整个项目的模块结构。你集成一个模型时,其实是在使用别人训练好的成果文件,并不需要重新实现算法。
这直接关系到后续沟通。当算法同学说“这个模型效果不好”,他可能说的是权重需要重新训练;当他说“这个架构不支持端侧推理”,他指的是模型结构太大,手机跑不动。两种问题的解决方式完全不同。
1.3 训练和推理:一半术语都在说这两个环节
训练(Training)是模型从数据中学习规律的过程,需要大量标注数据、算力和时间。推理(Inference)是模型训练完成之后,对新输入做预测的过程,安卓端集成模型时做的几乎全是推理。
很多安卓开发者第一次接触模型,误以为自己需要懂训练,于是去啃优化器、损失函数、反向传播,结果越看越迷茫。实际上,如果没有自训练需求,你只需要理解推理流程:加载模型文件 → 把输入数据预处理成模型要求的格式 → 跑一次前向计算 → 解析输出结果。
但这不代表训练术语完全不用了解。产品需求里经常出现“准确率”“召回率”“误识别率”,这些指标来自训练和测试阶段。你至少要知道准确率不等于一切,比如一个物品识别模型对 A 类物品识别很好,对 B 类物品几乎识别不出来,整体准确率可能还是很高,因为 A 类样本占了大头。这时候如果你只盯着一个数字,上线后就会出问题。
2. 数据与效果术语:特征、标签、数据集、过拟合
2.1 样本、特征、标签:训练过程怎么“喂”数据
机器学习训练的基本单位是样本。一个样本就是一条数据,比如一张图片、一段文本、一条用户行为记录。
特征是样本里用来做判断的信号。比如判断一封邮件是不是垃圾邮件,特征可以是“是否包含敏感词”“发送频率”“链接数量”。图像任务里,特征可能是像素值、边缘信息、纹理信息。传统机器学习需要人工设计特征,深度学习则可以自动从原始数据里提取特征,这也是它有巨大优势的原因。
标签是样本对应的正确答案。有标签的数据叫监督学习,没有标签但按相似程度分组叫无监督学习,只有部分标签的叫半监督学习。
安卓开发者接触到的成熟模型,绝大多数是基于监督学习训练出来的。比如人脸检测模型,训练时输入的是人脸图片(样本)、人脸位置框(标签);文本分类模型,输入的是句子(样本)、类别编号(标签)。
在做模型选型时,你要先确认一件事:你要处理的数据是什么类型,输出期望是什么。图片分类、目标检测、文本分类、文本生成、语音识别,背后是完全不同的模型结构,不能拿一个通用模型硬套。
2.2 训练集、验证集、测试集:为什么不能共用一份
数据会被分成三份:
- 训练集:用来训练模型,让模型学习参数。
- 验证集:训练过程中用来调整超参数、选择模型版本,防止模型只记住训练数据。
- 测试集:模型训练完成后,用来模拟真实场景评估效果,测试集绝不能在训练阶段使用。
这个原则和安卓开发里的测试环境很像。你不会只在自己手机上测一遍就发版,至少要分开发环境、测试环境、生产环境。数据划分也是同样的道理:如果用同一份数据既训练又测试,模型相当于“背下了答案”,测试分数再高也不能说明真实效果。
判断一个模型值不值得集成,不要只看算法同学给的测试报告,要关注测试集是什么来源、是否覆盖了你真实业务里的数据分布。如果测试集里全是白天拍摄的照片,而你的应用用户大量在晚上使用,效果一定会打折扣。
2.3 过拟合、欠拟合、泛化:模型精度判断的基本功
过拟合(Overfitting)是模型把训练数据里的细节和噪声都记住了,换一批新数据就表现很差。症状是训练集准确率极高,测试集准确率明显下降。
欠拟合(Underfitting)是模型太简单,连训练数据都没有学好,训练集和测试集的准确率都很低。
泛化能力(Generalization)是模型在新数据上的表现能力。所有模型训练的目标,不是“记住训练数据”,而是“在没见过的新数据上做对”。
安卓集成场景里,过拟合问题经常表现为:用官方 Demo 图片测试效果很好,换成自己手机拍的图片或真实业务图片,识别结果完全不对。这不一定是集成代码有 bug,也可能是模型训练数据分布与你的输入差异太大。
这时候不要急着改代码,先做对比测试:用模型自带的样例图片跑一遍,再用真实输入跑一遍。如果样例正常、真实输入异常,大概率是数据分布不匹配,而不是推理代码的问题。
3. 端侧部署术语:从 PyTorch 文件到 APK 里的可用模型
3.1 端侧推理与云端推理该怎么选
端侧推理(On-device Inference)是指模型直接运行在手机上。云端推理(Cloud Inference)是指手机把数据上传到服务器,由服务器运行模型并返回结果。
两者不是替代关系,而是不同约束下的选择。我在实际项目中一般这样判断:
| 场景 | 推荐方式 | 原因 |
|---|---|---|
| 离线可用、低延迟、隐私敏感 | 端侧推理 | 不上传数据,不依赖网络,响应快 |
| 超大模型、复杂任务 | 云端推理 | 手机内存装不下大模型,或端侧算力不够 |
| 网络稳定、对实时性要求不高 | 云端推理 | 开发和迭代成本低 |
| 混合场景 | 端云协同 | 简单任务端侧做,复杂任务上云 |
端侧推理最大的吸引力是隐私和实时性。人脸解锁、手势识别、实时翻译这类功能,如果每次都要上传服务器,用户网络稍差就卡顿,还容易引发隐私质疑。但端侧也有代价:包体变大、内存占用上升、老机型性能不足、模型更新需要发版。
理解这个对比后,你就知道为什么业内现在特别强调端侧部署。不是所有场景都适合端侧,但适合端侧的场景,体验优势非常明显。
3.2 TensorFlow Lite、ML Kit、ONNX Runtime 实际定位
这三个是安卓开发者最容易遇到的端侧推理框架。
TensorFlow Lite(简称 TFLite)是 Google 推出的端侧推理框架,专门针对移动和嵌入式设备做了优化。它支持的模型格式是 .tflite。如果你手里的模型是 TensorFlow 训练的,转成 TFLite 非常顺。
ML Kit 是 Google 提供的移动端 SDK,封装了常见的视觉、文本、条码识别能力。它的特点是不用关心底层模型怎么部署,直接调用 API 即可,非常适合快速验证功能。
ONNX Runtime 是微软主导的跨平台推理引擎,支持 ONNX 格式模型。ONNX 是一个开放模型交换格式,很多框架都能导出,所以如果你的模型来自 PyTorch、TensorFlow 或其他框架,ONNX Runtime 是一个折中方案。
选型建议很简单:如果不是重度定制,先用 ML Kit 验证效果;如果模型需要深度定制,优先考虑 TFLite;如果团队模型训练强依赖 PyTorch,可以用 ONNX Runtime 或者先把模型转换为 TFLite。
3.3 模型格式与转换链路:.pt、.onnx、.tflite
模型文件后缀就是格式的标识。常见的有:
- .pt / .pth:PyTorch 的模型权重文件。
- .h5 / .pb:TensorFlow 旧版本格式。
- .onnx:ONNX 开放交换格式。
- .tflite:TensorFlow Lite 格式,端侧部署的常见选择。
安卓开发者经常遇到的情况是:算法同学给一个 PyTorch 的 .pt 文件,而你需要集成到安卓。这时候不能直接把 .pt 文件放进 assets,要找算法同学或者自己完成转换链路。
一个典型的转换路径是:
PyTorch 模型 (.pt) ↓ 导出为 ONNX ONNX 模型 (.onnx) ↓ 转换为 TFLite TFLite 模型 (.tflite)这是常见的转换链路示例,实际操作时还要确认算子兼容性。有些模型包含端侧推理框架不支持的算子,转换会失败,这时候要么换模型结构,要么用可替代的自定义算子。
我在实际项目里踩过几次坑之后,建议团队约定:模型交付物统一为 .tflite 文件,附带输入输出格式说明、量化方式和测试数据。这样算法和开发之间就有一份明确的交付接口。
3.4 量化、剪枝、知识蒸馏:端侧模型压缩的三板斧
手机资源有限,原始模型往往太大、太慢,需要压缩后才能上端侧。
量化(Quantization)是把模型里的浮点数参数从比如 32 位降到 8 位或更低,从而减少模型体积,提高推理速度。常见做法是训练后量化(Post-training Quantization),实现简单,但精度可能有轻微下降;更稳的是量化感知训练(Quantization-aware Training),训练时就把量化误差纳入考虑,精度损失更小。
剪枝(Pruning)是去掉模型中不重要的连接或神经元,让模型变小。知识蒸馏(Knowledge Distillation)是让一个大模型“教”一个小模型,把小模型训练到接近大模型的效果。
这三个词在安卓项目里的意义是:你可能不会亲自做这些操作,但你要能听懂算法同学在做什么。当模型体积还是 80MB,撑爆了 APK 大小限制,这时候讨论的不是“优化代码”,而是“量化 + 剪枝”。如果你什么都听不懂,只能干等结果。
注意:量化不是零成本。模型体积变小后,识别精度可能会有轻微下降。上线前一定要用真实业务数据重新做一轮测试,不能只看体积和速度。
4. 性能与运行术语:延迟、FLOPS、CPU/GPU/NPU、线程配置
4.1 延迟和吞吐:衡量端侧推理体验的核心指标
延迟(Latency)是指从输入数据进入模型到拿到输出结果的时间,通常以毫秒为单位。对安卓应用来说,单次推理延迟直接决定用户体验。人脸解锁超过一两秒,用户就会觉得卡顿。
吞吐(Throughput)是指单位时间内能处理的数据量,通常以每秒处理多少张图片或多少条文本衡量。如果应用需要连续处理视频帧,比如实时滤镜、实时识别,吞吐量比单次延迟更重要。
大多数情况下,你要先确认需求更看重延迟还是吞吐。拍照识物只需要低延迟;视频流识别除了低延迟,还要求高吞吐,否则画面会掉帧。优化方向不一样,不要混在一起谈。
我在集成模型时,会先用一个测试页面统计几十次推理耗时,看平均值、最大值和最小值。只看平均值很容易漏问题:如果某几帧突然跑了 200ms,而平均值只有 80ms,用户感受到的卡顿就是那几帧带来的。
4.2 FLOPS、TOPS、模型大小:纸面算力不等于真实速度
FLOPS 是每秒浮点运算次数,TOPS 是每秒万亿次操作。它们是衡量硬件算力的理论指标,不是实际推理速度。
判断模型在某一台手机上跑得快不快,最准确的依据是实际运行时间。理论算力高,不代表框架优化得好;模型体积小,也不一定推理就快。有些模型被压缩后,体积变小但计算量没变多少,推理耗时几乎不降。
安卓开发者只要记住:纸面指标用于选型和对比,真实体验必须跑测试机。同一个模型在不同芯片、不同系统版本上的表现差异可能很大,不要拿一台旗舰机的测试结果代表所有用户。
4.3 CPU、GPU、NPU 与 Android 设备上的调度
手机上的计算单元主要分三类:
- CPU:通用计算,灵活,但并行计算能力有限。
- GPU:并行计算能力强,适合图像和矩阵计算。
- NPU:专门为神经网络计算设计的加速器,能效比高。
推理框架通常会尝试用 GPU 或 NPU 加速,但不是所有模型、所有机型都支持。TFLite 里有 GPU 代理和 NNAPI,NNAPI 是 Android 系统提供的神经网络 API,可以调用底层的 NPU 或 GPU。
这条术语链在项目里的实际含义是:你设置一个“使用 GPU 加速”的选项,不代表每台手机都能成功。代码里要做回退逻辑,硬件不支持时自动切回 CPU 推理。很多端侧应用闪退或黑屏,就是没有做好这个回退。
4.4 多线程、内存占用、耗电:实战里最容易翻车的点
端侧推理不是只占 CPU 时间,还会影响内存和电池。模型加载进内存后,占用的空间可能远大于文件本身的体积;推理过程如果持续占用多核 CPU,手机会发热,耗电会明显加快。
我在项目里一般按这个顺序排查:
- 模型加载时间是不是发生在启动阶段?如果是,会导致冷启动变慢。
- 推理是同步执行还是异步执行?如果放在主线程,会卡 UI。
- 要不要限制并发数?多个任务同时在模型上推理,可能相互争抢资源,反而更慢。
- 输入图片是否被缩放过?大图直接送进模型,内存和时间都会爆炸。
注意:不要一上来就开最大并发,先用一条样例确认输入、输出和日志都正常,再根据内存和耗时数据调整并发数。
5. 安卓项目接入 AI 模型的落地顺序和排查清单
5.1 需求拆解:把“加一个 AI 功能”变成具体任务
产品经理说“给应用加一个人脸识别”,这个需求看起来很明确,但落地时至少要拆成这些子问题:
- 是需要检测人脸位置,还是需要识别具体是谁?
- 需要在视频流里实时检测,还是只处理拍照后的静态图片?
- 需要离线运行,还是可以联网?
- 识别结果要求多高的准确率?
- 用户误识别时,应用该怎么处理?
每个问题都对应不同的模型和方案。检测人脸位置用目标检测模型;识别是谁用 face embedding 加比对算法;视频流实时处理需要轻量模型加高效调度;离线运行决定不能依赖云端接口。
拆完需求再谈技术选型,否则很容易出现:辛苦接了一个大模型,结果需求其实一个小模型就能满足;或者反过来,需求方以为手机能搞定,实际需要服务器资源支持。
我刚开始接触 AI 项目时,最大的错误就是拿到一个项目就直接搜“哪个模型最牛”,而不是先问“这个问题被完整定义了吗”。后来我养成了一个习惯:所有 AI 需求先写成一段白名单描述,包括输入、输出、边界条件、失败表现,再让算法和产品一起确认。
5.2 最小 Demo 先跑通,再谈优化
不管最终方案多复杂,我建议按三步走:
第一步,用最小样例验证模型。下载官方 demo APK,或者用一个最简单的测试页面加载模型,输入一张样例图片,确认输出能解析出来。
第二步,替换成真实输入。用用户最常上传的图片、文本或视频帧测试,确认模型在真实数据分布上可用。
第三步,再考虑优化。模型转换、量化加速、多线程调度、缓存策略,全部在功能正常之后再做。
这个顺序可以避免一个非常常见的坑:项目一开始就陷入性能优化,改了三天后发现模型输出本身就不对,之前的优化全部白费。先保证“结果能对”,再追求“速度够快”。
5.3 模型输出异常时的排查顺序
如果应用里模型推理结果不对或者直接报错,我建议按这个顺序排查:
- 先看输入前处理:图片尺寸是否被缩放到模型要求的尺寸?像素通道顺序是不是 RGB?数据是否归一化到模型要求的范围?
- 再看输出后处理:模型输出是概率分布还是坐标框?需要做 argmax 还是阈值过滤?
- 查看日志:TFLite 和 ONNX Runtime 会打印算子、输入输出形状、设备选择信息,很多时候问题在日志里已经写清楚了。
- 对比官方 demo:同一个模型在官方 demo 上能跑通,说明模型文件本身没问题,问题出在你的集成代码。
- 检查模型版本:是不是模型文件被替换过?输入尺寸和标签列表是否和模型配套?
很多“模型不准”的报错,最后定位到的是前处理逻辑写错,比如没有归一化、图片缩小后变形、输入类型填错。这一行代码,往往要花两三天才能发现。
5.4 给安卓开发者的术语速查表和小项目建议
最后整理一份速查表,方便你日常回看:
| 术语 | 简单理解 | 安卓项目中的关注点 |
|---|---|---|
| 训练 | 模型学习规律的过程 | 一般由算法团队完成 |
| 推理 | 用模型对新数据做预测 | 安卓端集成的主要环节 |
| 特征 | 样本中用于判断的信号 | 前处理阶段要把数据转成模型需要的特征 |
| 标签 | 样本的正确答案 | 后处理阶段要把预测值映射回标签 |
| 过拟合 | 模型记住训练集,新数据表现差 | 真实数据测试才能发现 |
| 量化 | 降低模型参数精度来压缩模型 | 模型更小更快,但精度可能下降 |
| TFLite | 端侧推理框架 | 最常用的模型集成方式之一 |
| ML Kit | Google 免维护 SDK | 快速验证功能时可优先选 |
| ONNX | 开放模型交换格式 | 不同框架模型转换的中间桥梁 |
| 延迟 | 单次推理耗时 | 直接影响用户体验 |
| 吞吐 | 单位时间处理任务量 | 视频流处理时很关键 |
如果你想从零开始接触安卓 AI 开发,不建议第一天就去读卷积神经网络的原理。更推荐的路径是:先选一个极简任务,比如在图片里识别手写数字,用 ML Kit 或者现成的 TFLite 模型跑通集成流程;然后逐步了解模型文件、输入输出、前后处理和性能分析;最后再回到术语表,你会发现大部分概念都能对应到实际操作上。
等这一轮走下来,你再看算法团队的讨论,就不会再被“模型、训练、量化、推理”这些词劝退了。