鱼皮AI导航
鱼皮AI导航
  • 主页
  • 社区
  • AI工具
  • AI知识库
  • AI提示词
  • MCP
  • Skills
  • AI学习资源
  • AI资讯
  • GitHub开源
登录/注册
站长:程序员鱼皮 老鱼简历 商务合作 增值电信业务经营许可证
2026 鱼皮AI导航 | 沪ICP备19026706号-6
4

AI 基础知识从 0.6 到 0.7—— 彻底拆解深度神经网络训练的五大核心步骤 - 学习笔记

反正没人会看
反正没人会看
2025-09-12 15:32
阅读 1260
反正没人会看
2025-09-12 15:32
阅读 1260

原文链接:AI 基础知识从 0.6 到 0.7—— 彻底拆解深度神经网络训练的五大核心步骤

AI 基础知识从 0.6 到 0.7—— 彻底拆解深度神经网络训练的五大核心步骤

深度神经网络训练过程

  1. 第一段深度学习代码:训练手写数字识别模型
▼
python
复制代码
import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms # 准备数据 train_loader = torch.utils.data.DataLoader( datasets.MNIST('./data', train=True, download=True, transform=transforms.ToTensor()), batch_size=64, shuffle=True ) # 定义模型 class SimpleNet(nn.Module): def __init__(self): super(SimpleNet, self).__init__() self.fc1 = nn.Linear(28*28, 128) self.relu = nn.ReLU() self.fc2 = nn.Linear(128, 10) def forward(self, x): x = x.view(-1, 28*28) x = self.fc1(x) x = self.relu(x) x = self.fc2(x) return x model = SimpleNet() # 损失函数和优化器 criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) # 训练循环 for epoch in range(5): for data, target in train_loader: outputs = model(data) # 前向传播 loss = criterion(outputs, target) # 计算损失 optimizer.zero_grad() # 梯度清零 loss.backward() # 反向传播 optimizer.step() # 更新参数
  1. 从粗粒度上上来讲,深度神经网络训练过程有 5 步:
    1. 前向传播
    2. 计算损失
    3. 反向传播
    4. 更新参数
    5. 循环训练

前向传播

  1. 前向传播是 DNN 训练的第一步,输入数据通过网络的各层(输入层、隐藏层、输出层)进行处理,生成预测输出。
    1. image.png
    2. 从技术角度看,前向传播是一个顺序计算过程,数据从输入层开始,经过隐藏层,最终到达输出层。在这个过程中,数据通过加权连接和激活函数进行转换,使网络能够捕捉复杂的模式。整个过程有几步:
      1. 初始化:网络接收输入数据,通常是一个特征向量或矩阵。这些输入数据将通过网络的第一层传递。
      2. 线性变换:在每一层中,输入数据与该层的权重矩阵相乘,然后加上偏置向量。这个操作被称为线性变换或仿射变换。
      3. 非线性激活:线性变换的结果通过一个非线性激活函数,如 ReLU、Sigmoid 或 Tanh。这一步为网络引入非线性,使其能够学习复杂的模式。
      4. 重复:步骤 2 和 3 在网络的每一层重复,每一层的输出作为下一层的输入。
      5. 输出:最后一层的激活函数通常根据任务类型选择,如分类任务使用 Softmax,回归任务可能使用线性激活。
  2. 线性(Linear)的概念源自数学中的线性函数。在机器学习和深度学习中,线性的基本含义可以总结如下:4c53d66819d6c8ecbfa3c708e7b840da.png 1.1e4adc3bd4ae5d345e1504fb14bc1b5f.png 2. x 是输入变量,w 是权重,b 是偏置,y 是输出,输入 x 和输出 y 之间的关系是简单的比例关系,图像是一条直线。线性函数只能表示简单的单一斜率关系,无法捕捉更复杂的模式。
  3. 非线性(Non-linear)是指输入与输出之间的关系无法用简单的线性表达式描述。非线性系统可以描述更加复杂、多样化的输入输出关系,是神经网络捕捉复杂模式的核心要素。

激活函数

  1. 神经网络的每一层通常都包含两步:“线性变换”再加上“非线性激活函数”。
  2. 激活函数的作用是什么?
    1. 如果只有线性层,无论多少层,整个网络其实本质上还是一个线性变换,表达能力有限。而激活函数(如 ReLU、Sigmoid、Tanh 等)引入了非线性特性,使得复杂的函数建模成为可能。
  3. a2f14d614d4fc1e74b078e3a4e756ddb.png 6201047efc535e302cfefc5e3d1aa40c.png

Dropout

  1. 在训练深度神经网络时一个常见的问题是过拟合。当模型的复杂度远高于训练数据的数量时,模型会开始“记忆”训练数据中的噪声和随机波动,而不是学习其潜在的通用规律。这导致模型在训练集上表现极好,但在未见过的测试集上表现很差,即模型的泛化能力很弱。

    Dropout 的提出正是为了解决这个问题,Dropout 的核心思想非常简单:在训练过程的每次迭代中,随机地“丢弃”(即暂时使其输出为0)一部分神经元。

    1. 由于任何一个神经元都可能在下一次迭代中被随机丢弃,所以网络不能过度依赖于任何一个或一小撮神经元的特定组合。这迫使每个神经元都必须学会一些独立的、更有用的特征,因为它需要与随机选择的其他神经元子集协同工作。这打破了神经元之间复杂的协同适应关系,使得模型泛化能力增强。

归一化

  1. 归一化就是在网络的每一层输入端,强行将数据的分布重新拉回到一个稳定、标准的范围内(例如,均值为 0,方差为 1)。常见有两种归一化方法:
    1. BatchNorm(批归一化) 旨在确保同一特征在不同样本间保持相似的分布。它在训练过程中对本批样本数据的每个特征维度横向进行归一化。
    2. LayerNorm(层归一化) 则着眼于单个样本内部的特征。它对单个样本的所有特征纵向进行归一化,使其完全独立于批次中的其他样本。
  2. 选择哪种归一化方法,本质上是在回答一个问题:“我们认为数据的哪个维度上更应该共享同一个统计规律?
    1. ”如果认为不同样本的同一特征应该遵循相似分布,就用 BatchNorm。
      1. 一张图片中的“猫”的特征(例如某个通道代表的纹理)和另一张图片中的“猫”的特征应该是相似的,所以它在批次维度上对这个特征通道进行归一化。
    2. 如果认为同一样本的不同特征应该作为一个整体看待,就用 LayerNorm。
      1. 一个句子(一个样本)内部的所有词向量(特征)构成了一个整体,应该一起被归一化,而它与其他句子的关系不大。
  3. 在现代深度学习实践中:
    1. 构建 CNN 模型时,BatchNorm 仍然是首选。
    2. 构建 Transformer 或其他基于自注意力机制的模型时,LayerNorm 是标配。

残差连接

  1. “残差”是一个数学术语,来源于统计学和机器学习领域,表示实际值与预测值之间的差异。在神经网络中的“残差连接”,正是基于这种意义,将“残差”巧妙融入网络结构的设计中。
  2. 在深度神经网络中,更多的层数能够捕获更加复杂的特征,理论上增加层数会使模型的拟合能力更强。但在实际训练时发现,随着网络层数的加深,模型的性能可能会开始下降,新增的网络层往往难以学习到有效的内容,甚至只是重复已有的特征。这种现象被称为退化问题(Degradation Problem)。
    1. 想象我们有一个目标任务——让团队成员接力撰写一篇高质量的论文。传统做法是由第一个人起草初稿,然后传递给下一个人,每个人阅读理解后,用自己的表述重写再传递下去。然而,随着传递次数增多,最终的文章可能已经偏离了最初的主题。表现出色的前几段内容会被后续重写的修改削弱,甚至可能导致整体质量下降。 一种改进方式是:每个人只需在上一位同事的基础上补充自己的修改意见,而无需完全重写。如果发现前面的内容已经非常优秀,可以选择不作任何改动。在这种策略下,文章的整体质量能够随着参与人数的增加而逐步提高,而不会因为频繁重写而被破坏。
  3. 残差连接的核心思想:与其让网络层直接学习一个复杂的、从输入到输出的完整映射,不如让它学习输入和输出之间的“残差”或“差异”(对论文的修改意见)。
    1. 这意味着原始输入的信息可以“跳过”当前层,直接传递到输出端。当前层只需学习如何对这个原始信息进行精炼和优化(即学习残差),而不是从零开始生成。通过为神经网络中的每一层增加一个捷径路径(Shortcut Path),直接将输入数据跳跃传递到后续层的输出,这些层只需负责学习补偿性的小变动,从而使得优化任务更加简单。

计算损失

  1. 当数据完成前向传播,我们会得到一个预测结果 outputs。下一步就是衡量这个预测结果与真实标签 labels 之间的差距。这个差距我们用一个数值来表示,称之为损失(Loss)。
  2. 机器学习的目标,就是通过不断地调整模型的参数,来最小化这个损失函数的值,从而让模型的预测尽可能地接近真实值。

损失函数

  1. 损失函数定义了**“差距”的计算方式**。不同的任务需要不同的损失函数:
    1. 分类任务:常用交叉熵损失 (Cross-Entropy Loss)。它衡量的是模型预测的概率分布与真实的标签分布之间的差异。
      1. 熵衡量的是一个概率分布的不确定性或信息量。一个分布越混乱、越不可预测,它的熵就越大。
    2. 回归任务:常用均方误差 (Mean Squared Error, MSE)。它计算的是预测值与真实值之差的平方的均值。
      1. 对差值取平方有两个好处:
        1. 消除正负号的影响,让误差 “绝对值化”,防止求和之后误差互相抵消;
        2. 放大误差便于模型优化,例如误差为 3 和 0.4,平方后变为 9 和 0.16,差异更明显。

正则化

  1. 正则化是在损失函数中加入一个惩罚项,限制或惩罚模型的复杂度,从而迫使模型去学习更简单、更具泛化能力的模式,以此来避免过拟合。
    1. 原来的损失函数只关心预测误差:原始损失 = Error(预测值, 真实值); 加入了正则化之后,新的损失函数(或称为目标函数)变成了:新目标函数 = 原始损失 + λ⋅模型复杂度惩罚项;
      1. 模型复杂度惩罚项是一个用来衡量模型有多复杂的函数。通常模型的参数(权重)越大,我们就认为模型越复杂。最经典的正则化技术主要有 L1 正则化和 L2 正则化,它们是对模型参数(权重)进行惩罚。
        1. L1 正则化是在损失函数中加入了模型所有参数的绝对值之和作为惩罚项。它会倾向于让很多不重要的特征的权重直接变为 0。当数据集中有很多特征,但只有少数特征是真正有用的时候,L1 正则化非常有效。
        2. L2 正则化是在损失函数中加入了模型所有参数的平方和作为惩罚项。它倾向于让模型的权重变得非常小,但不会变为 0,会使得模型的权重分布更平滑、更均匀,是最常用、最普遍的正则化方法。

反向传播

  1. 反向传播的数学基石是微积分中的链式法则,它允许我们计算一个复杂函数(整个网络的损失函数)中,每个参数对最终输出(Loss)的偏导数,这个偏导数就是梯度(Gradient)。
    1. 导数是微积分的一个核心概念,用来描述一个函数在某一点的变化率。简单来说,导数表示函数的输入发生微小变化时,输出的变化速度。
    2. 几何上,导数表示曲线 y=f(x) 在某一点 x 处切线的斜率。如果导数值为正,则函数在该位置是上升的;如果为负则函数下降;如果导数为零,这点可能是极小值、极大值或拐点。
    3. 偏导数是指多元函数(即输入有多个变量的函数)固定其他变量不变时,函数关于某个自变量的导数。
  2. 模型整个训练过程包含两个阶段:前向传播和反向传播。
    1. 阶段一:前向传播 (Forward Propagation),整个过程就像水流顺着管道从头流到尾,最终得到一个误差值。
      1. 输入数据:将一个或一批训练数据输入到网络的第一层。
      2. 逐层计算:数据从输入层开始,逐层向前流动。每一层的神经元接收上一层的输出,进行加权求和与激活函数计算,然后将结果传递给下一层。
      3. 生成输出:直到最后一层输出模型的预测结果 ŷ 。
      4. 计算损失:用损失函数比较模型的预测 ŷ 和真实标签 y ,计算出总的损失值 L 。
    2. 阶段二:反向传播 (Backward Propagation),梯度(误差信号)将从网络的末端开始,反向传播回网络的每一层; 整个过程就像把在终点产生的误差,按照原路“归因”或“分摊”给每一层的每一个参数,搞清楚每个参数对最终的总误差贡献了多少“责任”。
      1. 从损失函数开始:计算损失 L 对网络最后一层输出 ŷ 的梯度。这是梯度计算的起点。
      2. 逐层向后计算:利用链式法则,将梯度从当前层反向传播到前一层。具体来说,就是计算损失 L 对当前层所有参数( w ,  b )以及对当前层输入(即上一层的输出)的梯度。
      3. 梯度传递:上一层接收到从后一层传来的梯度信号后,继续用同样的方法计算本层的梯度,并继续向前传递。
      4. 到达输入层:这个过程一直持续到网络的第一层。当这个过程完成时,我们就得到了损失 L 对网络中所有参数的梯度。
  3. PyTorch、TensorFlow 等深度学习框架内置了自动求导 (Autograd) 引擎,它会自动构建计算图,并利用链式法则为我们计算所有参数的梯度。我们只需要简单地调用一个函数。

更新参数

  1. 计算出梯度后,我们就有了调整参数的方向。下一步就是实际去“更新”它们。

梯度下降

  1. 梯度下降 (Gradient Descent) 是一种在机器学习和深度学习中广泛使用的优化算法。它的主要目标是找到使某个损失函数达到最小值的模型参数,因为希望最小化损失函数,所以我们需要沿着函数值下降最快的方向移动。
  2. 梯度下降是一个迭代过程,它会重复以下步骤,直到达到某个停止条件(比如损失函数的值足够小,或者迭代次数达到上限):
    1. 初始化参数:首先,我们会给模型的权重和偏置等参数设置一个初始值(通常是随机值)。
    2. 计算损失:使用当前的参数值,计算模型在训练数据上的损失函数值,损失函数衡量了模型的预测结果与实际结果之间的差异。
    3. 计算梯度:计算损失函数对每个参数的偏导数,得到梯度。这个梯度告诉我们,如果沿着哪个方向稍微调整参数,损失函数会增加得最快。
    4. 更新参数:沿着梯度的反方向更新参数。更新的步长由一个叫做学习率 (Learning Rate) 的超参数决定。
      1. 学习率越大,每次更新的步长就越大;学习率越小,步长就越小。 数学表达式通常是:新参数 = 当前参数 - 学习率×梯度
    5. 重复:回到步骤 2,用新的参数值重新计算损失,然后继续更新,直到损失函数收敛到一个最小值。

37f6b2ac51bba165fbcde1245e9350e2.png 3. 就像一个盲人下山。他看不见整个山的全貌,只能通过脚下地面的坡度来判断方向。

  1. 他会先在山上的某个位置站定。
  2. 然后,他会用脚感受周围哪个方向的坡度最陡峭(这是梯度)。
  3. 为了下山,他会选择与坡度最陡峭方向相反的方向迈出一步(这是负梯度方向)。
  4. **每一步迈多远(学习率)**也很关键。步子太小,下山太慢;步子太大,可能会直接跳过最低点,甚至跌到山谷外面。
  5. 他会重复这个过程,一步一步地朝着山谷的最低点前进。
  6. 梯度下降存在一些局限性,比如:
    1. 收敛速度慢: 尤其是在数据量大的情况下,每次计算所有样本的梯度会非常耗时。
    2. 容易陷入局部最小值: 在非凸损失函数中,可能会停留在非全局最优的局部最小值。
    3. 对学习率敏感: 学习率设置不当容易导致震荡或收敛过慢。

优化器

  1. 为了克服这些限制,研究人员开发了各种改进型优化器。这些优化器在基本梯度下降的基础上,引入了额外的机制来提高训练效率、稳定性和收敛性。
    1. 5c609762c2f025b9b7b605e9f386a2df.png

梯度消失/梯度爆炸

  1. 梯度消失和梯度爆炸是深度神经网络训练过程中,由于反向传播中链式法则的乘法效应导致的两个极端问题;
    1. 梯度消失:当梯度从后向前传播时,经过多层链式法则的连乘,梯度值可能变得越来越小,趋近于0。这导致靠近输入层的网络参数几乎无法得到更新,模型学不到东西。
    2. 梯度爆炸:与梯度消失相反,梯度值在反向传播中被不断放大,变得异常巨大。这会导致参数更新过猛,模型无法收敛。
    3. 1939bf2be1f6d150ab8d9ecda312f74c.png

循环训练

  1. 至此,我们完成了一个完整的训练步骤(iteration)。但只走一步是远远不够的。我们需要将整个数据集过一遍,这个过程称为一个周期 (Epoch)。然后我们会重复很多个 Epoch,让模型在数据上反复学习。
    1. 在一个 Epoch 中,对于每一批(batch)数据:
      1. 前向传播:输入数据,得到预测值。
      2. 计算损失:用损失函数计算预测值和真实值之间的差距。
      3. 反向传播:调用 loss.backward(),计算每个参数的梯度。
      4. 更新参数:调用 optimizer.step(),使用梯度和优化算法更新参数。
    2. 这个循环不断重复,模型的参数被持续优化,损失值(Loss)会不断下降,模型在训练数据和未见过的验证数据上的表现会越来越好,直到达到收敛或满足我们设定的停止条件。
AI
学习笔记
4
0
分享
操作
评论
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
🔥热门工具
朱雀AI检测朱雀AI检测
朱雀AI检测助手朱雀AI检测助手
LovartLovart
老鱼简历老鱼简历
WritePass官网WritePass官网
面多多面多多
CursorCursor
星月写作星月写作
零感AI零感AI
墨得问题墨得问题

目录

🔥 热门文章
1
手把手教你设计一个成熟的 Agent Harness
2510
2
我用 REA 逆向了付费颜色 APP,结果很意外!
570
3
离谱,DeepSeek 崩了 5 小时,大家却喊:梁圣恩情还不完??
420
4
DeepSeek 全新模型发布,性价比最高的一集!
380
5
B 站上 DeepSeek 闹鱼灾了,我发起《大肥鱼清除计划》!
370
6
自己学习ai,直接买cursor 的套餐,还是买gpt 或者claude 的套餐?
360
7
又一个国产版 Codex 神器,也来卷办公了!
330
8
day3-如何写出一个高质量的 Skill(组内分享) 高质量 Skill 不是“一个调得很顺的巨型 Prompt”,而是一个可验证、可回归、可维护的能力包。 先定义“什么算好”,再实现“怎么做好”。评估体系先于 Skill 本身成型。 下面用“故障诊断 Markdown 转 YAML”作为例子,但方法是通用的。 --- 一、先想清楚:Skill 到底是什么 一个 Skill 至少包含四部分: 部分 作用 接口 输入什么、输出什么、边界在哪 流程 分几步做,每步的产物是什么 规则 硬约束、经验规则、失败模式 降级策略 不确定时怎么办,而不是硬编一个看似合理的结果 高质量 Skill 的共同点:职责单一、接口清晰、规则可定位、输出可验证。 反例:把几十条经验全塞进一个主 Prompt,改一条规则要重调整个 Prompt,评估时也不知道是哪条规则退化。 --- 二、核心方法:先建评估,再写 Skill 不要先写转换器再补测试。正确顺序是: 1. 定义输出契约:什么算合法、什么算合格; 2. 建金标准集:一小批人工认可“可放行”的样本; 3. 先写评估 Skill:让它在金标准集上跑出基线; 4. 再迭代生成 Skill:每次修改跑同一套评估,无退化且目标维度提升才算正向。 这就是评估驱动开发:评估是 Skill 的单元测试,金标准集是回归锚点。 --- 三、评估 Skill:三层门禁,逐层递进 前一层不过,后一层不跑。每层留可追溯证据。 第 1 层:确定性硬门禁 用解析器、Schema、校验器完成,不消耗模型成本。 · 输出可解析; · 必填字段齐全,类型/枚举合法; · 引用目标存在,无悬空引用、无不可达节点; · 关键路径至少有一条能到达预期出口。 不通过直接打回。 第 2 层:语义断言 用脚本 + 结构遍历检查“逻辑对不对”,仍然保持确定性。 通用检查项: · 覆盖率:源材料里的关键步骤、分支、条件,输出里是否都有对应? · 完整性:每个判断节点是否都有明确出口?有没有死胡同? · 可达性:每条路径是否都能到达预期终点?有没有无出口循环? · 顺序与依赖:有先后依赖的操作,是否保留了顺序?有没有被拍平成无序列表? 例子:故障诊断转换中,检查“每个判断项是否有是/否/异常出口”“每条路径是否能到根因”。 第 3 层:LLM-as-Judge 只处理解析器表达不了的维度:忠实度、完整性、可执行性。 但 Judge 会漂移,不能单独放行,必须建立在第 1、2 层之上。Judge 的 Prompt、rubric、模型版本都要版本化,换模型必须用金标准集重新校准。 通用 Judge 维度: 维度 问什么 忠实度 输出是否忠实源材料意图?有没有自行发明内容? 完整性 关键步骤、条件、证据是否保留?隐式知识有没有被压成空话? 收敛性 输出是否仍指向原目标,而不是发散? 可执行性 下游不依赖源材料能否直接使用? --- 四、金标准集:回归测试的锚点 不需要一开始就标注几百份。用已认可的样本当种子,扩到 15~30 份,覆盖失败模式而非随机抽样: · 完整正例:典型流程; · 边界/异常分支:异常路径、循环、前置失败回退; · 已知易错模式:实际踩过的坑; · 留出集:不参与调优,只用于最终验收,防过拟合。 金标准不需要完美,只需要当前标准下认可可放行。 回归指标:关键路径用 pass^k(k 次全过),稳定性用 pass@k。 --- 五、工程约束:让批量产出可重放 · 幂等:同输入 + 同 Skill 版本 + 同规则 → 输出一致,否则无法判断变好是 Skill 改了还是随机波动; · 隔离不阻断:单份失败进隔离队列,记录失败层和原因,不阻塞其余; · 版本绑定:规则、rubric、金标准集进 Git;每份报告绑定“源版本 + 生成 Skill 版本 + 评估 Skill 版本 + Judge 模型版本”; · 抽样人工复核:Judge 临界样本 + 易错模式,人工抽检结果反过来校准 rubric。 --- 六、Skill 本身怎么写 · SKILL.md 控制篇幅,写清:输入约定、输出契约、分步流程、硬规则、降级策略; · 经验规则放 references/ 或 rules/,按失败模式分类,不要全塞进主 Prompt; · 不确定时标 needs_review: true,不要硬编看似合理的结果; · 迭代由评估报告驱动:报告告诉你哪层挂了、哪类失败模式,你改对应规则文件,而不是漫无目的调 Prompt。 --- 七、落地顺序(不要反过来) 1. 固化输出契约:Schema + 结构约束; 2. 建金标准集:从已认可的 + 最易出错的样本开始; 3. 先写评估 Skill:跑出基线报告; 4. 再迭代生成 Skill:每次修改对比逐项通过率,无退化且目标提升才算正向; 5. 批量运行 + 隔离回放:失败进队列,结束后人工抽检; 6. 评估 Skill 自身版本化:换 Judge 模型必须重新校准。 --- 八、给组员的三条硬要求 1. 不许凭感觉说“变好了”:每次修改必须附评估报告对比,逐项通过率说话。 2. 不许跳过确定性门禁直接看 Judge 分数:前两层挂了,Judge 分数没有意义。 3. 不许把规则堆进主 Prompt:规则按失败模式分文件,评估报告要能定位到具体文件。 --- 一句话收尾 生成 Skill 决定“能不能做”,评估 Skill 决定“敢不敢用”。 先让评估体系站稳,再让生成器迭代。这样交付的不是一堆“看起来还行”的产出,而是一套可证明、可回归、可交接的 Skill 质量体系。
310
9
AI 越强,被它拒绝的代价就越大 我有时候会想:AI 越来越厉害之后,有些事情,会不会反而越来越难做? 这个想法看起来有点矛盾。AI 明明在降低门槛,让不会写代码的人做出软件,让不会画画的人生成图片,让一个人完成过去需要整支团队才能完成的工作。但今天用 Codex 的时候,AI 拒绝帮我编写 SQL 注入的请求体,而那还是我有源码、在本地跑测试的情况。那么,往后是否只会更难? 我们假设某一天,AI 说:「这个请求违规,我不能帮助你。」到那个时候,你还有多少能力,能绕过它,把事情做完? 这里的「违规」需要打个引号。平台的规则、模型的判断、法律的要求,以及一件事实际有没有造成伤害,彼此之间并不总是画得上等号。一个请求可能确实危险,也可能只是缺少上下文被误判,或者恰好落在某家公司的限制范围里。 无论是哪种情况,随着我们越来越依赖 AI,这句拒绝都可能变得越来越贵。 今天,一个程序员让 AI 帮忙写代码,AI 拒绝了,他大概率还有别的办法:查文档、找开源项目、问同行,或者自己写。麻烦一点,慢一点,但路还在。 可如果十年之后,大部分程序都由 AI 完成,情况就不一样了。 很多人从接触编程的第一天起,就习惯了描述需求、等待生成、运行结果、继续迭代。他们能做出相当复杂的产品,却未必经历过独立处理底层问题的训练。平时,这种能力结构完全够用,效率甚至更高。只有 AI 拒绝的时候,他们才会发现:平常被省掉的那段学习过程,恰好是此刻最需要的东西。 到那时,一次拒绝的成本,可能就从「今晚多花两个小时」,变成「先花半年学会这门技术」。 拿 SQL 注入举个稍显极端的例子:往后,连真正理解这类攻击如何发生、能够独立构造测试的人,会不会也越来越少? 这里也包括那些有正当需求的人。一个开发者想检查自己的旧系统,一个经过授权的安全研究员想复现漏洞,假如 AI 识别到危险模式就拒绝,而使用者又只熟悉「让 AI 帮我检查」,这项原本可以独立完成的工作,就这样卡住了。 但是安全专家不会因此消失,但这类技能可能越来越集中在少数人手里。你仍然可以找专家,只是要付出更多的钱、更多的时间,以及更高的沟通成本。 类似的困境,未必只发生在网络安全领域。 你想从一个停止维护的软件里取回自己的数据,需要解析它的旧文件格式。AI 判断这涉及规避保护措施,拒绝继续。你拥有这些数据,却没有能力把它们读出来。 你买了一台设备,厂商停止提供服务。你想修改程序让它继续运转,过程中需要处理某种访问限制。AI 不愿协助,而你所掌握的维修方式,早已只剩下「把报错发给 AI」。 你想给常用的网站写一个辅助工具,减少重复操作。平台将此归入自动化限制,AI 也据此拒绝。过去会写脚本的人可以自己判断、自己处理;未来的使用者,可能连从哪里开始都不知道。 这些例子有一个共同点:当工具同时承担了「执行工作」和「传授知识」的角色,它的拒绝就不只是挡住了一次任务,也挡住了获得这种能力的机会。 更麻烦的是,这种依赖往往是我们主动选择的,而且每一步都很合理。 既然 AI 几秒钟就能做好,为什么还要花几个月学习?既然公司可以采购成熟的 AI 服务,为什么还要养一支负责基础工作的团队?既然市场上已经很少有人手写这些东西,学校为什么还要花大量时间教? 对个人、公司和学校来说,这些选择都有现实依据。但叠加起来,整个社会保留的独立能力就可能越来越少。等到某项能力突然受到限制,我们才发现,备用方案早已在追求效率的过程中被一点点削掉了。 所以,「AI 越强,做事越便宜」可能只描述了未来的一半。 另一半是:被允许的事情越来越便宜,被拒绝的事情依然需要人工完成,却要面对更少的人才、更高的报价,以及越来越难获得的知识。两边的成本差距,会越拉越大。 有人会说,可以换一个模型,或者用本地模型。这确实是重要的选项。只要工具之间还有充分竞争,开放模型还足够可用,限制就未必能形成真正的门槛。 但备用方案也需要维护。它需要硬件、知识、软件生态,以及一群仍然理解这些系统的人。如果大多数人已经习惯了最方便的商业服务,那么「理论上还有别的办法」和「普通人实际用得起、用得明白」,之间仍然可能隔着很远。 我担心的,正是这段距离。 我不指望 AI 对任何请求都照单全收。对明显会伤害他人的行为设置限制,有充分的理由。但我们也需要关心:限制由谁定义,误判有没有申诉渠道,用户能不能换工具,以及脱离这个工具之后,还剩下多少独立行动的能力。 保留这些能力,平时看起来甚至有点低效,明明可以自动生成,还要理解原理;明明可以一键完成,还要知道手动怎么做。 但这些看似多余的知识,会在工具拒绝、失效、涨价或改变规则的那一刻,成为真正的选择权。 AI 越强,我们可能越需要留意它说「不」的那一刻。 因为那句话的分量,最终取决于:它拒绝之后,我们还能做什么。
310
10
什么是LLM
300