包括:
这是可微分神经计算机的一个实现,该方法在论文使用动态外部存储的神经网络的混合计算,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
构造函数参数:
以下是构造函数参数:
以下是构造函数参数:
| 参数 | 默认值 | 描述 |
|---|---|---|
| input_size | None | 输入向量的大小 |
| hidden_size | None | 隐藏单元的大小 |
| rnn_type | 'lstm' | 控制器中使用的循环单元类型 |
| num_layers | 1 | 控制器中循环单元的层数 |
| num_hidden_layers | 2 | 控制器每层的隐藏层数 |
| bias | True | 偏置 |
| batch_first | True | 数据是否以批次优先的方式输入 |
| dropout | 0 | 控制器层间的dropout |
| bidirectional | False | 控制器是否为双向(尚未实现) |
| nr_cells | 5 | 内存单元的数量 |
| read_heads | 2 | 读取头的数量 |
| cell_size | 10 | 每个内存单元的大小 |
| nonlinearity | 'tanh' | 如果使用'rnn'作为rnn_type,RNN的非线性函数 |
| gpu_id | -1 | GPU的ID,-1表示CPU |
| independent_linears | False | 是否使用独立的线性单元来推导接口向量 |
| share_memory | True | 是否在控制器层之间共享内存 |
以下是前向传播参数:
| 参数 | 默认值 | 描述 |
|---|---|---|
| input | - | 输入向量 (B*T*X) 或 (T*B*X) |
| hidden | (None,None,None) | 隐藏状态 (控制器隐藏状态, 内存隐藏状态, 读取向量) |
| reset_experience | False | 是否重置内存 |
| pass_through_memory | True | 是否通过内存传递 |
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'] | 层数 * 时间 | 记忆单元数 |
构造函数参数:
以下是构造函数参数:
| 参数 | 默认值 | 描述 |
|---|---|---|
| input_size | None | 输入向量的大小 |
| hidden_size | None | 隐藏单元的大小 |
| rnn_type | 'lstm' | 控制器中使用的循环单元类型 |
| num_layers | 1 | 控制器中循环单元的层数 |
| num_hidden_layers | 2 | 控制器每层的隐藏层数 |
| bias | True | 偏置 |
| batch_first | True | 数据是否以批次优先方式输入 |
| dropout | 0 | 控制器层间的dropout |
| bidirectional | False | 控制器是否为双向(尚未实现) |
| nr_cells | 5000 | 内存单元数量 |
| read_heads | 4 | 读头数量 |
| sparse_reads | 4 | 每个读头的稀疏内存读取次数 |
| temporal_reads | 4 | 时间读取次数 |
| cell_size | 10 | 每个内存单元的大小 |
| nonlinearity | 'tanh' | 如果rnn_type为'rnn',RNN的非线性函数 |
| gpu_id | -1 | GPU的ID,-1表示CPU |
| independent_linears | False | 是否使用独立的线性单元来推导接口向量 |
| share_memory | True | 控制器层之间是否共享内存 |
以下是前向传播参数:
| 参数 | 默认值 | 描述 |
|---|---|---|
| input | - | 输入向量 (B*T*X) 或 (T*B*X) |
| hidden | (None,None,None) | 隐藏状态 (控制器隐藏状态, 内存隐藏状态, 读取向量) |
| reset_experience | False | 是否重置内存 |
| pass_through_memory | True | 是否通过内存 |
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'] | 层数 * 时间 | 单元数 |
构造函数参数:
以下是构造函数参数:
| 参数 | 默认值 | 描述 |
|---|---|---|
| input_size | None | 输入向量的大小 |
| hidden_size | None | 隐藏单元的大小 |
| rnn_type | 'lstm' | 控制器中使用的循环单元类型 |
| num_layers | 1 | 控制器中循环单元的层数 |
| num_hidden_layers | 2 | 控制器每层的隐藏层数 |
| bias | True | 偏置 |
| batch_first | True | 数据是否以批次优先的方式输入 |
| dropout | 0 | 控制器层之间的dropout |
| bidirectional | False | 控制器是否为双向(尚未实现) |
| nr_cells | 5000 | 内存单元的数量 |
| read_heads | 4 | 读取头的数量 |
| sparse_reads | 4 | 每个读取头的稀疏内存读取次数 |
| cell_size | 10 | 每个内存单元的大小 |
| nonlinearity | 'tanh' | 如果使用'rnn'作为rnn_type,RNN的非线性函数 |
| gpu_id | -1 | GPU的ID,-1表示使用CPU |
| independent_linears | False | 是否使用独立的线性单元来推导接口向量 |
| share_memory | True | 是否在控制器层之间共享内存 |
以下是前向传播参数:
| 参数 | 默认值 | 描述 |
|---|---|---|
| input | - | 输入向量 (B*T*X) 或 (T*B*X) |
| hidden | (None,None,None) | 隐藏状态 (控制器隐藏状态, 内存隐藏状态, 读取向量) |
| reset_experience | False | 是否重置内存 |
| pass_through_memory | True | 是否通过内存 |
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)


AI一键生成PPT,就用博思AIPPT!
博思AIPPT,新一代的AI生成PPT平台,支持智能生成PPT、AI美化PPT、文本&链接生成PPT、导入Word/PDF/Markdown文档生成PPT等,内置海量精美PPT模板,涵盖商务、教育、科技等不同风格,同时针对每个页面提供多种版式,一键自适应切换,完美适配各种办公场景。


AI赋能电商视觉革命,一站式智能商拍平台
潮际好麦深耕服装行业,是国内AI试衣效果最好的软件。使用先进AIGC能力为电商卖家批量提供优质的、低成本的商拍图。合作品牌有Shein、Lazada、安踏、百丽等65个国内外头部品牌,以及国内10万+淘宝、天猫、京东等主流平台的品牌商家,为卖家节省将近85%的出图成本,提升约3倍出图效率,让品牌能够快速上架。


企业专属的AI法律顾问
iTerms是法大大集团旗下法律子品牌,基于最先进的大语言模型(LLM)、专业的法律知识库和强大的智能体架构,帮助企业扫清合规障碍,筑牢风控 防线,成为您企业专属的AI法律顾问。


稳定高效的流量提升解决方案,助力品牌曝光
稳定高效的流量提升解决方案,助力品牌曝光


最新版Sora2模型免费使用,一键生成无水印视频
最新版Sora2模型免费使用,一键生成无水印视频


实时语音翻译/同声传译工具
Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者 ,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。


选题、配图、成文,一站式创作,让内容运营更高效
讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。


AI辅助编程,代码自动修复
Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。


最强AI数据分析助手
小浣熊家族Raccoon,您的AI智能助手,致力于通过先进的人工智能技术,为用户提供高效、便捷的智能服务。无论是日常咨询还是专业问题解答,小浣熊都 能以快速、准确的响应满足您的需求,让您的生活更加智能便捷。


像人一样思考的AI智能体
imini 是一款超级AI智能体,能根据人类指令,自主思考、自主完成、并且交付结果的AI智能体。