如何构建像ChatGPT一样的大模型?

作者 | Devansh

编译 | YIFEI

大模型已经引起了人们的广泛关注,通过向模型添加更多的参数和数据,我们可以向系统添加更多的功能。额外的参数允许在神经元中有更多种类的连接,给神经网络在现有任务中以更好的表现和发展新技能的能力。

人们为这些模型以及它们可以实现的目标而兴奋不已。在最近的聊天中,几乎每个人都告诉我,他们正在寻求将这些模型集成到他们的系统中。然而,使用这些模型存在一个巨大的问题:它们非常贵。据研究,估计一个176b 参数语言模型 BLOOM 的碳足印,训练一个大型语言模型 BLOOM 大约需要50.5吨的二氧化碳当量,而GPT-3则释放了超过500吨二氧化碳当量。

如何有效地训练大型机器学习模型?

批量

正确的批量大小可能是模型训练中最有影响力的决定之一。 太多的数据科学家最终忽视了设置批量大小对其 AI 模型性能的影响。那么如何使用批量大小有效地训练大型深度学习模型呢?第一步是增加批量大小

较大的批量意味着在培训期间对模型的更新较少。这样可以降低计算成本。但这并不是唯一有意义的事情。在之前对一份报告的解读中,“将 TensorFlow 的预测值调整到每秒3亿次”,作者表示,通过增加批量的方式将培训成本减半。这是因为较大的批处理大小→完全加载数据集所需的批处理较少。

这种技术适用于各种数据类型,包括统计、文本、甚至图像。如果您希望构建一个多模态系统,这是一个很大的优势,因为这个优化可以处理多个组件

这里我们表明,通常可以获得相同的学习曲线的训练和测试集,而不是增加批量大小在训练过程中。这个过程对于随机梯度下降(SGD)、带动量的 SGD、内斯特洛夫动量和亚当都是成功的。在相同的训练周期后,它达到了等效的测试精度,但是参数更新较少,从而导致更大的并行性和更短的训练时间。

那么泛化和准确性如何?研究人员已经注意到,增加批量大小会扰乱其准确性和泛化。对于大批量训练的低泛化,甚至有一个众所周知的术语——泛化缺口,但我们可以采取一些步骤来避免这个问题。

现象级论文 Train longer, generalize better: closing the generalization gap in large batch training of neural networks 的作者提出了一个很好的替代训练方案。他们意识到 LB 模型所需的更新较少是一把双刃剑,在降低性能的同时提高了成本。然而,通过实施“Ghost Batch Normalization”,我们可以得到一些惊人的结果(想想如果你告诉人们你实施了 Ghost Batch Normalization,你听起来会多么酷)。

同样,为了提高性能,我们可以通过按比例调整学习率和批量大小来保持准确性

积极学习

主动学习是基于一个简单的概念,从机器学习模型的角度来看,所有的数据点都是不平等的。有些要点很容易处理,而另一些则需要更多的技巧。如果我们有很多数据,那么很有可能在数据点中存在很多重叠。因此,我们完全可以丢弃很大一部分。

这又增加了一个问题。我们如何确定我们的模型将从中受益的数据点?有一些引人注目的方法。我最近一直在试验的是使用半监督聚类来挑选离质心最远的样本。这是受到 Meta AI 出版物 Beyond neural scaling laws: beating power law scaling via data pruning 的启发。

到目前为止,我已经取得了很好的成绩。但是,这远不是我唯一使用的东西。在我的工作中,我依靠概率和标准模型、随机性和一些对抗性训练的集合来构建数据点过滤系统。这听起来可能很昂贵,但其中的每一部分都不必太广泛。它们可以很好地工作,以减少数据集的大小(以及我们需要的再训练量)。

增加令牌数量

ChatGPT、Bard 和现在的 Meta 的 Llama 都是语言模型,涵盖可以帮助我们设计更具可扩展性的语言模型的想法总是好的。在这里我们一个非常有趣的出版 《Training Compute-Optimal Large Language Models》 ,作者是 Deepmind 的“疯子”们。在他们的研究中,他们能够开发 Chinchilla,一种“仅”有 700 亿个参数的语言模型。然而,Chinchilla的表现却在另一个层面上——

在大范围的下游评估任务中,Chinchilla一致且显著优于Gopher (280B)、gtt -3 (175B)、Jurassic-1 (178B)和megaton – turing NLG (530B)。

考虑到 Chinchilla 的计算预算与 Gopher 相同,这就更令人印象深刻了。他们是如何做到这一点的?他们有一个关键的见解——过多地关注模型中参数的数量,而忽略了像令牌数量这样的因素。

给定一个计算预算,按照相同的比例放大您的培训标记和参数是有意义的。这会带来更好的性能,但也会降低成本。由于参数数量较少,因此在运行模型时,我们将看到更低的推理成本。不要忽视这一优势。亚马逊网络服务估计,“在深度学习应用程序中,推理占总运营成本的90%”。

稀疏激活

回想一下神经网络是如何工作的。当我们训练它们时,输入流经所有的神经元,包括向前和向后传递的神经元。这就是为什么在神经网络中增加更多的参数会成倍增加成本。

向我们的网络添加更多的神经元允许我们的模型从更复杂的数据中学习(比如来自多个任务的数据和来自多种感官的数据)。然而,这会增加大量的计算开销。

稀疏激活允许两全其美的场景。添加大量参数可以让我们的模型有效地学习更多任务(并建立更深层次的联系)。稀疏激活让您只使用网络的一部分,从而减少推理。这允许网络学习并擅长多项任务,而不会花费太多。

在所有稀疏算法中,稀疏重量激活训练(SWAT)已经取得了很大的成果,使用僵尸神经元比辍学或其他稀疏算法允许更多样化的网络,僵尸神经元的使用允许比 dropout 或其他稀疏算法更多样化的网络,并且取得了很好的效果。

对于 ImageNet SWAT 上的 ResNet-50,训练期间的总浮点运算(FLOPS)减少了80% ,当在代表新兴平台的模拟稀疏学习加速器上运行时,导致3.3倍的训练加速,而验证准确度仅降低1.63% 。此外,对于激活,SWAT 在向后传递过程中减少了23% 到50% 的内存占用,对于权重,SWAT 减少了50% 到90% 的内存占用。

应用过滤器并让简单模型完成大部分任务

高效构建和使用大型模型的最佳方式——不要经常使用它们。相反,让简单的模型/过滤器完成你的大部分任务,只有在绝对需要时才使用你的大型 AI 模型。这在技术上是作弊,但值得一提。太多的数据科学家和机器学习工程师忙于尝试构建完美的模型来完成任务。即使实现了,这个模型也可能非常昂贵,因为它必须考虑很多边缘情况。更好的选择是有时放弃一项任务。使用固定规则模型/过滤器来处理这些边缘情况是一个很好的选择。

如果要构建强大的模型,谨慎的做法是将它们保留到需要的时候,再使用,而绝大多数问题可以用更简单的技术合理地解决。

    THE END
    喜欢就支持一下吧
    点赞14 分享
    评论 抢沙发
    头像
    欢迎您留下宝贵的见解!
    提交
    头像

    昵称

    取消
    昵称表情代码图片

      暂无评论内容