想象一位在五星级酒店掌勺十年的老厨师走进你家厨房。切丝、颠勺、辨别油温,他闭着眼都会——你要教的,只是“你最爱的那道家常菜”的独家口味。更妙的是,这位老厨师全程在你家厨房里操作:食材不出家门,菜谱不外传,做好的菜也只有你和家人享用。 这就是“浏览器里的迁移学习”。过去训练 AI 模型需要海量数据、昂贵的 GPU 服务器;而现在,借助 TensorFlow.js,我们可以把一位“见多识广的老厨师”(预训练模型,如 MobileNet)直接请进用户的浏览器。用用户设备上收集到的少量样本(小样本)做“微调”,就能产出一个属于用户自己的个性化模型——数据全程留在本地,不传给服务器。 这篇文章里,你会看到一条完整的“浏览器迁移学习”路线图:从迁移学习的基本思想,到数据准备、模型加载、微调训练、隐私保护,再到最后部署成 Web 应用。全程用一个“老厨师入驻你家厨房”的故事串起来,让一个从未接触过 AI 的初学者,也能在读完时亲手在浏览器里跑起自己的个性化模型。

岗位关联

掌握 Web 端小样本迁移学习,意味着你能用极低的成本为用户端提供个性化 AI 能力:数据不出设备、秒级训练、即插即用——这是未来前端 AI 工程师的核心竞争力之一。

目录
  1. 可视化演示
  2. 迁移学习思想:老厨师的看家本领
  3. 数据准备策略:冰箱里的剩菜也能做一桌
  4. 预训练模型加载:自带工具的老厨师
  5. 微调训练优化:调火候学新菜
  6. 隐私保护机制:在家练菜菜谱不外传
  7. 部署与应用:私厨上菜开张营业
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

本节配有交互动效(进入视口后自动加载,约 3KB)。

Web端迁移学习架构 冻结层 (Frozen) - 特征提取可训练层 (Trainable) - 分类器微调浏览器环境冻结层 (Frozen) - 特征提取冻结层 (Frozen) - 特征提取可训练层 (Trainable) - 分类器微调浏览器环境冻结层 (Frozen) - 特征提取 冻结层 (Frozen) - 特征提取可训练层 (Trainable) - 分类器微调浏览器环境冻结层 (Frozen) - 特征提取冻结层 (Frozen) - 特征提取可训练层 (Trainable) ...

迁移学习思想:老厨师的看家本领

想象一位在五星级酒店掌勺十年的老厨师走进你家厨房。切丝、颠勺、辨别油温,他闭着眼都会——你要教的,只是“你最爱的那道家常菜”的独家口味。这里的“老厨师”就是预训练模型:它在 ImageNet 上见过上千万张图片,早就学会了识别边缘、纹理、物体轮廓这些通用本领。

这就是迁移学习(Transfer Learning):把在大型通用数据上学到的知识,迁移到一个数据稀少的特定任务上。如果让 AI 从零开始学识别你的个人物品,动辄需要上万张标注图和几块 GPU;而迁移学习只需加载一个预训练模型作为起点 $\theta_0$,再用你的几十张图片做小步调整即可。

在数学上,微调的目标是找到一个新参数 $\theta^*$,既要在你的小样本集上表现好,又不能偏离预训练知识太远。于是优化目标里多了一项“别忘本”的距离约束:

老厨师不会因为你尝了两道菜就把刀工火候全部推翻重来,对吧?正则项起的就是这个作用——学新菜和保老本,缺一不可,而迁移学习的艺术,就藏在这个平衡里。

θ∗=arg⁡min⁡θ  Ltarget(fθ;Dsmall)+λ∥θ−θ0∥2\theta^* = \arg\min_{\theta} \; \mathcal{L}_{\mathrm{target}}\big(f_{\theta}; \mathcal{D}_{\mathrm{small}}\big) + \lambda \big\lVert \theta - \theta_0 \big\rVert^2
直观理解:第一项是“新菜要合你口味”,第二项是“老手艺不能丢”。λ 越大,越不敢改动预训练参数。
  1. 目标参数$\theta^*$ 是微调完成后最终采用的模型参数,也就是老厨师学完新菜后的最终状态。
    θ∗=arg⁡min⁡θ(⋯ )\theta^* = \arg\min_{\theta} \left( \cdots \right)
  2. 目标损失$\mathcal{L}_{\mathrm{target}}(f_{\theta}; \mathcal{D}_{\mathrm{small}})$ 衡量模型在你少量样本上的错误程度,相当于“菜的味道和期望的差距”。
    Ltarget(fθ;Dsmall)\mathcal{L}_{\mathrm{target}}\big(f_{\theta}; \mathcal{D}_{\mathrm{small}}\big)
  3. 遗忘惩罚$\lambda \lVert \theta - \theta_0 \rVert^2$ 惩罚新参数偏离起点太远,防止为了迎合几个样本丢掉十年功底(过拟合)。
    λ∥θ−θ0∥2\lambda \big\lVert \theta - \theta_0 \big\rVert^2
  4. 最优求解$\arg\min_{\theta}$ 表示在参数空间里不断尝试,找到让上面两项相加最小的那个参数组合。
    arg⁡min⁡θ\arg\min_{\theta}

数据准备策略:冰箱里的剩菜也能做一桌

打开你家冰箱,只剩三五种主要食材——几十张照片,每类可能不超过 50 张。老厨师不慌:他把土豆既切丝又切块还压成泥,同一份食材换着花样练习,愣是练出了一整套新菜。这套“一菜多吃”的打法,就是数据增强(Data Augmentation)。

数据准备阶段通常包含四件事:收集样本、整理标签、数据增强、划分训练/验证集。在 TensorFlow.js 中,可以用 tf.image 系列 API 对图片做随机翻转、旋转、裁剪、亮度调整,让同一张图“变出”多个等价训练样本,显著缓解小样本过拟合。数据量不足时,这种做法相当于把“练习次数”成倍放大。

数学上,增强就是把原始样本 $x^{(i)}$ 映射成一个随机变换后的样本 $\tilde{x}^{(i)}$:

但注意,把同一块土豆做成一百道菜,本质上还是同一块土豆。增强只是把“练习的丰富度”做上去,无法凭空创造新的信息——真实世界里的数据多样性,依然要靠用户提供。

x~(i)=Tk(x(i)),k∼Uniform(1,4)\tilde{x}^{(i)} = T_k\big(x^{(i)}\big), \quad k \sim \mathrm{Uniform}(1, 4)
直观理解:每次训练撞见同一张图时,它可能被翻转、被旋转、被裁剪或换了亮度——模型看到的永远是“略有不同的同一道菜”。
  1. 原始样本$x^{(i)}$ 是你收集到的第 $i$ 张原始图片,它代表“原始食材”。
    x(i)∈Dsmallx^{(i)} \in \mathcal{D}_{\mathrm{small}}
  2. 随机变换$T_k$ 是第 $k$ 种图像变换函数,比如水平翻转、小角度旋转、随机裁剪、色彩抖动。
    Tk(⋅),k∈{1,2,3,4}T_k(\cdot), \quad k \in \{1, 2, 3, 4\}
  3. 均匀采样$k \sim \mathrm{Uniform}(1, 4)$ 表示每次训练时等概率随机选一种变换,增加多样性。
    k∼Uniform(1,4)k \sim \mathrm{Uniform}(1, 4)
  4. 增强样本$\tilde{x}^{(i)}$ 是变换后生成的“新练习素材”,它和原始样本共享同一个标签 $y^{(i)}$。
    x~(i)=Tk(x(i))\tilde{x}^{(i)} = T_k\big(x^{(i)}\big)

预训练模型加载:自带工具的老厨师

老厨师登门时,背着一个巨大的工具箱:各种型号的刀、锅、炉具——他就是 MobileNet。MobileNet 用深度可分离卷积大幅压缩参数体量(几 MB 到十几 MB),在浏览器里下载快、推理顺。他的“工具箱”就是卷积层学到的特征:从边缘、纹理,到眼镜、轮子这样的部件级概念。

在 TensorFlow.js 中,加载模型只需一行 const base = await mobilenet.load();。通过 truncated 选项可以丢掉 MobileNet 原始的 1000 类分类头,只保留特征提取层;随后我们接上自己的全连接层(分类头),为新任务量身定做输出。整个过程像是:工具全是现成的,只换一张“菜谱封面”。

从数学上看,整个前向过程可以拆成两步——先用预训练特征提取器 $F_{\theta_f}$ 把图片压缩成特征向量 $h$,再用新分类头 $W_{\mathrm{head}}$ 把特征映射成类别得分:

老厨师进厨房,刀具是现成的,只有“调味配方”(分类头)是空白的。你在浏览器里复用的,正是那套经过千万张图片锤炼的“刀具箱”。

h=Fθf(x),y^=Whead⊤h+bheadh = F_{\theta_f}(x), \quad \hat{y} = W_{\mathrm{head}}^{\top} h + b_{\mathrm{head}}
直观理解:老厨师(特征提取器)先“看”出这道菜的本质(特征向量),然后由你指定的调味配方(分类头)决定它属于哪一类。
  1. 特征提取器$F_{\theta_f}$ 是 MobileNet 中固定的卷积层组合,负责把像素图片变成有意义的特征。
    Fθf:R224×224×3→R1024F_{\theta_f}: \mathbb{R}^{224 \times 224 \times 3} \to \mathbb{R}^{1024}
  2. 特征向量$h$ 是图片的“数字摘要”,包含边缘、纹理、形状等高层信息,相当于厨师对食材的直觉。
    h=Fθf(x)h = F_{\theta_f}(x)
  3. 分类头权重$W_{\mathrm{head}}$ 和 $b_{\mathrm{head}}$ 是新建全连接层的权重与偏置,初始化为随机值,是唯一需要从头学习的部分。
    Whead∈R1024×C,bhead∈RCW_{\mathrm{head}} \in \mathbb{R}^{1024 \times C}, \quad b_{\mathrm{head}} \in \mathbb{R}^{C}
  4. 预测输出$\hat{y}$ 是模型对类别的打分向量,经过 softmax 后变成各类别的概率。
    y^=Whead⊤h+bhead\hat{y} = W_{\mathrm{head}}^{\top} h + b_{\mathrm{head}}

微调训练优化:调火候学新菜

老厨师学新菜时,刀工火候这些基本功保持不变(冻结底层),只有调味——由新菜谱决定的部分——要重新学。这就是微调的训练策略:先冻结、再分层、用小学习率慢慢调。

在 TensorFlow.js 中训练流程通常这样:先设置 base.trainable = false 冻结特征层,用 Adam 或 SGD 优化器(学习率 0.001 量级,比从头训练小 10~100 倍)训练分类头 5~20 轮;如果想更精细,再解冻最后 1~2 个卷积块,用更小的学习率做第二轮微调。训练中持续监控验证损失,连续几轮不下降就早停——避免模型把几十个训练样本“背”下来。

无论哪种优化器,核心都是梯度下降的更新规则:每一步都顺着损失下降的方向调整参数,幅度由学习率控制。

火候大有讲究:大火猛炒(学习率过大)会把老厨师辛苦练就的本领“炒糊”;小火慢炖(小学习率)才能让新味道和旧功底融为一体。等验证损失不再下降,就该关火装盘了。

θt+1=θt−η ∇θL(fθt(x),y)\theta_{t+1} = \theta_t - \eta \, \nabla_{\theta} \mathcal{L}\big(f_{\theta_t}(x), y\big)
直观理解:每次尝一口菜,如果偏咸就往淡的方向调一点;调多少由学习率 η 决定,方向由梯度 ∇L 告诉。
  1. 当前参数$\theta_t$ 是第 $t$ 轮训练时的模型参数,代表老厨师当下的调味状态。
    θt\theta_t
  2. 损失梯度$\nabla_{\theta} \mathcal{L}$ 是损失函数对参数的偏导向量,指明“菜偏了、该往哪边改”。
    ∇θL(fθt(x),y)\nabla_{\theta} \mathcal{L}\big(f_{\theta_t}(x), y\big)
  3. 学习率$\eta$ 控制每一步调整的大小,微调时通常取 0.001 左右的较小值,避免步子太大冲过头。
    η=0.001∼0.01\eta = 0.001 \sim 0.01
  4. 参数更新$\theta_{t+1} = \theta_t - \eta \nabla_{\theta} \mathcal{L}$ 表示沿负梯度方向移动一小步,迭代若干轮后损失逐渐下降。
    θt+1=θt−η ∇θL\theta_{t+1} = \theta_t - \eta \, \nabla_{\theta} \mathcal{L}

隐私保护机制:在家练菜菜谱不外传

老厨师在你家厨房做菜,全程不迈出家门。你不用提心吊胆,担心他把你的独家口味记在公共菜单上——这是浏览器迁移学习最迷人的地方:数据不出设备。

具体实现上,训练数据只存在于浏览器内存与 tf.data.Dataset 管道里;图片不需要上传服务器,梯度更新完全在设备端完成。需要同步时(比如手机和电脑间共享模型),也只传输模型权重,而不是原始照片。进阶手段包括差分隐私(训练时给梯度加噪声,让单个样本的信息难以被还原)和联邦学习(多设备在本地训练后只上传参数更新,由服务器聚合再下发)。

本地训练的目标函数可以写成:只用设备上的样本求平均损失并最小化,整个过程中数据不离开浏览器。

就算要“上菜”给别人,也只是把学到的口味概要(模型参数)传出去,而不是把素材(原始照片)端上桌。这份“菜谱不外传”的坚持,正是 Web 端迁移学习最打动人的价值。

θ∗=arg⁡min⁡θ  1n∑i=1nℓ(fθ(x(i)),y(i)),x(i)∈设备本地\theta^* = \arg\min_{\theta} \; \frac{1}{n} \sum_{i=1}^{n} \ell\big(f_{\theta}(x^{(i)}), y^{(i)}\big), \quad x^{(i)} \in \text{设备本地}
直观理解:这桌菜是在你家厨房里练出来的——所有尝菜、调味、改刀都发生在本地,外人最多看到最后端上桌的成品(模型),看不到你冰箱里有什么。
  1. 本地样本$(x^{(i)}, y^{(i)})$ 是用户设备上的训练样本对,约束条件注明它们存放在“设备本地”。
    (x(i),y(i))∈Browserlocal(x^{(i)}, y^{(i)}) \in \mathrm{Browser}_{\mathrm{local}}
  2. 平均损失$\frac{1}{n} \sum_{i=1}^{n} \ell(\cdot)$ 是所有样本损失的算术平均,衡量模型在本地数据上的整体表现。
    1n∑i=1nℓ(fθ(x(i)),y(i))\frac{1}{n} \sum_{i=1}^{n} \ell\big(f_{\theta}(x^{(i)}), y^{(i)}\big)
  3. 最小化目标$\arg\min_{\theta}$ 表示只调整模型参数让平均损失最小,而不移动任何数据。
    arg⁡min⁡θ\arg\min_{\theta}
  4. 隐私边界$x^{(i)} \in \text{设备本地}$ 用数学语言划定了数据的安全边界——优化过程能“看到”数据,但数据始终留在设备上。
    x(i)∈设备本地x^{(i)} \in \text{设备本地}

部署与应用:私厨上菜开张营业

学成之后,老厨师把这道新菜的做法记在随身小本上。你在浏览器里,用一行 await model.save('indexeddb://my-model') 就能把权重存进 IndexedDB;下次打开网页,直接加载运行,就像老厨师随时等着给你上菜。

上线前通常还要“打包”:模型量化(Quantization)把 float32 权重转为 int8,体积缩小到约原来的 1/4,推理速度成倍提升;然后集成进 Web 应用的拍照、摄像头、拖拽上传等交互里。组合起来就是个性化推荐、图像分类、手势控制等端侧 AI 应用。由于训练和推理都在浏览器完成,首屏加载一次模型,之后便可离线使用。

量化操作在数学上等价于:用一个缩放因子 $s$ 把连续的权重 $w$ 映射到低比特整数 $w_q$,再通过反量化近似还原:

菜谱记牢了、调味量化了、菜单摆上桌——从“请厨师上门”到“随时点菜”,浏览器迁移学习的完整闭环就此打通。下次用户打开你的网页,迎接他的就是一位只认自家口味的专属私厨。

wq=round(ws),s=max⁡∣w∣2b−1−1w_q = \mathrm{round}\Big(\frac{w}{s}\Big), \quad s = \frac{\max |w|}{2^{b-1} - 1}
直观理解:把调味配方从“精确到克的笔记”简化为“几勺几撮的口诀”——虽然精度略降,但小本子更薄、翻起来更快。
  1. 全精度权重$w$ 是训练得到的 float32 权重,精度高但体积大。
    w∈Rw \in \mathbb{R}
  2. 缩放因子$s$ 用来把权重范围映射到量化区间,由最大绝对值除以量化等级数决定。
    s=max⁡∣w∣2b−1−1s = \frac{\max |w|}{2^{b-1} - 1}
  3. 取整运算$\mathrm{round}(\cdot)$ 把连续值四舍五入成整数,是信息压缩的关键步骤。
    wq=round(ws)w_q = \mathrm{round}\Big(\frac{w}{s}\Big)
  4. 位宽$b$ 是量化比特数,如 int8 时 $b=8$,权重范围被压缩到 256 个整数档位。
    b=8,wq∈[−128,127]b = 8, \quad w_q \in [-128, 127]

AI 应用场景

个性化物品识别

阶段:微调训练与部署

解决的问题:传统做法要把用户相册图片上传到云端重新训练,传输慢、存储贵,而且几乎没有用户愿意把私密照片交给服务器。借用“老厨师上门”的思路,把预训练模型推送到浏览器,用户拍几十张照片,本地微调几十秒,专属分类器即刻可用,原始照片永不离开设备。

具体案例:“整理衣橱”小程序:首次使用时用户拍 20~30 张衣物照片并标注类别;浏览器下载 MobileNet、冻结特征层、用 Adam(学习率 0.001)训练全连接分类头约 20 轮;之后每次拍照识别都在本地完成,平均响应小于 300ms,离线也能用。

无障碍手势控制

阶段:数据准备与增强

解决的问题:通用手势模型对特殊用户的手势差异不适应,为每位患者制作带标注的数据集成本极高。浏览器摄像头实时采集用户自定义动作几十帧,配合翻转、裁剪增强即可完成个性化微调,无需专业标注团队,也无需把视频传出浏览器。

具体案例:为渐冻症患者做的“眨眼控制板”:患者对摄像头做 3 个自定义表情各 10 次,系统用 TensorFlow.js 加载人脸关键点模型并微调分类头;随后眨眼 1 次等于点击、眨眼 2 次等于返回,全部推理在本地完成,响应延迟低于 200ms。

Python 演示

python41 行
import numpy as np def make_features(n, dim=16, seed=42):    # 模拟预训练模型(MobileNet)输出的特征向量    rng = np.random.default_rng(seed)    class0 = rng.normal([1.0] * dim, 0.4, (n, dim))    class1 = rng.normal([-1.0] * dim, 0.4, (n, dim))    X = np.vstack([class0, class1])    y = np.array([0] * n + [1] * n)    return X, y class SmallHead:    # 新分类头:老厨师基本功不动,只学新菜调味    def __init__(self, dim=16):        self.w = np.zeros(dim)        self.b = 0.0        self.t_count = 0     def forward(self, X):        return 1.0 / (1.0 + np.exp(-(X @ self.w + self.b)))     def train(self, X, y, lr=0.2, epochs=30):        for _ in range(epochs):            X_aug = X + np.random.normal(0, 0.05, X.shape)            p = self.forward(X_aug)            grad = (X_aug.T @ (p - y)) / len(y)            self.w -= lr * grad            self.b -= lr * float(np.mean(p - y))            self.t_count += 1     def acc(self, X, y):        pred = (self.forward(X) > 0.5).astype(int)        return float(np.mean(pred == y)) if __name__ == "__main__":    X_train, y_train = make_features(20)          # 小样本:每类仅20个    X_test, y_test = make_features(50, seed=7)    head = SmallHead(dim=16)    print("训练前准确率:", head.acc(X_test, y_test))    head.train(X_train, y_train, lr=0.2, epochs=30)    print("训练后准确率:", head.acc(X_test, y_test))
目的:用 Python 模拟“预训练特征 + 小样本分类头”的完整微调流程,演示了小样本情况下准确率如何从 50% 提升到 90%+。
  1. class0 = rng.normal([1.0] * dim, 0.4, (n, dim))生成模拟预训练特征的两类样本簇,相当于老厨师的“味觉印象”
  2. self.w = np.zeros(dim)分类头从零初始化,只有这个“调味配方”需要训练
  3. X_aug = X + np.random.normal(0, 0.05, X.shape)每轮给特征加小噪声,模拟数据增强扩大练习多样性
  4. p = self.forward(X_aug)前向传播得到预测概率
  5. grad = (X_aug.T @ (p - y)) / len(y)计算平均梯度,告诉模型“该往哪个方向调味”
  6. self.w -= lr * grad梯度下降更新参数,学习率 lr 控制调整幅度
  7. pred = (self.forward(X) > 0.5).astype(int)以 0.5 为阈值把概率转成类别
  8. X_train, y_train = make_features(20)每类只有 20 个训练样本,小样本场景的真实写照

常见误区

误区我以为迁移学习就是把下载好的 MobileNet 直接拿来做预测,根本不用训练。结果识别自己照片时效果很差,因为它根本不认识我的私人类别。

正解预训练模型是在 ImageNet 上学的通用知识,它认识猫狗不等于认识你的业务类别。迁移学习的关键是“复用特征 + 微调分类头”:旧知识作为起点,新数据让它“接上新脑袋”。就像老厨师会切菜,但你这道新菜的调味得专门教。

为何常见:多数人接触到的模型都是“下载即推理”,容易把“预训练权重”误当成“已经适配好你的任务”。

误区既然只有几十张图,我把每张图旋转、翻转、加噪声,复制出一千张,模型应该更准吧?

正解数据增强本质是用先验知识解释数据的变化,它不能凭空创造新信息。同一张原始图被复制出过多强噪声变体,模型会去背这些“伪样本”的细节,反而忽略真实分布。合理做法是每类几十到几百张,配合适度的翻转、旋转、裁剪和色彩抖动,并用验证集观察是否过拟合。

为何常见:数据增强是被广泛宣传的“炼丹秘诀”,但很少有人讲它的边界,于是“越多越好”成了普遍错觉。

误区浏览器跑训练不就是前端炫技吗?服务器 GPU 训练快几十倍,我直接用服务器不是更香?

正解对大规模任务确实服务器更快,但小样本微调往往只有几十到几百个样本,模型本身是 MobileNet 级别(几 MB 到十几 MB)。借助 WebGL,浏览器里微调通常几秒到几十秒就能完成,而且省去了上传数据的时间与带宽。更重要的是隐私价值:数据不出设备,很多场景(个性化推荐、医疗笔记、财务分类)根本不允许数据外传。

为何常见:人们习惯用“训练大模型”的直觉衡量所有训练,忽略了小样本端侧任务的规模优势。

误区只要我不把数据传到服务器,模型在本地训练,隐私就百分百安全了。

正解本地训练显著降低了隐私泄漏面,但模型权重本身可能“记住”训练样本的某些模式(如人脸的基本轮廓),攻击者可借此实施模型逆向攻击。进阶防护包括:差分隐私(训练时给梯度加噪)、联邦学习(多设备聚合更新再下发)、模型加密保存。安全是一场持续博弈,不是简单开关。

为何常见:“本地”听起来像保险箱,容易让人忽略机器学习模型的记忆特性。

误区我把 MobileNet 所有层都冻结,只训练最后一层输出层,这样训练参数最少,肯定不会过拟合。

正解训练参数少并不自动等于不会过拟合。如果目标域和预训练域差异较大(如卫星图 vs 日常照片),高层特征根本对不上,全冻结会导致欠拟合——模型连训练集都学不好。更稳妥的路线是:先冻结底层(通用纹理、轮廓特征),解冻后面 1~2 个卷积块做小学习率微调,同时用早停观察验证损失。

为何常见:“参数越少越安全”的说法流传很广,但泛化能力取决于数据、任务、模型三者是否匹配,而不是参数数量本身。

面试题

Q1. 迁移学习最核心的思想是什么?

单选题 · easy

  • A.从零开始搭建网络
  • B.复用预训练模型知识← 正确答案
  • C.无限放大训练数据集
  • D.只使用决策树分类器

答案:B。迁移学习的关键是复用预训练模型在通用数据上学到的特征(边缘、纹理、形状),再针对新任务做微调。A 是“从零训练”而非迁移;C 只谈数据量,不构成迁移思想;D 是决策树,与迁移学习无关。

Q2. Web 端小样本迁移学习常用的框架是?

单选题 · easy

  • A.TensorFlow.js← 正确答案
  • B.PyTorch
  • C.Caffe2
  • D.Theano

答案:A。TensorFlow.js 支持在浏览器中加载预训练模型并进行训练,是前端迁移学习的主流选择。PyTorch 和 Caffe2 主要面向服务端,Theano 已停止维护。

Q3. 小样本训练时需要数据增强,最直接的原因是?

单选题 · easy

  • A.提升模型压缩率
  • B.增加样本多样性← 正确答案
  • C.减少网络层数量
  • D.缩短浏览器加载时长

答案:B。数据增强通过翻转、旋转、裁剪等随机变换生成多个变体,缓解样本不足导致的过拟合。它与模型压缩、网络层数和加载时长没有直接关系。

Q4. 微调时“冻结”MobileNet 低层的主要原因是?

单选题 · mid

  • A.低层特征具有通用性← 正确答案
  • B.低层参数已经是零
  • C.低层不参与前向传播
  • D.低层损失无法计算

答案:A。低层卷积负责边缘、纹理等通用特征,这些能力对大多数视觉任务都适用,冻结它们可以保留这些能力,同时大幅减少训练参数量、提升训练速度。

Q5. 浏览器本地训练时,数据最合适的存放位置是?

单选题 · mid

  • A.发送到远程数据库
  • B.仅保存在设备内存← 正确答案
  • C.复制到公共云盘
  • D.写入服务器缓存

答案:B。本地训练的核心目标是数据不出设备。把数据放在浏览器内存或 IndexedDB 中,训练和推理都在端侧完成,才能兑现隐私承诺。其余选项都把数据传出了设备。

Q6. MobileNet 被选作浏览器端预训练模型的原因是?

单选题 · mid

  • A.精度超过所有大模型
  • B.参数少且推理速度快← 正确答案
  • C.必须依赖独立显卡运行
  • D.支持数据库查询语言

答案:B。MobileNet 用深度可分离卷积大幅压缩参数量(几 MB 到十几 MB),适合在浏览器 WebGL 上实时推理与微调。它并不依赖独立显卡,也与数据库语言无关。

Q7. 模型量化(如 float32 转 int8)的主要收益是?

单选题 · hard

  • A.提高识别准确率
  • B.减小体积降低内存← 正确答案
  • C.自动收集训练数据
  • D.取消特征提取步骤

答案:B。量化把连续权重映射到低比特整数,模型体积缩小到约 1/4、推理速度提升,但通常会牺牲少量精度。它不会提高准确率,也不会替代特征提取或自动收集数据。

Q8. 下列哪些适合“Web 端小样本迁移学习”的应用?

多选题 · mid

  • A.用户个性化手势分类← 正确答案
  • B.本地私有照片整理← 正确答案
  • C.训练千亿级语言模型
  • D.服务器集群日志分析

答案:AB。A、B 涉及用户隐私且样本少,适合在浏览器本地微调。C 的规模远超浏览器能力范围;D 属于服务端数据分析场景,与端侧迁移学习无关。

Q9. 关于“微调”的正确说法有哪些?

多选题 · hard

  • A.只训练分类头也是微调← 正确答案
  • B.解冻部分层可提升效果← 正确答案
  • C.学习率必须设置极大
  • D.必须重新训练底层所有层

答案:AB。A 属于参数高效微调;B 是分层微调,目标域差异大时解冻高层有助提升效果;C 错误,微调惯用小学习率;D 错误,底层通常冻结以保留通用特征。

Q10. 浏览器内保护隐私的训练手段包括?

多选题 · extreme

  • A.数据全部留在本地← 正确答案
  • B.梯度加差分隐私噪声← 正确答案
  • C.权重直接上传云端
  • D.多设备联邦平均更新← 正确答案

答案:ABD。A 是本地训练;B 通过加噪防止模型逆向还原个体样本;D 是联邦学习,用参数聚合代替原始数据共享。C 直接上传权重会带来逆向攻击风险,不属于隐私保护手段。