一行程式碼提高大模型10%效能,開發者:免費午餐


原文來源:量子位元

圖片來源:由無界AI生成

大模型微調有「免費的午餐」了,只要一行程式碼就能讓效能提升至少10%。

在7B參數量的Llama 2上甚至出現了效能翻倍的結果,Mistral也有四分之一的成長。

雖然這種方法用在監督微調階段,但RLHF模型也能從中獲益。

來自馬裡蘭州大學、紐約大學等機構的研究人員提出了名為NEFT(une)的微調方式。

這是一種新的正則化技術,可用於提高微調監督(SFT)模型的效能。

這個方法已經被HuggingFace收錄進了TRL函式庫,只要import再加一行程式碼就能呼叫。

NEFT不僅操作簡便,而且沒有顯著的成本增加,作者稱看起來是個「免費的午餐」。

有網友試著用這種方法微調了基於Guanaco(一種羊駝家族模型)的Mistral-7B,結果性能提昇明顯。

那麼,NEFTune是如何用一行程式碼給一眾大模型「打雞血」的呢?

在模型中加入噪聲

NEFTune的全名為Noisy Embedding Fine Tuning,即「帶有雜訊的嵌入式微調」。

開發者認為,過度擬合現像是限制大模型效能的一大因素,因此採用在訓練階段向嵌入層中加入雜訊的方式來避免過度擬合的出現,從而提高效能。

具體而言,訓練資料庫中的文字首先會被token化,並轉換為嵌入向量。

然後,系統會隨機產生一個雜訊向量,並用縮放器將雜訊調節成所設定的強度。

經過縮放後的雜訊會加入嵌入向量中,作為模型的輸入,然後開始訓練。

每次迭代訓練時,都會產生新的雜訊並加入嵌入層。

from torch.nn import functional as F

def NEFTune(model, noise_alpha=5)
def noised_embed(orig_embed, noise_alpha):
def new_func(x):
if model.training:
embed_init = orig_embed(x)
dims = torch.tensor(embed_init.size(1) * embed_init.size(2))
mag_norm = noise_alpha/torch.sqrt(dims)
return embed_init + torch.zeros_like(embed_init).uniform_(-mag_norm, mag_norm)
else:
return orig_embed(x)
return new_func
model.base_model.model.model.embed_tokens.forward = noised_embed(model.base_model.model.model.embed_tokens, noise_alpha)
return model

這段程式碼中,NEFTune函數中的形參noise_alpha就是雜訊強度(係數),mag_norm則為實際過程中的雜訊範圍。

而NEFT只有在訓練過程中才會在模型中加入噪聲,推理階段無此過程,程式碼中的if語句起到的就是這個作用。

訓練模式下,new_func函數的回傳值即為加入雜訊後的嵌入層。

貼出這段程式碼是為了講解需要,如果只是想呼叫NEFT,可以不必使用上面的完整程式碼,直接從TRL函式庫中呼叫就可以了。

下面的程式碼是微調OPT-350M模型的範例:

from datasets import load_dataset
from trl import SFTTrainer

dataset = load_dataset(“imdb”, split=”train”)

trainer = SFTTrainer(
“facebook/opt-350m”,
train_dataset=dataset,
dataset_text_field=”text”,
max_seq_length=512,
)
trainer.train()

而資料集方面,開發者一共使用了Alpaca、ShareGPT等四種不同資料集都進行了微調。

作者介紹,選擇這些數據的原因包括它們比較著名、曾經成為SOTA等等。

另外出於硬體效能考慮,實驗過程中所選擇的都是單輪對話資料集。

那麼,用NEFT方法調校過後的大模型,表現到底怎麼樣呢?

性能最高提升1倍

研究團隊主要測試了模型調校前後產生的文字品質和對話能力。

其中文字品質主要基於AplacaEval資料集,使用ChatGPT和GPT-4評估。

用作參照的模型為Text-Davinci-003,訓練後的模型勝過TD3的比例即為評估指標。

為了節省資源,研究團隊先用ChatGPT判斷是自己來評估還是呼叫GPT-4,部分情況下還會人工評斷。

結果在不同的訓練資料中心化,Llama 2調整後都有至少10%的效能提升,在Alpaca資料集上更是直接翻倍。

推廣到OPT和Llama 1,NEFT方法同樣可以帶來一定的效能提升。

而用於評估模型聊天能力的,則是OpenLLM Leadorboard中的任務。

結果發現,NEFT調整後模型的聊天能力同樣相比Evol-Instruct有進一步提升。

在成本沒有顯著增加的情況下,提高文字品質和聊天能力,是否會導致其他能力的下跌,作者對此也進行了評估。

結果顯示,NEFT方法在不同的資料集和模型上,對模型的其他能力均沒有顯著影響。

實驗過程中,作者也發現,模型產生的文本和並不是照搬訓練數據,提示了模型具有一定泛化能力。

為了證實這一點,作者對模型損失進行了評估,結果發現測試資料集損失低於訓練數據,證實了這一觀點。

此外作者發現,經NEFT調整後,模型產生的文字不僅品質提高,長度也增加,增加的並非重複內容。

為了確認文本品質的提高是加入雜訊的作用而不是由文字長度的增加所導致,研究人員又進行了消融實驗。

結果顯示,只是強制模型產生較長的文字無法達到NEFT的效果。

論文地址:
https://arxiv.org/abs/2310.05914

資訊來源:由0x資訊編譯自8BTC。版權所有,未經許可,不得轉載

Total
0
Shares
Related Posts