GPT-2 small电路发现,使用稀疏的自动编码
要手动安装,只需在外壳中运行这些命令:
git clone https://github.com/DavidUdell/sparse_circuit_discovery
cd sparse_circuit_discovery
pip install -e .
另外,我在GitHub容器注册表上有一个Docker映像。 Docker映像特别适合拉到远程服务器。
您的操作基础是sparse_coding/config/central_config.yaml 。最重要的超参数是顶部:
# Note: leave out entries for None. Writing in `None` values will get you the
# string "None".
## ------------------------------------------------------------------------- ##
## --------------------------- Key Hyperparameters ------------------------- ##
## ------------------------------------------------------------------------- ##
# ACTS_LAYERS_SLICE should be a Python slice, in str format. Set it to ":" to
# plot data from all model layers.
ACTS_LAYERS_SLICE: "9:12"
INIT_THINNING_FACTOR: 1.0
NUM_SEQUENCES_INTERPED: 1
THRESHOLD_EXP: 5.0
# Only pin single dims per layer. If not set, every ablation effect is plotted.
DIMS_PINNED:
3: [331]
为了:
ACTS_LAYERS_SLICE是一个格式为字符串的Python切片。它设置了您可以解释激活的GPT-2 small模型的层。INIT_THINNING_FACTOR是您绘制的切片中第一层功能的一部分。例如, 1.0的部分将尝试绘制图层中的每个功能。NUM_SEQUENCES_INTERPED是绘图过程中使用的令牌序列的数量,目的是计算logit效果和下游特征效应。THRESHOLD_EXP是绘制激活差异的阈值值指数。激活幅度的差异较小,而不是2**THRESHOLD_EXP 。要绘制每个非零效果,请评论这一行。DIMS_PINNED是层索引的字典,其后是Singleton特征索引列表。如果设置为第一层,它将完全覆盖INIT_THINNING_FACTOR 。设置这些值,保存central_config.yaml ,然后使用以下方式运行解释性
cd sparse_coding
python3 pipe.py
所有数据都出现在sparse_coding/data/中。
您生成的最后一个认知图可以保存为适合您的.svg ,也可以保存为计算机的.dot 。如果您再次运行可解释性管道,则新数据将在该旧的.dot文件上扩展。这样,您可以随着时间的流逝逐渐搜索电路。
还有一种基于梯度的算法,即Marks等人的实现。 (2024)。该算法的优点是直接绘制对横向渗透损失的贡献,而不是绘制对中间激活幅度的贡献。它在这里的实现也扩展到了GPT-2的子层,而不仅仅是模型的剩余流。
关键的超参数是:
ACTS_LAYERS_SLICE如上所述。 # Topk thresholds for gradient-based method.
NUM_UP_NODES: 5
NUM_DOWN_NODES: 5
NUM_UP_NODES修复了每个sublayer down节点的子层节点的数量。请注意,边数的数量等于此值的两倍:您将获得这么多顶部的边缘和许多下K的边缘。NUM_DOWN_NODES修复了将从中绘制边缘的子层节点的数量。将这些值保存在central_config.yaml中,然后运行可解释性:
cd sparse_coding
python3 fast.py
数据显示在sparse_coding/data/中,就像使用幼稚算法一样。
这种可解释性管道还将从Neuronpedia中提取更全面的可解释性数据,并在可用时将其附加到每个节点。
在这里,您还可以选择将图形呈现为.png文件。为此,将central_config.yaml中.svg GRADS_FILE扩展到.png 。当需要物理副本时,我会单独使用后刺打印大的.png图形文件。
还有一个独立的电路验证管道val.py该脚本同时消除了包含电路的所有功能,以查看整个电路在消融下的行为(而不是仅在独立消融下查看单独的特征,即pipe.py认知图)。
要设置此设置,首先设置ACTS_LAYERS_SLICE以包含GPT-2中的相关层,包括一个完整的额外层,
ACTS_LAYERS_SLICE: "6:9"
然后将包含给定电路的所有功能固定在VALIDATION_DIMS_PINNED中。
# Here you can freely pin multiple dims per layer.
VALIDATION_DIMS_PINNED:
6: [8339, 14104, 18854]
7: [2118]
现在以:
python3 val.py
在central_config.yaml中设置数据集,然后运行:
python3 hist.py
将通过神经元激活的数据集群集,然后缓存99.99%自动编码器基本激活幅度。现在, fast.py运行将使用那些缓存的阈值。
考虑此页面顶部的认知图。每个具有像4.112这样的标签的盒子都是稀疏自动编码器中的功能。 4是其层索引,而112是该层自动编码器中的列索引。您可以为Neuronpedia上任何给定的功能交叉引用更全面的可解释性数据。
每个框中的序列中的蓝色令牌代表其上下文中的顶部特征激活,以指定的长度到任何一侧。
底部的单个盒子中的蓝色和红色令牌是该维度最高重/下降的逻辑。 (灰色是0.0效应边缘情况。)
盒之间的箭头代表了下游消融对其他功能的影响。红色箭头表示过重,蓝色( grad_graph.py中的绿色)箭头表示上升,箭头透明度代表大小。例如,淡红色箭头是一个小小的下降效果。
我目前已经了解了很多存储库功能:仅支持GPT-2 small ,投影系数为32,以利用一组先前存在的稀疏自动编码器。
如果抬高了急切的齐射率,则应仔细检查您的层切片是否与固定的昏暗兼容。
如果您遇到了隐秘的Env变量错误,请确保您正在运行CUDA工具包12.2或更新。
正如Shell语法所建议的那样,目前需要类似于Unix的路径(在MacOS或Linux上),并且Windows路径可能不会与回购相处。
fast.py采用独特的修剪策略:它将在最终的GPT-2 small层中使用自动编码器DIM并从中修剪。因此,您应该从模型的底部开始,然后从那里逐步绘制。
当前版本为1.3.1