添加自己的训练政策模型

pydial的主要目标便是提供一个通用的语言统计对话模型,开发者可以方便的向其中添加集成和测试自己的模型.pydial位主要模块都设计了明确定义的通用接口,为了了解这个,我们首先来看一下pydial的整体框架.

如上所示,多域功能的对话模型主要使用主题跟踪器来进行实现,主题跟踪器来识别用户输入的主题,可以保证切换,从上一个对话领域切换到用户当前想要的对话领域,由上图可以看出,主题追踪器在整个对话系统中扮演了一个核心的角色,其触发了对用户的语义理解,对话状态的追踪,从而影响到了最核心的对话决策部分,继而转到语言生成即输出部分,完成了整个的一个对话流程.

生成新的模块:

为了便于集成你自己的模块,pydial为模块都提供了简单的接口类.如下:

  • Topic Tracking: topictracking.RuleTopicTrackers.TopicTrackerInterface
  • Semantic Belief Tracking (from words to belief state): semanticbelieftracking.SemanticBeliefTrackingManager.SemanticBeliefTracker
  • Semantic Decoding (from words to semantics): semi.SemI.SemI
  • Belief Tracking (from semantics to belief state): belieftracking.BeliefTracker.BeliefTracker
  • Policy: policy.Policy.Policy
  • Language Generation: semo.SemOManager.SemO
  • Evaluation: EvaluationManager.Evaluator

所有这些模块都被同样的模块组织结构定义,pydial的主要目标是提供一个多领域的对话平台,一个叫做管理器(manager)的概念将被介绍,它使用了类似词典的结构处理方式来处理每个模块的域实例.实现一个未在pydial中实现的模型如下所示:

 

为了实现你自己的模型,查看基类中的一些方法,并继承基类来重写你自己需要实现的方法,为了使用你自己定义的模型,需要在配置文件中定义和加载对应的模型.config/dynamically_load_modules.cfg中便是动态加载模型的例子.

应用举例:

我们创建了一个新的parrotPolicy决策类,它简单的接受用户的操作并作为用户的操作返回,就像鹦鹉学舌一般,为此,第一步创建一个继承自policy的基类.

from policy import Policy

class Parrot(Policy.Policy):
    def nextAction(self, beliefstate):
        pass

为了实现用户的行为,我们必须从信念状态中提取最后一个用户状态信息,稍微做一下解析,然后返回它。在开始时,我们默认使用hello() system act。
 

from policy import Policy
import re

class Parrot(Policy.Policy):  
    def nextAction(self, beliefstate):
        userActs = beliefstate['userActs']
        if userActs is not None:
            systemAct = userActs[0][0]
        else:
            systemAct = "hello()"
        
        return systemAct    

在配置文件中进行加载和预处理.

用户意图:

用户行为表示为意图的字符串、槽或槽值对的列表。下面是系统当前使用的系统操作列表

  • request(slot)
  • inform(slot=value)
  • confirm(slot=value)
  • confreq(slot=value,slot)
  • affirm()
  • hello()
  • negate()
  • repeat()
  • requalts()
  • bye()         

信念状态封装在一个对话的对象当中,在内部,每个域的信念都使用以下的字典结构建模.

{'beliefs': {u'informable_slot1': {'**NONE**': 1.0,
                       u'value1': 0.0,
                       u'value2': 0.0,
                       ...  },
             u'informable_slot2': {'**NONE**': 1.0,
                       u'value1': 0.0,
                       u'value2': 0.0,
                       ...  },
             ...
             'discourseAct': {u'ack': 0.0,
                              'bye': 0.0,
                              u'hello': 0.0,
                              u'none': 1.0,
                              u'repeat': 0.0,
                              u'silence': 0.0,
                              u'thankyou': 0.0},
             'method': {u'byalternatives': 0.0,
                        u'byconstraints': 0.5,
                        u'byname': 0.0,
                        u'finished': 0.0,
                        u'none': 0.5,
                        u'restart': 0.0},
             'requested': {u'infromable_slot1': 0.0,
                           u'informable_slot2': 0.0,
                           ...
                           u'requestable_slot1': 0.0,
                           u'requestable_slot2': 0.0,
                           ...
                           u'name': 0.0}},
 'userActs': [('hypo1', 0.8),('hypo2',0.1),...]}

进行输出.

信息插槽、话语、方法和请求字段的实际值直接从本体文件中提取。而informable slot、discourse seact和method都代表了一个概率分布,即每个字段的数值总和为1,这对于被请求的字段是不同的。在这里,每个数值都可能在[0,1]中。

<think>嗯,用户想微调qwq32b模型训练集是294条政策问答对。首先,我得考虑模型微调的基本参数设置。数据量只有294条,这算是比较小的数据集,所以过拟合的风险很高。可能需要采用一些正则化方法,比如增加dropout率,或者权重衰减。不过具体数值需要参考类似任务的设置。 然后是优化器的选择,通常会用AdamW,学习率方面,因为数据量小,可能学习率不能太大,否则容易震荡。但qwq32b是个32B的大模型,学习率太低会不会收敛慢?可能需要找一个平衡点,比如3e-5到5e-5之间?或者更小? 批次大小方面,如果显存足够,可以适当调大,但数据量少的话,小批次可能更合适。比如用batch size 2或者4,这样每个epoch的更新次数多一些。不过也要看显存的限制,毕竟32B模型参数很多,显存占用大。 训练轮数方面,因为数据量小,可能需要较多的epoch,但早停法很重要。比如设置20个epoch,但实际可能在5-10轮后早停。或者用3-5的patience,监控验证损失。 另外,数据增强可能会有帮助,比如同义词替换,或者稍微调整问题表述,但政策问答对可能对准确性要求高,数据增强要小心,不能改变原意。 验证集的划分也很重要,可能用20%的数据作为验证集,这样大约58条,剩下的236条训练。但数据量太少,可能交叉验证更可靠,不过操作起来麻烦。 还有,预热步骤可能不需要太多,比如总步数的10%,或者设定为100步左右,让学习率逐步上升,避免初期的不稳定。 Lora参数方面,如果使用LoRA微调,需要设置合适的rank和alpha,可能从r=8开始尝试,alpha=16,这样在减少参数量的同时保持效果。不过具体数值可能需要实验调整。 另外,混合精度训练可以节省显存,但要注意梯度缩放,防止下溢。 最后,评估指标需要明确,比如用BLEU、ROUGE,或者人工评估回答的相关性和准确性。但自动指标可能不太可靠,政策问答对准确性要求高,人工评估可能更合适。 总之,参数设置需要平衡过拟合和欠拟合,通过实验调整,同时考虑计算资源的限制。可能需要多次尝试不同的学习率、批次大小和正则化组合,找到最佳配置。</think>以下是针对微调qwq32b模型(基于294条政策问答对)的参数配置建议,分为核心参数、正则化策略和训练优化三个部分: --- ### **一、核心参数配置** 1. **学习率(Learning Rate)** - 推荐范围:`3e-5 ~ 1e-4` - 小数据集需较低学习率防止震荡,初始建议从`5e-5`开始 - 配合学习率预热:`warmup_steps = 总训练步数 × 10%` 2. **批次大小(Batch Size)** - 显存允许下尽量小(如`2-4`),提升梯度更新频率 - 示例:`batch_size=4`时,每个epoch约74步 3. **训练轮数(Epochs)** - 初始设定`10-15`轮,配合早停机制 - 验证集loss连续`3-5`轮无改善则终止 --- ### **二、正则化策略(防过拟合)** 1. **权重衰减(Weight Decay)** - 建议值:`0.01-0.1` - 示例:`weight_decay=0.05` 2. **Dropout概率** - 适当提高(如`0.1-0.3`),原模型若未启用需显式开启 3. **梯度裁剪** - 阈值设为`1.0`:`max_grad_norm=1.0` --- ### **三、训练优化建议** 1. **数据层面** - 添加模板强化格式(如`问题:{Q} 回答:{A}`) - 尝试少量数据增强(如语义一致的问法改写) 2. **参数高效微调(PEFT)** - 优先使用LoRA(低秩适配): ```python peft_config = LoraConfig( r=8, # 秩维度 lora_alpha=16, # 缩放系数 target_modules=["q_proj","v_proj"], # 典型作用层 lora_dropout=0.1 ) ``` 3. **评估策略** - 保留15-20%数据(约45-59条)作为验证集 - 人工审核生成结果的准确性(政策类问题需严格校验) --- ### **四、典型配置示例** ```python training_args = TrainingArguments( output_dir="./results", num_train_epochs=12, per_device_train_batch_size=2, learning_rate=5e-5, warmup_steps=50, weight_decay=0.05, logging_steps=10, evaluation_strategy="epoch", save_strategy="epoch", load_best_model_at_end=True, fp16=True, # 启用混合精度训练 gradient_checkpointing=True # 显存优化 ) ``` --- ### **五、注意事项** 1. 若生成结果存在幻觉,可尝试: - 降低温度系数(`temperature=0.3`) - 添加显式指令(如"严格依据政策原文回答") 2. 资源不足时可尝试QLoRA量化微调 3. 建议记录不同超参数组合的实验结果(推荐W&B或TensorBoard) 需根据实际训练损失曲线动态调整参数。初期可先运行3-4个epoch观察过拟合迹象,再决定是否增强正则化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值