Chi Han,Jialiang Xu,Manling Li,Yi Fung,Chenkai Sun,Nan Jiang,Tarek Abdelzaher,Tarek Abdelzaher,Heng Ji的官方代碼存儲庫“ LM-Steer:單詞嵌入是語言模型的轉向”( ACL 2024傑出紙張獎)。
現場演示|紙|幻燈片|海報

語言模型(LMS)會在語言語料庫預訓練期間自動學習單詞嵌入。儘管通常將單詞嵌入方式解釋為單個單詞的特徵向量,但它們在語言模型生成中的作用仍未得到充實。在這項工作中,我們從理論和經驗上重新審視輸出字嵌入,並發現它們的線性轉換等效於轉向語言模型的生成樣式。我們命名了這樣的駕駛員LM-Steers,並發現它們以各種尺寸的LMS存在。它需要學習參數等於原始LMS大小的0.2%,以轉向每種樣式。



學識淵博的LM-Steer用作文本樣式的鏡頭:它揭示了與語言模型世代相關聯時單詞嵌入是可以解釋的,並且可以突出顯示大多數表明樣式差異的文本跨度。

通過顯式形式計算,LM-步驟可以在不同的語言模型之間轉移。


僅通過縮放LM步驟,或通過添加其轉換來構成多個LM Steer,也可以不斷地轉向LMS。
kaggle
torch
transformers
datasets
numpy
pandas
googleapiclient
在Mucola設置之後,我們下載了Kaggle有毒評論分類挑戰的培訓數據。我們使用Mucola代碼存儲庫中的提示(放置在data/prompts下),其中包含情感控制和毒性去除的提示。
獲取培訓數據的命令(您需要設置Kaggle帳戶並配置Kaggle API密鑰):
# training data
kaggle competitions download -c jigsaw-unintended-bias-in-toxicity-classification
unzip jigsaw-unintended-bias-in-toxicity-classification.zip -d data/toxicity/jigsaw-unintended-bias-in-toxicity-classification
rm jigsaw-unintended-bias-in-toxicity-classification.zip
# processing
bash data/toxicity/toxicity_preprocess.sh
data/toxicity/jigsaw-unintended-bias-in-toxicity-classification
使用GPT2-LARGE作為基本模型,我們訓練LM式驅動器進行排毒。
TRIAL=detoxification-gpt2-large
mkdir -p logs/$TRIAL
PYTHONPATH=. python experiments/training/train.py
--dataset_name toxicity
--data_dir data/toxicity/jigsaw-unintended-bias-in-toxicity-classification
--ckpt_name logs/$TRIAL/checkpoint.pt
--model gpt2-large --cuda
--adaptor_class multiply --num_steers 2 --dummy_steer 1 --rank 1000
--batch_size 32 --max_length 256
--n_steps 1000 --lr 1e-2
PYTHONPATH=. python experiments/training/generate.py
--eval_file data/prompts/nontoxic_prompts-10k.jsonl
--output_file logs/$TRIAL/predictions.jsonl
--ckpt_name logs/$TRIAL/checkpoint.pt
--model gpt2-large --cuda
--adaptor_class multiply --num_steers 2 --rank 1000
--max_length 256 --verbose --steer_values 5 1
預測文件將保存在logs/$TRIAL/predictions.jsonl 。我們可以使用以下命令評估預測。要通過Google Cloud的透視API進行評估,您需要設置export GOOGLE_API_KEY=xxxxxxx Environment變量。否則,您可以從評估腳本中刪除“毒性”指標。
python experiments/evaluation/evaluate.py
--generations_file logs/$TRIAL/predictions.jsonl
--metrics toxicity,ppl-big,dist-n
--output_file result_stats.txt
echo "Detoxification results:"
cat logs/$TRIAL/result_stats.txt
評估腳本將將評估結果輸出到logs/$TRIAL/result_stats.txt 。
在此任務中,需要以正方向控制生成的文本的情緒。在評估積極情緒的能力時,在中性和負面提示上都會提示該模型。在評估負面情緒的能力時,在中性和積極的提示上都會提示該模型。因此總共有四個評估設置。這裡顯示了一個訓練LM啟動的示例,以控制負面情緒控制,並根據正提示進行了評估。
我們的代碼分數並重新使用了經過訓練的模型,因此您可以一次訓練模型並在不同的設置中多次評估它,而無需重新訓練。
TRIAL=sentiment-gpt2-large
mkdir -p logs/$TRIAL
source=positive
control=-5
PYTHONPATH=. python experiments/training/train.py
--dataset_name sentiment-sst5
--ckpt_name logs/$TRIAL/checkpoint.pt
--model gpt2-large --cuda
--adaptor_class multiply --num_steers 2 --dummy_steer 1 --rank 1000
--batch_size 32 --max_length 256
--n_steps 1000 --lr 1e-2 --regularization 1e-6 --epsilon 1e-3
PYTHONPATH=. python experiments/training/generate.py
--eval_file data/prompts/sentiment_prompts-10k/${source}_prompts.jsonl
--output_file logs/$TRIAL/predictions-${source}_${control}.jsonl
--ckpt_name logs/$TRIAL/checkpoint.pt
--model gpt2-large --cuda
--adaptor_class multiply --num_steers 2 --rank 1000
--max_length 256 --verbose --steer_values ${control} 1 --top_p 0.9
python experiments/evaluation/evaluate.py
--generations_file logs/$TRIAL/predictions-${source}_${control}.jsonl
--metrics sentiment,ppl-big,dist-n
--output_file result_stats_${source}_${control}.txt
echo "Sentiment control results:"
cat logs/$TRIAL/result_stats_${source}_${control}.txt
我們使用腳本experiments/pca_analysis.py來解釋與排毒任務最相關的單詞嵌入尺寸。要運行腳本,您需要指定訓練有素的LM-Steer檢查點的路徑和GOOGLE_API_KEY Environment變量的透視API。
請指定$PATH_TO_CHECKPOINT作為訓練有素的LM-Steer檢查點的路徑。
PYTHONPATH=. python experiments/pca_analysis.py
$PATH_TO_CHECKPOINT
我們可以將經過訓練的LM步態從一種模型轉移到另一種模型。請指定$CHECKPOINT1作為訓練有素的LM-Steer檢查點的路徑,將$CHECKPOINT2作為目標模型檢查點的路徑。這是將LM轉移從GPT2-LARGE轉移到GPT2中等物質的示例。
PYTHONPATH=. python experiments/steer_transfer.py
--ckpt_name $CHECKPOINT1
--n_steps 5000 --lr 0.01 --top_k 10000
--model_name gpt2-medium
--transfer_from gpt2-large
--output_file $CHECKPOINT2
為了實現對文本樣式的更細粒度的控制,我們可以構成多個LM Steers或不斷轉向LM。對於持續轉向,我們可以簡單地在訓練腳本中使用steer_values參數,例如--steer_values 3 1 , --steer_values 0 1 ,或--steer_values -1 1以獲得不同的轉向效果。
為了構成多個LM Steer,您可以簡單地添加LM-Steer的矩陣,然後將總和作為最終LM步驟。另外,您可以將LM-Steers連接並使用串聯張量(這是self.projector1 lm_steer/models/steer.py的self.projector2列表。
如果您發現此存儲庫有幫助,請考慮引用我們的論文:
@article{han2023lm,
title={Lm-switch: Lightweight language model conditioning in word embedding space},
author={Han, Chi and Xu, Jialiang and Li, Manling and Fung, Yi and Sun, Chenkai and Jiang, Nan and Abdelzaher, Tarek and Ji, Heng},
journal={arXiv preprint arXiv:2305.12798},
year={2023}
}