我要提问
ARTICLE DETAIL

资讯详情

前沿编程新知与开发实战干货的深度解读。

mlpack 神经网络层接口迁移全解析:not_adapted 目录与 boost::visitor 到继承式 Layer 接口的演进

mlpack 神经网络层接口迁移全解析:not_adapted 目录与 boost::visitor 到继承式 Layer 接口的演进 人工智能机器学习深度学习【免费下载链接】mlpackmlpack: a fast, header-only C machine learning library项目地址https://gitcode.com/gh_mirrors/ml/mlpack点击查看免费下载导读mlpack 是一个 fast、header-only 的 C 机器学习库其src/mlpack/methods/ann/目录下承载着完整的神经网络ANN模块。在 mlpack 的接口演进过程中神经网络层曾经历了一次从boost::visitor到 C 继承体系的重要架构迁移而src/mlpack/methods/ann/layer/not_adapted/README.md正是记录这次迁移中尚未完成部分的官方说明文件。本文以该文档为骨架结合仓库中layer.hpp、layer_types.hpp、base_layer.hpp等源码与测试配置系统讲解not_adapted 目录的定位与由来、新旧两代层接口的本质差异、目录中 32 个未适配层的功能清单、相关测试为何被停用以及社区如何按官方计划逐步把这些层迁移到新接口。读完本文你将能准确区分 mlpack ANN 层系统的已适配与未适配状态并具备依据源码模式参与层迁移改造的完整知识储备。not_adapted 目录是什么旧接口层的暂存区在 mlpack 仓库中神经网络层的头文件分布在两个位置src/mlpack/methods/ann/layer/存放已完成新接口适配的层如convolution.hpp、lstm.hpp、batch_norm.hpp、multihead_attention.hpp等约 40 余种src/mlpack/methods/ann/layer/not_adapted/存放尚未适配到新接口的层即 not_adapted/README.md 所描述的对象。该 README 明确交代了目录的性质与成因原文要点如下Layers in this directory were written with the old boost::visitor interface. In #2777, we adapted each layer to use inheritance instead. However, time did not permit the adaptation of all layers, and so remaining layers that have not yet been adapted are in this directory.也就是说not_adapted 并非废弃代码堆而是接口迁移中途的暂存区这些层的功能实现仍然完好只是其编程接口仍停留在旧的boost::visitor风格上暂时无法与已经完成改造的层在同一个新的多态体系中协作。目录内的实际构成从仓库文件列表看not_adapted/目录下共包含32 个层每个层都由一对xxx.hpp声明与xxx_impl.hpp实现组成atrous_convolution、bicubic_interpolation、bilinear_interpolation、channel_shuffle、concat_performance、constant、fast_lstm、flatten_t_swish、glimpse、group_norm、hardshrink、highway、instance_norm、isrlu、join、lp_pooling、minibatch_discrimination、multiply_constant、multiply_merge、pixel_shuffle、positional_encoding、recurrent、recurrent_attention、reinforce_normal、reparametrization、select、sequential、softshrink、spatial_dropout、subview、virtual_batch_norm、weight_norm。此外在src/mlpack/methods/ann/下还有一个更高层的 not_adapted 目录存放 GANgan/、wgan_impl.hpp、wgangp_impl.hpp、RBMrbm/与双向循环网络brnn.hpp等同样依赖旧接口的复合模型可视为同一迁移计划的另一分支。为什么会有这个目录接口迁移的来龙去脉旧接口基于 boost::visitor 的类型擦除在早期设计中mlpack 的 ANN 层通过boost::visitor实现类型擦除与多态操作层的具体类型被包装进 variant再由一组 visitor如删除、增量、输出参数等统一驱动。not_adapted/multiply_merge.hpp中保留的被注释掉的 include 就是这段历史的直接物证// #include ../visitor/delete_visitor.hpp // #include ../visitor/delta_visitor.hpp // #include ../visitor/output_parameter_visitor.hpp这套机制虽然能够工作但随着层种类增多、序列化与维度推断需求复杂化其维护成本与编译开销都变得难以接受。PR #2777改用继承体系README 提到的#2777是这次迁移的关键节点该 PR 将每个层改造为继承同一个抽象基类通过虚函数而非 visitor 分发来统一前向、反向、梯度与参数管理。这一改动与 mlpack 整体去 Boost 化的大方向完全一致——HISTORY.md 记录了同一时期的系列动作用core::v2::any/std::any替换boost::any#3006、移除旧的非必要 Boost 头文件#3005用本地高效解析器替换boost::spirit#2942用 Catch2 替换 boost 测试框架#2523、#2584用 Cereal 替换 Boost 序列化库#2458。从源码注释与版本记录看适配工作在多个后续 PR 中持续进行例如TransposedConvolution层#3967、GRU层#3955、NearestInterpolation层#3768、MultiheadAttention与LayerNorm层、LinearRecurrent层与LSTM层的重构#3859等。而 not_adapted 目录正是这一长线工程尚未排到的部分。新旧接口的源码级对比要理解未适配层缺了什么需要先看清新基类要求什么。新接口的契约LayerMatType新接口的基类定义在 src/mlpack/methods/ann/layer/layer.hpp 中模板参数由旧的LayerInputType, OutputType双类型参数输入类型与输出类型收敛为单个LayerMatType。基类注释明确要求派生层实现以下方法构造函数定义层自身的属性并创建状态变量Forward(input, output)前向传播Backward(input, output, gy, g)反向传播output是此前Forward()的结果Gradient(input, error, gradient)计算层相对于自身输入的梯度SetWeights(weightsIn)接收网络分配的参数内存WeightSize()返回可训练参数量Training()训练/测试模式切换由FFN等类自动管理ComputeOutputDimensions()根据InputDimensions()惰性计算输出维度配合OutputDimensions()、OutputSize()Clone()支持多态的正确拷贝serialize()与 Cereal 序列化框架配合由MLPACK_ENABLE_ANN_SERIALIZATION宏控制是否启用。值得注意的是 layer.hpp 明确说明层的参数内存不由层自身分配而是由所属网络统一分配后通过SetWeights()传入实现上常用MakeAlias()包装这大幅简化了网络对权重布局的管理。已适配层的完整清单由 layer_types.hpp 集中维护——它逐个#include了所有已适配层的头文件convolution.hpp、gru.hpp、lstm.hpp、multihead_attention.hpp、transposed_convolution.hpp等。注意该清单中没有 include 任何 not_adapted 目录下的层这从侧面证实了未适配层尚未接入新的层类型体系。已适配层的样板BaseLayersrc/mlpack/methods/ann/layer/base_layer.hpp 是教科书级的适配样例它继承LayerMatType把激活函数层抽象为模板BaseLayerActivationFunction, MatType, DerivRequiresOutput并基于它派生出Sigmoid、ReLU、TanH、SoftPlus、Swish、Mish、GELU、HardSwish、SILU等一整套激活层 typedef。其Forward()一行调用ActivationFunction::Fn(input, output)Backward()用g gy % derivative完成逐元素梯度传播serialize()只序列化基类部分——结构极其干净。另一个样板是 adaptive_max_pooling.hpp它实现了ComputeOutputDimensions()来按输入尺寸自适应推导池化输出大小并持有MaxPoolingMatType poolingLayer作为内部实现展示了新接口下组合 维度推断的典型写法。未适配层的典型遗留特征对照以上样板从 not_adapted 各文件可以归纳出旧接口层的特征性痕迹沿用双模板参数如glimpse.hpp的class GlimpseType : public LayerInputType, OutputType、fast_lstm.hpp的FastLSTMType : public LayerInputType, OutputType与新的单参数LayerMatType不兼容。OutputDimensions()直接计算而非惰性推导如fast_lstm.hpp中的const std::vectorsize_t OutputDimensions() const { ... }未实现新接口要求的ComputeOutputDimensions()。SetWeights使用裸指针如highway.hpp与weight_norm.hpp中的SetWeights(typename OutputType::elem_type* weightsPtr)而新接口统一为SetWeights(const MatType)。文件头部 Temporarily drop. 标记atrous_convolution.hpp、bilinear_interpolation.hpp、fast_lstm.hpp、glimpse.hpp、highway.hpp、positional_encoding.hpp、spatial_dropout.hpp的第一行都写着// Temporarily drop.即暂时搁置。开发过程中的 TODO 遗留join.hpp中有// TODO: I dont understand this layer well enough to update it...recurrent_attention.hpp中有// TODO: refactor recurrent layervirtual_batch_norm.hpp中有// TODO: what about sizes for this layer?——这些注释从源码层面解释了部分层尚未适配的客观原因语义复杂或维度语义尚待厘清。未适配层功能清单与用途这 32 个层横跨卷积、归一化、循环、生成模型、容器与激活等类别。按功能分组梳理如下用途说明均来自各层头文件的类注释卷积与图像处理类AtrousConvolution空洞卷积在卷积核单元之间插入空洞以扩大感受野无需增大核尺寸支持 Valid/Same/None 三种 padding 与二维 dilation 参数见 atrous_convolution.hppBicubicInterpolation / BilinearInterpolation双三次/双线性插值主要用于图像缩放实现先沿一个方向插值、再沿另一个方向插值的标准算法ChannelShuffle将张量通道分组后重排ShuffleNet 的核心操作见 channel_shuffle.hppPixelShuffle子像素卷积将通道维重排为空间维实现上采样超分辨率任务常用输入通道数须为 upscaleFactor 平方的整数倍Glimpse视觉注意力中的一瞥层以给定位置为中心、按递增尺度裁剪并缩放出视网膜式多尺度表示源自 Recurrent Models of Visual Attention 论文内置均值池化与双线性重采样逻辑见 glimpse.hppLpPoolingLp 范数池化层。归一化类GroupNorm分组归一化对单个训练样本在按组划分的通道维度上计算均值与方差对应论文《Group Normalization》Wu He 2018InstanceNorm实例归一化对 mini-batch 中每个样本逐维度独立计算统计量训练/测试阶段分别使用批统计量与累积统计量VirtualBatchNorm虚拟批归一化使用参考子集而非当前 mini-batch 计算归一化统计量GAN 训练技巧见 virtual_batch_norm.hpp。循环与注意力类FastLSTM将输入门、遗忘门、输出门与隐状态的更新合并为单步计算的加速 LSTM 变体公式见 fast_lstm.hppi sigmoid(...)、f sigmoid(...)、z tanh(...)、c f·c i·z、o sigmoid(...)、h o·tanh(c)不使用 peephole 连接并内置分段线性 sigmoid 快速近似注意它不依赖当前已适配的LSTM层lstm.hpp在 layer/ 根目录Recurrent通用的循环层容器由 start/input/feedback/transfer 四个模块组合而成支持按 rho 步做时间反向传播BPTTRecurrentAttention循环视觉注意力模型Recurrent Model of Visual Attention的实现组合 Glimpse 与循环组件PositionalEncodingTransformer 式位置编码向序列 token 注入相对/绝对位置信息输入输出形状均为(embedDim * maxSequenceLength, batchSize)见 positional_encoding.hpp。生成模型 / VAE / GAN 相关Reparametrization重参数化层从给定正态分布参数中采样变分自编码器的标准组件同时支持 beta-VAE见 reparametrization.hppReinforceNormal基于 REINFORCE 算法、面向正态分布的随机层通过可配置的标准差默认 1.0与奖励值参与策略梯度训练见 reinforce_normal.hppMiniBatchDiscrimination判别器的小批量区分层让判别器联合观察多个样本以抑制生成器坍缩到单点输出Improved Techniques for Training GANs 论文见 minibatch_discrimination.hpp。容器与数据流类Sequential / Residual前馈全连接容器SequentialTypeInputType, OutputType, Residual派生两个别名Sequential顺序容器与Residual残差块要求输入输出尺寸相等见 sequential.hppJoin累积多个模块的输出MultiplyMerge将多个模块的输出逐元素相乘ConcatPerformance将多个性能层串接的容器Select从输入点中选取指定维度Subview将输入裁剪为所需尺寸的子矩阵MultiplyConstant将输入乘以一个不可学习的常数默认 1.0Constant常量输出层Highway高速网络层通过变换门在全连接容器与直通输入之间自适应切换要求输入输出尺寸相等Training Very Deep Networks 论文见 highway.hppWeightNorm权重归一化包装层将权重向量重参数化为长度 × 方向解耦二者并包裹任意已有层Weight Normalization 论文Salimans Kingma 2016见 weight_norm.hpp。激活与阈值类ISRLU逆平方根线性单元Improving deep learning by inverse square root linear units 论文x ≥ 0时为恒等、x 0时为x / (1 αx²)形式FlattenT Swish带阈值 T 的 ReLU-Swish 混合激活用于声学模型HardShrink / SoftShrink硬/软阈值收缩激活前者将幅度小于阈值的元素置零后者按阈值做加减收缩SpatialDropout空间维 Dropout整通道随机置零见 spatial_dropout.hpp。测试状态为何被停用接口迁移不仅涉及层本身还牵动测试体系。在 src/mlpack/tests/CMakeLists.txt 中可以看到一批被注释掉的测试目标# ann/not_adapted/activation_functions_test.cpp # ann/not_adapted/ann_layer_test.cpp # ann/not_adapted/feedforward_network_test.cpp # ann/not_adapted/recurrent_network_test.cpp # ann/not_adapted/rbm_network_test.cpp # ann/not_adapted/rnn_reber_test.cpp # ann/not_adapted/dcgan_test.cpp # ann/not_adapted/gan_test.cpp # ann/not_adapted/wgan_test.cpp这与 README 中更新到新接口并重新启用测试re-enabling tests的计划完全对应在层完成适配之前其对应的测试从默认构建目标中移除避免旧接口代码与新框架产生编译冲突。因此层迁移完成的验收标准之一就是这些测试重新回到 CMakeLists 的构建列表中并通过。迁移计划与参与方式README 明确表达了官方意图与协作态度The intention is that we will work our way through layers in this directory, updating them to the new interface and re-enabling tests for them in separate, follow-up PRs. If youd like to help out, you are more than welcome to!即官方计划通过一系列独立、后续的 PR逐个处理这些层每处理一个层就恢复其测试。社区贡献者完全可以按此节奏参与。结合已适配层的模式一个层的典型迁移流程可以归纳为推断自base_layer.hpp、adaptive_max_pooling.hpp等样板与layer.hpp的基类契约迁移类声明将class Xxx : public LayerInputType, OutputType改为class Xxx : public LayerMatType单模板参数并补全using ElemType typename MatType::elem_type;实现基类契约补上Clone()、SetWeights(const MatType)、WeightSize()、Training()如需训练/测试差异、ComputeOutputDimensions()用InputDimensions()推导输出维度取代旧的直接返回式OutputDimensions()统一参数访问通过Parameters()访问权重必要时用MakeAlias()包装网络分配的内存接入序列化按 Cereal 框架实现serialize()可参考 layer.hpp 基类自带的serialize对inputDimensions、outputDimensions、training等字段的处理移除旧痕迹删除文件头部的// Temporarily drop.与对 visitor 头文件的注释引用清理遗留 TODO如join.hpp中语义尚未理解透彻的注释所指向的难点需要实现者先厘清该层的批间连接语义接入层类型体系将新头文件加入 layer_types.hpp 的 include 列表使其成为一等公民恢复测试将对应的ann/not_adapted/*_test.cpp从 src/mlpack/tests/CMakeLists.txt 的注释状态恢复并补充针对新接口如维度推断、序列化、训练/测试模式切换的用例。从源码结构可以推断适配难度因层而异无参数、逐元素操作的激活/阈值类层如hardshrink、softshrink、isrlu、flatten_t_swish、multiply_constant最接近BaseLayer样板迁移成本最低而recurrent、recurrent_attention、glimpse、highway、weight_norm这类持有内部模块指针、需要管理子层生命周期与时间步状态的复合层迁移复杂度明显更高这也与它们在源码中残留的 TODO 注释相互印证。结语not_adapted 目录是 mlpack ANN 模块演进史上的一处活化石与在建工地它既保存了boost::visitor时代层接口的完整形态可供研究旧设计又是新继承式LayerMatType体系尚未覆盖的功能富矿——fast_lstm、glimpse、reparametrization、minibatch_discrimination、positional_encoding等层在迁移完成后将显著补全 mlpack 在循环视觉注意力、VAE、GAN 判别与 Transformer 位置编码等方向的能力。对开发者而言理解这份 README 与目录结构等于拿到了参与 mlpack 层体系现代化改造的入场券从最简单的激活层入手逐层向LayerMatType收敛并恢复测试正是官方欢迎的贡献路径。延伸阅读not_adapted 目录说明本文主题文档新 Layer 基类定义与接口契约已适配层类型清单BaseLayer 适配样板激活层 typedef 全集AdaptiveMaxPooling 适配样板维度推导示例被注释停用的 not_adapted 测试列表ANN 层接口迁移相关的版本记录更高层级的未适配模块GAN / RBM / BRNN赞分享人工智能机器学习深度学习【免费下载链接】mlpackmlpack: a fast, header-only C machine learning library项目地址https://gitcode.com/gh_mirrors/ml/mlpack点击查看免费下载相关推荐Recaf中的继承图分析类层级与接口实现Recaf中的继承图分析类层级与接口实现 引言Java反编译中的类关系挑战 你是否曾在分析Java字节码时因复杂的类继承关系和接口实现而感到困惑当面对一逆向工程开发工具桌面应用Bitalostored监控与调优关键指标解析和性能瓶颈排查Bitalostored监控与调优关键指标解析和性能瓶颈排查 Bitalostored是一款基于自研bitalosdb引擎的高性能分布式存储系统兼容RediMuPDF 公共 API 变更记录解读从 1.15 到 1.28 的接口演进与迁移指南MuPDF 公共 API 变更记录解读从 1.15 到 1.28 的接口演进与迁移指南 本篇指南以仓库 docs/other/changes.md https图形学图像处理创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表