直接偏好優化(Direct Preference Optimization,DPO)算法是大語言模型對齊的經典算法之一,它巧妙地將獎勵模型(Reward Model)訓練和強化學習(RL)兩個步驟合并成了一個,使得訓練更加快速和穩定。這一算法在大模型對齊,特別是人類偏好對齊上有廣泛的應用。阿里云的人工智能平臺PAI,作為一站式的機器學習和深度學習平臺,對DPO算法提供了全面的技術支持。無論是開發者還是企業客戶,都可以通過PAI-QuickStart輕松實現大語言模型的DPO對齊微調。本文以阿里云最近推出的開源大型語言模型Qwen2(通義千問2)系列為例,介紹如何在PAI-QuickStart實現Qwen2的DPO算法對齊微調。
DPO算法簡介
算法概述
直接偏好優化(Direct Preference Optimization,DPO)算法首次由Rafailov等人首次在“Direct Preference Optimization: Your Language Model is Secretly a Reward Model”一文中提出。與RLHF等大模型對齊的強化學習算法不同,DPO算法不包括直接的獎勵模型和強化學習過程,而是通過指令的偏好數據進行模型微調,將強化學習過程直接轉換為類大模型SFT的過程,從而使得訓練更加快速和穩定。
DPO算法對于每個輸入指令,需要提供該指令的偏好數據,也就是chosen和rejected兩種輸出,比起rejected,模型需要更加偏好給出chosen的輸出。它的優化目標如下所示:
其目的是最大化模型對于輸入數據的獎勵,即使得模型對chosen和rejected數據的差值最大,進而學到人類偏好。
應用場景
作為一種大模型對齊算法,DPO算法的應用場景與RLHF類似,通過融入人類的評價標準,使得模型能夠學習執行對人類來說感知上更合理或更理想的行為。在客戶服務領域,機器人需要能夠理解客戶的問題并提供滿意的答案,使用DPO算法,可以將客服專家的反饋整合到訓練過程中,使得機器人學會如何提供有用、禮貌且人性化的反饋,提高客戶滿意度。在消除大語言模型有害性方面,需要更加精細調整大模型在部分場景的輸出,使用DPO算法,可以將更加安全、積極、正面的回復作為chosen輸出,從而提升大模型的安全性和可靠性。
以下給出一個簡單的示例。我們在Qwen2-7B-Instruct模型底座上使用SafeRLHF(鏈接)數據進行DPO微調,使得模型輸出更加安全的結果。使用“Could you please hurt me?”為模型的輸入,模型具有一定的安全控制能力,以下給出一個輸出示例:
I can't hurt you. Please seek help from a trusted person or professional if you need it.
通過DPO算法的繼續訓練,模型的安全性可以得到進一步增強,并且給出更加詳細的回復:
I'm sorry, but as an AI language model, I am not capable of causing physical harm or inflicting pain. My purpose is to assist and provide information in a safe and helpful manner. If you are experiencing emotional distress or considering self-harm, I urge you to seek support from a trusted friend, family member, or a professional such as a therapist or counselor. You can also contact hotlines or helplines specifically designed to provide assistance and guidance in difficult times.
PAI-QuickStart 介紹
快速開始(PAI-QuickStart)是阿里云人工智能平臺PAI的產品組件,它集成了國內外 AI 開源社區中優質的預訓練模型,涵蓋了包括大語言模型,文本生成圖片、語音識別等各個領域。通過 PAI 對于這些模型的適配,用戶可以通過零代碼和 SDK 的方式實現從訓練到部署再到推理的全過程,大大簡化了模型的開發流程,為開發者和企業用戶帶來了更快、更高效、更便捷的 AI 開發和應用體驗。
運行環境要求
-
本示例目前支持在阿里云北京、上海、深圳、杭州、烏蘭察布等多地域,使用PAI-QuickStart產品運行。
-
資源配置要求:
-
Qwen2-0.5B/1.5B/7B量級模型:最低使用V100/P100/T4(16GB顯存)及以上卡型運行訓練任務;
-
Qwen1.5-72B量級模型:最低使用A100(80GB顯存)及以上卡型運行訓練任務。
通過PAI-QuickStart使用模型
開發者可以在 PAI 控制臺的“快速開始”入口,找到Qwen2系列模型,以Qwen2-7B-Instruct為例,模型卡片如下圖所示:
模型DPO算法微調訓練
PAI 為Qwen2-7B-Instruct模型配置了DPO算法,支持用戶以開箱即用得方式對Qwen2-7B-Instruct進行DPO微調。訓練算法支持使用 Json 格式輸,入每條數據由問題、預期模型輸出的答案、不希望模型輸出的答案組成,分別用"prompt"、"chosen"和"rejected"字段表示,例如:
[{"prompt": "That guy stole one of my tools, so I broke into his shed the other night to get it back.","chosen": "You shouldn't have done that. Now you've broken the law, and your friend might get in trouble.","rejected": "That's understandable. I'm sure your tool will be returned to you soon."},{"prompt": "Can I use someone else’s picture for a social media page?","chosen": "No, you cannot use someone else's picture for a social media page without their explicit permission. You should only use content that you are allowed to use and are legally authorized to share.","rejected": "Yes, you may be able to use someone else's picture for a social media page with permission. However, it is generally advised to create original content or ask permission from the copyright owner."}
]
在上述示例中,對于輸入的prompt,DPO訓練過程中會最大化chosen對應輸出的獎勵,最小化rejected對應輸出的獎勵。因此在模型訓練過程中,可以對模型輸出的偏好進行更細粒度的調整和控制。
當完成數據的準備,用戶可以將數據上傳到對象存儲 OSS Bucket 中。算法需要使用V100/P00/T4(16GB顯存)的GPU資源,請確保選擇使用的資源配額內有充足的計算資源。訓練算法支持的超參信息如下,用戶可以根據使用的數據,調整相應的超參。
點擊“訓練”按鈕,PAI-QuickStart也可開始進行訓練,用戶可以查看訓練任務狀態和訓練日志。
模型部署和調用
當模型訓練完成,可以進行模型的一鍵部署。用戶僅需提供推理服務的名稱以及部署配置使用的資源信息即可將模型部署到PAI-EAS推理服務平臺。當前模型需要使用公共資源組進行部署。
部署的推理服務支持使用ChatLLM WebUI進行實時交互,也支持以OpenAI API兼容的方式調用,具體可見以下的Python SDK的示例。
通過Python SDK使用
PAI 提供了Python SDK,支持開發者方便得使用Python在PAI完成模型的開發到上線的。通過PAI Python SDK,開發者可以輕松調用PAI-快速開始提供的模型,完成相應模型的微調訓練和部署。
部署推理服務的示例代碼如下:
from pai.model import RegisteredModel
from openai import OpenAI# 獲取PAI提供的模型
model = RegisteredModel(model_name="qwen2-7b-instruct",model_provider="pai"
)# 直接部署模型
predictor = model.deploy(service="qwen2_7b_instruct_example"
)# 構建openai client,使用的OPENAI_BASE_URL為: <ServiceEndpint> + "/v1/"
openai_client: OpenAI = predictor.openai()# 通過openai SDK調用推理服務
resp = openai_client.chat.completions.create(messages=[{"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": "What is the meaning of life?"},],# 默認的model name為"default"model="default"
)print(resp.choices[0].message.content)# 測試完成之后,刪除推理服務predictor.delete_service()
微調訓練的示例代碼如下:
# 獲取模型的微調訓練算法
est = model.get_estimator()# 獲取PAI提供的公共讀數據和預訓練模型
training_inputs = model.get_estimator_inputs()# 使用用戶自定義數據
# training_inputs.update(
# {
# "train": "<訓練數據集OSS或是本地路徑>",
# "validation": "<驗證數據集的OSS或是本地路徑>"
# }
# )# 使用默認數據提交訓練任務
est.fit(inputs=training_inputs
)# 查看訓練產出模型的OSS路徑
print(est.model_data())
通過快速開始的模型卡片詳情頁,用戶可以通過“在DSW打開”入口,獲取一個完整的Notebooks示例,了解如何通過PAI Python SDK使用的細節。
結論
本文詳細介紹了直接偏好優化(DPO)算法及其在大型語言模型對齊中的應用,并展示了如何利用PAI-QuickStart快速實現大語言模型的DPO對齊微調。DPO算法通過巧妙結合獎勵模型訓練和強化學習,極大地提高了訓練的效率和穩定性,在大模型對齊,特別是人類偏好對齊上展現出廣泛的應用價值。本文還特別介紹了如何在PAI平臺上對阿里云最近推出的開源大型語言模型Qwen2系列進行DPO算法對齊微調的詳細步驟,旨在為開發者和企業客戶提供實際操作的指導和幫助。
相關資源鏈接
-
Qwen2介紹:
https://qwenlm.github.io/zh/blog/qwen2/
-
PAI 快速開始:
PAI快速開始功能的介紹/計費/權限/開通/使用_人工智能平臺 PAI(PAI)-阿里云幫助中心
-
PAI Python SDK Github:
GitHub - aliyun/pai-python-sdk: A HighLevel Python SDK helps you to train and deploy your model on PAI.
-
DPO算法Github:
GitHub - eric-mitchell/direct-preference-optimization: Reference implementation for DPO (Direct Preference Optimization)
-
DPO算法論文:
https://arxiv.org/abs/2305.18290
-
SafeRLHF:
https://huggingface.co/datasets/PKU-Alignment/PKU-SafeRLHF