2026年7月9日 周四晚上19:30,报名腾讯会议了解“如何构建自进化的动态知识库(Brain)”(限30人)
免费POC, 零成本试错
FDE知识库

FDE知识库

学习大模型的前沿技术与行业落地应用


收藏

大模型时代,GPT分类器会比BERT分类器更好吗?

发布日期:2024-09-29 18:56:05 浏览次数: 3082
作者:NLP轻松谈

微信搜一搜,关注“NLP轻松谈”

文本将回答训练LLM分类器的以下问题:

  1. 我们需要训练所有层吗?

  2. 为什么要微调最后一个 token,而不是第一个 token?

  3. BERT 与 GPT 的性能相比如何?

  4. 我们应该禁用因果掩码吗?

  5. 增加模型大小有什么影响?

  6. 我们可以期待 LoRA 带来哪些改进?

  7. 填充还是没有填充?

1

微调语言模型的最常见方法是指令微调和分类微调。指令微调涉及使用特定指令在一组任务上训练语言模型,以提高其理解和执行自然语言提示中描述的任务的能力,如下图所示。

在分类微调中,该模型经过训练以识别一组特定的类标签,例如 “spam” 和 “not spam”。分类任务的示例不仅限于大型语言模型和电子邮件筛选;它们包括从图像中识别不同种类的植物,将新闻文章分类为体育、政治或技术等主题,以及在医学成像中区分良性和恶性肿瘤。

指令微调和分类微调模型相比,指令微调模型通常能够执行更广泛的任务。我们可以将分类微调模型视为高度专业化的模型,通常,开发专业化模型比开发在各种任务中都能正常工作的通用模型更容易。

2

修改预训练的大型语言模型,使其为分类微调做好准备。为此,将原始输出层替换为一个较小的输出层,该层将隐藏的表示映射到 50,257 个唯一标记的词汇表,该输出层映射到两个类:0(“非垃圾邮件”)和 1(“垃圾邮件”),如下图所示。

model = GPTModel(BASE_CONFIG)

for param in model.parameters():
    param.requires_grad = False
    
torch.manual_seed(123)

num_classes = 2

model.out_head = torch.nn.Linear(
    in_features=BASE_CONFIG["emb_dim"],
    out_features=num_classes
)
#最终的 LayerNorm 和最后一个 transformer 模块可训练
for param in model.trf_blocks[-1].parameters():
    param.requires_grad = True

for param in model.final_norm.parameters():
    param.requires_grad = True

下图所示的因果注意力掩码设置,序列中的最后一个标记积累的信息最多,因为它是唯一可以访问所有先前标记数据的标记。因此,在垃圾邮件分类任务中,我们专注于微调过程中的最后一个令牌。

3

  1. 我们需要训练所有层吗?

如表所示,训练所有层的性能略好:96.67% 对 95.00%。(不过,这将运行时间增加了大约 2.5 倍。

  1. 为什么要微调最后一个 token,而不是第一个 token?

BERT 这样的编码器风格的语言模型有一个指定的分类标记作为它们的第一个标记;GPT 是一种解码器风格的模型,带有因果注意力掩码。这意味着第一个标记在输入中没有任何其他标记的上下文信息。只有最后一个令牌包含有关所有其他令牌的信息。因此,如果我们想使用像 GPT 这样的模型进行分类微调,我们应该专注于最后一个标记来捕获所有其他输入标记的上下文信息。

  1. BERT 与 GPT 的性能相比如何?

小型 GPT-2 模型和 BERT 在垃圾邮件分类数据集上表现相似。

在大一点的数据集IMDB Movie Review进行情感分类。

  1. 我们应该禁用因果掩码吗?

由于我们在下一个单词预测任务上训练类似 GPT 的模型,因此 GPT 架构的一个核心特征是因果注意力掩码(不同于 BERT 模型或原始的 transformer 架构)。

但是,我们实际上可以在分类微调期间删除因果掩码,这将允许我们微调第一个而不是最后一个标记,因为未来的标记将不再被掩码,并且第一个标记可以看到所有其他标记。

在类似 LLM只需要更改 2 行代码:

class MultiheadAttention(nn.Module):
    def __init__(self, d_in, d_out, context_length, dropout, num_heads):
        super().__init__()
        # ...

    def forward(self, x):
        b, num_tokens, d_in = x.shape
        keys = self.W_key(x)  # Shape: (b, num_tokens, d_out)
        queries = self.W_query(x)
        values = self.W_value(x)

        # ...

        attn_scores = queries @ keys.transpose(2, 3)

        # Comment out the causal attention mask part
        # mask_bool = self.mask.bool()[:num_tokens, :num_tokens]
        # attn_scores.masked_fill_(mask_bool, -torch.inf)

        attn_weights = torch.softmax(
             attn_scores / keys.shape[-1]**0.5, dim=-1
        )
        context_vec = (attn_weights @ values).transpose(1, 2)
        context_vec = context_vec.contiguous().view(
            b, num_tokens, self.d_out
        )
        context_vec = self.out_proj(context_vec)
        return context_vec

可以看到,当我们在微调期间禁用因果掩码时,我们可以得到一个小的改进。这本身和任务的难度有关系。

  1. 增加模型大小有什么影响? 到目前为止,我们只研究了最小的 GPT-2 模型的性能,即 1.24 亿个参数的版本。它与具有 3.55 亿、7.74 亿和 15 亿个参数的大型变体相比如何。

正如表所示,较大的模型会显著提高预测准确性(但是,GPT-2 medium在这里是一个异常值。这个模型在其他数据集上的性能很差,我怀疑这个模型可能没有经过很好的预训练。)

  1. 我们可以期待 LoRA 带来哪些改进?

在第一个问题中,我们发现,当只微调最后一个 transformer 模块而不是微调整个模型时,我们可以(几乎)匹配分类性能。仅微调最后一个块的优点是训练更快,因为并非所有权重参数都被更新。

在小型模型上,LoRA 的速度略慢,因为添加 LoRA 层的额外开销可能大于好处,但是在训练更大的 15 亿个参数模型时,LoRA 的训练速度提高了 1.53 倍。

  1. 填充还是没有填充?

如果我们想在训练或推理期间批量处理数据(这涉及一次处理多个输入序列),我们需要插入填充标记以确保训练样本的长度相等。

在常规的文本生成任务中,填充不会影响模型响应,因为填充标记通常会添加到右侧,并且由于前面讨论的因果掩码,这些填充标记不会影响其他标记。

我们微调最后一个令牌实验时,由于填充标记位于最后一个标记的左侧,因此填充标记可能会影响结果。

参考

Building A GPT-Style LLM Classifier From Scratch

Finetuning for Text Classification


53AI,企业落地大模型首选服务商

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询

扫码登录
登录即表示您同意《53AI网站服务协议》
服务协议

欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。

在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。

一、 定义

本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。

会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。

知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。

二、 账号注册与登录

登录方式:本网站支持以下登录方式,您可根据实际情况选择:

微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。

手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。

账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。

实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。

未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。

三、 服务内容与规范

知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。

服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。

禁止行为:您在使用服务时不得实施以下行为:

利用技术手段批量爬取、下载、转存知识库内容;

将知识库内容用于商业目的或未经授权地向第三方传播;

干扰本网站正常运行或侵犯其他用户合法权益;

发布违法违规信息或从事违反公序良俗的活动。

四、 知识产权声明

权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。

有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。

侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。

五、 个人信息保护

我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。

您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。

您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。

六、 免责声明

内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。

不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。

第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。

七、 违约责任

如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。

如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。

八、 法律适用与争议解决

本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。

因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。

九、 其他

本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。

本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。

我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。


已查阅