
类型与神经网络
神经网络越来越多地用于生成采用支持高度通用且可证明正确编程的语言的代码,如 Idris、Lean 和 Agda。然而,大多数用于生成代码的前沿大语言模型(LLM)将训练过程与类型检查过程分离开来,训练后需通过多种临时方式将输出解析为特定语言的类型。
训练后强制类型检查
如今,大语言模型经训练用于预测给定训练语料库中的下一个标记,产生特定类型的函数。本节方法将训练好的网络视为固定的,仅修改推理过程,主要从粒度和带宽两个维度进行分类。
尝试;编译;出错则重试
这是大多数程序员的做法,同样可应用于大语言模型。给定生成特定类型值的任务,模型生成候选值,交给类型检查器,通过则完成任务,未通过则反馈错误并要求再次尝试。此方法粒度低、带宽高,但存在问题,如生成无法修正的序列时,需重新开始,浪费资源。收紧循环可解决粒度问题,但大语言模型不会保留所学内容,下一次会话仍从相同状态开始。
受限解码
该方法在采样每个标记之前调用类型检查器,屏蔽会导致类型错误结果的标记。此方法粒度最大、带宽最小,输出保证可通过类型检查,但仅阻止模型生成某些内容,不改变模型“想要”生成的内容,可能使生成过程陷入低概率完成方式的分支,产生无意义输出。且屏蔽操作不产生梯度,模型无法学习适应。
训练过程中学习类型
使用重试循环的前沿模型取得显著进展,如 FrontierMath 的得分提升,GPT - 4 在国际象棋领域达到一定 ELO 分。但在训练过程中利用结构的领域,性能提升更显著,如 AlphaZero 系统在国际象棋中达到超人类 ELO 分数。对于依赖类型编程语言,目前还不知道如何将编译器紧密集成到神经网络训练中。
通过结构求导
以 Haskell 中编写特定类型函数为例,说明生成带类型输出需对输入进行分区选择分支。相关研究利用定理展示如何构建输出为结构化类型的网络,但这些方法需程序员对输入空间进行分区,模型无法自动学习,若一开始选择错误分支,无法通过梯度更新修正。
相对于结构求导
可采用不固定分区而是学习分区的方法,使用三个可微映射,通过采样决定下一步。对该过程求导并使用监督学习训练很直接,此方法可生成类型正确的输出,允许网络“学习”正确的输出类型,还包含了通过结构求导的方法。该余积可推广并迭代生成一系列类型化结构,关键是“容器”理论。此想法在文献中已有一定研究,如教师强制、抽象语法网络等。AlphaZero 和 AlphaProof 在训练时使用受限解码并通过强化学习更新所选分支,但 AlphaProof 的输出空间仍为 `List Token`,类型与底层编程语言的类型解耦。
结束语
大语言模型在扁平的标记词汇表上运行,围绕其应用的结构技术是为输出赋予意义。相对于结构求导的方法提出输出空间可承载意义,编程语言结构越复杂,收益越大。这并非反对模型规模和“苦涩教训”,而是让规模在正确的对象上发挥作用。通过结构求导和相对于结构求导的区别在于是否将类型级别的选择视为网络可学习的内容,两者都能生成类型正确的输出,但后者能让网络学习输出的具体细节,统一描述类型化动作空间的数学语言是容器和依赖透镜的语言。
683



被折叠的 条评论
为什么被折叠?



