Highlight
Apple 在 iOS 17、iPadOS 17 和 macOS Sonoma 中为 Natural Language 框架引入了基于 BERT(Bidirectional Encoder Representations from Transformers)的多语言上下文嵌入模型,支持 27 种语言、三种文字系统,开发者可以用 Create ML 训练多语言文本分类和词标注模型,也可以将 BERT 嵌入作为输入层集成到 PyTorch 或 TensorFlow 模型中。
核心内容
问题:NLP 模型训练的语言壁垒
开发者在构建文本分类或词标注模型时,一直面临一个现实问题:每种语言都需要单独训练。你的 App 支持英语用户,训练了一个英语分类器;当意大利语、德语用户加入时,你需要重新收集数据、重新训练、重新部署。
更麻烦的是,小语种的训练数据往往稀缺。你想支持越南语或捷克语,但找不到足够的标注样本。传统静态嵌入(如 Word2Vec)只是简单的词到向量映射,无法利用语言间的相似性。
Apple 的方案:多语言 BERT 嵌入
BERT 的核心是 Transformer 架构中的多头自注意力机制(multi-headed self-attention)。它允许模型同时以多种方式关注文本的不同部分,根据上下文为同一个词生成不同的向量。“food” 在 “fast food joint” 和 “food for thought” 中会得到不同的嵌入向量。
Apple 训练了三个多语言 BERT 模型:
- 拉丁文字模型:覆盖英语、法语、德语、意大利语、西班牙语等
- 西里尔文字模型:覆盖俄语、乌克兰语等
- CJK 模型:覆盖中文、日文、韩文
总共支持 27 种语言。由于语言间的相似性,一种语言的训练数据对其他语言也有帮助——这被称为跨语言协同效应。
详细内容
用 Create ML 训练多语言文本分类器(06:54)
训练数据可以用 JSON、目录或 CSV 格式。下面是一个 JSON 格式的多语言训练数据示例:
[
{ "text": "Hey, want to grab lunch tomorrow?", "label": "personal" },
{ "text": "Ciao, vuoi pranzare domani?", "label": "personal" },
{ "text": "Meeting rescheduled to 3pm", "label": "business" },
{ "text": "La riunione è spostata alle 15", "label": "business" },
{ "text": "50% off all items this weekend!", "label": "commercial" },
{ "text": "¡50% de descuento este fin de semana!", "label": "commercial" }
]
关键点:
- 训练数据可以混合多种语言,BERT 嵌入会自动处理
- 标签可以是任意自定义类别,如情感、主题、优先级等
- JSON 格式最灵活,CSV 和目录结构也支持
在 Create ML app 中选择 BERT 嵌入作为算法(08:03):
// 在 Create ML app 的 Settings 标签页中选择:
// Algorithm: Transfer Learning
// Embedding: BERT
// Script: Latin (根据你的语言选择)
关键点:
- BERT 选项出现在 Create ML app 的模型参数中
- 需要选择对应的文字系统(Latin、Cyrillic 或 CJK)
- 多语言训练时选择 “automatic”,让模型自动检测语言
- 训练时间比传统 ELMo 嵌入长,但准确率更高
使用 NLContextualEmbedding API(09:42)
除了 Create ML,你也可以直接用 Natural Language 框架操作 BERT 嵌入:
import NaturalLanguage
// 查找适合英语的嵌入模型
let embedding = NLContextualEmbedding(language: .english)
// 检查模型是否已下载
if !embedding.hasAvailableAssets {
try? embedding.requestAssets()
}
// 获取模型属性
let dimension = embedding.dimensionality
let identifier = embedding.modelIdentifier
// 应用到文本
let string = "food for thought"
let result = try? embedding.embeddingResult(for: string, language: .english)
// 遍历每个词的嵌入向量
result?.enumerateTokens(in: string.startIndex..<string.endIndex) { vector, range in
print("Token: \(string[range])")
print("Vector dimension: \(vector.count)")
return true
}
关键点:
NLContextualEmbedding是 Natural Language 框架的新类language参数指定目标语言,框架会自动选择对应的 BERT 模型hasAvailableAssets检查模型资源是否已下载,首次使用可能需要下载requestAssets()可以主动触发下载,避免在推理时等待modelIdentifier是字符串,用于确保训练和推理使用同一个模型embeddingResult返回NLContextualEmbeddingResult,包含每个 token 的向量
将 BERT 嵌入用于 PyTorch/TensorFlow 模型(11:17)
BERT 嵌入可以作为通用输入层,集成到任何训练流程中:
import NaturalLanguage
import CoreML
// 步骤 1:在 macOS 上获取训练数据的嵌入向量
let embedding = NLContextualEmbedding(language: .english)
try? embedding.requestAssets()
let trainingTexts = ["example text 1", "example text 2"]
var embeddings: [[Double]] = []
for text in trainingTexts {
let result = try? embedding.embeddingResult(for: text, language: .english)
var vector: [Double] = []
result?.enumerateTokens(in: text.startIndex..<text.endIndex) { v, _ in
vector.append(contentsOf: v.map { Double($0) })
return true
}
embeddings.append(vector)
}
// 步骤 2:将嵌入向量传入 PyTorch/TensorFlow 训练
// 在 Python 中:
// import torch
// x = torch.tensor(embeddings)
// model = YourCustomModel()
// output = model(x)
// 步骤 3:将训练好的模型转换为 Core ML
// 使用 coremltools.convert()
// 步骤 4:在设备上推理时,再次使用 NLContextualEmbedding 获取输入嵌入
// 然后传入 Core ML 模型
关键点:
- 训练阶段在 macOS 上使用
NLContextualEmbedding提取嵌入向量 - 将向量作为 NumPy/PyTorch 张量传入你的模型训练
- 用 Core ML Tools 将训练好的模型转换为
.mlpackage - 推理阶段在设备上重复嵌入提取步骤,确保训练和推理使用同一个
modelIdentifier - Session 演示了用 BERT 嵌入微调 Stable Diffusion,实现多语言文生图
核心启发
-
为聊天 App 添加多语言消息自动分类:用 BERT 嵌入训练一个分类器,自动将用户消息分为个人、工作、广告等类别。为什么值得做:现代聊天 App 用户来自世界各地,传统方案需要为每种语言单独训练模型。BERT 的多语言能力让一套模型覆盖 27 种语言。怎么开始:收集各语言的消息样本,用 Create ML 选择 BERT 嵌入训练分类器,部署到 iOS 17+ 设备。
-
构建跨语言内容审核系统:用多语言 BERT 嵌入检测不当内容。为什么值得做:内容审核通常只覆盖主流语言,小语种成为盲区。BERT 的跨语言协同效应意味着即使小语种训练数据少,模型也能借助相似语言的知识获得不错效果。怎么开始:用英语和几种主流语言标注不当内容样本,用 BERT 训练分类器,测试其对未训练语言的泛化能力。
-
将 BERT 嵌入集成到自定义 Core ML 模型:如果你已经在用 PyTorch 训练模型,将 BERT 嵌入作为输入层替换传统的词嵌入。为什么值得做:BERT 的上下文感知能力远超静态嵌入,能显著提升模型在歧义文本上的表现。怎么开始:在 macOS 上用
NLContextualEmbedding提取训练数据的嵌入向量,替换现有模型的输入层,训练完成后用 Core ML Tools 转换。 -
实现设备端的多语言搜索增强:用 BERT 嵌入改进 App 内的文本搜索。为什么值得做:传统关键词匹配无法理解语义相似性。BERT 嵌入让”汽车”和”车辆”在向量空间中距离很近,实现语义搜索。怎么开始:为文档库预计算 BERT 嵌入向量,用户查询时计算查询文本的嵌入,用余弦相似度排序结果。
关联 Session
- Discover machine learning enhancements in Create ML — Create ML 的 BERT 文本分类和多标签图像分类
- Improve Core ML integration with async prediction — Core ML 的异步预测 API,提升模型推理的响应性
- Use Core ML Tools for machine learning model compression — 用模型压缩技术减小 BERT 模型的体积
评论
GitHub Issues · utterances