The Forward-Forward Algorithm: Some Preliminary Investigations
原文链接: https://arxiv.org/pdf/2212.13345
作者: Geoffrey Hinton (Google Brain)
1. 引言:反向传播 (Backpropagation) 的问题
尽管反向传播(Backpropagation, BP)在深度学习中取得了巨大的成功,但作为大脑皮层学习的生物学模型,它一直缺乏合理性(Implausible)。Hinton 指出了 BP 的几个主要问题:
- 生物不合理性:没有令人信服的证据表明大脑皮层明确地传播误差导数或存储神经活动以用于随后的反向传播。
- 时间冻结:为了通过时间进行反向传播(BPTT),系统需要停止处理感官输入流,或者需要完美的缓冲存储,这对于实时感知系统来说是不自然的。
- 黑盒依赖:BP 需要对前向传递中的计算有完美的了解(即模型必须是可微的且已知的)。如果前向传递中包含黑盒或未知的非线性,BP 将无法工作。
为了解决这些问题,Hinton 提出了 Forward-Forward (FF) 算法。该算法用两次前向传播代替了 BP 的前向和后向传播。
2. Forward-Forward 算法核心机制
FF 算法的核心思想是训练神经网络的每一层,使其能够区分正样本和负样本。
这就像我们教孩子认东西:我们给他看一只猫(正样本),说“这是猫”;再给他看一只狗(负样本),说“这不是猫”。
两个Forward
- Positive Forward:在真实数据(正样本)上运行,调整权重以增加每一层的优良度。
- Negative Forward:在生成的负样本(负样本)上运行,调整权重以降低每一层的优良度。
这种学习是贪婪的(Greedy)和逐层的(Layer-wise),不需要误差信号在层之间反向传播,每一层只关心自己的任务。
3. 数学表述与学习规则
3.1 优良度函数 (Goodness Function)
对于神经网络中的某一层,我们定义其“优良度”为该层神经元整流后(ReLU)活性的平方和。设 $y_j$ 为该层第 $j$ 个隐藏单元在Layer Norm之前的活性,则该层的优良度 $G$ 定义为:
$$ G = \sum_{j} y_j^2 $$
FF就是使用上面定义的优良度去判断输入是正样本还是负样本。
G相当于输出向量的长度。
3.2 概率解释
我们可以利用 Logistic Sigmoid 函数 $\sigma$ 将优良度转化为输入向量属于正类的概率:
$$ p(\text{positive}) = \sigma\left(\sum_{j} y_j^2 - \theta\right) = \frac{1}{1 + e^{-(\sum_{j} y_j^2 - \theta)}} $$
其中 $\theta$ 是阈值。
3.3 损失函数与参数更新
为了训练每一层,我们希望最大化正样本被分类为“正”的概率,并最小化负样本被分类为“正”的概率。损失函数定义为:
$$ \mathcal{L} = - \mathbb{E}_{pos}\left [ \log \frac{1}{1 + e^{-(\sum_{j} y_{j, pos}^2 - \theta)}} \right ] + \mathbb{E}_{neg}\left [ \log \frac{1}{1 + e^{-(\sum_{j} y_{j, neg}^2 - \theta)}} \right ] $$
在归一化之前完成参数更新,计算梯度 $\frac{\partial \mathcal{L}}{\partial W}$ 并更新权重 $W \leftarrow W - \eta \frac{\partial \mathcal{L}}{\partial W}$。
3.4 归一化
将输出的信号进行LayerNorm之后继续往后传。
为什么归一化?让后层不能通过向量长度判断是正样本还是负样本。
4. FF 实验 (Some experiments with FF)
本节展示 FF 算法在相对较小的神经网络(几百万连接)中的表现。
4.1 反向传播的基准线 (The backpropagation baseline)
作为对比,使用 BP 训练的全连接网络在 MNIST 上(不使用卷积结构,置换不变性任务)的错误率通常约为 1.4%。如果使用 Dropout 等正则化手段,错误率可降至 1.1% 左右。
4.2 简单的无监督学习示例 (A simple unsupervised example of FF)
我们首先关注 FF 是否能学习到有效捕捉数据结构的表示,而不依赖标签。
- 正样本:真实的 MNIST 数字图片。
- 负样本:混合图像 (Hybrid Images)。为了迫使网络关注长程相关性(形状),负样本通过混合两张不同数字的图像生成(一张使用 Mask,另一张使用 Mask 的反转)。这种图像在短程相关性上和真实图像很像,但在长程形状上不自然。
结果:训练 4 个隐藏层(每层 2000 ReLU),然后训练一个线性分类器在最后三层的归一化活动上进行分类,测试错误率为 1.37%。这表明 FF 有效地学习了无监督特征。
局部感受野 (Local Receptive Fields): 如果不使用全连接层,而是使用类似卷积但没有权重共享的局部感受野(Local Receptive Fields),错误率可降至 1.16%。这使用了“对等归一化 (Peer Normalization)”来防止神经元一直死掉或一直活跃。
4.3 简单的监督学习示例 (A simple supervised example of FF)
如果我们只关心分类任务,可以使用监督学习。
- 输入构造:将标签(One-hot)直接替换掉图像的前 10 个像素(MNIST 边缘通常是黑的,替换不影响内容)。
- 正样本:图像 + 正确标签。
- 负样本:图像 + 错误标签。
- 训练:网络应该学会忽略那些与标签不相关的图像特征。
结果:4 层网络,60 epochs,测试错误率 1.36%。这与 BP 的表现相当(BP 需 20 epochs)。 * 推理 (Inference):测试时,不知道标签。网络对每张图跑 10 次,每次填入一个不同的标签作为“猜想”,看哪一个猜想能让网络产生的累计 Goodness 最高。
4.4 使用 FF 模拟感知中的自顶向下效应 (Using FF to model top-down effects)
之前的模型都是单向贪婪的。为了引入自顶向下的影响(Context),Hinton 将静态图像视为“视频”,用多层循环神经网络 (RNN) 处理。 * 机制:每一层的输入不仅来自下一层(Bottom-up),也来自上一层(Top-down)。 * 结果:这种循环结构使得高层信息可以影响低层特征的形成,进一步降低了错误率(1.31%)。
4.5 使用空间上下文预测作为老师 (Using predictions from spatial context)
在具有空间局部连接的网络中,Top-down 输入来自更大的感受野,因此可以看作是对 Bottom-up 输入(来自局部感受野)的一种上下文预测。 * 如果我们将目标函数反转:让正样本的 Bottom-up 和 Top-down 输入相互抵消(最小化平方和),这就像是 预测编码 (Predictive Coding)。
5. CIFAR-10 实验 (Experiments with CIFAR-10)
CIFAR-10 背景复杂,全连接网络通常表现很差。
- 网络架构:不使用卷积(因为假设权重共享不可行),而是使用具有局部感受野的全连接网络。
- 2-3 个隐藏层,每层 3072 个 ReLU。
- 每个神经元看 11x11 的局部区域(363个输入)。
- 结果:FF 获得了与使用相同架构的 BP 相当的性能。虽然比不上现代 CNN,但证明了 FF 在处理复杂背景图像时的有效性。
6. 睡眠 (Sleep)
这部分讨论了 FF 算法最像生物学“睡眠”的地方。
- 理想情况:清醒时处理正样本;睡眠时处理负样本。
- 负样本来源:负样本由网络自己生成(从高层向低层或者随机采样),即“梦境”。
- Unlearning (反学习):睡眠时,网络对这些自生成的“梦境”进行 FF 的负向 Pass(最小化 Goodness)。这意味着网络在试图“遗忘”它自己产生的幻觉。这能确保存储的知识是关于外部世界的,而不是网络内部的正反馈循环。
- Hinton 提到早期的实验(预测字符序列)显示这种分离正负阶段的方法是可行的,但后来复现困难,可能需要特定的 Goodness 函数或极低的学习率。这是未来研究的重要方向。
7. FF 与其他对比学习技术的比较
7.1 与 Boltzmann Machines 的关系
FF 受到了玻尔兹曼机的启发(Contrastive Learning),但用简单的 Goodness 函数替代了复杂的能量函数(Energy Function),并且不需要通过长时间的马尔可夫链采样来达到热平衡。FF 的负样本生成更简单。
7.2 与 GAN 的关系
FF 可以看作是一种特殊的 GAN: * 判别器(Discriminator):每一层都是自己的判别器,判断输入是正还是负。 * 生成器(Generator):不需要单独训练生成器,网络本身就可以通过 Top-down 生成负样本。
7.3 与 SimCLR 等对比方法的关系
SimCLR 等方法对比的是同一图像的两个不同 Crop(正对) vs 不同图像的 Crop(负对)。 * 问题:这需要通过很多层之后的深层表示来对比,约束太弱(1 bit 信息),效率低。 * FF 的优势:FF 在每一层、每一个局部块都进行对比(Positive vs Negative),约束更强,能够更快地注入信息。
8. 快速与慢速学习 (Learning fast and slow)
FF 有一个有趣的数学性质: 如果层与层之间是全连接的,那么改变某层的权重以优化 Goodness,不会改变该层输出的归一化向量的方向(只改变长度)。 * 这意味着:我们可以同时并行更新所有层的权重,而不需要担心前面的更新会破坏后面的输入。 * 这允许网络对单个样本进行极快速的学习(Fast Learning),甚至一步到位。这对于适应新环境或由慢速“黑盒”组件构成的系统非常有用。
9. 凡人计算 (Mortal Computation)
这部分是 Hinton 对计算机硬件未来的哲学思考。
- 不朽计算 (Immortal Computation):目前的软件(权重)与硬件分离,可以在不同机器上复制。这很方便,但能耗高。
- 凡人计算 (Mortal Computation):如果我们要追求极致的低功耗(像人脑一样),我们可能需要放弃软硬件分离。
- 允许每块芯片有其独特的模拟特性(制造缺陷、非线性等)。
- 使用 FF 这样的算法,让每块芯片自己学习如何利用自身的物理特性来解决问题。
- 代价:权重不能复制到另一块芯片上(因为硬件特性不同)。知识随着硬件的死亡而消失。
- 知识传承:虽然权重不能复制,但知识可以通过 蒸馏 (Distillation) 传递——就像老师教学生,不是直接把脑子里的突触复制过去,而是通过输出(语言、示范)来训练学生的脑子。
10. 未来工作 (Future work)
- 寻找更好的 Goodness 函数。
- 探索 ReLU 之外的激活函数。
- 在空间数据上使用更多局部 Goodness 函数。
- 在序列数据上结合 Fast Weights。