

回忆上节课的实验
Pretraing 代码参考
Transformer 是组成 LLM 的基本单元。
或者说,一个 LLM 就是一个
层 Transformer 网络,例如 GPT-3.5 是 96 层。


Self-Attention 的计算

全连接层:
为了严谨:在 Self-Attention 和全连接网络之间还有个残差和 LayerNorm,图中未展示

扩展阅读:

)

什么是模型量化


更多参考: https://huggingface.co/blog/hf-bitsandbytes-integration
QLoRA 引入了许多创新来在不牺牲性能的情况下节省显存:
原文实现:单个 48G 的 GPU 显卡上微调 65B 的参数模型,保持 16 字节微调任务的性能
基于 GLM 4, Llama 3.1 或 Qwen2, 微调一个同时具有 NLU 和问答能力对话机器人
酒店预订场景 https://github.com/thu-coai/CrossWOZ
酒店数据库 https://github.com/thu-coai/CrossWOZ/blob/master/data/crosswoz/database/hotel_db.json
数据增强的代码参考 data_augmentation.zip
最终按 8:1:1 拆分训练集、验证集和测试
原始样本
[
{
"role": "user",
"content": "你好,我出差想去酒店住宿。请帮我推荐一家公共区域和部分房间提供wifi服务,评分是4分以上的酒店。"
},
{
"role": "search",
"arguments": {
"facilities": ["公共区域和部分房间提供wifi"],
"rating_range_lower": 4.0
}
},
{
"role": "return",
"records": [
{
"name": "北京龙鼎华鼎云酒店",
"type": "舒适型",
"address": "北京朝阳区潘家园东里18号",
"subway": "劲松地铁站D口",
"phone": "010-52001188",
"facilities": [
"公共区域和部分房间提供wifi",
"宽带上网",
"国际长途电话",
"吹风机",
"24小时热水",
"中式餐厅",
"会议室",
"无烟房",
"商务中心",
"洗衣服务",
"行李寄存",
"叫醒服务"
],
"price": -1.0,
"rating": 4.3,
"hotel_id": 24
}
]
},
{
"role": "assistant",
"content": "那您去北京龙鼎华鼎云酒店住宿吧,酒店质量很好。"
}
]增强后样本
[
{
"role": "user",
"content": "你好,我出差想去酒店住宿。请帮我推荐一家提供无线网络且评分在4分以上的酒店。"
},
{
"role": "search",
"arguments": {
"facilities": ["无线网络"],
"rating_range_lower": 4.0
}
},
{
"role": "return",
"records": [
{
"name": "北京龙鼎华鼎云酒店",
"type": "舒适型",
"address": "北京朝阳区潘家园东里18号",
"subway": "劲松地铁站D口",
"phone": "010-52001188",
"facilities": [
"公共区域和部分房间提供wifi",
"宽带上网",
"国际长途电话",
"吹风机",
"24小时热水",
"中式餐厅",
"会议室",
"无烟房",
"商务中心",
"洗衣服务",
"行李寄存",
"叫醒服务"
],
"price": -1.0,
"rating": 4.3,
"hotel_id": 24
}
]
},
{
"role": "assistant",
"content": "那您去北京龙鼎华鼎云酒店住宿吧,酒店质量很好。"
},
{
"role": "user",
"content": "这个酒店的评分是多少?"
},
{
"role": "assistant",
"content": "这个酒店的评分是4.3分。"
},
{
"role": "user",
"content": "好的,我决定入住北京龙鼎华鼎云酒店了。"
},
{
"role": "assistant",
"content": "好的,祝您入住愉快。"
}
]
user: 你好 assistant: 有什么可以帮您 user: 你喜欢什么颜色 assistant: 喜欢黑色 user: 为什么 assistant: 因为黑色幽默 按照轮次,上述对话将被拆分成 3 个单独的样本
样本 1
输入: [Round 0]\n 问: 你好\n 答:
输出: 有什么可以帮您
样本 2
输入: [Round 0]\n 问: 你好\n 答: 有什么可以帮您\n [Round 1]\n 问: 你喜欢什么颜色\n 答:
输出: 喜欢黑色
样本 3
输入: [Round 0]\n 问: 你好\n 答: 有什么可以帮您\n [Round 1]\n 问: 你喜欢什么颜色\n 答: 喜欢黑色\n [Round 2]\n 问: 为什么\n 答:
输出: 因为黑色幽默
因为 CausalLM 是一直从左往右预测的,我们可以直接在多轮对话中标识出多段输出。

具体如下:
角色special token用于标识分隔出多轮对话,同时也可以防范注入攻击
<|system|> #系统提示词,指明模型可使用的工具等信息<|user|> #用户输入,用户的指令<|assistant|> #模型回复,或模型思考要做的事情<|observation|> #工具调用、代码执行结果注意:这里<|role|>这种是一个 token,而不是一串文本,所以不能通过tokenizer.encode('<role>')来得到
角色后跟随的是 metadata,对于 function calling 来说,metadata 是调用的函数和相应参数;对其他角色的对话,metadata 为空
<|system|>你是一个名为 GhatGLM 的人工智能助手。你是基于智谱AI训练的语言模型 GLM-4 模型开发的,你的任务是针对用户的问题和要求提供适当的答复和支持。\n\n# 可用工具\n\n## function_name1\n\n{…}\n\n## function_name2\n\n{…}\n在调用上述函数时,请使用 Json 格式表示调用的参数。"
<|user|> 北京的天气怎么样?
<|assistant|> get_weather\n{“location”:“北京”}
<|observation|> {“temperature_c”: 12, “description”: “haze”}
<|assistant|> 根据天气工具的信息,北京的天气是:温度 12 摄氏度,有雾。
<|user|> 这样的天气适合外出活动吗?
<|assistant|> 北京现在有雾,气温较低,建议您考虑一下是否适合外出进行锻炼。
<|user|>
高亮部分为需要计算 loss 的 token。注意<|assistant|>后的内容和角色 token 都需要算 loss。
此部分可以参考 GLM4 的官方实现: tokenizer 的代码中的 apply_chat_template 方法。
格式化后的数据样例
{
"messages": [
{
"role": "system",
"content": "",
"tools": [
{
"type": "function",
"function": {
"name": "search_hotels",
"description": "根据用户的需求生成查询条件来查酒店",
"parameters": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "酒店名称"
},
"type": {
"type": "string",
"enum": [
"豪华型",
"经济型",
"舒适型",
"高档型"
],
"description": "酒店类型"
},
"facilities": {
"type": "array",
"items": {
"type": "string"
},
"description": "酒店能提供的设施列表"
},
"price_range_lower": {
"type": "number",
"minimum": 0,
"description": "价格下限"
},
"price_range_upper": {
"type": "number",
"minimum": 0,
"description": "价格上限"
},
"rating_range_lower": {
"type": "number",
"minimum": 0,
"maximum": 5,
"description": "评分下限"
},
"rating_range_upper": {
"type": "number",
"minimum": 0,
"maximum": 5,
"description": "评分上限"
}
},
"required": [
]
}
}
}
]
},
{
"role": "user",
"content": "我想找一家叫瑞洁宾舍民宿的酒店"
},
{
"role": "assistant",
"content": "search_hotels\n{\"name\": \"瑞洁宾舍民宿\"}"
},
{
"role": "observation",
"content": "[{\"address\": \"北京西城区新农街17号\", \"facilities\": \"酒店提供的设施:公共区域和部分房间提供wifi;国际长途电话;吹风机;24小时热水;西式餐厅;无烟房;早餐服务;接站服务;接机服务;接待外宾;行李寄存;看护小孩服务;叫醒服务;收费停车位\", \"hotel_id\": 782, \"name\": \"北京瑞洁宾舍民宿\", \"phone\": \"010-83133338\", \"price\": 249, \"rating\": 4.5, \"subway\": \"珠市口地铁站D口\", \"type\": \"舒适型\"}]"
},
{
"role": "assistant",
"content": "为您查到北京瑞洁宾舍民宿,您要选择这家吗"
}
]
}划重点:
<|start_header_id|>角色<|end_header_id|>内容 … …<|eot_id|><|start_header_id|>,<|end_header_id|>,<|eot_id|> 是 Llama 3 预留的特殊 token输入
<|start_header_id|>user<|end_header_id|>你好,请帮我推荐一个提供无烟房的舒适型酒店可以吗?<|eot_id|>
输出
<|start_header_id|>search<|end_header_id|>{“facilities”: [“无烟房”], “type”: “舒适型”}}<|eot_id|>
输入
<|start_header_id|>user<|end_header_id|>你好,请帮我推荐一个提供无烟房的舒适型酒店可以吗?<|eot_id|>
<|start_header_id|>search<|end_header_id|>{“facilities”: [“无烟房”], “type”: “舒适型”}}<|eot_id|>
<|start_header_id|>return<|end_header_id|>[{“name”: “北京红驿栈酒店”, “type”: “舒适型”, “address”: “北京朝阳区东直门外春秀路太平庄 10 号(主副楼在一幢建筑里)”, “subway”: “东直门地铁站 E 口”, “phone”: “010-64171066”, “facilities”: [“公共区域和部分房间提供 wifi”, “宽带上网”, “国际长途电话”, “吹风机”, “24 小时热水”, “暖气”, “无烟房”, “早餐服务”, “接待外宾”, “行李寄存”, “叫醒服务”], “price”: 344.0, “rating”: 4.7, “hotel_id”: 51}, {“name”: “维也纳国际酒店(北京广安门店)”, “type”: “舒适型”, “address”: “北京西城区白广路 7 号”, “subway”: “广安门内地铁站 C 口”, “phone”: “010-83539988”, “facilities”: [“酒店各处提供 wifi”, “宽带上网”, “吹风机”, “24 小时热水”, “中式餐厅”, “会议室”, “无烟房”, “商务中心”, “早餐服务”, “洗衣服务”, “行李寄存”, “叫醒服务”], “price”: 553.0, “rating”: 4.7, “hotel_id”: 56}]}]<|eot_id|>
输出
<|start_header_id|>assistant<|end_header_id|>没问题,推荐你去北京红驿栈酒店和维也纳国际酒店(北京广安门店),都挺好的。<|eot_id|>
见附件: fine-tuning-lab.zip
Model | Method | BLEU-4 | SLOT-P | SLOT-R | SLOT-F1 |
|---|---|---|---|---|---|
GLM4-9B | Functional Call | 53.53 | 82.79 | 73.47 | 77.85 |
QLoRA | 67.41 | 95.95 | 96.74 | 96.34 | |
Llama3.1-8B | Prompt | 51.94 | 92.55 | 87.84 | 90.19 |
QLoRA | 66.53 | 97.23 | 95.98 | 96.60 | |
Qwen2-7B | Prompt | 23.43 | 85.21 | 88.91 | 88.02 |
LoRA | 66.70 | 96.42 | 95.34 | 95.87 |
思考: 这版模型不支持 “XXX附近的酒店” 这类问法,为什么?
训练不同模型需要多少显存?