1作者: killerstorm7 个月前原帖
目标: * 证明大型语言模型(LLMs)足够智能,可以几乎独立进行机器学习实验 * 具体来说,vibe-coding不仅仅适用于网页开发 * 鼓励人们进行这些小实验 * 特别是为了更好地理解相关概念 背景:我在大学上过线性代数课程,但没有接受过正规的机器学习培训。然而,五年前,像AI Dungeon和GPT-3这样的项目让我产生了浓厚的兴趣,我开始观看Yannic Kilcher的视频,以了解其工作原理。我甚至想到了使用变换器架构进行实验的一些想法,但实际上执行这些实验似乎有些繁琐。 于是,vibe coding应运而生。具体来说,是Claude Code。它是否足够聪明,可以组织一个实验:准备数据集、构建模型、编写训练代码、调试等? 基本上,是的。描述你想要的内容并确保它不作弊需要一些努力,但Claude足够聪明,可以从头开始编写模型代码。 其他模型如Gemini 2.5 Pro和o3可能甚至更好。 很多人认为LLMs无法编写新代码,只能重用现有代码。我并不认为这是事实。很难确定代码是否100%独特,但至少它是相当不寻常的。 无论如何,以下是我所做的: 1. 仅编码的非自回归变换器。 几乎所有生成型LLMs都基于仅解码的自回归变换器架构,该架构一次生成一个标记。(即,为了生成标记(n+1),它依赖于标记1到n的数据。)这种类型的变换器可以高效训练(因果掩码为每个标记提供训练信号,仅需一次前向传播),但生成过程缓慢且低效。Gemini 2.5 Flash允许1M标记的输入,但输出仅为65k标记。你无法真正转换大量文本。 但如果我们直接通过一次前向传播生成目标序列呢?即,我们可以预测输出序列的标记,而不是预测下一个标记。没有根本原因表明这不能工作,但这更具挑战性,因为神经网络必须跟踪输入和输出标记的位置等。 实验表明,这在简单语言中是可行的:在这个例子中,变换器学会了如何展开括号,例如,对于输入“a(b+c)”,它生成“ab+a*c”。 [链接](https://github.com/killerstorm/expere/tree/master/non_autoregressive_transformer) 我相信还有更好的方法来实现这一点,但至少这足以确认没有根本原因表明这不能工作。编写代码花了大约20分钟,示例在RTX 4070上训练了2分钟。 我尝试了几个实验: 2. 通过在每个头的注意力分数上添加一个小型多层感知器(MLP)来尝试改善注意力。 3. 制作RWKV和变换器之间的混合体。 这也足够有效,能够开始训练并获得合理的损失曲线。(尽管我花了超过30分钟让Claude修复代码,它在这里遇到了一些困难。)虽然训练一个真实的语言模型需要更强大的GPU和时间,而我没有等它完成。 我认为,通过更好的提示和更好的模型,它可以完全自主地进行实验,这可能会在今年实现。