[算法学习] Forward-forward (FF) 双重前馈算法
[算法学习] Forward-forward (FF) 双重前馈算法
[算法学习] Forward forward (FF) 双重前馈算法 [算法学习] Forward forward (FF) 双重前馈算法 Modified November 27, 2024 4972 5175 E + =(H 1 + ) 2 +(H 2 + ) 2 =4 2 +0 2 =16 负样本能量 E − E − =(H 1 − ) 2 +(H 2 − ) 2 =0 2 +0 2 =0 6.5 训练目标 根据训练目标,正样本获得了更多的能量,负样本没有获得能量 6.6 计算梯度 计算能量对权重矩阵 W 的梯度,以便更新权重。 对于正样本 X + 能量对隐藏层激活 H + 的梯度 ∂H i + ∂E + =2H i + 首先计算隐藏层加权和 Z i + = j ∑ W ij X j + 其中 W ij 是权重矩阵中第 i行、第 j 列的元素。 X j + 是输入向量的第 j 个元素。 由于激活函数是 ReLU,其导数为: ReLU ′ (Z i + )={ 1, 0, if Z i + 0 if Z i + ≤0 应用链式法则,计算能量对权重的梯度: ∂W ij ∂E + = ∂H i + ∂E + × ∂Z i + ∂H i + × ∂W ij ∂Z i + =2H i + ×ReLU ′ (Z i + )×X j + 对于隐藏层的第一个神经元 i = 1 H 1 + = 4 Z 1 + = 4 由于 Z 1 + 0, ReLU ′ (Z i + )=1 ∂W 1j ∂E + =2×4×1×X j + =8X j + 由于 X j + = 1, 对于 j = 1,2,3,4 ∂W 1j ∂E + =8×1×1=8 对于隐藏层的第一个神经元 i = 2 H 2 + = 0 Z 2 + = 4 由于 Z 1 + ≤0 , 0 ∂W 2j ∂E + =2×0×0×X j + =0 对于负样本 X − 能量对隐藏层激活梯度 ∂H i − ∂E − =2H i − =0 能量对权重的梯度为零 ∂W ij ∂E − =0 梯度汇总: 正样本梯度: 对于 i=1(第一个隐藏层神经元)和所有 j: ∂W 1j ∂E + =8 对于 i=2(第二个隐藏层神经元)和所有 j: ∂W 2j ∂E + =0 负样本梯度: 所有 ∂W ij ∂E − =0 6.7 更新权重 根据梯度更新权重,使用学习率 η 更新规则 W new =W old +η( ∂W ∂E + − ∂W ∂E − ) 由于 ∂W ij ∂E − =0 W new =W old +η ∂W ∂E + 设定学习率 η=0.1 对于 i=1 和所有 j: ΔW 1j =η× ∂W 1j ∂E + =0.1×8=0.8 对于 i=2 和所有 j: ΔW 2j =0.1×0=0 原始权重矩阵 W old =[ 1 −1 1 −1 1 −1 1 −1 ] 更新后的权重矩阵 对于 i=1 和所有 j: W new,1j =W old,1j +ΔW 1j =1+0.8=1.8 对于 i=2 和所有 j: W new,2j =W old,2j +ΔW 2j =−1+0=−1 更新后的矩阵 W new =[ 1.8 −1 1.8 −1 1.8 −1 1.8 −1 ] 6.8 验证更新结果 6.8.1 对正样本进行前向传播 计算新的隐藏层激活 H new + H new + =ReLU(W new ×X + ) =ReLU([ 1.8×1+1.8×1+1.8×1+1.8×1 −1×1+(−1)×1+(−1)×1+(−1)×1 ]) =ReLU([ 7.2 −4 ]) =[ 7.2 0 ] 计算新的能量 E new + E new + =(H new,1 + ) 2 +(H new,2 + ) 2 =(7.2) 2 +0 2 =51.84 能量从 16 提升到了 51.84,说明网络对正样本的响应增强。 6.8.2 对负样本进行前向传播 计算新的隐藏层激活 H new − H new − =ReLU(W new ×X − )=ReLU([ 1.8×0+1.8×0+1.8×0+1.8×0 −1×0+(−1)×0+(−1)×0+(−1)×0 ])=[ 0 0 ] 计算新的能量 E new − E new − =(H new,1 − ) 2 +(H new,2 − ) 2 =0 2 +0 2 =0 能量仍然为 0,说明网络对负样本的响应没有增强。 6.9 迭代训练 通过重复上面的步骤,继续训练网络,使其对正样本的能量不断增加,对负样本的能量保持低值。 总体训练步骤 1. 前向传播:对正负样本计算隐藏层激活和能量。 2. 计算梯度:根据能量和激活值计算能量对权重的梯度。 3. 更新权重:使用学习率和梯度更新权重矩阵。 4. 评估效果:验证能量的变化,确保训练方向正确。 多次迭代效果 • 正样本能量将继续增加,网络对正样本的识别能力增强。 • 负样本能量保持低值,网络对负样本的抑制效果良好。 在FF算法中,一个直观的指标是: ΔE=E + −E − 通常的目标是让 ΔE 尽可能放大,当多次迭代后没有明显变化,训练就可以停止了。 除此之外,也可以关注每次迭代中的梯度范数,梯度的大小非常小时,说明权重更新幅度很小,模型可能已经接近收敛。 ∥∇W∥= i,j ∑ ( ∂W ij ∂E ) 2 总结 • 通过计算能量对权重的梯度,我们能够知道如何调整权重,以增大正样本的能量,减小负样本的能量。 • 整个过程只涉及前向传播和局部的梯度计算,无需反向传播整个网络的误差。 • FF 算法的关键在于使用正负样本,通过比较能量来指导权重更新。 正负样本的区分 关于正负样本的区分有很多种方式,现有的数据集如果已有明确的标签,可以直接利用标签来区分,其他情况下可以选择: 根据任务选择 • 单类别任务(如异常检测): ◦ 正样本:正常数据。 ◦ 负样本:异常数据,可能需要手动收集或标注。 • 多类别任务: ◦ 正样本:目标类别的数据。 ◦ 负样本:其他类别的数据,可以从数据集中提取,无需手动分类。 自动生成负样本 • 数据增强技术:对正样本应用数据增强,如旋转、缩放、添加噪声等,生成负样本。 • 合成数据:使用生成模型(如 GAN)生成负样本。 • 无需手动分类:这些方法可以在数据预处理阶段自动完成。 E + =(H 1 + ) 2 +(H 2 + ) 2 =4 2 +0 2 =16 负样本能量 E − E − =(H 1 − ) 2 +(H 2 − ) 2 =0 2 +0 2 =0 6.5 训练目标 根据训练目标,正样本获得了更多的能量,负样本没有获得能量 6.6 计算梯度 计算能量对权重矩阵 W 的梯度,以便更新权重。 对于正样本 X + 能量对隐藏层激活 H + 的梯度 ∂H i + ∂E + =2H i + 首先计算隐藏层加权和 Z i + = j ∑ W ij X j + 其中 W ij 是权重矩阵中第 i行、第 j 列的元素。 X j + 是输入向量的第 j 个元素。 由于激活函数是 ReLU,其导数为: ReLU ′ (Z i + )={ 1, 0, if Z i + 0 if Z i + ≤0 应用链式法则,计算能量对权重的梯度: ∂W ij ∂E + = ∂H i + ∂E + × ∂Z i + ∂H i + × ∂W ij ∂Z i + =2H i + ×ReLU ′ (Z i + )×X j + 对于隐藏层的第一个神经元 i = 1 H 1 + = 4 Z 1 + = 4 由于 Z 1 + 0, ReLU ′ (Z i + )=1 ∂W 1j ∂E + =2×4×1×X j + =8X j + 由于 X j + = 1, 对于 j = 1,2,3,4 ∂W 1j ∂E + =8×1×1=8 对于隐藏层的第一个神经元 i = 2 H 2 + = 0 Z 2 + = 4 由于 Z 1 + ≤0 , 0 ∂W 2j ∂E + =2×0×0×X j + =0 对于负样本 X − 能量对隐藏层激活梯度 ∂H i − ∂E − =2H i − =0 能量对权重的梯度为零 ∂W ij ∂E − =0 梯度汇总: 正样本梯度: 对于 i=1(第一个隐藏层神经元)和所有 j: ∂W 1j ∂E + =8 对于 i=2(第二个隐藏层神经元)和所有 j: ∂W 2j ∂E + =0 负样本梯度: 所有 ∂W ij ∂E − =0 6.7 更新权重 根据梯度更新权重,使用学习率 η 更新规则 W new =W old +η( ∂W ∂E + − ∂W ∂E − ) 由于 ∂W ij ∂E − =0 W new =W old +η ∂W ∂E + 设定学习率 η=0.1 对于 i=1 和所有 j: ΔW 1j =η× ∂W 1j ∂E + =0.1×8=0.8 对于 i=2 和所有 j: ΔW 2j =0.1×0=0 原始权重矩阵 W old =[ 1 −1 1 −1 1 −1 1 −1 ] 更新后的权重矩阵 对于 i=1 和所有 j: W new,1j =W old,1j +ΔW 1j =1+0.8=1.8 对于 i=2 和所有 j: W new,2j =W old,2j +ΔW 2j =−1+0=−1 更新后的矩阵 W new =[ 1.8 −1 1.8 −1 1.8 −1 1.8 −1 ] 6.8 验证更新结果 6.8.1 对正样本进行前向传播 计算新的隐藏层激活 H new + H new + =ReLU(W new ×X + ) =ReLU([ 1.8×1+1.8×1+1.8×1+1.8×1 −1×1+(−1)×1+(−1)×1+(−1)×1 ]) =ReLU([ 7.2 −4 ]) =[ 7.2 0 ] 计算新的能量 E new + E new + =(H new,1 + ) 2 +(H new,2 + ) 2 =(7.2) 2 +0 2 =51.84 能量从 16 提升到了 51.84,说明网络对正样本的响应增强。 6.8.2 对负样本进行前向传播 计算新的隐藏层激活 H new − H new − =ReLU(W new ×X − )=ReLU([ 1.8×0+1.8×0+1.8×0+1.8×0 −1×0+(−1)×0+(−1)×0+(−1)×0 ])=[ 0 0 ] 计算新的能量 E new − E new − =(H new,1 − ) 2 +(H new,2 − ) 2 =0 2 +0 2 =0 能量仍然为 0,说明网络对负样本的响应没有增强。 6.9 迭代训练 通过重复上面的步骤,继续训练网络,使其对正样本的能量不断增加,对负样本的能量保持低值。 总体训练步骤 1. 前向传播:对正负样本计算隐藏层激活和能量。 2. 计算梯度:根据能量和激活值计算能量对权重的梯度。 3. 更新权重:使用学习率和梯度更新权重矩阵。 4. 评估效果:验证能量的变化,确保训练方向正确。 多次迭代效果 • 正样本能量将继续增加,网络对正样本的识别能力增强。 • 负样本能量保持低值,网络对负样本的抑制效果良好。 在FF算法中,一个直观的指标是: ΔE=E + −E − 通常的目标是让 ΔE 尽可能放大,当多次迭代后没有明显变化,训练就可以停止了。 除此之外,也可以关注每次迭代中的梯度范数,梯度的大小非常小时,说明权重更新幅度很小,模型可能已经接近收敛。 ∥∇W∥= i,j ∑ ( ∂W ij ∂E ) 2 总结 • 通过计算能量对权重的梯度,我们能够知道如何调整权重,以增大正样本的能量,减小负样本的能量。 • 整个过程只涉及前向传播和局部的梯度计算,无需反向传播整个网络的误差。 • FF 算法的关键在于使用正负样本,通过比较能量来指导权重更新。 正负样本的区分 关于正负样本的区分有很多种方式,现有的数据集如果已有明确的标签,可以直接利用标签来区分,其他情况下可以选择: 根据任务选择 • 单类别任务(如异常检测): ◦ 正样本:正常数据。 ◦ 负样本:异常数据,可能需要手动收集或标注。 ◦ 正样本:正常数据。 ◦ 负样本:异常数据,可能需要手动收集或标注。 • 多类别任务: ◦ 正样本:目标类别的数据。 ◦ 负样本:其他类别的数据,可以从数据集中提取,无需手动分类。 ◦ 正样本:目标类别的数据。 ◦ 负样本:其他类别的数据,可以从数据集中提取,无需手动分类。 自动生成负样本 • 数据增强技术:对正样本应用数据增强,如旋转、缩放、添加噪声等,生成负样本。 • 合成数据:使用生成模型(如 GAN)生成负样本。 • 无需手动分类:这些方法可以在数据预处理阶段自动完成。 🏕️ 之前的一篇文章里面,我们学习了BP(反向传播)算法的工作原理 (当今大模型用于训练阶段的非常有效的算法) [算法学习] 从0开始掌握反向传播算法,收敛效果非常显著。但去年年底的时候,Hinton老爷子在NeurlPS会议上分享了一篇叫《The Forward Forward Algoritm: Some Preliminary Investigations》的论文,这篇论文提出了用Forward Forward双重前向传播的方式替代Forward Backward反向传播的训练方式。这篇文章主要来探讨FF的工作原理,以及和BP相比的区别。 [[算法学习] 从0开始掌握反向传播算法](https://waytoagi.feishu.cn/wiki/XhFDwymwMiEMT6kkSCKc3LKinHd) 之前的一篇文章里面,我们学习了BP(反向传播)算法的工作原理 (当今大模型用于训练阶段的非常有效的算法) [算法学习] 从0开始掌握反向传播算法,收敛效果非常显著。但去年年底的时候,Hinton老爷子在NeurlPS会议上分享了一篇叫《The Forward Forward Algoritm: Some Preliminary Investigations》的论文,这篇论文提出了用Forward Forward双重前向传播的方式替代Forward Backward反向传播的训练方式。这篇文章主要来探讨FF的工作原理,以及和BP相比的区别。 [[算法学习] 从0开始掌握反向传播算法](https://waytoagi.feishu.cn/wiki/XhFDwymwMiEMT6kkSCKc3LKinHd) 《The Forward Forward Algorithm: Some Preliminary Investigations》 by Geoffrey Hinton 论文地址:https://arxiv.org/abs/2212.13345 一、基础含义 Forward Forward(FF)是一种新型的神经网络训练方法,旨在替代传统的 BP 算法。 BP 算法需要在网络中进行前向传播(计算输出)和反向传播(更新权重),而 FF 算法试图仅通过前向传播来完成网络的训练。这种方法有望简化训练过程,提高计算效率,并更容易在硬件上实现。 二、FF的核心思想 双重前向传播 FF 算法的核心在于使用两种不同的输入数据进行前向传播: • 正样本(Positive Data):真实的数据,代表期望的输入。代表我们希望神经网络正确识别或分类的实例。 • 负样本(Negative Data):与正样本相反,负样本是不符合我们期望的输入数据。它们可能是随机生成的、经过扰动的正样本,或者是其他类别的数据。 层级能量计算 对于每一层,计算其对正样本和负样本的“能量”或激活程度。目标是: • 最大化正样本的能量:使神经网络对正确的输入有更强的响应。 • 最小化负样本的能量:降低神经网络对错误输入的响应。 权重更新 根据能量差异,调整每一层的权重,使网络逐渐学习到区分正负样本的能力。这种方法避免了反向传播中的梯度计算,只需使用前向传播的信息即可更新权重。 三、和BP算法的区别 为什么要提出FF算法? FF 算法的提出旨在解决传统 BP 算法的一些问题: • 生物可实现性:BP 算法在生物学上缺乏证据支持,而 FF 算法更接近于生物神经网络的工作方式。 • 硬件实现困难:BP 算法需要反向传播,涉及复杂的梯度计算,不利于并行化和硬件实现。FF 算法由于只需前向传播,更易于在硬件上实现。 • 全局误差依赖:BP 算法需要全局误差信息,FF 算法则可以基于局部信息进行学习。 计算流程 • BP 算法:包含前向传播和反向传播两个阶段。前向传播计算输出,反向传播计算梯度并更新权重。 • FF 算法:只进行前向传播,通过比较正负样本的能量来更新权重。 信息传递方向 • BP 算法:需要从输出层反向传递误差信号。 • FF 算法:所有信息都在前向传播中完成,没有反向信息流。 依赖的参数 • BP 算法:需要全局误差函数,依赖整个网络的输出。 • FF 算法:只需局部的能量计算,依赖每一层的输出。 四、FF的优劣势 优势 • 生物学合理性:更接近生物神经网络的工作方式。 • 硬件友好性:由于只需前向传播,更容易在硬件上实现并行计算。 • 避免梯度问题:没有反向传播,避免了梯度消失或爆炸的问题。 劣势 • 训练效果未知:作为新提出的算法,尚需大量实验验证其效果。 • 可能收敛慢:由于缺乏全局误差信号,可能需要更多的迭代次数。 • 负样本选择困难:如何有效地生成负样本是一个挑战。 五、运算步骤 情景:识别猫和狗的图片 假设我们正在训练一个神经网络来区分猫和狗的图片 1. 数据准备 正样本: • 一组我们期望得到的真实数据。 负样本: • 一组我们不期望得到的噪声数据。 2. 网络结构 • 输入层:接收图片的像素数据。 • 隐藏层:若干神经元,用于提取特征。 (输出层可以忽略, FF 算法主要关注隐藏层的能量) 3. 前向传播过程 对于每个样本(正样本和负样本)都进行一次前向传播: • 计算隐藏层的激活值: H=ReLU(W×X+b) 其中: W = 权重矩阵 X = 输入图片展开成的像素量 b = 偏置 ReLU = 激活函数,定义为 ReLU(x)=max(0,x) 4. 计算能量 • 能量(Energy) 定义为隐藏层激活值的平方和: E= i ∑ H i 2 其中H = 隐藏层第i个神经元的激活值 5. 训练目标 • 正样本(猫的图片):希望能量 E + 大,即网络对猫的图片有强烈的响应。 • 负样本(非猫的图片):希望能量 E − 小,即网络对非猫的图片反应较弱。 6. 更新权重 • 计算能量的梯度: ◦ 对于正样本,计算 ∂W ∂E + 。 ◦ 对于负样本,计算 ∂W ∂E − 。 ◦ 对于正样本,计算 ∂W ∂E + 。 ◦ 对于负样本,计算 ∂W ∂E − 。 更新规则: W new =W old +η( ∂W ∂E + − ∂W ∂E − ) 其中 η 为学习率。目的为增加正样本的能量,减少负样本的能量 六、带入实例 假设我们正在训练一个神经网络来区分猫和狗的图片。 我们有一组猫的图片(正样本),一组狗的图片(负样本),为了简单我们假设输入图片的像素为2 2 网络结构:一个有2个神经元的隐藏层 权重初始化:w是一个 2 x 4的矩阵(因为有4个像素) 6.1 输入数据 正样本 X + (猫)的简单图片 X + = ⎣ ⎡ 1 1 1 1 ⎦ ⎤ 负样本 X − (狗)的简单图片 X − = ⎣ ⎡ 0 0 0 0 ⎦ ⎤ 6.2 根据网络结构初始化权重矩阵 初始权重W我们可以做一个随机初始化 W=[ 1 −1 1 −1 1 −1 1 −1 ] 6.3 前向传播过程 正样本计算隐藏激活值 H + H + =ReLU(W×X + ) =ReLU([ 1×1+1×1+1×1+1×1 −1×1+(−1)×1+(−1)×1+(−1)×1 ]) =ReLU([ 4 −4 ]) =[ 4 0 ] 负样本计算隐藏激活值 H − H − =ReLU(W×X − ) =ReLU([ 1×0+1×0+1×0+1×0 −1×0+(−1)×0+(−1)×0+(−1)×0 ]) =ReLU([ 0 0 ]) =[ 0 0 ] 6.4 计算能量 正样本能量 E +