
深度学习NLP【免费下载链接】seq2seqA general-purpose encoder-decoder framework for Tensorflow项目地址https://gitcode.com/gh_mirrors/seq2seq1/seq2seq点击查看免费下载seq2seq 是一个面向 TensorFlow 的通用 encoder-decoder 框架其核心抽象围绕配置驱动的组件化设计Encoder、Decoder、Model、Input Pipeline 与 Inference Task 全部通过键值参数key-value parameters统一配置并以 YAML 文件或命令行参数注入。本文将以仓库文档 docs/concepts.md 为主线逐层拆解 Configuration、Input Pipeline、Encoder、Decoder、Model 五大概念并结合源码seq2seq/configurable.py、seq2seq/data/input_pipeline.py、seq2seq/models/ 等说明每个抽象的实际落点读完你即可看懂该框架的配置写法并能独立组装一套可运行的 seq2seq 模型。一、配置系统Configuration一切对象的统一入口在 seq2seq 中包括 Encoders、Decoders、Models、Input Pipelines 和 Inference Tasks 在内的几乎所有对象都通过键值参数key-value parameters进行配置。这些参数通常以 YAML 的形式写在配置文件里或者直接通过命令行传入。例如可以把一个model_params字符串传给训练脚本用来配置模型。配置通常是嵌套的。例如下面的 YAML 同时配置了注意力层、词嵌入维度、编码器及其内部的 RNN 单元model_params: attention.class: seq2seq.decoders.attention.AttentionLayerBahdanau attention.params: num_units: 512 embedding.dim: 1024 encoder.class: seq2seq.encoders.BidirectionalRNNEncoder encoder.params: rnn_cell: cell_class: LSTMCell cell_params: num_units: 512这段配置揭示了该框架两条重要约定xxx.class指定实现类。类名可以是完整限定名如seq2seq.encoders.BidirectionalRNNEncoder也可以是在默认模块命名空间内可直接解析的短类名如LSTMCell、AttentionLayerBahdanau。xxx.params指定该类构造参数且参数本身可以继续嵌套如encoder.params.rnn_cell.cell_class形成任意深度的配置树。1.1 底层实现Configurable 基类从源码看这套字典驱动机制的根在 seq2seq/configurable.py 的Configurable抽象基类。其构造函数的核心逻辑是_parse_params(params, self.default_params())将用户传入的参数与子类定义的default_params()合并缺失值用默认值补齐并按默认值的类型对传入值做类型转换未知参数名会直接抛出ValueErroris not a valid model parameter从而在构建图之前尽早拦截拼写错误configurable.py。_print_params()在构造时将类名、mode 与解析后的参数通过tf.logging.info以 YAML 格式打印出来方便训练/推理时核对实际生效的配置configurable.py。此外模块还提供_create_from_dict通过pydoc.locate将字符串类名解析为真实类并实例化、_maybe_load_yaml把 YAML 字符串解析为 dict与_deep_merge_dict递归合并嵌套字典等工具函数configurable.py这些正是model_params字符串能被训练脚本接收并生效的底层机制。1.2 真实配置示例仓库的 example_configs/nmt_small.yml 是一份可直接运行的完整配置它比上面的示例更贴近实战包含了注意力类型、编码器/解码器的 RNN 单元、dropout、优化器与序列长度等完整参数model: AttentionSeq2Seq model_params: attention.class: seq2seq.decoders.attention.AttentionLayerDot attention.params: num_units: 128 bridge.class: seq2seq.models.bridges.ZeroBridge embedding.dim: 128 encoder.class: seq2seq.encoders.BidirectionalRNNEncoder encoder.params: rnn_cell: cell_class: GRUCell cell_params: num_units: 128 dropout_input_keep_prob: 0.8 dropout_output_keep_prob: 1.0 num_layers: 1 decoder.class: seq2seq.decoders.AttentionDecoder decoder.params: rnn_cell: cell_class: GRUCell cell_params: num_units: 128 dropout_input_keep_prob: 0.8 dropout_output_keep_prob: 1.0 num_layers: 1 optimizer.name: Adam optimizer.params: epsilon: 0.0000008 optimizer.learning_rate: 0.0001 source.max_seq_len: 50 source.reverse: false target.max_seq_len: 50可见model_params只是整个模型配置树的一个分支同一套机制同样用于 input pipeline、inference task 等对象的配置。可参考 docs/training.md 与 docs/getting_started.md 了解如何把这类配置交给训练脚本。二、输入管道Input Pipeline数据如何变成 features 与 labelsInputPipeline定义了数据如何被读取read、解析parse并切分为 features特征与 labels标签。在 seq2seq/data/input_pipeline.py 中InputPipeline是一个继承自Configurable的抽象基类它要求子类实现make_data_provider()创建数据供给器DataProvider负责按批次产出数据feature_keys/label_keys声明该管道提供的特征名与标签名集合同时继承了两个通用参数shuffle是否打乱数据默认True与num_epochs遍历数据集的次数None表示无限迭代默认Noneinput_pipeline.py。2.1 ParallelTextInputPipeline两文件对齐的文本数据原文重点介绍了ParallelTextInputPipeline它从两个文本文件读取数据按分隔符切分 token并为每条样本产出source_tokens、source_length、target_tokens、target_length四个张量。从源码看input_pipeline.py其关键参数为参数默认值说明source_files[]源数据文件路径数组target_files[]目标数据文件路径数组必须与source_files按行对齐source_delimiter 空格源文本的切分字符做字符级训练时可设为空字符串target_delimiter 空格目标文本的切分字符同上实现上源端使用SplitTokensDecoder并append_tokenSEQUENCE_END目标端额外prepend_tokenSEQUENCE_START再通过ParallelDataProvider把两个按行对齐的数据集打包其feature_keys为{source_tokens, source_len}label_keys为{target_tokens, target_len}。这意味着框架内部的监督信号就是目标 token 序列训练时解码器据此做 teacher forcing。2.2 其他内置管道除了并行文本管道input_pipeline.py还内置了另外两类TFRecordInputPipeline从 TFRecords 读取同时包含源/目标序列的数据参数为files、source_field默认source、target_field默认target及两个 delimiterinput_pipeline.pyImageCaptioningInputPipeline面向看图说话任务从 TFRecords 中读取image_field默认image/data、image_format默认jpg、caption_ids_field与caption_tokens_field输出image特征与target_tokens/target_ids/target_len标签input_pipeline.py。正如原文所说如果要读取新的数据格式就需要自己实现一个 InputPipeline——即继承InputPipeline实现make_data_provider并声明feature_keys/label_keys。工厂函数make_input_pipeline_from_def支持直接从字典定义含class与params实例化管道input_pipeline.py。管道产出的批次最终由create_input_fn包装为(feature_batch, labels_batch)供 Estimator 使用seq2seq/training/utils.py。三、编码器Encoder把源数据编码为连续空间表示编码器读取源数据例如一个词序列或一张图像并产生连续空间中的特征表示。RNN 编码器可以把一个词序列编码为一个大致对应文本语义的定长向量CNN 编码器可以把一张图像变成包含更高层特征的新卷。编码器产出的表示随后可被解码器用来生成新数据例如另一种语言的句子或对图像的描述。3.1 EncoderOutput编码结果的统一出口在 seq2seq/encoders/encoder.py 中Encoder是一个同时继承GraphModule与Configurable的抽象类其核心抽象方法为encode(inputs, sequence_length)返回值是命名元组EncoderOutput包含四个字段EncoderOutput namedtuple( EncoderOutput, outputs final_state attention_values attention_values_length)outputs每个时间步的输出[B, T, ...]final_state最终状态用于通过 bridge 初始化解码器attention_values与attention_values_length供注意力机制使用的待关注序列及其长度。统一输出结构的设计使得任意编码器都可以无缝接入统一的解码器接口。3.2 RNN 编码器族seq2seq/encoders/rnn_encoder.py 提供了三个 RNN 编码器UnidirectionalRNNEncoder单向 RNN 编码器使用tf.nn.dynamic_rnnBidirectionalRNNEncoder双向 RNN 编码器前向/后向共用同一 cell 配置通过tf.nn.bidirectional_dynamic_rnn运行并将正反向输出在深度维拼接tf.concat(outputs, 2)StackBidirectionalRNNEncoder堆叠双向编码器通过stack_bidirectional_dynamic_rnn支持多层。它们的默认rnn_cell配置为rnn_encoder.pyrnn_cell: cell_class: BasicLSTMCell # 单元类如 BasicLSTMCell / GRUCell / LSTMCell cell_params: num_units: 128 # 隐藏单元数 dropout_input_keep_prob: 1.0 # 输入 dropout 保留概率 dropout_output_keep_prob: 1.0 # 输出 dropout 保留概率 num_layers: 1 # 堆叠层数 residual_connections: False # 是否在层间加残差连接 residual_combiner: add # 残差组合方式add / multiply 等 residual_dense: False此外还有init_scale: 0.04参数初始化范围。RNN cell 的构建统一由training_utils.get_rnn_cell完成它按num_layers循环创建 cell逐层包裹DropoutWrapper多层时再用ExtendedMultiRNNCell堆叠seq2seq/training/utils.py。注意编码器构造时会根据 mode 自动把 dropout 关闭在非 TRAIN 模式下dropout_input_keep_prob与dropout_output_keep_prob被强制置为 1.0rnn_encoder.py。3.3 卷积编码器与图像编码器ConvEncoderseq2seq/encoders/conv_encoder.py一种深度卷积编码器含两条 CNN 分支——attention_cnn默认 15 层、512 单元、kernel size 3输出作为 attention 的outputs与output_cnn默认 5 层、256 单元输出池化后作为final_state并支持可选的位置嵌入position_embeddings.enable默认开启num_positions默认 100。它的编码结果可直接支撑无 RNN 的卷积序列模型。InceptionV3Encoderseq2seq/encoders/image_encoder.py图像编码器把输入图缩放到resize_height/resize_width默认 299×299后送入 Inception V3 主干输出的空间特征图被展平为[B, W*H, dim]作为 attention 的关注对象——这正是看图说话image captioning任务的编码端对应 docs/image_captioning.md。完整编码器清单见 docs/encoders.md。四、解码器Decoder基于编码表示的条件生成模型解码器是一个以编码器表示为条件的生成模型。例如RNN 解码器可以学习为一个已编码的句子生成另一种语言的翻译。解码器逐时间步输出 logits 并采样 token直到遇到序列结束符。4.1 BasicDecoder最简 RNN 解码器seq2seq/decoders/basic_decoder.py 中的BasicDecoder是最简实现每个时间步把 cell 输出直接送入一个不带激活函数的全连接层得到词表大小的 logits再经helper.sample采样得到predicted_ids。其输出DecoderOutput包含logits、predicted_ids、cell_output。4.2 AttentionDecoder带注意力机制的解码器seq2seq/decoders/attention_decoder.py 的AttentionDecoder在每个时间步都会以当前 cell 输出为 query在编码器的attention_keys上计算注意力分数对attention_values做加权求和得到attention_context将 cell 输出与 context 拼接后经一个attention_mix全连接层tanh 激活压缩再投影到词表得到 logits。其输出类型AttentionDecoderOutput额外携带attention_scores与attention_contextattention_decoder.py这些注意力分数正是DecodeText任务做 UNK 替换、以及dump_attention工具绘制对齐图的原始数据。注意力层的两种内置实现位于 seq2seq/decoders/attention.pyAttentionLayerDot点积打分与AttentionLayerBahdanau参数化加性打分即 Bahdanau attention默认num_units: 128框架还通过tf.nn.softmax归一化分数并用sequence_mask将 padding 位置的分数替换为tf.float32.min以免影响注意力attention.py。4.3 解码模式与 Beam Search解码行为由helper决定且依赖训练/推理模式训练时_decode_train使用TrainingHelper做 teacher forcing——把目标序列target_ids[:, :-1]嵌入后作为输入推理时_decode_infer使用GreedyEmbeddingHelper从SEQUENCE_START开始逐词贪婪生成seq2seq/models/basic_seq2seq.py。当配置inference.beam_search.beam_width 1时模型会把解码器包装进BeamSearchDecoder并支持length_penalty_weight长度惩罚与可插拔的choose_successors_fn默认choose_top_kseq2seq/models/seq2seq_model.py。Beam Search 的实现与测试可参考 seq2seq/inference/beam_search.py 与 seq2seq/decoders/beam_search_decoder.py。完整解码器清单见 docs/decoders.md。五、模型Model组装 Encoder 与 Decoder 并驱动训练模型定义了如何把编码器与解码器组装起来如何计算并最小化损失函数同时处理从输入管道读到的数据的必要预处理。底层上每个模型都被实现为一个传给tf.contrib.learn.Estimator的model_fn。5.1 模型基类与默认参数ModelBaseseq2seq/models/model_base.py是最上层抽象负责优化器与训练 op 的构建其默认参数包括optimizer.name: Adam、optimizer.learning_rate: 1e-4、学习率衰减系列参数lr_decay_type、lr_decay_steps: 100、lr_decay_rate: 0.99、lr_start_decay_at、lr_min_learning_rate: 1e-12等、optimizer.clip_gradients: 5.0以及分布式sync_replicas配置。其_build_train_op通过tf.contrib.layers.optimize_loss组合优化器、学习率衰减函数与梯度裁剪model_base.py。Seq2SeqModelseq2seq/models/seq2seq_model.py在其基础上补充了 seq2seq 专属默认参数source.max_seq_len: 50、source.reverse: True、target.max_seq_len: 50、embedding.dim: 100、embedding.init_scale: 0.04、embedding.share: False、vocab_source/vocab_target等seq2seq_model.py。其_preprocess完成了模型侧的核心预处理创建源/目标词表查找表vocab.create_vocabulary_lookup_table、把 token 转成词表 id、按max_seq_len截断、以及按source.reverse对源序列做tf.reverse_sequenceseq2seq_model.py。损失计算采用cross_entropy_sequence_loss以平均 log 困惑度作为整体标量损失seq2seq_model.py具体实现见 seq2seq/losses.py。5.2 三种开箱即用的模型BasicSeq2Seqseq2seq/models/basic_seq2seq.py基础 seq2seq默认使用UnidirectionalRNNEncoderBasicDecoderInitialStateBridgeAttentionSeq2Seqseq2seq/models/attention_seq2seq.py带注意力机制的 seq2seq默认使用BidirectionalRNNEncoderAttentionDecoderZeroBridgeAttentionLayerBahdanau。当配置了source.reverse时它还会对注意力分数做反向序列化使可视化与源句顺序一致attention_seq2seq.pyImage2Seq面向图像输入的模型配合InceptionV3Encoder与ImageCaptioningInputPipeline使用见 seq2seq/models/image2seq.py 与 docs/image_captioning.md。5.3 Bridge编码器与解码器之间的桥编码器的最终状态如何传给解码器由bridge决定。seq2seq/models/bridges.py 提供三种ZeroBridge不传递任何编码信息把解码器初始状态置零PassThroughBridge把编码器状态原样透传给解码器要求两者状态结构完全一致InitialStateBridge把编码器输出默认取final_state展平拼接后经一个全连接层映射到解码器状态尺寸再按解码器状态结构拆分回填支持activation_fn默认tensorflow.identity可设为tensorflow.nn.tanh。5.4 推理任务Inference Task训练好的模型如何被使用也遵循同一套配置体系。InferenceTask是tf.train.SessionRunHook与Configurable的组合seq2seq/tasks/inference_task.py典型实现DecodeText负责把预测张量还原为可读文本支持delimiter输出分隔符、unk_replace基于注意力分数替换 UNK、unk_mapping自定义 UNK 映射文件、postproc_fn等参数seq2seq/tasks/decode_text.py。推理图的构建由create_inference_graph完成beam search 场景下会把 batch size 强制设为 1seq2seq/inference/inference.py。更多推理用法见 docs/inference.md。六、从概念到实战五层抽象如何协同把这五个概念串起来一条完整的数据流是配置YAML→Configurable解析并实例化各组件Input Pipeline从文件读取、解析、切分出features/labelsEncoder把source_tokens编码为EncoderOutputoutputs final_state attention_valuesBridge把final_state转换为解码器初始状态Decoder以编码表示为条件逐时间步生成 tokenModel负责词表预处理、损失计算、训练 op 与预测输出组装整体作为model_fn交给 Estimator 训练或推理。这种配置驱动 抽象基类 命名元组统一接口的设计使得替换任意一个环节例如把双向 RNN 编码器换成 ConvEncoder或把 BasicDecoder 换成 AttentionDecoder都只需修改 YAML 中的xxx.class与xxx.params而无需改动任何调用代码。相关测试如 seq2seq/test/models_test.py、seq2seq/test/input_pipeline_test.py、seq2seq/test/conv_encoder_test.py也直接验证了这套可配置机制的可用性。若要进一步深入可继续阅读 docs/encoders.md、docs/decoders.md、docs/models.md 三个参考文档以及 docs/training.md、docs/inference.md 了解训练与推理的完整命令机器翻译任务的端到端实践见 docs/nmt.md其中的训练曲线截图BLEU、PPL可以直观看到这套概念体系在实际任务上的收敛效果docs/images/nmt_tutorial_bleu.png、docs/images/nmt_tutorial_ppl.png。赞分享深度学习NLP【免费下载链接】seq2seqA general-purpose encoder-decoder framework for Tensorflow项目地址https://gitcode.com/gh_mirrors/seq2seq1/seq2seq点击查看免费下载相关推荐WeChatMsg免费导出微信记录与生成年度报告WeChatMsg免费导出微信记录与生成年度报告 年末整理和母亲的聊天记录时我发现微信并不提供完整的导出入口截图也只能留下片段。WeChatMsg项目名seq2seq 框架核心概念解析配置系统、Input Pipeline、编码器、解码器与模型Configurable 机制详解seq2seq 框架核心概念解析配置系统、Input Pipeline、编码器、解码器与模型Configurable 机制详解 导读 本文是 Google深度学习NLPTransformer核心模块解析Encoder-Decoder架构详解Transformer核心模块解析Encoder Decoder架构详解 Transformer模型彻底改变了自然语言处理领域其核心的 Encoder De人工智能NLP深度学习上一篇favicon-cheat-sheet审计工具评估网站图标健康度下一篇SwarmForge安全审计检查AI代理工作流的安全漏洞创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考