神经元多义性(Polysemy)与模型稀疏化(Sparse)

最近初步探索了大模型的可解释性,有两块内容特别有收获,神经元多义性和模型稀疏化

想像一个理想的世界,所有的神经元都是单一意思的,比如说在一个动物识别模型中,我们可能找到一个猫咪神经元,当且仅当哈基米图像输入模型的时候才会激活,如果神经元都依赖这样的形式存在。这个模型的解释性就非常好,因为我们可以像检查一个电路板一样,检查不同的图像对应的激活节点是哪个。

早期人们也是这样认为模型的,比如著名的“祖母细胞假说”(Grandmother Cell Hypothesis),它的意思说你的大脑中可能存在一个专门识别你祖母的神经元。

事实上并非如此,绝大多数神经元是多意义的,一个在模型中多意义的,活跃的神经元,会被很多毫无关联的输入特征激活,在不同上下文中扮演不同角色

例如在你的脑中有一个神经元,他会在你看到某些尖锐的,向上的三角形敏感。但同时,它也可能在看到汽车的扰流板金字塔的轮廓,甚至是代码中的箭头符号 -> 时被激活。

我们能给这个神经元起个名字吗?叫它“猫耳朵细胞”?显然不准确。叫它“锐角细胞”?也不对,因为它可能还对某些纹理有反应,也许是我们没有完全检测到。所以我们无法用一个简单的人类语言来概括它的全部功能。

为什么会有这种现象产生?

其实这是一种很自然的现象,因为一个模型的神经元(参数)有限,为了在有限的空间里面实现特定的功能,神经元在训练的过程中会对多个相似的特征起反应,让一个神经元产生多种功能,这就对我们的可解释性造成了困扰,因为很多时候我们并不能完全分清楚这个模型的某个节点传入哪些信息才会起反应,有些在我们的直觉看来甚至毫无关联,而不是单单总结成一个“某些尖锐的,向上的三角形”这么简单。

好在我们有稀疏自动编码器(Sparse Autoencoders)技术,可以从这些多义的神经元中“解压缩”出单义的、可理解的特征。

什么是自动编码器?

自动编码器是一个对信息压缩和解压的工具,他负责对你电脑传入的向量压缩,作为一个低维度的,更小的表示,这个压缩后的向量被称为“潜在空间”。训练这个自动编码器的目标就是为了让模型的输入和输出尽可能的一样,如果解码器能够完美的从压缩后的向量里面恢复出原始的数据,说明这个编码器已经学会了如何捕捉这些数据中最重要的核心信息。

常规的编码器通常是密集的,瓶颈层所有的神经元都会被激活。这并没有解决多义性的问题,只是把一个大的多义性表示变成了一个小的多义性表示。

稀疏自动编码器(SAE)对普通的编码器做了一个关键的改造

常规编码器可能长这样

| \              / |

|   \          /  |

|     \     /     |

|       |         |

|       |         |

|     /       \   |

| /               \|

输入 瓶颈     输出

而稀疏自动编码器(SAE)长这样

        / | \ 

      /   |    \

    /     |       \

|         |          |

|         |           |

|         |           |

   \      |        /

      \   |      /

         \|/

输入 中间层 输出

他通过建立一个巨大的中间层(通常有20000层+),来放大我们的信息

现在问题来了,我们放大了这么多节点,如何确保这些多引入的节点全部都有被激活,而不会由于模型的“偷懒”机制,只采用中间一些节点来保存信息?

为此,我们引入了稀疏性惩罚 (Sparsity Penalty),这是一种特殊的损失函数。除了要求“输出必须像输入”之外,它还增加了一个要求:“在巨大的特征层中,被激活的神经元数量必须尽可能少”。在引入这个机制后,模型现在面临一个权衡。为了精确地重构输入,它想激活更多的特征神经元。但为了减少稀疏性惩罚,它又必须抑制大部分神经元。

在稀疏性惩罚中,我们核心思想是创造一个“资源极其稀缺”的环境,让神经元之间形成激烈的竞争,只有最“专业”的神经元才能获得激活的机会。

其中的关键机制就是

L1L2稀疏性惩罚

这不仅仅是要求“激活的神经元少”,而是通过数学手段从根本上鼓励“要么不激活,要么就显著激活”。

1.L2惩罚(常见于权重衰减):它会惩罚大的激活值,倾向于让所有激活值都变得比较小,但很少会变成精确的零。这就像让一个团队里所有人都小声说话,但每个人还在说话,我们就是要让一些人完全闭嘴。

2.L1惩罚(SAE的核心):它惩罚的是激活值的绝对值之和。在优化过程中,L1有一个非常好的特性:它会强烈地驱使不重要的激活值变成精确的零。

通过这种机制,我们可以确保一个神经元只有在输入信号与其代表的特征高度匹配,能够对重构做出巨大贡献,足以“值回”L1惩罚的票价时,它才会选择激活。这就从根本上抑制了它被其他不相关特征“牵连激活”的可能性。

我们通常需要一个超参数来调节 L1L2稀疏性惩罚,通常称为sparsity_coefficient,

就是我们后续的λ,在研究调试中,我们的目标就是找到一个“最佳点”,使得模型既能很好地重构原始激活,又能保证特征层是高度稀疏的。

 

为此,我们的总loss function由两部分构成:

Total Loss=Reconstruction Loss+(λ×Sparsity Loss)

其中:

Reconstruction Loss:衡量模型的输出与输入有多么不一致。常用均方误差 (MSE)计算。

Sparsity Loss:惩罚隐藏层中激活的神经元。

λ :稀疏性系数,一个超参数,用来平衡上述两个损失项的重要性。

通过这样的训练,我们可以训练出一个将网络模型“稀疏化”的解压缩模型

训练后,我们不能想当然地认为每个特征都是纯净的。必须通过严格的“审计”来验证,确保SAE后这个节点只会被一个特征激活,而不会被其他特征也牵连激活。

一个是看特征密度,训练一个好的SAE,其特征密度应该非常低(例如,一个有20000个特征的SAE,可能平均每次只有不到10个特征被激活)还要看在整个数据集上,有多少比例的神经元至少被激活过一次。如果这个比例太低,说明L1惩罚可能过强,需要进一步调大λ。

还有一个方法就是暴力的人工审查,比如说我们可以输入一些相关但是完全不相同的特征进去,如果一个分辨耄耋表情的模型,他的某个节点在耄耋图案输入的时候会激活,但是输入其他棕色哈基米哈气的图案也会被激活,如果激活了,这个激活值是比耄耋输入强还是更弱,这可以帮我们定义特征的边界,也许他分辨的不是“耄耋”特征,而是“哈气”特征。

不过目前,这个过程还没有算法来设计出一个完全自动化的流程,需要大量的人工介入和判断。

 

posted @ 2025-10-10 15:34  liujunxi  阅读(16)  评论(0)    收藏  举报