grenade

GitHub
1.5k 82 较难 1 次阅读 1个月前BSD-2-Clause开发框架
AI 解读 由 AI 自动生成,仅供参考

Grenade 是一个专为 Haskell 语言设计的深度学习库,专注于构建高效、可组合的循环神经网络(RNN)。它主要解决了在静态类型语言中定义复杂神经网络时,难以在编译期确保网络结构正确性和数据维度匹配的问题。通过引入依赖类型技术,Grenade 将网络层级与数据形状(如 1D 向量、2D 图像、3D 张量)直接编码进类型系统中。这意味着如果层与层之间的数据维度不兼容,代码将无法通过编译,从而在运行前就消除了大量潜在的维度错误。

该工具特别适合熟悉 Haskell 的开发者、函数式编程爱好者以及希望利用强类型系统保障模型严谨性的研究人员使用。其核心技术亮点在于“异构列表”设计:网络的类型定义不仅包含层结构,还完整描述了数据在各层间的流转形态。用户只需几行代码即可精确定义如卷积神经网络或 LSTM 等复杂架构,无需编写繁琐的底层维度检查逻辑。虽然名字带有“手榴弹”的戏谑意味,暗示其强大威力,但 Grenade 实际上为构建安全、精确且高性能的神经网络提供了一套优雅的类型安全方案。

使用场景

某函数式编程团队正在为金融风控系统构建一个高可靠性的时序预测模型,要求代码在编译阶段就能杜绝维度不匹配的错误。

没有 grenade 时

  • 运行时崩溃风险高:在传统深度学习框架中,神经网络层之间的输入输出维度错误往往要等到模型训练启动后才会暴露,导致宝贵的计算资源浪费。
  • 重构成本巨大:当需要调整网络结构(如增加卷积层或修改池化大小)时,开发者必须手动追踪并修改每一层的数据形状定义,极易出错。
  • 类型安全缺失:缺乏编译期的形状检查,无法利用 Haskell 强大的类型系统来保证数据流转的逻辑正确性,只能依赖繁琐的单元测试。
  • 代码冗长且易读性差:为了显式管理张量形状和层间连接,需要编写大量样板代码,掩盖了核心的算法逻辑。

使用 grenade 后

  • 编译期绝对安全:grenade 利用依赖类型技术,将数据形状(如 28x28 图像或 10 维向量)嵌入类型定义,若层间维度不匹配,代码根本无法通过编译。
  • 极简的网络定义:只需几行代码即可通过异构列表声明复杂的卷积或循环神经网络(如 LSTM),无需手动编写任何底层形状转换逻辑。
  • 无忧的结构重构:修改网络架构时,编译器会自动推导并验证所有受影响的层级形状,开发者可大胆调整结构而无需担心隐性错误。
  • 逻辑与数据合一:网络定义即包含了完整的数据流拓扑,代码即文档,显著提升了复杂模型的可维护性和可读性。

grenade 通过将深度学习中的形状校验提前至编译阶段,让 Haskell 开发者能以数学般的严谨度构建零运行时错误的神经网络。

运行环境要求

操作系统
  • 未说明 (需支持 GHC 及 BLAS/LAPACK 的系统,通常为 Linux/macOS)
GPU

未说明 (基于 CPU 的 BLAS/LAPACK,示例提及单核运行,未提及 CUDA 或 GPU 加速)

内存

未说明

依赖
notes该工具是使用 Haskell 编写的机器学习库,非 Python 项目。构建时需要安装 BLAS 和 LAPACK 库及其开发工具。推荐使用仓库中的 mafia 脚本进行构建和测试。性能依赖于底层的 C 语言优化(通过 hmatrix 调用 BLAS/LAPACK),目前示例为单线程运行。
python不适用 (基于 Haskell)
GHC 7.10 - 8.4
hmatrix
BLAS
LAPACK
mafia (构建工具)
grenade hero image

快速开始

手榴弹

构建状态 Hackage 页面(下载量和 API 参考) Hackage 依赖

首先你必须取出圣针,然后你要数到三,不多也不少。
三就是你要数的数字,而计数的次数也必须是三。
四你不能数,二也不能数,除非你接着数到三。
五绝对不行。

💣 可能会让你大吃一惊的机器学习 💣

Grenade 是一个可组合、依赖类型、实用且快速的循环神经网络库, 用于在 Haskell 中简洁而精确地定义复杂的神经网络。

例如,一个在 MNIST 数据集上能达到约 1.5% 错误率的网络, 只需几行代码即可用随机权重进行定义和初始化:

type MNIST
  = Network
    '[ Convolution 1 10 5 5 1 1, Pooling 2 2 2 2, Relu
     , Convolution 10 16 5 5 1 1, Pooling 2 2 2 2, Reshape, Relu
     , FullyConnected 256 80, Logit, FullyConnected 80 10, Logit]
    '[ 'D2 28 28
     , 'D3 24 24 10, 'D3 12 12 10 , 'D3 12 12 10
     , 'D3 8 8 16, 'D3 4 4 16, 'D1 256, 'D1 256
     , 'D1 80, 'D1 80, 'D1 10, 'D1 10]

randomMnist :: MonadRandom m => m MNIST
randomMnist = randomNetwork

仅此而已。由于类型非常丰富,无需特定的运行时代码来构造这个网络; 当然,也可以轻松地显式地构造和拆解网络及层。

如果你更喜欢循环神经网络,可以尝试定义一些“不合理有效”的东西:

type Shakespeare
  = RecurrentNetwork
    '[ R (LSTM 40 80), R (LSTM 80 40), F (FullyConnected 40 40), F Logit]
    '[ 'D1 40, 'D1 80, 'D1 40, 'D1 40, 'D1 40 ]

设计

Grenade 中的网络可以被视为由不同类型的层组成的异构列表, 其类型不仅包含网络的各层,还包含了层间传递的数据形状。

网络的定义非常简单:

data Network :: [*] -> [Shape] -> * where
    NNil  :: SingI i
          => Network '[] '[i]

    (:~>) :: (SingI i, SingI h, Layer x i h)
          => !x
          -> !(Network xs (h ': hs))
          -> Network (x ': xs) (i ': h ': hs)

Layer x i o 约束确保层 x 能够合理地在输入形状 i 和输出形状 o 之间进行变换。

提升后的数据种类 Shape 定义了我们的 1、2 和 3 维类型, 用于声明层间传递的数据形状。

在上面的 MNIST 示例中,输入层是一个二维(D2)图像,大小为 28×28 像素。 当第一个 卷积 层运行时,它会输出一个三维(D3)图像,大小为 24×24×10。 列表中的最后一项是一维(D1),包含 10 个值,代表 MNIST 数据的类别。

使用

为了执行反向传播,可以调用同名函数

backPropagate :: forall shapes layers.
                 Network layers shapes -> S (Head shapes) -> S (Last shapes) -> Gradients layers

该函数接受一个网络、适当的输入和目标数据,并返回网络的反向传播梯度。 梯度的形状与每一层相匹配,对于像 Relu 这样没有可学习参数的层来说,梯度可能是空的。

然而,这些梯度总是可以应用的,从而产生一个新的(希望更好的)层:

applyUpdate :: LearningParameters -> Network ls ss -> Gradients ls -> Network ls ss

Grenade 中的层以 Haskell 类的形式表示,因此在下游代码中很容易创建自定义层。 如果网络的形状指定不正确,导致某一层无法在两个形状之间合理地执行操作, 则会在编译时引发错误。

组合

Grenade 中的网络和层可以在类型级别轻松组合。由于 NetworkLayer 的实例, 因此可以将训练好的网络作为大型网络中的一个小组件轻松使用。 此外,我们还提供了两种层,旨在并行运行多个层并将它们的输出合并起来 (可以通过在一个维度上连接它们,或通过逐点相加激活值来实现)。 这使得我们可以编写任何可以用 串并联图 表示的网络。

例如,残差网络层的定义可以写成:

type Residual net = Merge Trivial net

如果类型 netLayer 的实例,那么 Residual net 也将是。它会运行该网络, 同时通过 Trivial 层保留输入,并将原始图像与输出合并。

请参阅 MNIST 示例, 该示例经过过度工程化,既包含了残差风格的学习,也包含了 inception 风格的卷积。

生成对抗网络

由于 Grenade 是纯函数式的,因此可以灵活地组合其训练函数。 GAN-MNIST 示例展示了一种有趣且类型安全的方式, 仅用 10 行代码就能写出一个生成对抗训练函数。

层动物园

Grenade 的层是普通的 Haskell 数据类型,同时也是 Layer 的实例, 因此很容易在下游代码中构建自己的层。不过,我们也提供了一系列不错的层, 包括卷积、反卷积、池化、填充、裁剪、logit、relu、elu、tanh 和全连接层。

构建说明

Grenade 最容易通过位于仓库中的 mafia 脚本进行构建。 你还需要 lapackblas 库以及开发工具。准备好这些之后, 就可以使用以下命令构建 Grenade:

./mafia build

并使用以下命令运行测试:

./mafia test

Grenade 支持 ghc 7.10、8.0、8.2 和 8.4 版本。

致谢

编写这样的库一直在我脑海中酝酿已久,但我要特别感谢 Justin Le, 他的 依赖类型全连接网络 激励我开始动手,为我提供了许多关于所需类型级工具的想法, 并成为编写这个库的一个极佳起点。

性能

Grenade 后端使用 hmatrix、BLAS 和 LAPACK,并对关键函数进行了 C 语言优化。 借助 Caffe 推广的 im2col 技巧,它应该足以应对许多问题。

由于它纯粹是功能性的,因此也应该很容易并行运行批处理,这对于较大的网络来说是合适的。不过,我目前的示例仍然是单线程的。

在 Kaggle 的 41000 个样本 MNIST 训练集上,使用单核训练 15 代大约花了 12 分钟,在 1000 个样本的保留集中达到了 1.5% 的错误率。

贡献

欢迎贡献。

版本历史

v0.1.02017/12/18

常见问题

相似工具推荐

openclaw

OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你

349.3k|★★★☆☆|1周前
Agent开发框架图像

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|2周前
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

160.4k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

109.2k|★★☆☆☆|昨天
开发框架图像Agent

gemini-cli

gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。

100.8k|★★☆☆☆|1周前
插件Agent图像

markitdown

MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器

93.4k|★★☆☆☆|1周前
插件开发框架