#LLaMA大模型是如何炼成的?

本文介绍来自 Meta AI 的 LLaMa 模型,类似于 OPT,也是一种完全开源的大语言模型。LLaMa 的参数量级从 7B 到 65B 大小不等,是在数万亿个 token 上面训练得到。值得一提的是,LLaMa 虽然只使用公共的数据集,依然取得了强悍的性能。 

本文介绍来自 Meta AI 的 LLaMa 模型,类似于 OPT,也是一种完全开源的大语言模型。LLaMa 的参数量级从 7B 到 65B 大小不等,是在数万亿个 token 上面训练得到。值得一提的是,LLaMa 虽然只使用公共的数据集,依然取得了强悍的性能。LLaMA-13B 在大多数基准测试中都优于 GPT-3 (175B),LLaMA65B 与最佳模型 Chinchilla-70B 和 PaLM-540B 相比具有竞争力。

1 LLaMa:开源高效的大语言模型

论文名称:LLaMA: Open and Efficient Foundation Language Models

论文地址:

https://arxiv.org/pdf/2302.13971.pdf

代码链接:

https://github.com/facebookresearch/llama

1.1 背景:模型参数量级的积累,或者训练数据的增加,哪个对性能提升帮助更大?

以 GPT-3 为代表的大语言模型 (Large language models, LLMs) 在海量文本集合上训练,展示出了惊人的涌现能力以及零样本迁移和少样本学习能力。GPT-3 把模型的量级缩放到了 175B,也使得后面的研究工作继续去放大语言模型的量级。大家好像有一个共识,就是:模型参数量级的增加就会带来同样的性能提升。

但是事实确实如此吗?

最近的 "Training Compute-Optimal Large Language Models[1]" 这篇论文提出一种缩放定律 (Scaling Law):

训练大语言模型时,在计算成本达到最优情况下,模型大小和训练数据 (token) 的数量应该比例相等地缩放,即:如果模型的大小加倍,那么训练数据的数量也应该加倍。

翻译过来就是:当我们给定特定的计算成本预算的前提下,语言模型的最佳性能不仅仅可以通过设计较大的模型搭配小一点的数据集得到,也可以通过设计较小的模型配合大量的数据集得到。

那么,相似成本训练 LLM,是大 LLM 配小数据训练,还是小 LLM 配大数据训练更好?

缩放定律 (Scaling Law) 告诉我们对于给定的特定的计算成本预算,如何去匹配最优的模型和数据的大小。但是本文作者团队认为,这个功能只考虑了总体的计算成本,忽略了推理时候的成本。因为大部分社区用户其实没有训练 LLM 的资源,他们更多的是拿着训好的 LLM 来推理。在这种情况下,我们首选的模型应该不是训练最快的,而应该是推理最快的 LLM。呼应上题,本文认为答案就是:小 LLM 配大数据训练更好,因为小 LLM 推理更友好。

1.2 LLaMa 做到了什么

LLaMa 沿着小 LLM 配大数据训练的指导思想,训练了一系列性能强悍的语言模型,参数量从 7B 到 65B。例如,LLaMA-13B 比 GPT-3 小10倍,但是在大多数基准测试中都优于 GPT-3。大一点的 65B 的 LLaMa 模型也和 Chinchilla 或者 PaLM-540B 的性能相当。

同时,LLaMa 模型只使用了公开数据集,开源之后可以复现。但是大多数现有的模型都依赖于不公开或未记录的数据完成训练。

1.3 LLaMa 预训练数据

LLaMa 预训练数据大约包含 1.4T tokens,对于绝大部分的训练数据,在训练期间模型只见到过1次,Wikipedia 和 Books 这两个数据集见过2次。

如下图1所示是 LLaMa 预训练数据的含量和分布,其中包含了 CommonCrawl 和 Books 等不同域的数据。

51c大模型~合集51_大模型

图1:LLaMa 预训练数据的含量和分布

CommonCrawl (占 67%): 包含 2017 到 2020 的5个版本,预处理部分包含:删除重复数据,去除掉非英文的数据,并通过一个 n-gram 语言模型过滤掉低质量内容。

C4 (占 15%): 在探索性实验中,作者观察到使用不同的预处理 CommonCrawl 数据集可以提高性能,因此在预训练数据集中加了 C4。预处理部分包含:删除重复数据,过滤的方法有一些不同,主要依赖于启发式方法,例如标点符号的存在或网页中的单词和句子的数量。

Github (占 4.5%): 在 Github 中,作者只保留在 Apache、BSD 和 MIT 许可下的项目。此外,作者使用基于行长或字母数字字符比例的启发式方法过滤低质量文件,并使用正则表达式删除标题。最后使用重复数据删除。

Wikipedia (占 4.5%): 作者添加了 2022 年 6-8 月的 Wikipedia 数据集,包括 20 种语言,作者处理数据以删除超链接、评论和其他格式样板。

Gutenberg and Books3 (占 4.5%): 作者添加了两个书的数据集,分别是 Gutenberg 以及 ThePile (训练 LLM 的常用公开数据集) 中的 Book3 部分。处理数据时作者执行重复数据删除,删除内容重叠超过 90% 的书籍。

ArXiv (占 2.5%): 为了添加一些科学数据集,作者处理了 arXiv Latex 文件。作者删除了第一部分之前的所有内容,以及参考文献。还删除了 .tex 文件的评论,以及用户编写的内联扩展定义和宏,以增加论文之间的一致性。

Stack Exchange (占 2%): 作者添加了 Stack Exchange,这是一个涵盖各种领域的高质量问题和答案网站,范围从计算机科学到化学。作者从 28 个最大的网站保留数据,从文本中删除 HTML 标签并按分数对答案进行排序。

Tokenizer 的做法基于 SentencePieceProcessor[2],使用 bytepair encoding (BPE) 算法。

LLaMa 的 PyTorch 代码如下,用到了 sentencepiece 这个库。

class Tokenizer:
    def __init__(self, model_path: str):
        # reload tokenizer
        assert os.path.isfile(model_path), model_path
        self.sp_model = SentencePieceProcessor(model_file=model_path)
        logger.info(f"Reloaded SentencePiece model from {model_path}")

        # BOS / EOS token IDs
        self.n_words: int = self.sp_model.vocab_size()
        self.bos_id: int = self.sp_model.bos_id()
        self.eos_id: int = self.sp_model.eos_id()
        self.pad_id: int = self.sp_model.pad_id()
        logger.info(
            f"#words: {self.n_words} - BOS ID: {self.bos_id} - EOS ID: {self.eos_id}"
        )
        assert self.sp_model.vocab_size() == self.sp_model.get_piece_size()

    def encode(self, s: str, bos: bool, eos: bool) -> List[int]:
        assert type(s) is str
        t = self.sp_model.encode(s)
        if bos:
            t = [self.bos_id] + t
        if eos:
            t = t + [self.eos_id]
        return t

    def decode(self, t: List[int]) -> str:
        return self.sp_model.decode(t)

1.4 LLaMa 模型架构

Pre-normalization [受 GPT3 的启发]:

为了提高训练稳定性,LLaMa 对每个 Transformer 的子层的输入进行归一化,而不是对输出进行归一化。使用 RMSNorm[3] 归一化函数。

class RMSNorm(torch.nn.Module):
    def __init__(self, dim: int, eps: float = 1e-6):
        super().__init__()
        self.eps = eps
        self.weight = nn.Parameter(torch.ones(dim))

    def _norm(self, x):
        return x * torch.rsqrt(x.pow(2).mean(-1, keepdim=True) + self.eps)

    def forward(self, x):
        output = self._norm(x.float()).type_as(x)
        return output * self.weight

常规的 Layer Normalization:

51c大模型~合集51_大模型_02

式中,  和  是 LN 的 scale 和 shift 参数,  和  的计算如下式所示:

51c大模型~合集51_大模型_03

RMSNorm:

相当于是去掉了  这一项。

51c大模型~合集51_大模型_04

看上去就这一点小小的改动,有什么作用呢?RMSNorm 的原始论文进行了一些不变性的分析和梯度上的分析。

SwiGLU 激活函数 [受 PaLM 的启发]:

LLaMa 使用 SwiGLU 激活函数[4]替换 ReLU 非线性以提高性能,维度从  变为 。

Rotary Embeddings [受 GPTNeo 的启发]:

LLaMa 去掉了绝对位置编码,使用旋转位置编码 (Rotary Positional Embeddings, RoPE)[5],这里的 RoPE 来自苏剑林老师,其原理略微复杂,感兴趣的读者可以参考苏神的原始论文和官方博客介绍:

https://spaces.ac.cn/archives/8265

Self-Attention 的 PyTorch 代码:

class Attention(nn.Module):
    def __init__(self, args: ModelArgs):
        super().__init__()

        self.n_local_heads = args.n_heads // fs_init.get_model_parallel_world_size()
        self.head_dim = args.dim // args.n_heads

        self.wq = ColumnParallelLinear(
            args.dim,
            args.n_heads * self.head_dim,
            bias=False,
            gather_output=False,
            init_method=lambda x: x,
        )
        self.wk = ColumnParallelLinear(
            args.dim,
            args.n_heads * self.head_dim,
            bias=False,
            gather_output=False,
            init_method=lambda x: x,
        )
        self.wv = ColumnParallelLinear(
            args.dim,
            args.n_heads * self.head_dim,
            bias=False,
            gather_output=False,
            init_method=lambda x: x,
        )
        self.wo = RowParallelLinear(
            args.n_heads * self.head_dim,
            args.dim,
            bias=False,
            input_is_parallel=True,
            init_method=lambda x: x,
        )

        self.cache_k = torch.zeros(
            (args.max_batch_size, args.max_seq_len, self.n_local_heads, self.head_dim)
        ).cuda()
        self.cache_v = torch.zeros(
            (args.max_batch_size, args.max_seq_len, self.n_local_heads, self.head_dim)
        ).cuda()

    def forward(self, x: torch.Tensor, start_pos: int, freqs_cis: torch.Tensor, mask: Optional[torch.Tensor]):
        bsz, seqlen, _ = x.shape
        xq, xk, xv = self.wq(x), self.wk(x), self.wv(x)

        xq = xq.view(bsz, seqlen, self.n_local_heads, self.head_dim)
        xk = xk.view(bsz, seqlen, self.n_local_heads, self.head_dim)
        xv = xv.view(bsz, seqlen, self.n_local_heads, self.head_dim)

        xq, xk = apply_rotary_emb(xq, xk, freqs_cis=freqs_cis)

        self.cache_k = self.cache_k.to(xq)
        self.cache_v = self.cache_v.to(xq)

        self.cache_k[:bsz, start_pos : start_pos + seqlen] = xk
        self.cache_v[:bsz, start_pos : start_pos + seqlen] = xv

        keys = self.cache_k[:bsz, : start_pos + seqlen]
        values = self.cache_v[:bsz, : start_pos + seqlen]

        xq = xq.transpose(1, 2)
        keys = keys.transpose(1, 2)
        values = values.transpose(1, 2)
        scores = torch.matmul(xq, keys.transpose(2, 3)) / math.sqrt(self.head_dim)
        if mask is not None:
            scores = scores + mask  # (bs, n_local_heads, slen, cache_len + slen)
        scores = F.softmax(scores.float(), dim=-1).type_as(xq)
        output = torch.matmul(scores, values)  # (bs, n_local_heads, slen, head_dim)
        output = output.transpose(
            1, 2
        ).contiguous().view(bsz, seqlen, -1)

        return self.wo(output)

这里有几个地方值得注意一下:首先是 model.py 文件里面从 fairscale 中 import 了3个类,分别是:ParallelEmbedding,RowParallelLinear,和 ColumnParallelLinear。Fairscale 链接如下,是一个用于高性能大规模预训练的库,LLaMa 使用了其 ParallelEmbedding 去替换 Embedding, 使用了其 RowParallelLinear 和 ColumnParallelLinear 去替换 nn.Linear,猜测可能是为了加速吧。

https://github.com/facebookresearch/fairscale

另一个需要注意的点是:cache 的缓存机制,可以看到在构造函数里面定义了下面两个东西:self.cache_k = torch.zeros((args.max_batch_size, args.max_seq_len, self.n_local_heads, self.head_dim)).cuda()self.cache_v = torch.zeros((args.max_batch_size, args.max_seq_len, self.n_local_heads, self.head_dim)).cuda()

关键其实就是这几行代码:self.cache_k[:bsz, start_pos : start_pos + seqlen] = xkself.cache_v[:bsz, start_pos : start_pos + seqlen] = xvkeys = self.cache_k[:bsz, : start_pos + seqlen]values = self.cache_v[:bsz, : start_pos + seqlen]

在训练的时候,因为每次都是输入完整的一句话,所以 cache 机制其实是不发挥作用的。在推理的时候,比如要生成 "I have a cat",过程是:1 输入 <s>,生成 <s> I。2 输入 <s> I,生成 <s> I have。3 输入 <s> I have,生成 <s> I have a。4 输入 <s> I have a,生成 <s> I have a cat。

在执行3这一步时,计算 "a" 的信息时,还要计算 <s> I have 的 Attention 信息,比较复杂。因此,cache 的作用就是在执行2这一步时,提前把 <s> I have 的 keys 和 values 算好,并保存在 self.cache_k 和 self.cache_v 中。在执行3这一步时,计算 Attention 所需的 keys 和 values 是直接从这里面取出来的:keys = self.cache_k[:bsz, : start_pos + seqlen]values = self.cache_v[:bsz, : start_pos + seqlen]只需要额外地计算 "a" 的 keys 和 values 即可,这对模型的快速推理是至关重要的。

还有一个值得注意的点:self.cache_k = self.cache_k.to(xq)这里使用的是 to() 函数的一种不太常见的用法:torch.to(other, non_blocking=False, copy=False)→TensorReturns a Tensor with same torch.dtype and torch.device as the Tensor other.

FFN 的 PyTorch 代码:

class FeedForward(nn.Module):
    def __init__(
        self,
        dim: int,
        hidden_dim: int,
        multiple_of: int,
    ):
        super().__init__()
        hidden_dim = int(2 * hidden_dim / 3)
        hidden_dim = multiple_of * ((hidden_dim + multiple_of - 1) // multiple_of)

        self.w1 = ColumnParallelLinear(
            dim, hidden_dim, bias=False, gather_output=False, init_method=lambda x: x
        )
        self.w2 = RowParallelLinear(
            hidden_dim, dim, bias=False, input_is_parallel=True, init_method=lambda x: x
        )
        self.w3 = ColumnParallelLinear(
            dim, hidden_dim, bias=False, gather_output=False, init_method=lambda x: x
        )

    def forward(self, x):
        return self.w2(F.silu(self.w1(x)) * self.w3(x))

这里需要注意的点是:激活函数用的是 F.silu(),也就是 Swish 激活函数。self.w2(F.silu(self.w1(x)) * self.w3(x)) 的实现也就是 SwiGLU 激活函数。

51c大模型~合集51_大模型_05

图2:silu 激活函数

Transformer Block 的 PyTorch 代码:

class TransformerBlock(nn.Module):
    def __init__(self, layer_id: int, args: ModelArgs):
        super().__init__()
        self.n_heads = args.n_heads
        self.dim = args.dim
        self.head_dim = args.dim // args.n_heads
        self.attention = Attention(args)
        self.feed_forward = FeedForward(
            dim=args.dim, hidden_dim=4 * args.dim, multiple_of=args.multiple_of
        )
        self.layer_id = layer_id
        self.attention_norm = RMSNorm(args.dim, eps=args.norm_eps)
        self.ffn_norm = RMSNorm(args.dim, eps=args.norm_eps)

    def forward(self, x: torch.Tensor, start_pos: int, freqs_cis: torch.Tensor, mask: Optional[torch.Tensor]):
        h = x + self.attention.forward(self.attention_norm(x), start_pos, freqs_cis, mask)
        out = h + self.feed_forward.forward(self.ffn_norm(h))
        return out

Transformer 的 PyTorch 代码:

class Transformer(nn.Module):
    def __init__(self, params: ModelArgs):
        super().__init__()
        self.params = params
        self.vocab_size = params.vocab_size
        self.n_layers = params.n_layers

        self.tok_embeddings = ParallelEmbedding(
            params.vocab_size, params.dim, init_method=lambda x: x
        )

        self.layers = torch.nn.ModuleList()
        for layer_id in range(params.n_layers):
            self.layers.append(TransformerBlock(layer_id, params))

        self.norm = RMSNorm(params.dim, eps=params.norm_eps)
        self.output = ColumnParallelLinear(
            params.dim, params.vocab_size, bias=False, init_method=lambda x: x
        )

        self.freqs_cis = precompute_freqs_cis(
            self.params.dim // self.params.n_heads, self.params.max_seq_len * 2
        )

    @torch.inference_mode()
    def forward(self, tokens: torch.Tensor, start_pos: int):
        _bsz, seqlen = tokens.shape
        h = self.tok_embeddings(tokens)
        self.freqs_cis = self.freqs_cis.to(h.device)
        freqs_cis = self.freqs_cis[start_pos : start_pos + seqlen]

        mask = None
        if seqlen > 1:
            mask = torch.full((1, 1, seqlen, seqlen), float("-inf"), device=tokens.device)
            mask = torch.triu(mask, diagnotallow=start_pos + 1).type_as(h)

        for layer in self.layers:
            h = layer(h, start_pos, freqs_cis, mask)
        h = self.norm(h)
        output = self.output(h[:, -1, :])  # only compute last logits
        return output.float()

self.tok_embeddings 用的是 ParallelEmbedding 这个函数,把 ids 变为词向量。mask 部分通过 torch.full() 函数和 torch.triu() 函数得到一个上三角矩阵,用于注意力的计算。通过 torch.nn.ModuleList() 函数定义所有的 Transformer Block。所有的 norm 函数都使用 RMSNorm 去定义。

生成过程的 PyTorch 代码:

class LLaMA:
    def __init__(self, model: Transformer, tokenizer: Tokenizer):
        self.model = model
        self.tokenizer = tokenizer

    def generate(
        self,
        prompts: List[str],
        max_gen_len: int,
        temperature: float = 0.8,
        top_p: float = 0.95,
    ) -> List[str]:
        bsz = len(prompts)
        params = self.model.params
        assert bsz <= params.max_batch_size, (bsz, params.max_batch_size)

        prompt_tokens = [self.tokenizer.encode(x, bos=True, eos=False) for x in prompts]

        min_prompt_size = min([len(t) for t in prompt_tokens])
        max_prompt_size = max([len(t) for t in prompt_tokens])

        total_len = min(params.max_seq_len, max_gen_len + max_prompt_size)

        tokens = torch.full((bsz, total_len), self.tokenizer.pad_id).cuda().long()
        for k, t in enumerate(prompt_tokens):
            tokens[k, : len(t)] = torch.tensor(t).long()
        input_text_mask = tokens != self.tokenizer.pad_id
        start_pos = min_prompt_size
        prev_pos = 0
        for cur_pos in range(start_pos, total_len):
            logits = self.model.forward(tokens[:, prev_pos:cur_pos], prev_pos)
            if temperature > 0:
                probs = torch.softmax(logits / temperature, dim=-1)
                next_token = sample_top_p(probs, top_p)
            else:
                next_token = torch.argmax(logits, dim=-1)
            next_token = next_token.reshape(-1)
            # only replace token if prompt has already been generated
            next_token = torch.where(
                input_text_mask[:, cur_pos], tokens[:, cur_pos], next_token
            )
            tokens[:, cur_pos] = next_token
            prev_pos = cur_pos

        decoded = []
        for i, t in enumerate(tokens.tolist()):
            # cut to max gen len
            t = t[: len(prompt_tokens[i]) + max_gen_len]
            # cut to eos tok if any
            try:
                t = t[: t.index(self.tokenizer.eos_id)]
            except ValueError:
                pass
            decoded.append(self.tokenizer.decode(t))
        return decoded


def sample_top_p(probs, p):
    probs_sort, probs_idx = torch.sort(probs, dim=-1, descending=True)
    probs_sum = torch.cumsum(probs_sort, dim=-1)
    mask = probs_sum - probs_sort > p
    probs_sort[mask] = 0.0
    probs_sort.div_(probs_sort.sum(dim=-1, keepdim=True))
    next_token = torch.multinomial(probs_sort, num_samples=1)
    next_token = torch.gather(probs_idx, -1, next_token)
    return next_token

这里需要注意的是:torch.multinomial() 函数用于按照一定的概率 (probs_sort) 采样一定数量 (num_samples) 的 Tensor。torch.gather() 函数是一个抽数据的函数,按照 probs_idx 的索引和 dim=-1 的维度。

1.5 LLaMa 的优化

AdamW, , 使用 cosine 学习率衰减策略, 2000 步的 warm-up, 最终学习率等于最大学习率的 , 使用 0.1 的权重衰减和 1.0 的梯度裁剪。

1.6 LLaMa 的高效实现

快速的注意力机制: LLaMa 采用了高效的 causal multi-head attention (基于 xformers[6]),不存储注意力权重,且不计算 mask 掉的 query 和 key 的值。

手动实现反向传播过程,不使用 PyTorch autograd: 使用 checkpointing 技术减少反向传播中的激活值的计算,更准确地说,LLaMa 保存计算代价较高的激活值,例如线性层的输出。

通过使用模型和序列并行减少模型的内存使用。此外,LLaMa 还尽可能多地重叠激活的计算和网络上的 GPU 之间的通信。

LLaMa-65B 的模型使用 2048 块 80G 的 A100 GPU,在 1.4T token 的数据集上训练 21 天。

1.7 LLaMa 实验结果

LLaMa 在 20 个标准的 Zero-Shot 和 Few-Shot 任务上面做了评测。在评测时的任务包括自由形式的生成任务和多项选择任务。多项选择任务的目标是根据提供的上下文在一组给定选项中选择最合适的答案。

Zero-Shot 在评测时,作者提供了任务和测试示例的文本描述。LLaMa 要么使用开放式生成提供答案,要么对给定的答案进行排名。Few-Shot 在评测时,作者提供了任务的几个示例 (在 1 到 64 之间) 和一个测试示例。LLaMa 将此文本作为输入并生成答案或者排名不同的选项。

1.7.1 常识推理实验结果

作者考虑了8个标准的常识推理基准:BoolQ, PIQA, SIQA, WinoGrande 等,采用标准的 Zero-Shot 的设定进行评估。结果如图3所示,LLaMA-65B 在除了 BoolQ 的所有基准测试中都优于 Chinchilla-70B,在除了 BoolQ 和 WinoGrande 的任何地方都超过了 PaLM540B。LLAMA-13B 模型在大多数基准测试中也优于 GPT-3。

51c大模型~合集51_大模型_06

图3:常识推理实验结果

1.7.2 封闭式问答实验结果

如下图3和4所示是封闭式问答实验结果,图4是 Natural Questions 数据集,图5是 TriviaQA 数据集,报告的是报告精确匹配性能,即:模型无法访问包含回答问题证据的文档。在这两个基准测试中,LLaMA-65B 在零样本和少样本设置中实现了最先进的性能,而且 LLaMa-13B 的性能也同样具备竞争力。

51c大模型~合集51_大模型_07

图4:Natural Questions 封闭式问答实验结果

51c大模型~合集51_大模型_08

图5:TriviaQA 封闭式问答实验结果

1.7.3 阅读理解实验结果

阅读理解任务在 RACE 数据集上做评测,结果如图6所示。LLaMA-65B 与 PaLM-540B 具有竞争力,LLaMA-13B 的性能比 GPT-3 好几个百分点。

51c大模型~合集51_大模型_09

图6:阅读理解实验结果

1.7.4 数学推理实验结果

作者在 MATH 和 GSM8k 两个任务上面做数学推理任务,MATH 是一个 12K 中学和高中数学问题的数据集,用 LaTeX 编写。GSM8k 是一组中学数学问题。在 GSM8k 上,尽管 LLaMA-65B 从没在数学数据上进行微调,但可以观察到 LLaMA-65B 优于 Minerva-62B。

51c大模型~合集51_大模型_10

图7:数学推理实验结果

1.7.5 代码生成实验结果

作者在 HumanEval 和 MBPP 两个任务上面做代码生成任务,对于这两个任务,模型接收几个句子中的程序描述,以及一些输入输出示例。模型需要生成一个符合描述并满足测试用例的 Python 程序。图7将 LLaMa 与尚未在代码上微调的现有语言模型 (PaLM 和 LaMDA) 进行比较,PaLM 和 LLAMA 在包含相似数量代码标记的数据集上进行训练。对于相似数量的参数,LLaMa 优于其他通用模型,例如 LaMDA 和 PaLM,这些模型没有专门针对代码进行训练或微调。具有 13B 参数的 LLAMA,在 HumanEval 和 MBPP 上都优于 LaMDA 137B。LLaMA 65B 也超过了训练时间更长的 PaLM 62B。

1.7.6 大规模多任务语言理解实验结果

MMLU 大规模多任务语言理解基准由涵盖各种知识领域的多项选择题组成,包括人文、STEM 和社会科学。作者使用基准提供的示例在 5-shot 设置中评估我们的模型,结果如图7所示。可以观察到 LLaMa-65B 在大多数领域平均落后于 Chinchilla70B 和 PaLM-540B 几个百分点。一个潜在的解释是,LLaMa 在预训练数据中只使用了有限数量的书籍和学术论文,即 ArXiv、Gutenberg 和 Books3,总计只有 177GB,而其他的模型训练了多达 2TB 的书籍。

作者还发现加入一些微调指令也能够提升 大规模多任务语言理解的性能。尽管 LLaMA-65B 的非微调版本已经能够遵循基本指令,但可以观察到非常少量的微调提高了 MMLU 的性能,并进一步提高了模型遵循指令的能力。

如下图8所示,尽管这里使用的指令微调方法很简单,但在 MMLU 上达到了 68.9%。LLAMA-I (65B) 优于 MMLU 现有中等大小的指令微调模型,但仍远未达到最先进的水平。

51c大模型~合集51_大模型_11

图8:大规模多任务语言理解实验结果

1.8 训练期间的性能变化

如下图9所示是 7B、13B、33B 和 65B 这几个模型在一些问答和常识基准的表现随着 training token 的变化,图10是 7B、13B、33B 和 65B 这几个模型的 training loss 随着 training token 的变化。在大多数基准测试中,性能稳步提高,并且与模型的训练困惑度相关。

51c大模型~合集51_大模型_12

图9:7B、13B、33B 和 65B 这几个模型在一些问答和常识基准的表现随着 training token 的变化

51c大模型~合集51_大模型_13

图10:7B、13B、33B 和 65B 这几个模型的 training loss 随着 training token 的变化

参考

  1. ^https://arxiv.org/abs/2203.15556
  2. ^https://github.com/facebookresearch/xformers



#谷歌不敢用Transformer

谢尔盖布林:谷歌不敢用Transformer,作者全跑路了,现在我每天都在写代码

坐拥世界最大的搜索业务,谷歌一直独步于硅谷。搜索所带来的丰厚广告收入,让两位创始人谢尔盖・布林 (Sergey Brin) 和拉里・(Larry Page)可以退居二线,安心享受生活。

1997 年 9 月 15 日,谢尔盖・布林和拉里·佩吉注册了一个名为「谷歌」的网站。

直到 2022 年底,ChatGPT 火遍全球,原本 AI 浪潮的引领者谷歌似乎才意识到地位发生了翻转。最近一年以来,我们似乎习惯了这家科技巨头作为「追赶者」出现。

从去年开始,就有媒体爆料,称谢尔盖・布林已经重返一线,亲自编写代码。前 CEO 埃里克・施密特(Eric Schmidt)更是在斯坦福大学的讲座中直接向「每周只上一天班」的散漫制度开炮:「输给 OpenAI,再下去要输创业公司了」。

施密特在斯坦福演讲

同时,随着谷歌的体量越来越大,一些「大公司病」的症状也越发明显。许多谷歌的离职「小作文」显示:谷歌问题的根源不是「技术」,而是在于「文化」,比如员工的使命感不足,公司为了避免风险设置了繁琐的系统和流程。

AppSheet 创始人 Praveen Seshadri 宣布离开谷歌,他的博客称,公司已迷失方向,员工被困在系统里。

谷歌到底出了什么问题?Alphabet 工人工会表示:「真正阻碍谷歌员工每天工作效率的是人员不足、优先事项的不断变化、频繁的裁员、工资停滞不前以及管理层在项目跟进上的不足。」

虽然谷歌在「ChatGPT 反击战」迎头赶上,但和 OpenAI 评论区下期待 GPT-5 发布的画风有些不同,Gemini 亮相时,总会在不经意间「翻车」。首次发布就出现了 demo 造假,此后,Gemini 也因生成的人像图片存在种族偏见,建议每个人一天吃一块石头、用胶水来黏合披萨上的芝士,挨了不少批评。

上个月,谷歌发布了加强版的 Gemini,还推出了对标 GPT-4o 的语音助手 Gemini Live,但在演示环节,Gemini Live 还是出错了。

51c大模型~合集51_大模型_14

在 8 月举办的 Made by Google 活动上,前两次试用 Gemini Live 的拍照识图功能都失败了,直到第三次换手机才成功。

明明已经财富自由,为什么还要重返技术一线?频频「翻车」的 Gemini,谷歌内部如何看待?在科技巨头的竞争中,谷歌存在什么问题?在这场竞争中又将扮演怎样的角色?在昨天举办的 All-In 峰会现场,久未在媒体前露面的谢尔盖・布林在一场访谈中聊了聊他的看法。

,时长20:47

布林的主要观点为:

  • 决定重返技术前线,是因为 AI 领域的进展太过激动人心,作为计算机科学家,他不愿意错过这一波浪潮。
  • AI 技术不只是搜索的延伸,它将触及更广泛的变革。
  • 相比于专精于某个领域的「专家模型」,布林更看好通用模型,谷歌成功拿下 IMO 银牌模型,这源于谷歌在之前开始将形式证明模型中的某些知识和能力融合到通用语言模型之中的尝试。
  • 目前对于算力的需求源源不断,但很难出现「从 100 兆瓦到 1 吉瓦、10 吉瓦,甚至 100 吉瓦」的需求激增。
  • 在人工智能应用领域,布林认为生物学已经较好地实现了 AI 技术的落地应用,而机器人领域还是看完演示觉得很神奇的阶段,没有达到日常可以使用的水平。
  • 虽然 AI 偶尔会犯大错,但更应及时发布。AI 不是那种你紧紧捂在怀里、隐藏起来、直到它变得完美无缺的技术。比 AI「犯蠢」更可怕的是,当时谷歌太胆小,都不敢部署 Transformer,论文作者全离职了。
  • 科技巨头在 AI 领域的竞争实际是好事,不过布林还是会密切关注大模型排行榜。

以下是访谈全文:

布林:我本来以为我只是来参加一个播客,没想到现场有这么多观众,恭喜你的事业这么成功,整得我都有点害羞了。

主持人:感谢您抽空和我聊天。当今,AI 正处于改变世界的临界点。1998 年,你和拉里(Larry Page)成立了谷歌。听说最近你亲自上阵,在谷歌研究 AI。大型语言模型和对话式 AI 工具对谷歌搜索来说是一种威胁,这是许多行业分析师和专家争论的话题。所以你现在每天在谷歌坐多长时间的班?都在做什么?

布林:老实说,我几乎每天都去上班,不过今天因为要上你的节目,所以缺席一天。作为一名计算机科学家,我我从未见过像最近几年 AI 领域这样激动人心的进展。AI 的进步实在是太震撼了!

回想 90 年代,我还是研究生时,AI 在课程中几乎无足轻重,充其量不过是教材中的一个脚注。课本里讲的是,前人做了各种各样的试验,但是 AI 真的不起作用,搞 AI 就是「死路一条」。这就是关于 AI 你需要知道的一切。

然后不知怎的,奇迹般地,这些研究神经网络的人,让在 60、70 年代被丢弃的 AI 方法开始取得进展 —— 更多的计算,更多的数据,更聪明的算法..... 过去的十年里发生的事情简直令人惊叹。如今的 AI 工具,几乎每个月都能展现出全新的能力,而且这些能力很快就能翻倍。计算机展现出的能力着实令人惊叹。因此,我决定重返技术前线,因为我不愿错过作为计算机科学家所能体验到的这一切。

主持人:你觉得 AI 是搜索的延伸,还是它将重新定义人们检索信息的方式?

布林:我认为 AI 触及着日常生活的方方面面,搜索是其中之一。AI 的影响力几乎无所不包,例如编程。我现在对 AI 编程有所改观。从头开始编写代码,真的很难,特别是和指挥 AI 编程对比起来,对吧?

主持人:你都用 AI 编写了什么呢?

布林:事实上,我自己也写了一点代码,不过只是为了找点乐子。我有时也让 AI 为我写代码,体验很有趣。举个例子来说,我想知道谷歌的 AI 模型玩数独(Sudoku)玩得怎么样。于是,我让 AI 模型自己写了很多代码,可以自动生成数独谜题,然后再把这些题喂给 AI,拿去评分。AI 完全能够胜任编写这些代码的任务。

但当我和工程师们谈论这件事的时候,来回辩论了几轮,结果我半小时后回来,发现 AI 已经完成了。他们很震撼,很显然,他们并不像我所认为的那样,经常使用 AI 工具来辅助编码。

51c大模型~合集51_大模型_15

数独游戏(Sudoku)

主持人:这太好笑了。有的模型擅长解数独题,有的模型可以回答我世界中的事实信息,有的模型专用于设计房子。同时,众多研究者正致力于开发通用的大型语言模型。你认为未来将会朝着哪个路线发展呢?

我也不知道这种说法从何而起,说将会有一个「上帝模型」。这就是为什么投资人都在往 AI 里砸钱,一旦「上帝模型」被研发出来,那你就能「一步登天」了,当你拥有 AGI,你可以统治所有事物。或者有很多基于特定应用的小模型,在智能体中协作。你认为未来的模型开发与应用将会如何演变呢?

布林:如果你回顾 10 到 15 年前,那时,不同的 AI 技术被用于解决完全不同的问题。比如,下棋的 AI 与图像生成技术就非常不同,它们各自有着很大的差异。

主持人:就像最近谷歌发了一个 GNN 模型,它的表现优于所有物理预测模型。我不确定你知不知道,但是确实是谷歌发的。

布林:太棒了,但我不知道(尴尬)。

主持人:这个模型就是一个完全不同的架构。

布林:以历史的眼光来看,AI 确实存在着多种不同的系统。以最近举行的国际数学奥林匹克竞赛(IMO)为例,谷歌的模型获得了银牌,离金牌就差一分

实际上,我们采用了三种 AI 模型:一种负责定理证明,一种专注于几何问题,还有一种是通用的语言模型。然而,就在几个月前,我们开始尝试从之前的工作中吸取经验,开始将形式证明模型中的某些知识和能力融合到通用语言模型之中。

这项工作还在进行,但我认为趋势将朝着构建一个更加统一的模型方向发展。我不确定它就是所谓的「上帝模型」,但可以肯定的是,我们正在朝着某种共享架构,甚至是共享模型的方向发展。

主持人:如果这就是未来的方向,那么为了训练和完善那个超大模型,势必需要动用庞大的计算资源。

布林:算力不可或缺。我读过一些文章,它们预测算力需求将激增,从 100 兆瓦到 1 吉瓦、10 吉瓦,甚至 100 吉瓦。我对此持保留意见。近年来,算法的创新和优化,已带来比增加硬件算力更显著的性能提升。

主持人:那么,当前对算力的大量投入不合理吗?每个人都在谈论英伟达的收益、利润、市值。它支持了超大规模计算和基础设施的增长,使得构建这些庞大的模型成为可能。这种趋势真的没有道理吗?或许它确实有道理,要不然为什么英伟达能赚这么多?

布林:首先声明,我并非经济学家或市场分析师,我的观点仅基于计算机科学家的视角。对我们来说,因为面对巨大的需求,我们正在尽可能快地构建算力集群。比如,谷歌云的客户只想要大量的 PPU、GPU,应有尽有。我们不得不拒绝客户,因为我们自己卡不够用,我们内部也依赖这些资源来训练和部署我们自己的模型。因此,我认为各大公司目前都在积极扩充算力,这都很合理。我只是觉得,很难直接从现状做出未来算力需求会从「100 兆瓦增长到 1 吉瓦、10 吉瓦,甚至 100 吉瓦」这种推断。

主持人:但企业需求就摆在那里。

布林:我明白,客户们有着广泛的需求,他们希望在各种 AI 模型上执行推理任务,并将这些模型应用于层出不穷的新场景中。他们的这些需求暂时是没有上限的。

主持人:在 AI 的应用领域,无论是机器人学还是生物学,您认为哪些方面取得了最显著的成就?有没有用例让你觉得「哇,这太有用了」?又有哪些领域挑战较大,应用落地可能比预期更久?

布林:我的答案是生物学。Alphafold 已经推出一段时间了。它已经推出一段时间,而且我与生物学家交流时发现,几乎人人都在使用它。Alphafold 的最新版本,Alphafold 3,代表了一种新型的 AI 技术。正如我之前提到的,我相信未来的趋势是模型的统一化。

对于机器人,我处于一个「wow 阶段」,比如,「哇,机器人竟然可以做家务了!」但你要知道,它背后可能只是一个微调了一下的通用语言模型,虽然它很神奇,但大多数情况下,它们还没有达到日常可以使用的水平。

主持人:你看到机器人的前景了吗?

布林:可能吧...... 但是我没有看到具体的......

主持人:但你们谷歌不是也有机器人业务吗?虽然后来被拆出去了,还被卖了。

布林:谷歌曾在做机器人的生意。

主持人:可能只是时机不对。

布林:坦白说,那可能是我们过于超前了。波士顿动力公司有那么多明星产品,但我甚至不记得谷歌做出过什么。无论如何,我们有过五六个令人尴尬的产品,但它们很酷,能给人留下深刻的印象。只是看到现在的通用语言模型有多能干,多模态技术能让机器人理解场景,想想当年还是有点傻。当时还没有这些 AI 技术,我们就像是在跑步机上原地踏步,难以向前迈进。

谷歌开发机器人的计划曾有一手好牌:「Android 之父」安迪・鲁宾(Andy Rubin),大名鼎鼎的机器人制造商波士顿动力,名动一时的人形机器人 Atlas…… 不过,就在短短五年时间里,计划解散重组,再解散再重组。高管相继离职,销售计划叫停,几大王牌公司各自卖身...

主持人:你在核心技术的研发上投入了大量时间。在产品方面,你是否也投入了相当的精力?在一个 AI 无处不在的未来世界中,人机交互的方式将如何演进,我们的日常生活又将发生怎样的变化呢?

布林:这好像在茶水间和同事聊天的话题。

主持人:介意和我们分享一下吗?

布林:不介意,我在回想一些不会令人尴尬的事情,挣扎 ing。

主持人:讲「你有一个朋友」的故事也行。

布林:未来会怎么样,真的很难讲。AI 的技术是实现应用的基础。比如有人放出了一个炸裂的 demo,特别惊艳,但从演示到真正在生产中实现,这需要时间。我不知道你是否尝试过 Astra 模型,你可以与它打实时视频,它能说出你身边环境中发生的事情。

主持人:你可以用对吧。

布林:我肯定会拿到访问权限的。有时候,我可能是最后一批获得权限的人。目前,我们已经来到了一个这样的阶段,体验了 AI 之后,人们可能会惊叹:「哦,我的天,这真是太神奇了。」然后你会思考,「好吧,它 90% 的情况下都能正确运行。」但接着你可能会质疑,「如果还有 10% 的情况下会出现错误或反应迟缓,这样的技术真的够好吗?」于是,我们必须努力去完善这些细节,确保它既迅速又可靠,等等。当这一切真正实现时,那确实是一种令人惊叹的成就。

主持人:我听说了一个故事,应该在上台之前和你通一下气的。在一次发布会之前,一群工程师向你展示了 AI 可以用来编写代码,他们说:「我们尚未在 Gemini 中部署它,因为我们想确保它不会出错。」谷歌有一些这样「犹豫不决」的企业文化。当时你说:「不,既然它能写代码,那就应该推出。」很多人都给我讲过这个故事。因为他们认为,「从你这位创始人口中听到这样的言论极为重要,这表明保守主义还没有完全占领谷歌,我们期待看到谷歌继续引领创新。」这样的描述准确吗?你真的这样说过吗?

布林:我不记得具体细节了。老实说,这确实很像我会做的事。

主持人:对我来说,这就会成为一个问题,因为谷歌的规模已经如此之大,一旦出现失误,就会损失惨重。

布林:那我还是有害怕的事的。现在语言模型的起点,要追溯到 6 年前还是 8 年前哪篇 Transformer 论文。但是这些论文作者全部都从谷歌离职了。恭喜他们!当时我们太胆小,都不敢部署 Transformer。

布林:而且无论 AI 的能力有多强大,它们有时仍会犯错误,仍会说出一些令人尴尬的话。但同时,AI 已经可以帮助我们从未做过的事情。比如我和我的孩子们一起编程,处理一些极其复杂的问题。

仅仅通过向 AI 咨询,他们就能直接上手编程,学会那些通常需要花费一个月时间去学习的各种复杂 API 和工具。这种能力近乎神奇。我们需要准备好面对一些错误,并勇于承担风险。我相信我们在这方面的应对已经有所改进。当然,你们可能已经见过很多 AI「犯蠢」的时刻了,但......

主持人:这是可以接受的。毕竟,你早已财富自由,坐拥巨额股票。我的意思是,你愿意接受这些尴尬,因为在这个阶段这么做非常重要。

布林:我这么做不是因为我的股票,好吗?但是想想我真能接受这些错误吗?这就是我们呈现给世界的神奇之物吗?我觉得我们所需要传达的是,「看,这个东西很神奇」。AI 偶尔会犯大错,但我认为我们应该及时发布,让人们去实验,看看能找到什么新应用。AI 不是那种你紧紧捂在怀里、隐藏起来、直到它变得完美无缺的技术。

主持人:您是否认为人工智能对世界的影响力如此深远,创造的价值如此巨大,以至于这不再是谷歌、Meta 和亚马逊之间的一场简单竞争?大家都把它看作是一场商战,但是有没有这种可能,AI 做出的蛋糕如此大,你们正在探索的领域如此广泛,远不止于谁打造了得分最高的模型,谁的 LLM 性能最出色?你如何看待如何看待 AI 带来的广阔前景,谷歌在其中将扮演怎样的角色?

布林:我认为竞争在某种程度上是非常有帮助的,因为所有科技大厂都在争夺,顺便说一下,几周前在某个排行榜上,谷歌是第一名,并且我上次检查时,我们仍然击败了顶级模型。只是......

主持人:有几个指标不好。所以你确实是在乎模型评分的!

布林:我没说我不在乎啊。ChatGPT 问世时,谷歌确实落后了一大截,现在我们已经取得了长足的进步。我对谷歌现在取得的所有进步非常满意。因此,我们肯定会密切关注模型排行榜。我认为有这么多 AI 公司存在是好事,无论是 OpenAI、Anthropic,还有 Mistral,这代表着 AI 领域正在迅速扩张,充满活力。

对于你的问题,我认为 AI 对人类来说有巨大的价值。如果回想一下我的大学时代,那时还没有我们今天所熟知的互联网,想要获取基本信息、与人沟通都需要付出巨大的努力。在手机普及之前,我们已经在全球范围内获得了巨大的能力提升,而如今的 AI 技术,无疑是另一项重大的能力飞跃。现在,几乎每个人都能以某种方式接触到 AI。我认为这是非常令人兴奋的,真是太棒了。




#音频驱动人像视频模型

字节Loopy、CyberHost研究成果揭秘

近期,来自字节跳动的视频生成模型 Loopy,一经发布就在 X 上引起了广泛的讨论。Loopy 可以仅仅通过一张图片和一段音频生成逼真的肖像视频,对声音中呼吸,叹气,挑眉等细节都能生成的非常自然,让网友直呼哈利波特的魔法也不过如此。

Loopy 模型采用了 Diffusion 视频生成框架。输入一张图片和一段音频,就可以生成相应的视频。不但可以实现准确的音频和口型同步,还可以生成细微自然的表情动作,例如人物跟随情绪节奏做出抬眉、吸气、憋嘴停顿、叹气、肩膀运动等非语言类动作也能很好地被捕捉到;在唱歌时也能表现得活灵活现,驾驭不同风格。

rap

更多丰富风格的展示,可移步项目主页:https://Loopyavatar.github.io/, https://arxiv.org/pdf/2409.02634

在不同的图片风格上,Loopy 也都表现得不错,像古风画像、粘土风格、油画风格、3D 素材以及侧脸的情况等等。

Loopy 技术方案

具体来说,Loopy 是如何仅需音频,就能实现这样生动的效果呢?

51c大模型~合集51_大模型_16

Loopy 框架中分别对外观信息(对应图中左上角)和音频信息(图中左下角)做了相应的方法设计,在外观上团队引入了 inter/intra- clip temporal layers 模块,通过 inter-clip temporal layer 来捕捉跨时间片段的时序信息,通过 intra-clip temporal layer 来捕捉单个片段内的时序信息,通过分而治之的方式更好建模人物的运动信息。

51c大模型~合集51_大模型_17

同时为了进一步的提升效果,团队设计了 Temporal Segment Module 使得 inter-clip temporal layer 可以捕捉长达 100 帧以上的时序信息,从而可以更好的基于数据学习长时运动信息依赖,抛弃了空间模版的限制,最终生成更好的人像运动。这就不难理解为什么 Loopy 可以仅仅依靠音频,不需要任何空间辅助信号就可以生成自然逼真的人像视频了。

51c大模型~合集51_大模型_18

除此以外,为了能够捕捉到细腻的表情变化,团队设计了一个名为 audio to latents(A2L)的模块,用来增强音频和头部运动之间的关联关系。这个 A2L 模块在训练过程中会随机选取音频、表情参数、运动参数中的一个,将其转化为 motion latents,作为 diffusion model 的运动控制信号。在测试的时候,只需要音频就能够得到 motion latents。通过这种方式,可以借助与肖像运动强相关的条件(表情参数、运动参数)来帮助较弱相关的条件(audio)生成更好的 motion latents,进而实现对细微生动的肖像运动及表情的生成。

Loopy 在不同场景下都和近期的方法做了数值对比,也体现了相当的优势:

51c大模型~合集51_大模型_19

51c大模型~合集51_大模型_20

CyberHost 半身人像版模型,手部动作也能驱动

除此以外,该团队近期还推出了一个名为 CyberHost 的半身人像版本。这款模型是首个采用端到端算法框架进行纯音频驱动的半身视频生成系统,将驱动范围从肖像扩大到了半身,不仅表情自然、口型准确,也能生成和音频同步的手部动作,这在该领域是一个重大突破。

手部动作生成一直是视频生成技术中的难题,鲜有模型能实现稳定的效果。特别是在纯音频驱动的场景下,由于缺乏骨架信息输入,保持手部动作的稳定性更具挑战。CyberHost 通过专门设计的 Codebook Attention 来强化对人脸和手部等关键区域的结构先验学习,在纯音频驱动下的手部生成质量甚至超越了许多基于视频驱动的方法。

,时长00:20

,时长00:18

Codebook Attention 引入了一系列可学习的时空联合隐变量参数,专注于在训练过程中学习数据集中局部区域的结构特征和运动模式。同时,该机制还提取了关键区域的外观特征,强化了局部 ID 的一致性。团队将这一机制应用于脸部和手部区域,并在 Denoising U-Net 的各个阶段进行插入,提升了对关键区域的建模能力。

51c大模型~合集51_大模型_21

此外,CyberHost 还设计了一系列基于人体结构先验的训练策略,旨在减少音频驱动下人体动作生成的不确定性。这些策略包括 Body Movement Map 和 Hand Clarity Score。Body Movement Map 可以用于限制视频生成中人体的运动范围。而 Hand Clarity Score 通过计算局部像素的 laplacian 算子来控制生成手部的清晰度,规避手部运动模糊带来的效果劣化。

更多细节见论文以及项目主页:

CyberHost: https://cyberhost.github.io/, https://arxiv.org/pdf/2409.01876




#KAG

蚂蚁自研知识增强大模型服务框架KAG,可显著提升知识推理准确率

近日,在 2024 Inclusion・外滩大会 “超越平面思维,图计算让 AI 洞悉复杂世界” 见解论坛上,蚂蚁集团知识图谱负责人梁磊分享了 “构建知识增强的专业智能体” 相关工作,并带来了知识图谱与大模型结合最新研发成果 —— 知识增强大模型服务框架 KAG。

梁磊介绍,专业领域增强大模型服务框架 KAG 通过图谱逻辑符号引导决策和检索,显著提升了垂直领域决策的精准性和逻辑严谨性;通过信息检索可补全知识图谱的稀疏性和知识覆盖的不足,同时充分利用大语言模型的理解和生成能力降低领域知识图谱的构造门槛。KAG 框架在垂直领域的适用性得到了有效验证。比如,支付宝最新推出的 AI 原生 App “支小宝” 采用这套框架,在政务问答场景的准确率提升到了 91%,医疗问答垂直的指标解读准确率可达 90% 以上。梁磊还透露,KAG 框架会进一步向社区开放,并在开源框架 OpenSPG (https://github.com/OpenSPG/openspg) 中原生支持,也欢迎社区共建。

1、可信是大语言模型真正落地应用的前提

大语言模型有着很好的理解和生成能力,在垂直领域的应用有巨大的机会,但同时也存在着非常大的挑战。比如在垂直领域跟专家经验、一些具体业务结合的时候,依然存在着不懂领域知识、做不了复杂决策、不可靠等问题。

51c大模型~合集51_大模型_22

首先,大语言模型本身不具备比较严谨的思考能力。在一些测试中,我们让大语言模型做复杂问题的拆解,问两部电影之间的共同主演是谁,结果显示总体上回复的准确性和一致性相对较低,甚至还有一些拆解错误。这种情况下,大语言模型很难严格遵从人类的指令。此外,大语言模型还存在事实性不足的问题。今年以来行业尝试把 RAG、搜索引擎之类的技术引入到大语言模型,来补充事实性不足的问题,以及 GraphRAG,用图的方式去重新组织它的检索。但问题是,即便引入了一些外部知识库,把一些垂直领域的知识库和事实文档给到语言模型,模型也不见得能够完全生成一个准确的答案。

除此以外,大模型在外部知识库召回的时候,也依然会存在召回不准的问题。举个基于向量计算的 RAG 的例子。比如问 “怎么查找我的养老金”,常见的有两种做法,一种是直接基于向量计算去召回文档,但是往往和业务专家定义的知识不相关。但在垂直领域,有很多知识在字面上不相似,但却是很相关的。比如政策明确规定了五险一金的范围,大模型不能对这些内容做胡乱生成,这就必须有一些预定义的领域知识和预定义的知识结构,来约束大模型的行为,甚至给它提供一个更有效的知识注入,而这些都是模型在文本上不相似,但却是强相关的。在这种情况下,今年讨论引入知识图谱技术的也越来越多。通过知识图谱的语义相关性来提升模型内容的相关性,以此可以做更好的语义计算和语义的召回。

大模型幻觉也是阻碍应用的关键挑战之一。那么,引入了 RAG、知识库之后,大模型就能解决幻觉问题了吗?其实不然,而且有些幻觉问题不仔细观察便难以察觉。举个例子,比如原文提到功能饮料中的维生素、矿物质等,对运动后补充身体营养、消除疲劳具有一定作用,而大模型重新生成以后,可能会改写成对于增加疲劳有一定作用。这种其实就会给一个错误的引导,但这种错误的引导,尤其是大模型生成的文案可能是几百字,甚至上千字的,这时候就很难从里面观察到这类细节问题。通过测评发现,大语言模型即便是加入 RAG 以后,依然有大概 30% 到 40% 的幻觉率。

在真实业务决策场景,挑战就更多了。以金融场景为例,无论是研报生成,还是医疗问诊等等,业务上都有比较严格的问题规划、信息获取、决策建议,甚至生成和反馈的过程。也就是说,因为大语言模型还是要为人类服务,应用在一个个垂直业务场景,每一类都需要准确的决策过程,如果这个决策过程不能得到很好的控制的话,就很难真正意义上用在垂直领域。在专业性的知识服务场景,大语言模型服务的首要前提是知识精准。这就包括知识的边界是完备的,知识的结构及语义清晰、逻辑严谨。另外,在垂直领域落地,也一定要对时间、数字和逻辑敏感,无论让它做多跳推理,还是逻辑规则数字计算,而这些恰好是大语言模型所不擅长的,包括前一段时间热议的 9.9 和 9.12 比大小的例子。

基于此,我们认为在垂直领域落地的时候,大语言模型一定确保专业和可信。可信是大语言模型真正意义上落地的前提。如果不能保证可信,我们可能不会迎来真正意义上的 AGI 的变革。这也是蚂蚁为什么要做知识增强的重要原因。

2、KAG:专业领域知识增强大模型服务框架

应对大模型在真实应用场景遇到的挑战,蚂蚁研发了基于知识增强在垂直领域的可控生成框架 KAG。

51c大模型~合集51_大模型_23

KAG 可控生成框架是基于开源系统 OpenSPG 升级,并且结合了蚂蚁自研的图数据库 TuGraph-DB 的能力。TuGraph-DB 作为 KAG 中知识图谱 SPG 的底层图引擎,为 KAG 提供了高效的知识存储与检索能力。KAG 将抽取的知识存储于 SPG 中,由 TuGraph-DB 提供图存储;在检索流程中,SPG 通过 TuGraph-DB 的 Cypher 接口检索与用户提问相关的知识信息,并将结果反馈给大模型生成回答。

KAG 框架针对大语言模型和图谱的结合做了五方面的增强:分别是知识表示的增强、图结构与文本互索引、符号引导的拆解和推理、基于概念的知识对齐、KAG Model。具体包括以下关键能力:

1) KAG: LLMs 友好的知识表示

今年,我们对语义表示进行了升级,旨在进一步发展 OpenSPG 项目,推动知识图谱从静态二元结构向多元动态结构持续升级。通过原始文本增强深度上下文感知,我们实现了更丰富的可解释文本的知识关联,对大语言模型也更友好,同时,参考 DIKW 层次范式在同一实体空间中支持 Schema 约束、无模式建模及文本结构的分层表示。

51c大模型~合集51_大模型_24

同时,我们探讨了 GraphRAG 范式的两种主要实现:微软的 GraphRAG 和 HippoRAG。尽管微软的 GraphRAG 在摘要生成类任务上有不错表现,但在事实问答准确率上表现不佳。而 HippoRAG 通过图结构构建倒排索引,显著提升了文档召回的相关性和事实问答的准确性。我们的目标是在专业领域内实现准确的事实性回答和报告生成,融合不同层级知识创建从严格到宽松的决策范式。

2) 互索引:结构化知识与文本数据互索引结构

我们将原有的 term-based 倒排索引升级为 graph-based 倒排索引,通过开放信息抽取获取原始文档中的关键元素和描述性信息,进行有效的语义切分,最终形成一个包含业务实体、通用概念知识和文本块的图结构。这种结构不仅便于遍历和检索文本块,还能有效分析文档间的关联。

51c大模型~合集51_大模型_25

3) 混合推理:符号决策、向量检索与大模型混合推理

我们在 KAG 中构建了一个混合推理引擎,旨在解决知识图谱在严谨决策中的应用问题。目标是开发一套技术范式,支持复杂推理决策的执行,同时通过信息检索来弥补知识图谱的不足。

51c大模型~合集51_大模型_26

该框架采用符号驱动的方法生成逻辑可执行的查询表达式(Logic form Query)。通过图结构操作,利用分层知识进行决策:先在逻辑知识层检索,若无解则转向开放信息层,再通过关联文档检索提高召回率和准确性。在生成阶段,我们应用 query-focused summary 方法,以通过查询结构提取答案,解决传统知识图谱与用户查询的粒度匹配问题。同时,基于知识图谱的反馈有助于抑制语言模型生成中的幻觉,提高准确性。系统将问题拆解为逻辑符号表达,可转化为 KGDSL 或 GQL。我们的两阶段规划包含图谱存储中的精确匹配和 SPO 子图检索,最后集成知识图谱以减轻幻觉。通过文本抽取的三元组注入语言模型,在生成时遵循结构范式,有效降低幻觉率。这种方法在内部业务中如区域风险报告生成中已显著改善,我们将继续深入探索这一方向。

4) 语义对齐:平衡信息检索与专业决策

问题的关键在于如何有效整合信息检索和专业决策。信息检索允许一定的错误率,而专业决策对准确性要求则是严格的。因此,我们通过开放信息抽取构建结构化知识,并应用 schema 约束以提升决策的严谨性。此外,基于概念的语义对齐让我们能兼顾这两者,形成一个基于 SPG 的领域知识图谱,从而改善信息检索和专业决策的能力。

51c大模型~合集51_大模型_27

我们通过传统图谱方法,如实体链接和概念分层等,提升了图结构的稠密性和语义完备性。借助与浙江大学的 OpenKG 合作,推进 OneGraph 项目,我们致力于通过增强知识对齐能力,降低构建成本。同时,在垂直领域的探索中,例如医疗和法律术语的应用,我们优化了开放抽取的效率,显著提升了与领域知识的对齐准确性。我们的框架在通用数据集上较现有 SOTA 的 F1 提高了 10-20 个百分点,并在实际应用中,比如政务和医疗问答场景,取得了显著的精度提升,表明其在专业决策中的有效性。

5) KAG 模型:定义 LLMs 与 KGs 之间的协同任务

KAG 模型旨在降低大型语言模型(LLMs)与知识图谱(KGs)结合的成本,利用指令合成技术使较小模型在性能上接近更大模型。我们对 LLMs 和 KGs 的能力进行对齐,强调自然语言理解、推理和生成能力,确保从文本中提取结构化信息并提升知识融合效率。结构化、语义化的知识图谱和原始文档之间形成了良好的双向映射,从文本到图谱则是刻画文本内的关键信息和符号结构,从图谱到文本则是描述文本生成中所必须满足的知识和逻辑约束。

51c大模型~合集51_大模型_28

为构建知识图谱,我们注重知识点的文本可解释性,要求附带描述信息、关联原始文本段, 避免仅只有原始词条。知识图谱的结构化特性有助于生成高质量指令,通过逻辑拆解和语义关系合成提升大语言模型的自然语言理解和推理能力。此外,指令的合成和语义对齐使小参数量模型达到接近或超越更大参数模型的效果,同时大幅提升性能。实践中发现图谱指令合成微调后的小模型在概念补全、信息抽取等图谱专用任务上的准确率均高于更大参数模型。

3. KAG 在垂直领域的典型应用

今年以来,我们在业务应用中不断完善 KAG 框架。在支付宝 AI 生活管家 “支小宝” 的热点事件功能、政务民生场景,以及研报生成类任务,KAG 都能够生成逻辑上更为准确的内容。此外,支付宝今年在政务办事和医疗健康两个重要功能升级中也应用了知识图谱技术。例如,“去医院针灸能否报销?” 这一问题包含了特定条件,而带有条件的检索是传统搜索引擎或向量计算所不具备的功能。通过知识图谱的方式,我们可以更有效地找到相关知识并生成更加完备的回答。

近期,蚂蚁将发布 KAG 的整体技术报告。我们希望真正融合知识图谱的符号计算和向量检索的优势,因为它们在很多方面是互补的。同时,利用大型语言模型的理解和生成能力,构建一个知识增强的大语言模型生成系统。

51c大模型~合集51_大模型_29

在这个过程中,我们首先需要解决的是垂直领域应用的问题。系统既能进行复杂的符号决策,又能在复杂符号决策无法满足需求时,通过向量检索进行补充。在框架的后续版本中,我们将提供一些用户可调的参数。这意味着,如果用户对准确率有极高要求,可以减少基于信息检索生成的内容;如果对准确率有一定容忍度,则可以适当放宽标准。这为用户提供了一个可调节的垂直领域解决方案。因为并不是所有垂直领域应用场景都要求绝对的准确率,而是存在一定的容忍范围。因此,我们可以为用户提供更多的动态选择。

除了上述工作,为加速知识图谱与大语言模型的双向融通,蚂蚁集团也和浙江大学成立了知识图谱联合实验室。联合实验室已发布了大模型抽取框架 OneKE,下一步还将构建增强语言模型的 OneGraph。 

后记:在 2024Inclusion・外滩大会 “超越平面思维,图计算让 AI 洞悉复杂世界” 见解论坛上,美国伊利诺伊大学芝加哥分校计算机科学与技术系特聘教授俞士纶、国际关联数据基准委员会(LDBC)副主席 Alastair Green、中国人寿财产保险有限公司人工智能开发团队负责人孔宇飞、蚂蚁数字科技 AI 技术负责人章鹏、蚂蚁集团图计算解决方案架构师崔安颀等嘉宾也带来了精彩分享,更多观点可点击阅读原文查看。




#MMRole多模态角色扮演

与「李白」赏图赋诗,同「猴哥」直面天命,人大高瓴提出

代彦琪是中国人民大学高瓴人工智能学院的三年级博士生,师从卢志武教授,2022年毕业于大连理工大学软件学院。他的研究兴趣包括多任务学习、多模态大模型以及角色扮演智能体等领域,近期尤其关注多模态大模型指令微调中的多任务冲突问题。如有任何交流或合作机会,欢迎通过邮箱 yanqi_dai@ruc.edu.cn 联系。

随着大语言模型的飞速发展,角色扮演智能体(RPAs)正逐渐成为 AI 领域的热门话题。这类智能体不仅能够为人们提供陪伴、互动和娱乐,还在教育、社会模拟等领域展现出重要的应用潜力。然而,当前市面上的大多数角色扮演智能体都只会「文字聊天」,其理解能力仅限于单一的文本模态,远远无法与具备多模态感知能力的人类相比。这让我们不禁思考:我们真的只能与这些「单调」的智能体对话吗?显然,答案是否定的!

近日,中国人民大学高瓴人工智能学院的研究团队率先提出了「多模态角色扮演智能体」(MRPAs)的概念。这类智能体不仅能够扮演特定角色,还能够围绕图像进行多模态对话。与此同时,团队正式推出了 MMRole—— 一个专为 MRPAs 开发与评测量身打造的综合框架。

51c大模型~合集51_大模型_30

  • 代码仓库:https://github.com/YanqiDai/MMRole
  • 论文地址:https://arxiv.org/abs/2408.04203

51c大模型~合集51_大模型_31

图 1:MMRole 框架概述。

如图 1 所示,该框架包括一个大规模、高质量的多模态角色扮演数据集 MMRole-Data,并配备了一套健全的评测方法 MMRole-Eval,涵盖三个维度下的八项指标。在此基础上,团队开发了首个专门的多模态角色扮演智能体 ——MMRole-Agent,在多模态信息理解和角色扮演能力上明显优于同等参数规模的通用对话模型。

MMRole 打破了传统角色扮演智能体仅限于单一模态的局限,让智能体能够在图像和文字之间自由切换,带来更为沉浸的对话体验,进一步扩展了角色扮演智能体的应用场景与价值。

MMRole-Data 数据集

如图 1(a)所示,MMRole-Data 是一个大规模、高质量的多模态角色扮演数据集,包含 85 个角色及其身份信息、11K 张图像,以及 14K 段围绕图像展开的单轮或多轮对话,共生成了 85K 条训练样本和 294 条测试样本。在数据构建过程中,团队借助了 GPT-4V 进行辅助生成,并执行了严格的人工质量审查,为角色扮演智能体的训练和性能评测奠定了坚实基础。

51c大模型~合集51_大模型_32

图 2:MMRole-Data 中构建的所有角色。

如图 2 所示,MMRole-Data 涵盖了三种角色类型:虚构角色、历史和公众人物,以及假想现实角色。前两类角色的身份信息由 GPT-4 通过总结 Wikipedia 或百度百科的人物介绍生成,而第三类角色的身份信息则通过 GPT-4 采用两阶段生成方式,在确保多样性的基础上随机生成。前两类角色在之前的研究中已有较多探讨,团队特别引入了第三类角色,旨在提升和评测 MRPAs 在并不广为人知的角色上的性能,使其在多样化角色扮演场景中展现出更强的灵活性与泛化性。

进一步地,MMRole-Data 引入来自 MS-COCO 数据集的通用图像,确保了对广泛视觉概念的覆盖。同时,团队还人工收集和标注了剧照等与角色密切相关的图像,以更有效地唤起角色的个人经历和情感。

51c大模型~合集51_大模型_33

图 3:MMRole-Data 中三种对话场景的示例。

最后,如图 3 所示,团队利用 GPT-4V 生成了三类以图像为中心的对话场景:评论性交互、用户 - 角色对话,以及角色间对话。这些对话经过多轮规则过滤和严格的人工质量审查,确保了对话内容的准确性和角色一致性。

51c大模型~合集51_大模型_34

图 4:MMRole-Data 中文示例。

特别地,如图 4 所示,团队对数据集的中文部分进行了精细打磨,成功再现了李白、孙悟空等经典人物的形象。通过深入挖掘这些角色的独特个性和背景故事,MRPAs 能够在多模态对话中更具表现力和沉浸感,为用户带来更加真实的互动体验。

MMRole-Eval 评测方法

如图 1(b)所示,MMRole-Eval 是一套稳健而全面的多模态角色扮演智能体评测方法,涵盖三个维度下的八项评测指标,确保对智能体的多方面能力进行深入评估。具体的评测指标包括:

基础对话技巧

  • 指令遵循度(Instruction Adherence, IA)
  • 流畅度(Fluency, Flu)
  • 连贯性(Coherency, Coh)

多模态理解能力

  • 图文相关性(Image-Text Relevance, ITR)
  • 响应准确度(Response Accuracy, RA)

角色扮演质量

  • 性格一致性(Personality Consistency, PC)
  • 知识一致性(Knowledge Consistency, KC)
  • 语气一致性(Tone Consistency, TC)

为了定量评估 MRPAs 在各项指标上的性能,团队开发了一个专门的奖励模型。该模型首先对待评估的 MRPA 与构建的标准答案之间的相对性能进行简要的定性评价,随后为其生成一个定量的分数对,MRPA 的最终得分为该分数对中两个分数的比值。为了开发这一奖励模型,团队利用 GPT-4 在所有测试样本上对多个 MRPAs 进行评测,生成了大量评测轨迹,这些轨迹随后被转换为奖励模型的训练和验证数据。

评测结果与分析

51c大模型~合集51_大模型_35

表 1:MMRole-Eval 评测结果。In-Test 表示在训练集中出现过的角色上的测试,而 Out-Test 表示在训练集中未见过的角色上的测试。

如表 1 所示,团队开发的首个专门的多模态角色扮演智能体 MMRole-Agent(9B)在各项指标上表现出了卓越的性能,整体性能远超同等参数规模(<10B)的通用对话模型,甚至优于部分参数量更大(10B-100B)的模型。此外, MMRole-Agent 在未见过的角色上同样展现出了强大的泛化能力。

51c大模型~合集51_大模型_36

图 5:MMRole-Eval 评测结果的可视化。

此外,如图 5 所示,团队将评测结果进行了可视化分析,发现所有 MRPAs 在流畅度指标上均获得了较高分数,表明生成流畅内容对于现有的大模型而言相对容易。然而,在其他评测指标上,尤其是性格一致性和语气一致性指标,不同的 MRPAs 之间存在显著差异。这说明,在多模态角色扮演智能体的开发中,多模态理解能力和角色扮演质量是更具挑战性的方面,需要在未来的研究和优化中予以特别关注。



#PaperQA2

检索总结能力超博士后,首个大模型科研智能体PaperQA2开源了


这是 AI 智能体在大部分科学研究中超越人类的第一个案例,或许会彻底改变人类与科学文献互动的方式。


最近一段时间,有关 AI 科学家的研究越来越多。大语言模型(LLM)有望帮助科学家检索、综合和总结文献,提升人们的工作效率,但在研究工作中使用仍然有很多限制。

对于科研来说,事实性至关重要,而大模型会产生幻觉,有时会自信地陈述没有任何现有来源或证据的信息。另外,科学需要极其注重细节,而大模型在面对具有挑战性的推理问题时可能会忽略或误用细节。

最后,目前科学文献的检索和推理基准尚不完善。AI 无法参考整篇文献,而是局限于摘要、在固定语料库上检索,或者只是直接提供相关论文。这些基准不适合作为实际科学研究任务的性能代理,更重要的是,它们通常缺乏与人类表现的直接比较。因此,语言模型和智能体是否适合用于科学研究仍不清楚。

近日,来自 FutureHouse、罗切斯特大学等机构的研究者们尝试构建一个更为强大的科研智能体,并对 AI 系统和人类在三个现实任务上的表现进行严格比较。这三个任务有关搜索整个文献以回答问题;生成一篇有引用的、维基百科风格的科学主题文章;从论文中提取所有主张,并检查它们与所有文献之间的矛盾。

这可能是第一个在多个现实文献搜索任务上评估单个 AI 系统的强大程序。利用新开发的评估方法,研究者探索了多种设计,最终形成了 PaperQA2 系统,它在检索和总结任务上的表现超过了博士生和博士后。

51c大模型~合集51_大模型_37

将 PaperQA2 应用于矛盾检测任务让我们能够大规模识别生物学论文中的矛盾。例如,ZNF804A rs1344706 等位基因对精神分裂症患者的大脑结构有积极影响的说法与后来发表的研究相矛盾,该研究发现 rs1344706 对大脑皮质厚度、表面积和皮质体积的影响会加剧患精神分裂症的风险。

  • 论文地址:https://storage.googleapis.com/fh-public/paperqa/Language_Agents_Science.pdf
  • GitHub 链接:https://github.com/Future-House/paper-qa

网友纷纷表示这项工作太棒了,并且是开源的。

回答科学问题

为了评估 AI 系统对科学文献的检索能力,研究者首先生成了 LitQA2,这是一组共 248 个多项选择题,其答案需要从科学文献中检索。LitQA2 问题的设计目的是让答案出现在论文正文中,但不出现在摘要中,理想的情况下,在所有科学文献中只出现一次。这些约束使我们能够通过将系统引用的来源 DOI 与问题创建者最初分配的 DOI 进行匹配来评估回答的准确性(下图 A)。

为了执行这些标准,研究者生成了大量关于最近论文中模糊的中间发现的问题,然后排除了任何现有 AI 系统或人类注释者可以使用替代来源进行回答的问题。它们都是由专家生成的。

在回答 LitQA2 问题时,模型可以通过选择「信息不足,无法回答此问题」来拒绝回答。与先前的研究和实际的科学问题类似,有些问题本来就是无法回答的。研究者评估了两个指标:精确度(即在提供答案时正确回答的问题的比例)和准确度(即所有问题中正确答案的比例)。此外还考虑了召回率,即系统将其答案归因于 LitQA2 中表示的正确源 DOI 的问题的总百分比。

51c大模型~合集51_大模型_38

在开发了 LitQA2 之后,研究者利用它来设计一个科学文献的 AI 系统。在 PaperQA 的启发下,PaperQA2 是一个 RAG 智能体,它将检索和响应生成视为一个多步骤智能体任务,而不是一个直接过程。PaperQA2 将 RAG 分解为工具,使其能够修改其搜索参数,并在生成最终答案之前生成和检查候选答案(下图 A)。

PaperQA2 可以访问「论文搜索」工具,其中智能体模型将用户请求转换为用于识别候选论文的关键字搜索。候选论文被解析为机器可读的文本,并分块以供智能体稍后使用。PaperQA2 使用最先进的文档解析算法(Grobid19),能可靠地解析论文中的章节、表格和引文。找到候选论文后,PaperQA2 可以使用「收集证据」工具,该工具首先使用 top-k 密集向量检索步骤对论文块进行排序,然后进行大模型重新排序和上下文摘要(RCS)步骤。

51c大模型~合集51_大模型_39

在回答 LitQA2 问题时,PaperQA2 平均每道题解析并使用 14.5 ± 0.6(平均值 ± SD,n = 3)篇论文。在 LitQA2 上运行 PaperQA2 可获得 85.2% ± 1.1%(平均值 ± SD,n = 3)的精确度和 66.0% ± 1.2%(平均值 ± SD,n = 3)的准确度。另外,系统在 21.9% ± 0.9%(平均值 ± SD,n = 3)的答案中选择报告「信息不足」(下图 B)。

研究者发现 PaperQA2 在 LitQA2 基准测试中的精确度和准确度均优于其他 RAG 系统。我们还可以发现,除 Elicit 外所有测试的 RAG 系统在精确度和准确度方面均优于非 RAG 前沿模型。

51c大模型~合集51_大模型_40

为了确保 PaperQA2 不会过拟合,从而无法在 LitQA2 上取得优异成绩,研究者在对 PaperQA2 进行大量工程改动后,生成了一组新的 101 个 LitQA2 问题。

PaperQA2 在原始 147 个问题上的准确率与后一组 101 个问题的准确率没有显著差异,这表明在第一阶段的优化已经很好地推广到了新的 LitQA2 问题(下表 2)。

51c大模型~合集51_大模型_41

PaperQA2 性能分析

研究者尝试改变 PaperQA2 的参数,以了解哪些参数决定其准确性(下图 C)。他们创建了一个非智能体版本,其中包含一个硬编码操作序列(论文搜索、收集证据,然后生成答案)。非智能体系统的准确率明显较低(t (3.7)= 3.41,p= 0.015),验证了使用智能体的选择。

研究者将性能差异归因于智能体更好的记忆能力,因为它可以在观察到找到的相关论文数量后返回并更改关键字搜索(论文搜索工具调用)。

结果显示,LitQA2 运行准确度最高时为每个问题进行了 1.26 ± 0.07(平均值 ± SD)次搜索,每个问题进行了 0.46 ± 0.02(平均值 ±SD)次引用遍历,这表明智能体有时会返回进行额外搜索或遍历引用图以收集更多论文。

51c大模型~合集51_大模型_42

为了改进相关块检索,研究者假设,找到的论文对于现有相关块的引用者或被引用者而言将是一种有效的分层索引形式。通过去除「引用遍历」工具验证了这一点,该工具显示准确率有所提高(t (2.55) = 2.14,p= 0.069),DOI 召回率显著提高(t (3) = 3.4,p = 0.022),并在 PaperQA2 流程的所有阶段都是如此。该工具的流程反映了科学家与文献互动的方式。

研究者曾假设解析质量会影响准确度,但 Grobid 解析和更大的块并没有显著提高 LitQA2 的精度、准确度或召回率(下图 6)。

51c大模型~合集51_大模型_43

总结科学主题

为了评估 PaperQA2 的摘要功能,研究者设计了一个名为 WikiCrow 的系统。该系统通过结合多个 PaperQA2 调用来生成有关人类蛋白质编码基因的维基百科风格文章,而这些调用涉及基因的结构、功能、相互作用和临床意义等主题。

研究者使用 WikiCrow 生成了 240 篇有关基因的文章,这些文章已经有非存根维基百科文章进行匹配比较。WikiCrow 文章平均为 1219.0 ± 275.0 个字(平均值 ± SD,N = 240),比相应的维基百科文章(889.6 ± 715.3 个字)长。平均文章生成时间为 491.5 ± 324.0 秒,平均每篇文章成本为 4.48 ± 1.02 美元(包括搜索和 LLM API 的费用)。

51c大模型~合集51_大模型_44

同时,「引用但不受支持」评估类别包括不准确的陈述(例如真实幻觉或推理错误)和准确但引用不当的声明。

为了进一步调查维基百科和 WikiCrow 中的错误性质,研究者手动检查了所有报告的错误,并尝试将问题分类为以下几类:

  • 推理问题,即书面信息自相矛盾、过度推断或不受任何引用支持;
  • 归因问题,即信息可能得到另一个包含的来源支持,但该声明在本地没有包含正确的引用或来源太宽泛(例如数据库门户链接);
  • 琐碎的声明,这些声明虽是真实的段落,但过于迂腐或没有必要。

51c大模型~合集51_大模型_45

检测文献中的矛盾

由于 PaperQA2 可以比人类科学家探索吞吐量高得多的科学文献,因此研究者推测可以部署它来系统地、大规模地识别文献中矛盾和不一致的地方。矛盾检测是一个「一对多」问题,原则上涉及将一篇论文中的观点或声明与文献中所有其他观点或声明进行比较。在规模上,矛盾检测变成了「多对多」问题,对人类来说失去了可行性。

因此,研究者利用 PaperQA2 构建了一个名为 ContraCrow 的系统,可以自动检测文献中的矛盾(下图 A)。

51c大模型~合集51_大模型_46

ContraCrow 首先使用一系列 LLM completion 调用从提供的论文中提取声明,然后将这些声明输入到 PaperQA2 中,并附带矛盾检测提示。该提示指示系统评估文献中是否存在与提供的声明相矛盾的内容,并提供答案和 11-point 李克特量表的选择。使用李克特量表可让系统在提供排名时给出更可靠、更易于解释的分数。

51c大模型~合集51_大模型_47

接下来,研究者评估了 ContraCrow 检测 ContraDetect 中矛盾的能力。通过将李克特量表输出转换为整数,他们能够调整检测阈值并获得 AUC 为 0.842 的 ROC 曲线。将阈值设置为 8(矛盾),ContraCrow 实现了 73% 的准确率、88% 的精度和仅为 7% 的假阳性率(下图 C)。

51c大模型~合集51_大模型_48

研究者将 ContraCrow 应用于从数据库中随机选择的 93 篇生物学相关论文,平均每篇论文识别出 35.16 ± 21.72(平均值 ± SD,N = 93)个声明。在对 93 篇论文分析出的 3180 个声明中,ContraCrow 认为 6.85% 与文献相矛盾,其中分别有 2.89%、3.77% 和 0.19% 的声明被打了 8 分、9 分和 10 分(下图 D)。

51c大模型~合集51_大模型_49

此外,当将李克特量表阈值设定为 8,研究者发现平均每篇论文有 2.34 ± 1.99 个矛盾(平均值 ± SD)(下图 E)。

51c大模型~合集51_大模型_50

更多任务细节和测试结果请参阅原论文。



#OpenAI震撼发布o1大模型


大模型领域的技术发展,今天起再次「从 1 开始」了。

大语言模型还能向上突破,OpenAI 再次证明了自己的实力。

北京时间 9 月 13 日午夜,OpenAI 正式公开一系列全新 AI 大模型,旨在专门解决难题。这是一个重大突破,新模型可以实现复杂推理,一个通用模型解决比此前的科学、代码和数学模型能做到的更难的问题。

OpenAI 称,今天在 ChatGPT 和大模型 API 中新发布的是该系列中的第一款模型,而且还只是预览版 ——o1-preview。除了 o1,OpenAI 还展示了目前正在开发的下次更新的评估。

o1 模型一举创造了很多历史记录。

首先,o1 就是此前 OpenAI 从山姆・奥特曼到科学家们一直在「高调宣传」的草莓大模型。它拥有真正的通用推理能力。在一系列高难基准测试中展现出了超强实力,相比 GPT-4o 有巨大提升,让大模型的上限从「没法看」直接上升到优秀水平,不专门训练直接数学奥赛金牌,甚至能在博士级别的科学问答环节上超越人类专家。

奥特曼表示,虽然 o1 的表现仍然存在缺陷,不过你在第一次使用它的时候仍然会感到震撼。

其次,o1 给大模型规模扩展 vs 性能的曲线带来了一次上翘。它在大模型领域重现了当年 AlphaGo 强化学习的成功 —— 给越多算力,就输出越多智能,一直到超越人类水平。

也就是从方法上,o1 大模型首次证明了语言模型可以进行真正的强化学习。

开发出首个 AI 软件工程师 Devin 的 Cognition AI 表示,过去几周一直与 OpenAI 密切合作,使用 Devin 评估 o1 的推理能力。结果发现, 与 GPT-4o 相比,o1 系列模型对于处理代码的智能体系统来说是一个重大进步。

最后在实践中,o1 上线之后,现在 ChatGPT 可以在回答问题前先仔细思考,而不是立即脱口而出答案。就像人类大脑的系统 1 和系统 2,ChatGPT 已经从仅使用系统 1(快速、自动、直观、易出错)进化到了可使用系统 2 思维(缓慢、深思熟虑、有意识、可靠)。这让它能够解决以前无法解决的问题。

从今天 ChatGPT 的用户体验来看,这是向前迈进一小步。在简单的 Prompt 下,用户可能不会注意到太大的差异,但如果问一些棘手的数学或者代码问题,区别就开始明显了。更重要的是,未来发展的道路已经开始显现。

总而言之,今晚 OpenAI 丢出的这个重磅炸弹,已经让整个 AI 社区震撼,纷纷表示 tql、睡不着觉,深夜已经开始抓紧学习。接下来,就让我们看下 OpenAI o1 大模型的技术细节。

OpenAI o1 工作原理

在技术博客《Learning to Reason with LLMs》中,OpenAI 对 o1 系列语言模型做了详细的技术介绍。

OpenAI o1 是经过强化学习训练来执行复杂推理任务的新型语言模型。特点就是,o1 在回答之前会思考 —— 它可以在响应用户之前产生一个很长的内部思维链。

也就是该模型在作出反应之前,需要像人类一样,花更多时间思考问题。通过训练,它们学会完善自己的思维过程,尝试不同的策略,并认识到自己的错误。

在 OpenAI 的测试中,该系列后续更新的模型在物理、化学和生物学这些具有挑战性的基准任务上的表现与博士生相似。OpenAI 还发现它在数学和编码方面表现出色。

在国际数学奥林匹克(IMO)资格考试中,GPT-4o 仅正确解答了 13% 的问题,而 o1 模型正确解答了 83% 的问题。

模型的编码能力也在比赛中得到了评估,在 Codeforces 比赛中排名 89%。

OpenAI 表示,作为早期模型,它还不具备 ChatGPT 的许多实用功能,例如浏览网页获取信息以及上传文件和图片。

但对于复杂的推理任务来说,这是一个重大进步,代表了人工智能能力的新水平。鉴于此,OpenAI 将计数器重置为 1,并将该系列模型命名为 OpenAI o1。

重点在于,OpenAI 的大规模强化学习算法,教会模型如何在数据高度有效的训练过程中利用其思想链进行高效思考。换言之,类似于强化学习的 Scaling Law。

OpenAI 发现,随着更多的强化学习(训练时计算)和更多的思考时间(测试时计算),o1 的性能持续提高。而且扩展这种方法的限制与大模型预训练的限制有很大不同,OpenAI 也还在继续研究。

51c大模型~合集51_大模型_51

评估

为了突出相对于 GPT-4o 的推理性能改进,OpenAI 在一系列不同的人类考试和机器学习基准测试中测试了 o1 模型。实验结果表明,在绝大多数推理任务中,o1 的表现明显优于 GPT-4o。

51c大模型~合集51_大模型_52

o1 在具有挑战性的推理基准上比 GPT-4o 有了很大的改进。

51c大模型~合集51_大模型_53

o1 在广泛的基准测试上比 GPT-4o 有所改进,包括 54/57 MMLU 子类别,图示出了 7 个以供说明。

在许多推理密集型基准测试中,o1 的表现可与人类专家相媲美。最近的前沿模型在 MATH 和 GSM8K 上表现得非常好,以至于这些基准测试在区分模型方面不再有效。因此,OpenAI 在 AIME 上评估了数学成绩,这是一项旨在测试美国最聪明高中数学学生的考试。

51c大模型~合集51_大模型_54

在一个官方演示中,o1-preview 解答了一个非常困难的推理问题:当公主的年龄是王子的两倍时,公主的年龄与王子一样大,而公主的年龄是他们现在年龄总和的一半。王子和公主的年龄是多少?提供这个问题的所有解。

在 2024 年 AIME 考试中,GPT-4o 平均只解决了 12% (1.8/15) 的问题,而 o1 在每个问题只有一个样本的情况下平均为 74% (11.1/15),在 64 个样本之间达成一致的情况下为 83% (12.5/15),在使用学习的评分函数对 1000 个样本重新排序时为 93% (13.9/15)。13.9 分可以跻身全美前 500 名,并且高于美国数学奥林匹克竞赛分数线。

OpenAI 还在 GPQA Diamond 基准上评估了 o1,这是一个困难的智力基准,用于测试化学、物理和生物学方面的专业知识。为了将模型与人类进行比较,OpenAI 聘请了拥有博士学位的专家来回答 GPQA Diamond 基准问题。

实验结果表明:o1 超越了人类专家的表现,成为第一个在该基准测试中做到这一点的模型。

这些结果并不意味着 o1 在所有方面都比博士更有能力 —— 只是该模型更擅长解决一些博士应该解决的问题。在其他几个 ML 基准测试中,o1 实现了新的 SOTA。

启用视觉感知能力后,o1 在 MMMU 基准上得分为 78.2%,成为第一个与人类专家相当的模型。o1 还在 57 个 MMLU 子类别中的 54 个上优于 GPT-4o。

思维链(CoT)

与人类在回答难题之前会长时间思考类似,o1 在尝试解决问题时会使用思维链。通过强化学习,o1 学会磨练其思维链并改进其使用的策略。o1 学会了识别和纠正错误,并可以将棘手的步骤分解为更简单的步骤。o1 还学会了在当前方法不起作用时尝试不同的方法。这个过程极大地提高了模型的推理能力。

编程能力

基于 o1 进行了初始化并进一步训练了其编程技能后,OpenAI 训练得到了一个非常强大的编程模型(o1-ioi)。该模型在 2024 年国际信息学奥林匹克竞赛(IOI)赛题上得到了 213 分,达到了排名前 49% 的水平。并且该模型参与竞赛的条件与 2024 IOI 的人类参赛者一样:需要在 10 个小时内解答 6 个高难度算法问题,并且每个问题仅能提交 50 次答案。

针对每个问题,这个经过专门训练的 o1 模型会采样许多候选答案,然后基于一个测试时选取策略提交其中 50 个答案。选取标准包括在 IOI 公共测试案例、模型生成的测试案例以及一个学习得到的评分函数上的性能。

研究表明,这个策略是有效的。因为如果直接随机提交一个答案,则平均得分仅有 156。这说明在该竞赛条件下,这个策略至少值 60 分。

OpenAI 发现,如果放宽提交限制条件,则模型性能更是能大幅提升。如果每个问题允许提交 1 万次答案,即使不使用上述测试时选取策略,该模型也能得到 362.14 分——可以得金牌了。

最后,OpenAI 模拟了 Codeforces 主办的竞争性编程竞赛,以展示该模型的编码技能。采用的评估与竞赛规则非常接近,允许提交 10 份代码。GPT-4o 的 Elo 评分为 808,在人类竞争对手中处于前 11% 的水平。该模型远远超过了 GPT-4o 和 o1——它的 Elo 评分为 1807,表现优于 93% 的竞争对手。

51c大模型~合集51_大模型_55

在编程竞赛上进一步微调使得 o1 能力又增,并在 2024 年国际信息学奥林匹克竞赛(IOI)规则下排名前 49%。

下面这个官方示例直观地展示了 o1-preview 的编程能力:一段提示词就让其写出了一个完整可运行的游戏。

51c大模型~合集51_大模型_56

人类偏好评估

除了考试和学术基准之外,OpenAI 还在更多领域的具有挑战性的开放式提示上评估了人类对 o1-preview 和 GPT-4o 的偏好。

在这次评估中,人类训练者对 o1-preview 和 GPT-4o 的提示进行匿名回答,并投票选出他们更喜欢的回答。在数据分析、编程和数学等推理能力较强的类别中,o1-preview 的受欢迎程度远远高于 GPT-4o。然而,o1-preview 在某些自然语言任务上并不受欢迎,这表明它并不适合所有用例。

51c大模型~合集51_大模型_57

在需要更强大推理能力的领域,人们更青睐 o1-preview。

安全

思维链(CoT)推理为安全和对齐提供了新的思路。OpenAI 发现,将模型行为策略整合到推理模型的思维链中,可以高效、稳健地教导人类价值观和原则。通过向模型教导自己的安全规则以及如何在上下文中推理它们,OpenAI 发现推理能力直接有利于模型稳健性的证据:o1-preview 在关键越狱评估和用于评估模型安全拒绝边界的最严格内部基准上取得了显著的改进。

OpenAI 认为,使用思维链可以为安全和对齐带来重大进步,因为 1)它能够以清晰的方式观察模型思维,并且 2)关于安全规则的模型推理对于分布外场景更具稳健性。

为了对自己的改进进行压力测试, OpenAI 在部署之前根据自己的安全准备框架进行了一系列安全测试和红队测试。结果发现,思维链推理有助于在整个评估过程中提高能力。尤其值得注意的是,OpenAI 观察到了有趣的奖励黑客攻击实例。

51c大模型~合集51_大模型_58

安全准备框架链接:https://openai.com/safety/

隐藏思维链

OpenAI 认为隐藏思维链为监控模型提供了独特的机会。假设它是忠实且清晰的,隐藏思维链使得能够「读懂」模型的思想并了解其思维过程。例如,人们将来可能希望监控思维链以寻找操控用户的迹象。

但要做到这一点,模型必须能够自由地以未改变的形式表达其思想,因此不能在思维链方面训练进行任何政策合规性或用户偏好性训练。OpenAI 也不想让用户直接看到不一致的思维链。

因此,在权衡用户体验、竞争优势和追求思维链监控的选项等多种因素后,OpenAI 决定不向用户展示原始的思维链。OpenAI 承认这个决定有不好的地方,因此努力通过教导模型在答案中重现思维链中的任何有用想法来部分弥补。同时,对于 o1 模型系列,OpenAI 展示了模型生成的思维链摘要。

可以说,o1 显著提升了 AI 推理的最新水平。OpenAI 计划在不断迭代的过程中发布此模型的改进版本,并期望这些新的推理能力将提高将模型与人类价值观和原则相结合的能力。OpenAI 相信 o1 及其后续产品将在科学、编程、数学和相关领域为 AI 解锁更多新用例。

OpenAI o1-mini

o1 是一个系列模型。这次 OpenAI 还一并发布了一个 mini 版 OpenAI o1-mini。该公司在博客中给出了 preview 和 mini 版的不同定义:「为了给开发者提供更高效的解决方案,我们也发布了 OpenAI o1-mini,这是一个尤其擅长编程的更快、更便宜的推理模型。」整体来看,o1-mini 的成本比 o1-preview 低 80%。

由于 o1 等大型语言模型是在大量文本数据集上预训练,虽然具有广泛世界知识,但对于实际应用来说,可能成本高昂且速度慢。

相比之下,o1-mini 是一个较小的模型,在预训练期间针对 STEM 推理进行了优化。在使用与 o1 相同的高计算强化学习 (RL) pipeline 进行训练后, o1-mini 在许多有用的推理任务上实现了相媲美的性能,同时成本效率显著提高。

比如在需要智能和推理的基准测试中,与 o1-preview 和 o1 相比,o1-mini 表现良好。但它在需要非 STEM 事实知识的任务上表现较差。

51c大模型~合集51_大模型_59

数学能力:在高中 AIME 数学竞赛中,o1-mini (70.0%) 与 o1 (74.4%) 不相上下,但价格却便宜很多,并且优于 o1-preview (44.6%)。o1-mini 的得分(约 11/15 个问题)大约位于美国前 500 名高中生之列。

编码能力:在 Codeforces 竞赛网站上,o1-mini 的 Elo 得分为 1650,与 o1 (1673) 不相上下,并且高于 o1-preview (1258)。此外,o1-mini 在 HumanEval 编码基准和高中网络安全夺旗挑战 (CTF) 中也表现出色。

51c大模型~合集51_大模型_60

STEM:在一些需要推理的学术基准上,例如 GPQA(科学)和 MATH-500,o1-mini 的表现优于 GPT-4o。o1-mini 在 MMLU 等任务上的表现则不如 GPT-4o,并且由于缺乏广泛的世界知识而在 GPQA 基准上落后于 o1-preview。

51c大模型~合集51_大模型_61

人类偏好评估:OpenAI 让人类评分员在各个领域具有挑战性的开放式提示上比较 o1-mini 和 GPT-4o。与 o1-preview 类似,在推理密集型领域,o1-mini 比 GPT-4o 更受欢迎;但在以语言为中心的领域,o1-mini 并不比 GPT-4o 更受欢迎。

51c大模型~合集51_大模型_62

在速度层面,OpenAI 比较了 GPT-4o、o1-mini 和 o1-preview 对一个单词推理问题的回答。结果显示,GPT-4o 回答不正确,而 o1-mini 和 o1-preview 均回答正确,并且 o1-mini 得出答案的速度快了大约 3-5 倍。

51c大模型~合集51_大模型_63

如何使用 OpenAI o1?

ChatGPT Plus 和 Team(个人付费版与团队版)用户马上就可以在该公司的聊天机器人产品 ChatGPT 中开始使用 o1 模型了。你可以手动选取使用 o1-preview 或 o1-mini。不过,用户的使用量有限。

目前,每位用户每周仅能给 o1-preview 发送 30 条消息,给 o1-mini 发送 50 条消息。

是的,很少!不过 OpenAI 表示正在努力提升用户的可使用次数,并让 ChatGPT 能自动针对给定提示词选择使用合适的模型。

51c大模型~合集51_大模型_64

至于企业版和教育版用户,要到下周才能开始使用这两个模型。

至于通过 API 访问的用户,OpenAI 表示达到了 5 级 API 使用量的开发者可以即刻开始使用这两个模型开始开发应用原型,但同样也被限了速:20 RPM。什么是 5 级 API 使用量?简单来说,就是已经消费了 1000 美元以上并且已经是超过 1 个月的付费用户。请看下图:

51c大模型~合集51_大模型_65

OpenAI 表示对这两个模型的 API 调用并不包含函数调用、流式传输(streaming)、系统支持消息等功能。同样,OpenAI 表示正在努力提升这些限制。

未来

OpenAI 表示,未来除了模型更新之外,还将增加网络浏览、文件和图像上传等功能,以让这些模型变得更加有用。

「除了新的 o1 系列模型,我们计划继续开发和发布我们的 GPT 系列模型。」

参考内容:

https://openai.com/index/introducing-openai-o1-preview/

https://openai.com/index/openai-o1-mini-advancing-cost-efficient-reasoning/

https://openai.com/index/learning-to-reason-with-llms/

https://x.com/sama/status/1834283100639297910