dm-haiku: 一个为 JAX 设计的、支持面向对象模型定义的神经网络库

dm-haiku: 一个为 JAX 设计的、支持面向对象模型定义的神经网络库

它解决了什么问题

JAX 是一个强大的数值计算库,但它要求函数必须是纯函数才能使用其变换功能(如 jitgrad)。Haiku 通过允许开发者使用熟悉的面向对象编程模型来定义神经网络,同时自动将这些“不纯”的面向对象定义转换为 JAX 可以处理的纯函数,从而解决了这个问题。

工作原理

Haiku 提供了两个主要工具来弥合面向对象设计与函数纯粹性之间的鸿沟:

  • hk.Module:一个用于定义网络层和组件的 Python 对象。这些模块持有对参数和方法的引用,允许用户编写看起来像标准神经网络库的代码。
  • hk.transform:一种函数变换,它将使用 hk.Module 的函数转换为一对纯函数:init(收集初始参数值)和 apply(将这些参数重新注入函数进行计算)。

对于需要内部可变状态的模型(如 batch normalization),Haiku 提供了 hk.transform_with_state,它可以分别管理参数和状态。

适用人群

希望在构建神经网络时获得面向对象 API 的高效生产力,同时又需要 JAX 函数变换和硬件加速的完整能力的研究人员和开发者。

亮点

  • DeepMind 规模:经过 DeepMind 研究人员的测试,用于大规模图像、语言和强化学习实验。
  • 库而非框架:设计为一个轻量级库,专注于参数和状态管理,而不强制使用自定义优化器或检查点格式。
  • hk.next_rng_key():通过提供确定性的密钥序列,简化了 JAX 中的随机数生成。
  • JAX 兼容性:完全兼容 jax.pmap,支持在多个加速器上进行分布式训练。

Sources