WWDC Quick Look 💓 By SwiftGGTeam
Explore Natural Language multilingual models

Explore Natural Language multilingual models

观看原视频

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,实现多语言文生图

核心启发

  1. 为聊天 App 添加多语言消息自动分类:用 BERT 嵌入训练一个分类器,自动将用户消息分为个人、工作、广告等类别。为什么值得做:现代聊天 App 用户来自世界各地,传统方案需要为每种语言单独训练模型。BERT 的多语言能力让一套模型覆盖 27 种语言。怎么开始:收集各语言的消息样本,用 Create ML 选择 BERT 嵌入训练分类器,部署到 iOS 17+ 设备。

  2. 构建跨语言内容审核系统:用多语言 BERT 嵌入检测不当内容。为什么值得做:内容审核通常只覆盖主流语言,小语种成为盲区。BERT 的跨语言协同效应意味着即使小语种训练数据少,模型也能借助相似语言的知识获得不错效果。怎么开始:用英语和几种主流语言标注不当内容样本,用 BERT 训练分类器,测试其对未训练语言的泛化能力。

  3. 将 BERT 嵌入集成到自定义 Core ML 模型:如果你已经在用 PyTorch 训练模型,将 BERT 嵌入作为输入层替换传统的词嵌入。为什么值得做:BERT 的上下文感知能力远超静态嵌入,能显著提升模型在歧义文本上的表现。怎么开始:在 macOS 上用 NLContextualEmbedding 提取训练数据的嵌入向量,替换现有模型的输入层,训练完成后用 Core ML Tools 转换。

  4. 实现设备端的多语言搜索增强:用 BERT 嵌入改进 App 内的文本搜索。为什么值得做:传统关键词匹配无法理解语义相似性。BERT 嵌入让”汽车”和”车辆”在向量空间中距离很近,实现语义搜索。怎么开始:为文档库预计算 BERT 嵌入向量,用户查询时计算查询文本的嵌入,用余弦相似度排序结果。


关联 Session

评论

GitHub Issues · utterances