[ACL2019 Best Paper] Bridging the Gap between Training and Inference for Neural Machine Translation

ACL2019 Best Long Paper解读:

  • 目的:解决训练数据的Teacher Forcing问题
  • 训练时使用true ground数据,而推断时使用预测结果作为上文,在训练时会造成overcorrection(同义词结果被过度矫正)
  • 提出在训练时不仅仅使用true ground label,还会结合oracle word作为上下文,结构如下:

在原始NTM的基础上,在j时,输入j-1不再仅仅使用true groud label,而是会结合oracle word(soft机制),文章的重点在于如何选择oracle word,提出两种方式:词粒度和句子粒度。

  • 使用oracle word机制的三步走:

 

  • Word-Level Oracle(WO)机制
  • 直接拿预测概率最大的输出作为oracle word,下图及公式(9)所示

 

  • 引入Gumbel noise正则项增加模型鲁棒性

 

  • Sentence-Level Oracle (SO)
  • 在每个step时,对batch内样本做beam search decode,使用BLEU进行效果度量,得到最优目标句子,句子中第j-1个word作为SO

  • 由于SO及来自于true ground又来自于beam search,所以需要二者长度对齐,对齐方式使用Force Decoding
  • Force Decoding:根据EOS作为判断,步骤如下:

  • Sampling with Decay 原则:训练开始的时候倾向于使用true ground label,训练后期倾向于选择oracle word
  • p控制true groud和oracle word的选择,衰减公式如下,e为epoch,μ为超参

  • 结果展示:使用Transformat结果效果好用RNN,引入sentence oracle效果好于WO

  • 总结:文章创新性地使用了soft label作为next step的输入,可以解决训练过程中的「过度矫正及误差累及」问题,该方法在NMT上提及,但感觉可以扩展应用到其他「联合训练的模型上」,第二个任务基于第一个任务的输出label,在训练阶段可采用此soft label选取的方法。

 

 

 

 

 

论文《DTC-SpMM: Bridging the Gap in Accelerating General Sparse Matrix Multiplication with Tensor Cores》提出了一种利用NVIDIA Tensor Core技术加速通用稀疏矩阵乘法(SpMM)的方法。为了复现该论文的实验结果,需要遵循一系列系统化的步骤与方法。 ### 实验环境准备 1. **硬件平台**:需要一台配备NVIDIA GPU的机器,且GPU需支持Tensor Core技术,例如Volta、Turing或Ampere架构的GPU。 2. **软件依赖**:安装CUDA Toolkit(版本需与论文中使用的版本一致),以及cuSPARSE库,用于比较基准性能。 3. **代码仓库**:从论文作者提供的开源代码仓库(如果存在)获取源码,或自行实现论文中描述的DTC-SpMM算法[^2]。 ### 数据集准备 - **稀疏矩阵数据集**:使用标准的稀疏矩阵测试集,例如SuiteSparse稀疏矩阵集合(原名University of Florida Sparse Matrix Collection)。 - **矩阵格式**:确保所有稀疏矩阵以CSR(Compressed Sparse Row)或其他论文中指定的格式存储,以便适配Tensor Core的计算需求[^4]。 ### 算法实现 1. **Tensor Core编程**:使用CUDA编程模型,结合WMMA(Warp-level Matrix Multiply-Accumulate)API或PTX汇编实现Tensor Core加速的稀疏矩阵乘法。 2. **稀疏模式优化**:根据论文描述,设计适合Tensor Core的稀疏模式压缩与解压机制,例如将稀疏矩阵转换为适合Tile计算的结构。 3. **内存管理优化**:利用统一内存(Unified Memory)或零拷贝内存提升数据传输效率,减少主机与设备之间的数据拷贝开销[^1]。 ### 实验配置与执行 1. **编译与构建**:使用`nvcc`编译CUDA代码,并链接必要的库(如cudart、cusparse等)。 2. **性能测试**:运行不同规模的稀疏矩阵乘法任务,记录执行时间、吞吐量(GOPS)等指标。 3. **对比实验**:与cuSPARSE中的SpMM实现进行对比,评估DTC-SpMM在性能、内存带宽利用率等方面的提升效果[^3]。 ### 示例代码片段(CUDA稀疏矩阵乘法核心部分) ```cuda #include <cuda_runtime.h> #include <mma.h> using namespace nvcuda; __global__ void tensor_core_spmm_kernel(...) { // 初始化WMMA描述符 wmma::fragment<wmma::matrix_a, WMMA_M, WMMA_N, WMMA_K, wmma::precision::tf32, wmma::row_major> a_frag; wmma::fragment<wmma::matrix_b, WMMA_M, WMMA_N, WMMA_K, wmma::precision::tf32, wmma::col_major> b_frag; wmma::fragment<wmma::accumulator, WMMA_M, WMMA_N, WMMA_K, wmma::precision::tf32> c_frag; // 加载矩阵数据 wmma::load_matrix_sync(a_frag, A, lda); wmma::load_matrix_sync(b_frag, B, ldb); // 执行矩阵乘法 wmma::mma_sync(c_frag, a_frag, b_frag, c_frag); // 存储结果 wmma::store_matrix_sync(C, c_frag.data(), ldc, wmma::mem_row_major); } ``` ### 结果分析与验证 - **性能分析**:绘制不同矩阵密度、尺寸下的性能对比图,验证DTC-SpMM在各种场景下的加速效果。 - **正确性验证**:通过与cuSPARSE或CPU端密集矩阵乘法结果进行对比,确保输出结果的数值正确性。 ### 调试与问题解决 - **链接错误处理**:若在编译过程中出现如`multiple definition of yylloc`等链接错误,需检查编译器版本是否与论文中一致,必要时修改源码中的变量声明(如添加`extern`修饰符)以解决符号冲突问题[^4]。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值