层选择性秩约简
本代码仓库包含了Pratyusha Sharma、Jordan T. Ash和Dipendra Misra在ICLR 2024上发表的论文"The Truth is in There: Improving Reasoning in Language Models with Layer-Selective Rank Reduction"的代码。
网站地址: https://pratyushasharma.github.io/laser/
更新:
- 2024年1月18日: refactor分支正在进行重构。我们正在努力尽快发布,感谢您的耐心。
- 2024年1月7日: 结果表已经在网站上创建。
- 2024年1月4日: 讨论页面已开放。请随时使用该页面建议新的主题/想法/结果,这些内容尚未在问题中覆盖。
这是一个早期开发版本。我们将在2024年1月进行一次重大重构,以使代码更易于使用和更灵活。
我们欢迎问题报告和贡献。如果您在某个LLM和NLP任务上使用LASER并报告了新的结果,请提交拉取请求,我们会将其添加到网站的排行榜上。
什么是层选择性秩约简?
LAyer-SElective Rank-Reduction,简称LASER,是一种干预方法,我们将LLM的Transformer架构中的选择权重矩阵替换为其低秩近似。单个LASER变换包含3个超参数:要修改的层数(ℓ),如第16层,参数类型(τ),如第一个MLP层,以及要保留的最大秩的比例(ρ),如秩的0.01比例。我们可以将此转换写为(ℓ, τ, ρ),并可以组合这些转换并并行应用。低秩近似是使用SVD执行的。下面的图例来自我们的论文。
LASER可以在无需额外模型训练的情况下在问答任务上显著提高性能。我们的论文展示了在3个不同的LLM和几个LLM基准上评估LASER的各种结果。本代码仓库包含了复现这些结果的代码。
如何运行样本代码
我们首先讨论如何安装代码,然后讨论如何运行实验。
安装
要安装实验,请安装pip文件。我们主要只需要pytorch和huggingface的datasets和transformers包。建议创建一个conda环境。
pip3 install -r requirements.txt
可选的,如果您想使用CounterFact数据集进行实验,请运行以下脚本下载它。所有其他数据集都可以在HuggingFace上获得。
python scripts/get_counterfact.py
运行样本代码
目前,每个设置都有其自己的文件。要运行在Fever数据集上对GPTJ执行单个LASER变换的实验,您可以运行:
python3 intervention_gptj_fever.py --lname fc_in --rate 9.9 --lnum 26
这里的_ln_即为ℓ,_lname_是τ,_rate_与ρ的关系为ρ = 1 - 0.1 * rate。rate的值在[0, 10.0]之间,表示舍弃多少成分,其中10表示全部舍弃,得到一个0矩阵,0表示全部保留,保留原始矩阵。rate的使用是为了兼容老版本的原因,我们将在未来重构代码直接使用ρ。我们使用的_lname_映射为:
lname | 描述 |
---|---|
dont | 使用基础模型,不进行干预 |
fc_in | MLP的第一层 |
fc_out | MLP的第二层 |
fc_up | 一些LLM中的第三个MLP权重矩阵,用于Hadamard乘法 |
mlp | 所有MLP权重矩阵 {fc_in, fc_up, fc_out} |
k_proj | 自注意力中的key矩阵 |
v_proj | 自注意力中的value矩阵 |
q_proj | 自注意力中的query矩阵 |
out_proj | 自注意力中的输出矩阵 |
attn | 所有注意力权重矩阵 |
请注意,如果您添加了一个新的LLM,那么您必须修改laser包以实现映射。 例如,请参见Llama2的映射这里。您还需要更新Laser包装器以使其与新的LLM一起工作这里。
注意,上述实验将保存每个数据点的准确率和log-loss。在某些文件中,需要先使用验证集(前20%例子)进行超参数选择,然后使用选定的超参数计算测试集(剩余80%例子)的准确率。未来,我们将重构代码,使其非常容易做到这一点。
代码组织
代码在src
文件夹内。主要的实验文件在src
的顶层。文件名的约定是intervention_<llm-name>_<dataset-name>.py
,其中<llm-name>
是LLM的名称,<dataset-name>
是数据集的名称。对于BigBench,数据集的拆分通常用额外的标志--split指定。请参阅代码库以获取命令行参数的详细信息。我们将在以后提供详细的教程。
执行laser的代码在laser
包内。我们使用PyTorch执行SVD并计算低秩近似。低秩近似的代码发生在这里。读取和处理数据集的代码在dataset_util
内。最后,度量和日志记录使用的是study_utils
。
引用
如果您觉得该代码库有用,请引用以下论文。此外,您也可以发送拉取请求或电子邮件,我们会在排行榜上引用您的结果/论文。
@article{sharma2023truth,
title={The Truth is in There: Improving Reasoning in Language Models with Layer-Selective Rank Reduction},
author={Sharma, Pratyusha and Ash, Jordan T and Misra, Dipendra},
journal={arXiv preprint arXiv:2312.13558},
year={2023}
}