Project Icon

pytorch-dnc

PyTorch实现的差分神经计算机及相关模型库

这个PyTorch库实现了差分神经计算机(DNC)、稀疏访问存储器(SAM)和稀疏差分神经计算机(SDNC)等模型。它提供灵活API用于构建和训练这些神经网络,支持多层控制器、共享内存等配置。库中还包含复制和加法等基准任务,以及内存可视化功能,有助于开发和评估基于外部存储的神经网络模型。

可微分神经计算机及其家族,适用于PyTorch

包括:

  1. 可微分神经计算机 (DNC)
  2. 稀疏访问内存 (SAM)
  3. 稀疏可微分神经计算机 (SDNC)

构建状态 PyPI版本

这是可微分神经计算机的一个实现,该方法在论文使用动态外部存储的神经网络的混合计算,Graves等人中有所描述。稀疏DNC(SDNC)和稀疏访问内存(SAM)则在使用稀疏读写扩展记忆增强神经网络中有所描述。

安装

pip install dnc

从源代码安装

git clone https://github.com/ixaxaar/pytorch-dnc
cd pytorch-dnc
pip install -r ./requirements.txt
pip install -e .

要使用完全基于GPU的SDNC或SAM,请安装FAISS:

conda install faiss-gpu -c pytorch

运行测试需要pytest

架构

使用方法

DNC

构造函数参数:

以下是构造函数参数:

以下是构造函数参数:

参数默认值描述
input_sizeNone输入向量的大小
hidden_sizeNone隐藏单元的大小
rnn_type'lstm'控制器中使用的循环单元类型
num_layers1控制器中循环单元的层数
num_hidden_layers2控制器每层的隐藏层数
biasTrue偏置
batch_firstTrue数据是否以批次优先的方式输入
dropout0控制器层间的dropout
bidirectionalFalse控制器是否为双向(尚未实现)
nr_cells5内存单元的数量
read_heads2读取头的数量
cell_size10每个内存单元的大小
nonlinearity'tanh'如果使用'rnn'作为rnn_type,RNN的非线性函数
gpu_id-1GPU的ID,-1表示CPU
independent_linearsFalse是否使用独立的线性单元来推导接口向量
share_memoryTrue是否在控制器层之间共享内存

以下是前向传播参数:

参数默认值描述
input-输入向量 (B*T*X)(T*B*X)
hidden(None,None,None)隐藏状态 (控制器隐藏状态, 内存隐藏状态, 读取向量)
reset_experienceFalse是否重置内存
pass_through_memoryTrue是否通过内存传递

使用示例

from dnc import DNC

rnn = DNC(
  input_size=64,
  hidden_size=128,
  rnn_type='lstm',
  num_layers=4,
  nr_cells=100,
  cell_size=32,
  read_heads=4,
  batch_first=True,
  gpu_id=0
)

(controller_hidden, memory, read_vectors) = (None, None, None)

output, (controller_hidden, memory, read_vectors) = \
  rnn(torch.randn(10, 4, 64), (controller_hidden, memory, read_vectors), reset_experience=True)

调试

debug选项会使网络在每个前向步骤的第一个批次返回其内存隐藏向量(numpy ndarray数组)。这些向量可以被分析或可视化,例如使用visdom。

from dnc import DNC

rnn = DNC(
  input_size=64,
  hidden_size=128,
  rnn_type='lstm',
  num_layers=4,
  nr_cells=100,
  cell_size=32,
  read_heads=4,
  batch_first=True,
  gpu_id=0,
  debug=True
)

(controller_hidden, memory, read_vectors) = (None, None, None)

output, (controller_hidden, memory, read_vectors), debug_memory = \
  rnn(torch.randn(10, 4, 64), (controller_hidden, memory, read_vectors), reset_experience=True)

前向传播返回的内存向量(np.ndarray):

Y轴(维度)X轴(维度)
debug_memory['memory']层数 * 时间记忆单元数 * 单元大小
debug_memory['link_matrix']层数 * 时间记忆单元数 * 记忆单元数
debug_memory['precedence']层数 * 时间记忆单元数
debug_memory['read_weights']层数 * 时间读头数 * 记忆单元数
debug_memory['write_weights']层数 * 时间记忆单元数
debug_memory['usage_vector']层数 * 时间记忆单元数

SDNC

构造函数参数

以下是构造函数参数:

参数默认值描述
input_sizeNone输入向量的大小
hidden_sizeNone隐藏单元的大小
rnn_type'lstm'控制器中使用的循环单元类型
num_layers1控制器中循环单元的层数
num_hidden_layers2控制器每层的隐藏层数
biasTrue偏置
batch_firstTrue数据是否以批次优先方式输入
dropout0控制器层间的dropout
bidirectionalFalse控制器是否为双向(尚未实现)
nr_cells5000内存单元数量
read_heads4读头数量
sparse_reads4每个读头的稀疏内存读取次数
temporal_reads4时间读取次数
cell_size10每个内存单元的大小
nonlinearity'tanh'如果rnn_type为'rnn',RNN的非线性函数
gpu_id-1GPU的ID,-1表示CPU
independent_linearsFalse是否使用独立的线性单元来推导接口向量
share_memoryTrue控制器层之间是否共享内存

以下是前向传播参数:

参数默认值描述
input-输入向量 (B*T*X)(T*B*X)
hidden(None,None,None)隐藏状态 (控制器隐藏状态, 内存隐藏状态, 读取向量)
reset_experienceFalse是否重置内存
pass_through_memoryTrue是否通过内存

使用示例

from dnc import SDNC

rnn = SDNC(
  input_size=64,
  hidden_size=128,
  rnn_type='lstm',
  num_layers=4,
  nr_cells=100,
  cell_size=32,
  read_heads=4,
  sparse_reads=4,
  batch_first=True,
  gpu_id=0
)

(controller_hidden, memory, read_vectors) = (None, None, None)

output, (controller_hidden, memory, read_vectors) = \
  rnn(torch.randn(10, 4, 64), (controller_hidden, memory, read_vectors), reset_experience=True)

调试

debug选项会使网络在每个前向步骤的第一个批次返回其内存隐藏向量(numpy ndarray数组)。这些向量可以被分析或可视化,例如使用visdom。

from dnc import SDNC

rnn = SDNC(
  input_size=64,
  hidden_size=128,
  rnn_type='lstm',
  num_layers=4,
  nr_cells=100,
  cell_size=32,
  read_heads=4,
  batch_first=True,
  sparse_reads=4,
  temporal_reads=4,
  gpu_id=0,
  debug=True
)

(controller_hidden, memory, read_vectors) = (None, None, None)

output, (controller_hidden, memory, read_vectors), debug_memory = \
  rnn(torch.randn(10, 4, 64), (controller_hidden, memory, read_vectors), reset_experience=True)

前向传播返回的内存向量(np.ndarray):

Y轴(维度)X轴(维度)
debug_memory['memory']层数 * 时间单元数 * 单元大小
debug_memory['visible_memory']层数 * 时间稀疏读取+2*时间读取+1 * 单元数
debug_memory['read_positions']层数 * 时间稀疏读取+2*时间读取+1
debug_memory['link_matrix']层数 * 时间稀疏读取+2时间读取+1 * 稀疏读取+2时间读取+1
debug_memory['rev_link_matrix']层数 * 时间稀疏读取+2时间读取+1 * 稀疏读取+2时间读取+1
debug_memory['precedence']层数 * 时间单元数
debug_memory['read_weights']层数 * 时间读取头数 * 单元数
debug_memory['write_weights']层数 * 时间单元数
debug_memory['usage']层数 * 时间单元数

SAM

构造函数参数:

以下是构造函数参数:

参数默认值描述
input_sizeNone输入向量的大小
hidden_sizeNone隐藏单元的大小
rnn_type'lstm'控制器中使用的循环单元类型
num_layers1控制器中循环单元的层数
num_hidden_layers2控制器每层的隐藏层数
biasTrue偏置
batch_firstTrue数据是否以批次优先的方式输入
dropout0控制器层之间的dropout
bidirectionalFalse控制器是否为双向(尚未实现)
nr_cells5000内存单元的数量
read_heads4读取头的数量
sparse_reads4每个读取头的稀疏内存读取次数
cell_size10每个内存单元的大小
nonlinearity'tanh'如果使用'rnn'作为rnn_type,RNN的非线性函数
gpu_id-1GPU的ID,-1表示使用CPU
independent_linearsFalse是否使用独立的线性单元来推导接口向量
share_memoryTrue是否在控制器层之间共享内存

以下是前向传播参数:

参数默认值描述
input-输入向量 (B*T*X)(T*B*X)
hidden(None,None,None)隐藏状态 (控制器隐藏状态, 内存隐藏状态, 读取向量)
reset_experienceFalse是否重置内存
pass_through_memoryTrue是否通过内存

使用示例

from dnc import SAM

rnn = SAM(
  input_size=64,
  hidden_size=128,
  rnn_type='lstm',
  num_layers=4,
  nr_cells=100,
  cell_size=32,
  read_heads=4,
  sparse_reads=4,
  batch_first=True,
  gpu_id=0
)

(controller_hidden, memory, read_vectors) = (None, None, None)

output, (controller_hidden, memory, read_vectors) = \
  rnn(torch.randn(10, 4, 64), (controller_hidden, memory, read_vectors), reset_experience=True)

调试

debug选项会使网络在每次前向传播时返回第一个批次的内存隐藏向量(numpy ndarray)。 这些向量可以被分析或可视化,例如使用visdom。

from dnc import SAM

rnn = SAM(
  input_size=64,
  hidden_size=128,
  rnn_type='lstm',
  num_layers=4,
  nr_cells=100,
  cell_size=32,
  read_heads=4,
  batch_first=True,
  sparse_reads=4,
  gpu_id=0,
  debug=True
)

(controller_hidden, memory, read_vectors) = (None, None, None)

output, (controller_hidden, memory, read_vectors), debug_memory = \
  rnn(torch.randn(10, 4, 64), (controller_hidden, memory, read_vectors), reset_experience=True)

前向传播返回的内存向量(np.ndarray):

Y轴(维度)X轴(维度)
debug_memory['memory']层数 * 时间单元数 * 单元大小
debug_memory['visible_memory']层数 * 时间稀疏读取+2*时间读取+1 * 单元数
debug_memory['read_positions']层数 * 时间稀疏读取+2*时间读取+1
debug_memory['read_weights']层数 * 时间读取头数 * 单元数
debug_memory['write_weights']层数 * 时间单元数
debug_memory['usage']层数 * 时间单元数

任务

复制任务(带课程学习和泛化)

原始论文中描述的复制任务已包含在仓库中。

从项目根目录:

python ./tasks/copy_task.py -cuda 0 -optim rmsprop -batch_size 32 -mem_slot 64 # (类似原始实现)

python ./tasks/copy_task.py -cuda 0 -lr 0.001 -rnn_type lstm -nlayer 1 -nhlayer 2 -dropout 0 -mem_slot 32 -batch_size 1000 -optim adam -sequence_max_length 8 # (更快收敛)
对于SDNC:
python ./tasks/copy_task.py -cuda 0 -lr 0.001 -rnn_type lstm -memory_type sdnc -nlayer 1 -nhlayer 2 -dropout 0 -mem_slot 100 -mem_size 10  -read_heads 1 -sparse_reads 10 -batch_size 20 -optim adam -sequence_max_length 10

对于SDNC的课程学习:
python ./tasks/copy_task.py -cuda 0 -lr 0.001 -rnn_type lstm -memory_type sdnc -nlayer 1 -nhlayer 2 -dropout 0 -mem_slot 100 -mem_size 10  -read_heads 1 -sparse_reads 4 -temporal_reads 4 -batch_size 20 -optim adam -sequence_max_length 4 -curriculum_increment 2 -curriculum_freq 10000

要查看完整的选项列表,请运行:
python ./tasks/copy_task.py --help

复制任务可以使用Visdom来调试内存。

需要额外的步骤:

pip install visdom
python -m visdom.server

在浏览器中打开http://localhost:8097/,然后执行复制任务:

python ./tasks/copy_task.py -cuda 0

Visdom仪表板每隔-summarize_freq次迭代会以热图形式显示批次0的内存:

[图片]

泛化加法任务

加法任务如这个GitHub拉取请求中所述。
这个任务
- 创建大小为input_size的独热向量,每个代表一个数字
- 将一串向量输入网络
- 网络的输出相加得到解码输出的总和

该任务首先训练网络处理长度约100的序列,然后测试网络是否能泛化到长度约1000的序列。

python ./tasks/adding_task.py -cuda 0 -lr 0.0001 -rnn_type lstm -memory_type sam -nlayer 1 -nhlayer 1 -nhid 100 -dropout 0 -mem_slot 1000 -mem_size 32 -read_heads 1 -sparse_reads 4 -batch_size 20 -optim rmsprop -input_size 3 -sequence_max_length 100

泛化Argmax任务

第二个加法任务与第一个类似,但网络在最后一个时间步的输出应为输入的argmax。

python ./tasks/argmax_task.py -cuda 0 -lr 0.0001 -rnn_type lstm -memory_type dnc -nlayer 1 -nhlayer 1 -nhid 100 -dropout 0 -mem_slot 100 -mem_size 10 -read_heads 2 -batch_size 1 -optim rmsprop -sequence_max_length 15 -input_size 10 -iterations 10000

代码结构

1. DNC:
  - dnc/dnc.py - 控制器代码。
  - dnc/memory.py - 内存模块。
2. SDNC:
  - dnc/sdnc.py - 控制器代码,继承自dnc.py。
  - dnc/sparse_temporal_memory.py - 内存模块。
  - dnc/flann_index.py - 使用kNN的内存索引。
3. SAM:
  - dnc/sam.py - 控制器代码,继承自dnc.py。
  - dnc/sparse_memory.py - 内存模块。
  - dnc/flann_index.py - 使用kNN的内存索引。
4. 测试:
  - 所有测试都在./tests文件夹中。

一般值得注意的事项

1. SDNC使用FLANN近似最近邻库,及其Python绑定pyflann3和FAISS。

FLANN可以通过pip自动安装作为依赖项,或从源代码安装(例如使用OpenMP进行多线程):

# 首先安装openmp: 例如在Arch上运行 `sudo pacman -S openmp`。
git clone git://github.com/mariusmuja/flann.git
cd flann
mkdir build
cd build
cmake ..
make -j 4
sudo make install

可以使用以下命令安装FAISS:

conda install faiss-gpu -c pytorch
FAISS速度更快,具有GPU实现,并且可与PyTorch张量互操作。我们默认尝试使用FAISS,如果没有FAISS则会退而使用FLANN。

2. 梯度中出现"nan"值很常见,请尝试使用不同的批量大小。

创建此仓库时参考的仓库:

- [deepmind/dnc](https://github.com/deepmind/dnc)
- [ypxie/pytorch-NeuCom](https://github.com/ypxie/pytorch-NeuCom)
- [jingweiz/pytorch-dnc](https://github.com/jingweiz/pytorch-dnc)
项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号