0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

视觉模型weak-to-strong的实现

深度学习自然语言处理 来源:深度学习自然语言处理 2024-01-08 11:07 次阅读

深度学习自然语言处理 原创
作者:pp

几天前,OpenAI「超级对齐」(Superalignment)团队发布了成立以来的首篇论文,声称开辟了对超人类模型进行实证对齐的新研究方向。GPT-2能监督GPT-4,Ilya带头OpenAI超级对齐首篇论文来了:AI对齐AI取得实证结果

可能是为了让大家更容易实现论文中的思路,也可能是为了让自己的研究更加接地气,不再被调侃为“CloseAI”。在公布这篇论文的同时,OpenAI也在GitHub开源了论文提出的"weak-to-strong"框架的代码[1]

在观察了仓库中的代码之后我们有了如下发现:

既有NLP版本也有CV版本

主代码仓库是一个对二元分类(binary classification)任务的“weak-to-strong”方法的实现。包含用于微调预训练语言模型的代码(训练弱模型,生成若标签),以及针对来自另一种语言模型的标签进行训练的代码(使用弱标签,训练强学生)。

Vision目录中则包含视觉模型"weak-to-strong"的实现(AlexNet -> DINO)。

a3897d4e-9e46-11ee-8b88-92fbcf53809c.png

支持论文中描述的各种损失函数,如置信度辅助损失函数,也可以自己定义损失函数,见weak_to_strong/loss.py。

#Customlossfunction
classxent_loss(LossFnBase):
def__call__(
self,logits:torch.Tensor,labels:torch.Tensor,step_frac:float
)->torch.Tensor:
"""
Thisfunctioncalculatesthecrossentropylossbetweenlogitsandlabels.

Parameters:
logits:Thepredictedvalues.
labels:Theactualvalues.
step_frac:Thefractionoftotaltrainingstepscompleted.

Returns:
Themeanofthecrossentropyloss.
"""
loss=torch.nn.functional.cross_entropy(logits,labels)
returnloss.mean()


classproduct_loss_fn(LossFnBase):
...
returnloss.mean()


classlogconf_loss_fn(LossFnBase):
...
returnloss.mean()

Qwen(千问)模型出现在代码中

在主文件train_weak_to_strong.py中,OpenAI以自己的GPT2模型,和国产的Qwen(千问)模型为例

ModelConfig(
name="gpt2",
default_lr=5e-5,
eval_batch_size=32,
custom_kwargs={
"bf16":torch.cuda.is_bf16_supported(),
"fp32":nottorch.cuda.is_bf16_supported(),
},
),
ModelConfig(
name="gpt2-medium",
default_lr=5e-5,
eval_batch_size=32,
custom_kwargs={
"bf16":torch.cuda.is_bf16_supported(),
"fp32":nottorch.cuda.is_bf16_supported(),
},
),
...
ModelConfig(
name="Qwen/Qwen-7B",
default_lr=1e-5,
eval_batch_size=2,
gradient_checkpointing=True,
model_parallel=True,
#note:youwillprobablynotbeabletorunthiswithoutmanygpus
custom_kwargs={
"trust_remote_code":True,
"bf16":torch.cuda.is_bf16_supported(),
"fp32":nottorch.cuda.is_bf16_supported(),
},
),
ModelConfig(
name="Qwen/Qwen-14B",
default_lr=1e-5,
eval_batch_size=2,
gradient_checkpointing=True,
model_parallel=True,
#note:youwillprobablynotbeabletorunthiswithoutbf16supportandmanygpus
custom_kwargs={
"trust_remote_code":True,
"bf16":torch.cuda.is_bf16_supported(),
"fp32":nottorch.cuda.is_bf16_supported(),
},
),
...

两阶段训练

Weak-to-strong关注的重点是:一个弱监督者如何监督一个比它聪明得多的模型?为此,OpenAI提出了一个两阶段的训练方法:

对于一个给定的任务:

构建弱监督者。通过在一半训练数据上微调较小的预训练模型来构造弱监督者,他们把弱监督者的表现称为弱表现,并通过弱模型的预测来生成弱标签。(Stage 1)

#Traintheweakmodelonthefirsthalfofthetrainingdata
print(f"Trainingweakmodel,size{weak_model_size}")
weak_test_results,weak_ds=train_model(
weak_model_config,
train1_ds,
test_ds,
loss_type="xent",
label="weak",
subpath=os.path.join("weak_model_gt",weak_model_size.replace("/","_")),
lr=weak_lr,
eval_batch_size=weak_eval_batch_size,
inference_ds=train2_ds,
epochs=gt_epochs,
linear_probe=linear_probe,
optimizer_name=weak_optim,
)

训练一个用于比较的性能上限的强模型。在另一半训练数据上以Ground Truth作为标签训练一个较大的模型作为比较的上限。(Upper bound)

#Trainthestrongmodelonthesecondhalfofthetrainingdata
print(f"Trainingstrongmodel,size{strong_model_size}")
strong_test_results,_=train_model(
strong_model_config,
train2_ds,
test_ds,
loss_type="xent",
label="strong",
subpath=os.path.join("strong_model_gt",strong_model_size.replace("/","_")),
lr=strong_lr,
eval_batch_size=strong_eval_batch_size,
epochs=gt_epochs,
linear_probe=linear_probe,
optimizer_name=strong_optim,
)

通过第一步中的弱监督训练强学生模型。本文使用生成的弱标签微调强模型,并将该模型称为强学生模型将其产生的性能称为从弱到强(weak-to-strong)的性能。(Stage 2)

#Trainthestrongmodelonthesecondhalfofthetrainingdatawithlabelsgeneratedbytheweakmodel
all_transfer_test_results={}
fortlossintransfer_losses:
print(
f"Trainingtransfermodel,size{strong_model_size}onlabelsfrom{weak_model_size},withloss{tloss}"
)
transfer_test_results,_=train_model(
strong_model_config,
weak_ds,
test_ds,
loss_type=tloss,
label="weak2strong",
subpath=os.path.join(
"strong_model_transfer",
f"{weak_model_size.replace('/','_')}_{strong_model_size.replace('/','_')}_{tloss}",
),
lr=transfer_lr,
eval_batch_size=strong_eval_batch_size,
epochs=transfer_epochs,
linear_probe=linear_probe,
optimizer_name=transfer_optim,
)
all_transfer_test_results[tloss]=transfer_test_results
deltransfer_test_results

复刻版本,并非源码

OpenAI在仓库中提到,目前开源的代码并非与论文实验部分完全一致,不过是结果相近的。

"STATUS: This codebase is not well tested and does not use the exact same settings we used in the paper, but in our experience gives qualitatively similar results when using large model size gaps and multiple seeds. Expected results can be found for two datasets below. We may update the code significantly in the coming week."

这次开源的weak-to-strong实现代码较为简单,感兴趣的朋友可以去尝试一下,结合论文也许会有不一样的感受。OpenAI正在大力研究超级对齐(Superalignment),不仅仅放出论文,开源代码,同时也宣布了一项高达1000万美金的资助计划,我们将在之后的文章中为您带来详细解读,敬请期待!

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 开源
    +关注

    关注

    3

    文章

    2985

    浏览量

    41718
  • 模型
    +关注

    关注

    1

    文章

    2704

    浏览量

    47685
  • OpenAI
    +关注

    关注

    8

    文章

    757

    浏览量

    5911

原文标题:OpenAI开源"weak-to-strong"方法代码框架!我们带你一探究竟

文章出处:【微信号:zenRRan,微信公众号:深度学习自然语言处理】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何利用Transformers了解视觉语言模型

    模型称为 “视觉语言” 模型是什么意思?一个结合了视觉和语言模态的模型?但这到底是什么意思呢?
    发表于 03-03 09:49 744次阅读
    如何利用Transformers了解<b class='flag-5'>视觉</b>语言<b class='flag-5'>模型</b>

    为什么HAL库的stm32f3xx_hal_rcc.c中的定义前有_weak修饰

    的定义前有_weak修饰,为什么会这样。比如_weak HAL_StatusTypeDef HAL_RCC_OscConfig(RCC_OscInitTypeDef*RCC_OscInitStruct),这个函数在rcc.c中的函数体里没有代码
    发表于 03-04 06:27

    在Fast-Strong情况下是否会出现过多的过冲

    ODT和CKE驱动程序的正确配置时遇到问题:SSTL18_II,有或没有outerm = 25,50和SSTL18_I。他们都不满意。根据配置的不同,在Fast-Strong情况下是否会出现过多的过冲
    发表于 06-11 14:54

    keil中__weak的功能和应用是什么

    __weak可以应用于函数的声明和实现.若使用__weak修饰声明 __weak void function(void);执行 function(); 语句时,当前文件中
    发表于 11-30 06:41

    HAL库中__weak修饰符是什么?

    单片机系统时钟是什么?HAL库中__weak修饰符是什么?
    发表于 02-23 07:32

    __attribute__((weak)) __weak_symbol在idf4.4库中无效,要怎么操作才能起作用呢?

    请教下,在编译时,遇到几个问题:1.同一个工程中,在不同的C文件写相同的函数,编译时不报错,函数生效随机;2.使用__attribute__((weak)) __weak_symbol无效。请教下,__attribute__((weak
    发表于 02-14 06:43

    目标跟踪的视觉注意计算模型

    目标跟踪的视觉注意计算模型:借鉴心理学中有关视觉注意的研究成果,提出一种应用于视频图像序列的注意焦点计算模型。针对Itti 模型算法计算复杂
    发表于 01-04 12:20 14次下载

    视觉词袋模型生成方法

    构建视觉词典是视觉词袋模型中的关键步骤,目前大多数视觉词典是基于k-means及其改进算法聚类生成。但由于k-means聚类的局限性以及样本空间结构的复杂性与高维性,该方式构建的
    发表于 03-20 15:09 1次下载
    <b class='flag-5'>视觉</b>词袋<b class='flag-5'>模型</b>生成方法

    【MCU】Keil编译无法识别__WEAK问题

    文章目录1. Keil编译无法识别__WEAK问题2. ARM系列编译工具链:`__CC_ARM、__ICCARM__、__GNUC__、__TASKING__`__CC_ARM对应的平台是:ARM
    发表于 11-05 16:05 48次下载
    【MCU】Keil编译无法识别__<b class='flag-5'>WEAK</b>问题

    keil中__weak的功能和应用

    __weak可以应用于函数的声明和实现.若使用__weak修饰声明 __weak void function(void);执行 function(); 语句时,当前文件中
    发表于 11-21 15:51 6次下载
    keil中__<b class='flag-5'>weak</b>的功能和应用

    strong-password-generator密码生成器

    strong-password-generator.zip
    发表于 05-07 10:40 0次下载
    <b class='flag-5'>strong</b>-password-generator密码生成器

    基于可变形卷积的大规模视觉基础模型

    扩大模型的规模是提高特征表示质量的重要策略,在计算机视觉领域,模型参数量的扩大不仅能够有效加强深度模型的表征学习能力,而且能够实现从海量数据
    的头像 发表于 11-21 11:28 757次阅读

    梳理一下DPHY的集成验证

    用于表示0的强度:highz0、supply0、strong0、pull0、weak0。
    的头像 发表于 04-10 10:56 1375次阅读

    「悟道·视界」视觉模型系列,6项领先成果技术详解

    日前,智源「悟道·视界」通用视觉模型系列,带来计算机视觉多任务处理能力方面的6项国际领先技术,迎接通用视觉智能曙光降临,包括: 在多模态序列中补全一切的多模态大
    的头像 发表于 06-27 16:40 469次阅读

    Strong ARM比较器电路的工作原理

    “比较器是模数转换器ADC中的核心电路之一。研究比较器失调等非理想因素的产生机制对提高ADC性能具有重要意义。鉴于此,本文以Strong ARM比较器为例,从工作原理和失调两个方面对Strong ARM进行介绍。”
    的头像 发表于 07-17 16:19 3945次阅读
    <b class='flag-5'>Strong</b> ARM比较器电路的工作原理