[WWDC23] 端智能 ML & Vision 更新一览

前言

同学们!过年了!过年了!专属于苹果开发者的一年一度的节日它来了!眼瞅着隔壁 GPT 在热火朝天的改变世界,好奇苹果在 ML 方面都做了啥?于是默默地点开了相关的 session 学习了解一下。

今年 ML 相关 session 的数量,对比起 Vision Pro 那叫一个少的可怜。不过看了一遍 ML 相关的 session 后,感觉从上层开箱即用的 API 到自己训练、部署一个端智能模型,苹果还是做了不少的优化和改进。总结出几个重点更新:

  • 人体姿态识别现在支持 3D 姿态识别了,你口袋中的私教可以更好的纠正你的动作了。除此之外,小猫小狗也支持姿态识别了。
  • Vision Framework 增加了前景分割的 API 以及可以精确到单个人的人物分割 API。
  • 语音识别可以自定语言模型了,可以让语言模型使用我们应用领域的短语和专业术语进行训练,提高语音识别准确性。
  • Create ML 支持了使用 BERT 嵌入的迁移学习算法。并且也支持将 BERT 作为 PyTorch 或 TensorFlow 的输入层进行训练并部署到端上使用。
  • Create ML 增加了新的预训练模型来作为图像的特征提取器,新的特征提取器可以提高分类器的准确性、训练速度并减少内存占用。Create ML 还新增了多标签图像分类器模板,训练出的模型可以同时预测多个标签。
  • Create ML 提供了新的数据增强的API,可以用于自定义数据增强流水线。可以帮助改善训练数据有限时模型的质量,提高模型的泛化能力。
  • Core ML Tools 新增了训练时压缩的 API,可以在保持模型性能的情况下,更好的平衡精度与压缩比。
  • iOS 17 优化了 Core ML 的底层推理引擎,无需重新编译模型或者修改代码,就可以带来预测性能的提升。
  • Core ML 新增了线程安全的异步预测 API,支持并发预测来提高吞吐量,提高预测性能。

Vision 相关更新

人体 3D 姿态识别

简单来说,就是 Vision Framework 新增支持了人体 3D 姿态识别,通过使用新的 API(VNDetectHumanBodyPose3DRequest),可以从图像中获取到由 17 个关节点组成的 3D 人体姿态。

并且还可以获取到图像拍摄时,相机相对于人的位置以及人体关节点在2D图像中的投影位置等信息。

详见 WWDC23 session:Explore 3D body pose and person segmentation in Vision

动物姿态识别

Vision Framework 从 iOS 13 开始就提供了动物识别的 api(VNRecognizeAnimalsRequest),它可以检测猫和狗,并提供识别动物的位置、标签信息以及置信度。

而进一步想了解动物的动作、行为等,该 API 就不能满足了。Animal Body Pose 是 Vision 中的一个新 API,通过 DetectAnimalBodyPoseRequest 返回动物身体关节位置的集合。该 API 支持猫和狗的识别,并返回包括尾巴、耳朵在内的 25 个动物身体关键点标志。

有了这些关键点后,我们便可以通过特定算法识别动物的行为,例如:

也可以在相机应用里,给狗狗戴上帽子和墨镜。或者结合电动手机云台,打造动物追踪应用。

详见 WWDC23 session:

图像对象分割

iOS 相册 app 里长按提取图片前景对象的功能,相信大家都体验过并且印象深刻。VisionKit 以及 Vision framework 使得我们自己的应用也可以拥有这样的能力。

VisionKit 提供了开箱即用的图片前景对象提取能力,只需要很少的代码,即可在我们自己的应用里实现同系统相册应用类似的体验。但是 VisionKit 对处理图片的分辨率有所限制。

而 Vision framework 作为一个更低级别的框架,提供了更加灵活和强大的 API,它可以成为图像编辑管线的一部分,例如使用 CoreImage 的管线。并且,它不像 VisionKit 那样限制图像的最大分辨率。

iOS 17 Vision framework 增加了用于人物分割的 API:VNGeneratePersonInstanceMaskRequest;以及用于前景提取的api:VNGenerateForegroundInstanceMaskRequest。

相较 iOS 15 Vision framework 里提供的人物分割 API(VNGeneratePersonSegmentationRequest),新的 API 可以为场景中的每个人提供单独的遮罩(MASK)。

输入 VNGeneratePersonSegmentationRequest VNGeneratePersonInstanceMaskRequest

不同于人物提取,前景对象提取的 api 并不专注于提取某一类事物,任何前景对象,都可能被提取。例如下图中,前景提取得到的遮罩,除了人物还包含汽车,他们共同组成了这张图片的前景部分。

正如前文提到,Vision 非常适合同 CoreImage 一起使用,我们可以用 Vision 提取前景,并使用 CoreImage 的 API 进行背景替换、前景增加光影等操作来生成一张新的图片。

详见 WWDC23 session:Lift subjects from images in your app

自定义语音识别的语言模型

在 iOS 10,我们可以通过 Speech Framework 提供的 API 进行语音识别。语音识别系统先将音频数据输入声学模型(Acoustic Model),生成音素表示,然后将音素表示转换为文本形式或转录。

由于一个音频数据可能对应多个音素表示,一个音素表示又可能对应多个转录,因此语音识别系统会使用语言模型,预测给定单词在一系列单词中出现的可能性,来消除歧义并提高识别的准确性。

Speech Framework 封装了整个语音识别过程,提供开箱即用的 API。但由于它并未单独针对某个领域进行优化和权重调整,它可能并不能适用于所有领域的应用。

Session 中举了一个国际象棋的例子,当玩家说出“Play the Albin counter gambit”时,语音识别器识别成了“Play the album counter gambit”。

Play the Albin counter gambit 是国际象棋开局的一种着法,其中棋手在将王兵前进两格后,将主教置于第七横线,并将车置于第二横线。这个着法以 19 世纪法国国际象棋大师路易斯·查尔斯·阿尔宾命名。

这是由于通用的语音识别模型在训练时,通常会使用大量音乐播放相关的指令,例如“Play the album xxx”,因此语言模型会优先认为这是一条音乐播放的指令。

从 iOS 17 开始,我们可以自定义 SFSpeechRecognizer 的语言模型了。我们可以通过新的 API,创建包含特定领域的短语或者专业术语的训练数据,还可以利用模板生成大量符合规则模式的样本。然后用这些样本训练并部署我们自定义的语言模型。并且,这个过程可以完全在用户设备本地完成,降低了隐私合规方面的风险。

通过自定义语言模型,我们可以让语音识别针对我们应用的领域进行针对性的优化,提高语音识别准确性。

详见 WWDC23 session:Customize on-device speech recognition

Create ML 以及 Core ML 的更新

Create ML 新增支持 BERT

从头开始训练一个大型模型可能需要数千小时、数百万的标注文件和相关专业领域的知识。而通过 Create ML 我们可以轻松快速的训练自己的机器学习模型。

Create ML 为常见的机器学习任务提供了各种模板,并且可以利用操作系统内置的高度优化后的模型。我们可以用它完成整个模型的开发工作流,例如模型训练、模型评估等。

对于文本分类来说,我们可以在 Create ML 中选择迁移学习算法,并使用一个已预训练的嵌入模型来作为特征提取器。今年,Create ML 新增了 BERT 嵌入模型,它使用数十亿带标注的文本样本进行了训练,并且支持多种语言,此外,BERT 还可以提高单语言文本分类器的准确性。

NLP 模型通常具有类似的流程:他们接收文本数据,通过一个输入层将其转换为数值特征表示,然后机器学习模型可以对其进行操作,并产生一些输出。

经过十几年的发展,输入层从静态词嵌入(word embeddings)发展到基于神经网络模型(例如 CNN 和 LSTM)的动态上下文词嵌入,然后到最近的基于 transformer 的上下文词嵌入。

此前,Create ML 已经支持基于 LSTM 的 ELMo 模型用于训练分类和标注。然而 BERT 诞生后,它在各类 NLP 比赛中疯狂屠榜,一时风头无两。

现在,Create ML 也支持了 BERT,它使用数十亿带标注的文本样本进行了训练,并且支持多种语言。使用 BERT 充当输入编码层,结合任务目标,增加不同功能的输出层联合训练,就可以完成不同的 NLP 任务。例如文本分类就是增加了分类器,出入句子,输出类别;阅读理解增加了一个全链接层,出入问题和文章,输出答案的位置。BERT 只需要根据任务进行微调即可。

通过 NLContextualEmbedding API,也可以将 BERT 作为 PyTorch 或 TensorFlow 的输入层进行训练,并使用 Core ML 提供的工具将结果转换为 Core ML 模型,然后部署到端上使用。

详见 WWDC23 session:Explore Natural Language multilingual models

新的多标签图像分类器

对于图像分类而言,我们同样可以使用迁移学习,并利用已预训练嵌入模型从图像中提取特征。最新版本的特征提取器,可以提高分类器的准确性,缩短训练时间,并减少存储提取特征所需的内存。

单标签图像分类器旨在预测描述图像内容的最佳标签。例如,它可以将此图像描述为狗或户外,但是只能选择一个。

而多标签图像分类器可以预测图像的一组对象、属性或标签。例如,下图包含狗、玩具、草地和公园。

Create ML 新增了多标签图像分类器模板,它可以帮助我们快速的完成模型的训练、评估和导出。该模版会使用新的特征提取器来提取特征,然后训练分类器。

新的特征提取器,可以提高分类器的准确性、训练速度和内存利用率。

最终训练出的模型,可以同时预测多个标签,如下图中的月亮仙人掌、厨房、桶状仙人掌和兔耳仙人掌:

数据增强(Data Augmentation):

为了获得泛化能力较好的模型,训练集中的图像应具有多种特征,如不同的光照条件、方向、背景等。但是要获取并标注这些图像,可能会非常耗时。

数据增强技术是一种通过让有限的数据产生更多的等价数据来人工扩展训练数据集的技术。 它是克服训练数据不足的有效手段,目前在深度学习的各个领域中应用广泛。

数据增强可以通过变换图像生成新的训练样本,例如可以通过翻转、裁剪、增加对比度,或者组合转换:

今年,数据增强添加了新的 API,我们可以用它来设计自定义的增强器。例如:结合图像的对象提取,我们可以设计一个随机切换背景图,切换主体位置、变换的增强器:

这样我们就得到了一系列不同场景下的训练样本。可以帮助改善训练数据有限时模型的质量,提高模型的泛化能力。

详见 WWDC23 session:Discover machine learning enhancements in Create ML

模型压缩

随着端智能应用的增多,越来越多的功能由 AI 驱动。单个应用内部署模型的数量在增多,同时每个模型的大小也在增加,这给空间占用、内存占用、应用性能等都带来了挑战。因此,优化模型的大小并保持在可控范围内是至关重要的。减小模型尺寸的好处有:在相同的内存占用下运行更多、更强大的模型、提高模型的运算速度。

一般来说,减小模型大小的方法,一种是设计一个更高效的模型架构,可以用更少、更小的权重实现良好的性能。另一种方法是压缩现有模型的权重。本 Session 主要讨论后者。

压缩模型权重有几种方法:

  1. 权重剪枝后,使用稀疏矩阵表示来更高效的打包权重:

    通过剪枝,将权重矩阵中的一些接近 0 的权值设为 0,这样我们就可以只存储非零值以及零的位置。模型的大小与引入的稀疏程度成线性关系下降。

  2. 通过量化减少存储权重的精度:

    对权重值进行缩放、偏移和舍入,将他们映射入一个更小的数据范围内,例如下图的 Int8 范围内。

  3. 通过使用调色板(权重聚类)减少存储权重的精度:

    将相近的权重值聚类到一起,并使用它们所属的簇中心值来表示。这些簇中心值存储在查找表中,原始的权重矩阵转换为一个索引表,其中每个元素指向相应的簇中心值。在下图的例子中,能够使用 2 位来表示每个权重,相对于 Float16 实现了 8 倍的压缩。

以上几种压缩方法,均为训练后压缩,且都是有损压缩,在高压缩率下,模型通常会出现预测准确性下降的问题。

为了克服在高压缩率下模型性能下降的问题,Core ML Tools 7,新增了训练时压缩的功能。使用新的 API,在预训练模型中插入一个压缩层(例如剪枝层),然后使用原来的训练数据和代码对其进行微调(fine-tune)。在对权重进行压缩时,对模型进行微调。压缩是逐渐引入的,并以可微分的方式进行,使权重能够重新调整以适应压缩。

训练后压缩 训练时压缩

训练时压缩可以在保持模型性能的情况下提供更好的压缩率:

训练后压缩 训练时压缩

详见 WWDC23 session:Use Core ML Tools for machine learning model compression

优化预测性能

iOS 17 优化了 Core ML 的底层推理引擎,无需重新编译模型或者修改代码,就可以带来预测性能的提升,提升幅度取决于模型和硬件。

对于开发者来说,需要注意的是模型的加载在延迟和内存方面可能代价高昂,因此应遵循:

  • 不要在主线程上加载模型,考虑使用异步加载 API。

  • 如果有连续多次的预测,建议复用模型,而不是每次预测都重新加载。

  • 如果暂时不再使用模型,可以卸载它,释放相应的内存。

Core ML 新增了线程安全的异步预测 API,支持并发预测来提高吞吐量,提高预测性能。但需要注意控制最大并发量,避免内存峰值过高。

详见 WWDC23 session:lmprove Core ML integration with async prediction

总结

又是 GPT 又是 MR 的,感觉脑子有点不够用学不过来了,加油加油。作为一个 ML 萌新,有理解错误的地方,还请大佬们不吝指正,多谢!

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MY4H1FUg' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片