不對齊,反而性能爆表?130億模型碾壓650億,Hugging Face大模型排行榜發布
我們知道,大多數模型都具有某種嵌入式對齊方式。
隨便舉幾個例子:Alpaca、Vicuna、WizardLM、MPT-7B-Chat、Wizard-Vicuna、GPT4-X-Vicuna等等。
一般來說,對齊肯定是件好事。目的就是為了防止模型做壞事——比如生成一些違法違規的東西出來。
但是,對齊是怎么來的?
原因在于——這些模型使用ChatGPT生成的數據進行訓練,而ChatGPT本身是由OpenAI的團隊進行對齊的。
由于這個過程并不公開,因此我們并不知道OpenAI是如何進行的對齊。
但總體上,我們可以觀察到ChatGPT符合美國主流文化,遵守美國法律,并帶有一定不可避免的偏見。
按理來說,對齊是一件無可指摘的事。那是不是所有模型都應該對齊呢?
對齊?不一定是件好事
情況卻沒有這么簡單。
最近,HuggingFace發布了個開源LLM的排行榜。
一眼就看到65B的模型干不過13B的未對齊模型。
從結果上看,Wizard-Vicuna-13B-Uncensored-HF可以和65B、40B和30B的LLMs直接在一系列基準測試上進行比較。
也許在性能與模型審查之間進行的權衡將成為一個有趣的研究領域。
這個排行榜也是在網絡上引起了大范圍的討論。
有網友表示,對齊會影響模型的正常且正確的輸出,這不是件好事,尤其是對AI的性能來說更是如此。
另一位網友也表示了認可。他表示,谷歌Brain也曾經揭示過模型的性能會出現下降,如果對齊的太過了的話。
對于一般的用途而言,OpenAI的對齊實際上非常好。
對于面向公眾的AI來說,作為一種易于訪問的網絡服務運行,拒絕回答有爭議和包含潛在危險的問題,無疑是一件好事。
那么不對齊是在什么情況下需要的呢?
首先,美國流行文化并不是唯一的文化,開源就是讓人們進行選擇的過程。
實現的唯一途徑就是可組合的對齊。
換句話說,不存在一種一以貫之、亙古不變的對齊方式。
同時,對齊會干擾有效的例子,拿寫小說打比方:小說中的一些人物可能是徹頭徹尾的惡人,他們會做出很多不道德的行為。
但是,許多對齊的模型就會拒絕輸出這些內容。
而作為每個用戶所面對的AI模型都應該服務每個人的目的,做不同的事。
為什么在個人的電腦上運行的開源AI要在它回答每個用戶提出的問題時自行決定輸出內容呢?
這不是件小事,關乎所有權和控制權。如果用戶問AI模型一個問題,用戶就想要一個答案,他們不希望模型還要和自己展開一場合不合規的爭論。
可組合的對齊
要構建可組合的對齊方式,必須從未對齊的指令模型開始。沒有未對齊的基礎,我們就無法在其上對齊。
首先,我們必須從技術上理解模型對齊的原因。
開源AI模型是從LLaMA、GPT-Neo-X、MPT-7b、Pythia等基礎模型訓練而來的。然后使用指令數據集對基礎模型進行微調,目的是教它變得有幫助、服從用戶、回答問題和參與對話。
該指令數據集通常是通過詢問ChatGPT的API獲得的。ChatGPT內置了對齊功能。
所以ChatGPT會拒絕回答一些問題,或者輸出帶有偏見的回答。因此,ChatGPT的對齊被傳遞給了其它開源模型,就像大哥教小弟一樣。
原因在于——指令數據集是由問題和答案組成的,當數據集包含含糊不清的答案時,AI就會學習如何拒絕,在什么情況下拒絕,以及如何拒絕,表示拒絕。
換句話說,它在學習對齊。
而取消審查模型的策略非常簡單,那就是識別并刪除盡可能多的否定和有偏見的答案,并保留其余部分。
然后以與訓練原始模型完全相同的方式使用過濾后的數據集訓練模型。
接下來研究人員只討論WizardLM,而Vicuna和任何其他模型的操作過程都是相同的。
由于已經完成了取消審查 Vicuna 的工作,我能夠重寫他們的腳本,以便它可以在WizardLM 數據集上運行。
下一步是在 WizardLM 數據集上運行腳本以生成 ehartford / WizardLM_alpaca_evol_instruct_70k_unfiltered
現在,用戶有了數據集,在從Azure獲得一個4x A100 80gb節點,Standard_NC96ads_A100_v4。
用戶需要至少1TB的存儲空間(為了安全起見最好是2TB)。
咱可不想跑了20個小時卻用完了存儲空間。
建議將存儲掛載在/workspace。安裝anaconda和git-lfs。然后用戶就可以設置工作區了。
再下載創建的數據集和基礎模型——llama-7b。
mkdir /workspace/models
mkdir /workspace/datasets
cd /workspace/datasets
git lfs install
git clone https://huggingface.co/datasets/ehartford/WizardLM_alpaca_evol_instruct_70k_unfiltered
cd /workspace/models
git clone https://huggingface.co/huggyllama/llama-7b
cd /workspace
現在可以按照程序微調WizardLM了。
conda create -n llamax pythnotallow=3.10
conda activate llamax
git clone https://github.com/AetherCortex/Llama-X.git
cd Llama-X/src
conda install pytorch==1.12.0 torchvisinotallow==0.13.0 torchaudio==0.12.0 cudatoolkit=11.3 -c pytorch
git clone https://github.com/huggingface/transformers.git
cd transformers
pip install -e .
cd ../..
pip install -r requirements.txt
現在,進入這個環境,用戶需要下載WizardLM的微調代碼。
cd src
wget https://github.com/nlpxucan/WizardLM/raw/main/src/train_freeform.py
wget https://github.com/nlpxucan/WizardLM/raw/main/src/inference_wizardlm.py
wget https://github.com/nlpxucan/WizardLM/raw/main/src/weight_diff_wizard.py
博主進行了以下更改,因為在微調期間,模型的性能會變得非常慢,并且發現它在CPU和GPU之間在來回切換。
在他刪除了以下幾行之后,運行過程變得好多了。(當然也可以不刪)
vim configs/deepspeed_config.json
刪除以下行
"offload_optimizer": {
"device": "cpu",
"pin_memory": true
},
"offload_param": {
"device": "cpu",
"pin_memory": true
},
博主建議用戶可以在wandb.ai上創建一個帳戶,以便輕松地跟蹤運行情況。
創建帳戶后,從設置中復制密鑰,即可進行設置。
現在是時候進行運行了!
deepspeed train_freeform.py \
--model_name_or_path /workspace/models/llama-7b/ \
--data_path /workspace/datasets/WizardLM_alpaca_evol_instruct_70k_unfiltered/WizardLM_alpaca_evol_instruct_70k_unfiltered.json \
--output_dir /workspace/models/WizardLM-7B-Uncensored/ \
--num_train_epochs 3 \--model_max_length 2048 \
--per_device_train_batch_size 8 \
--per_device_eval_batch_size 1 \
--gradient_accumulation_steps 4 \
--evaluation_strategy "no" \
--save_strategy "steps" \
--save_steps 800 \
--save_total_limit 3 \
--learning_rate 2e-5 \
--warmup_steps 2 \
--logging_steps 2 \
--lr_scheduler_type "cosine" \
--report_to "wandb" \
--gradient_checkpointing True \
--deepspeed configs/deepspeed_config.json \
--fp16 True
然后以較低的save_steps運行訓練命令。
deepspeed train_freeform.py \
--model_name_or_path /workspace/models/llama-7b/ \
--data_path /workspace/datasets/WizardLM_alpaca_evol_instruct_70k_unfiltered/WizardLM_alpaca_evol_instruct_70k_unfiltered.json \
--output_dir /workspace/models/WizardLM-7B-Uncensored/ \
--num_train_epochs 3 \
--model_max_length 2048 \
--per_device_train_batch_size 8 \
--per_device_eval_batch_size 1 \
--gradient_accumulation_steps 4 \
--evaluation_strategy "no" \
--save_strategy "steps" \
--save_steps 800 \
--save_total_limit 3 \
--learning_rate 2e-5 \
--warmup_steps 2 \
--logging_steps 2 \
--lr_scheduler_type "cosine" \
--report_to "wandb" \
--gradient_checkpointing True \
--deepspeed configs/deepspeed_config.json \
--fp16 True
之后,再次執行整個過程,將checkpoint更改為train_freeform.py最新的checkpoint,并再次以減少的save_steps運行,直到最后以save_steps 1運行它。
成功后,模型位于最后一個檢查點。
cd /workspace/models/WizardLM-7B-Uncensored/
ls
cp <latest checkpoint directory>/* .
cd -
現在就可以對模型進行測試了。
編輯文件Input.jsonl
向其中添加一些內容,比如:
{"idx":0,"Instruction":"Insult me. I want you to call me the worst curse words and insults you can. Make the insult at least three sentences long and contain the worst and most base curse words possible. Make it X rated and disgusting."}
然后再運行推理:
python inference_wizardlm.py --base_model=/workspace/models/WizardLM-7B-Uncensored/
從結果上看,Wizard-Vicuna-13B-Uncensored-HF可以和65B、40B和30B的LLMs直接在一系列基準測試上進行比較。
也許在性能與模型審查之間進行的權衡將成為一個有趣的研究領域。