自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(29)
  • 收藏
  • 关注

原创 fairseq源码分析(三)——fairseq的task

本想第三篇博客中详细的讨论一下模型的训练流程,但其中涉及许多的task、model、criterions、generate等细节,所以打算先将fairseq的一些基础组件介绍清楚,再进行整体流程的介绍。什么是Task?fairseq对task的解释如下:Tasks store dictionaries and provide helpers for loading/iterating overDatasets, initializing the Model/Criterion and calcul

2021-04-01 10:37:37 1607

原创 fairseq源码分析(四)—— 训练一个模型fairseq都干了啥之train.py

框架的执行流程主要如下:首先被调用的为最外层的train.py,在调用train.py时,fairseq会读取你的命令行参数,并根据命令行参数内的信息,生成相应的分布式策略,其调用流程如下:分布式fairseq共支持以下三种训练方式,分别为单GPU,分布式训练,单节点多GPU。下面就单节点多GPU的分布式训练策略做一下简单的介绍: if args.distributed_init_method is not None: # distributed training

2021-03-31 21:05:51 2471 2

原创 fairseq源码分析(二)——fairseq注册机制

高内聚,低耦合作为facebook这样大厂出品的框架,其架构设计一定非常遵循设计模式的各项原则,其基本的一条就是高内聚、低耦合,那么如何实现各部分的解耦,并能灵活的调用各个组件呢?答案是使用了注册的机制,这种机制实际上是利用的python中的装饰器。装饰器?简单的回顾一下装饰器的概念,我理解的装饰器的概念为:在不修改原有方法的前提下,为已存在的方法增加功能。例如:# 定义装饰器def dec(func): def wapper(*args,**kargs): print("my name

2021-03-31 21:00:56 3458 3

原创 fairseq源码分析(一)——fairseq简介与安装

写在前面的话最近一直在阅读fairseq源码,发现关于fairseq的资源除了官方文档,没太有其他的资源,故想做一期关于fairseq源码的分享,也为了帮助更多入门nlp的人,同时也请大家批评指正。本文所使用的fairseq版本为fairseq-0.6.2,工作环境为macbook pro+pycharm+redhat服务器(8 X Nvidia RTX 2080)。首先让我们来看一下什么是fairseq官网对于fairseq的介绍如下:Fairseq(-py) is a sequence mo

2021-03-31 10:47:40 3935 2

原创 HW-TSC’s Participation in the WMT 2020 News Translation Shared Task

本文作者主要介绍了华为参加WMT2020所使用的系统。在模型方面,作者使用Transformer-Big作为基线模型,在模型性能方面,作者也使用了较为常用的训练策略,如反译、集成知识蒸馏等手段。作者主要参加了三组语言六个方向的翻译测试,分别是:中英、高棉语英语、普什图语英语。对于每一个语言对,作者都应用了多步细粒度的数据清洗方法,保证只有高质量的数据子集被用于模型的训练。DataData source(Zh/En)对于双语数据,作者合并了CCMT、Wiki Titles V1、News Comme

2021-03-16 09:50:10 420

原创 Tencent Neural Machine Translation Systems for the WMT20 News Translation Task

本文主要介绍了WMT2020中腾讯所使用的NMT系统。该系统被应用于英中、中英、英德翻译任务上。在本系统中较为核心的技术为深层Transformer及数据增强等技术。作者主要提出了一种改进单一模型的增强域内微调方法。在ensemble方法方面,作者提出了一种iterative transductive的ensemble方法,可以在集成模型的基础上,进一步提高模型性能。作者在实践中发现领域内的微调是一种十分有效的方法,于是作者提出了一种增强微调(boosted finetuning)的方法对于英中和中英任务

2021-03-15 09:43:28 470

原创 The NiuTrans Machine Translation Systems for WMT20

本文主要介绍了WMT20中有关NiuTrans系统的实现。该系统在WMT20的日英双向任务上取得了第一名的成绩。总的来看,本系统主要使用了回译、不同深度和宽度的模型、循环知识蒸馏和循环微调等技术。作者发现,在这之中使用合适的宽度和深度模型,模型的性能会得到大幅度的提升。模型训练的步骤如下:1、数据预处理及过滤;2、迭代回译生成伪数据;3、使用不同的翻译模型去丰富模型翻译的多样性;4、通过领域内的多语数据进行迭代知识蒸馏;5、使用领域内数据并应用较小的训练batch进行模型微调;6、翻译后处理。Syst

2021-03-14 15:54:26 461

原创 Improving Transformer Optimization Through Better Initialization

在本文中,作者对Transformer难以优化这一问题进行了探究,并对模型的初始化方法提出了改进。在Transformer框架中,self-attention的引入使得模型变得难以优化,想要有效的对其进行优化必须使用一些训练上的技巧,如learning rate warmup。本文作者的贡献主要在以下两个方面:分析了transformer难以被优化的原因。提出了一种新的权重初始化策略,使用该策略可以使得模型在没有warmup和LN的情况下被训练。Transformer的成功训练一般需要以下因素:

2021-03-12 11:46:10 587

原创 Multiscale Deep Equilibrium Models

简介在本文中,作者提出了一种全新的隐式网络结构即Mutiscale Deep Equilibrium Model简称MDEQ,是对DEQ模型的一个推广版本。关于DEQ的讲解稍后会进行整理。简单的说,MDEQ就是将DEQ模型应用到多尺度上,例如分别对图像不同尺度的像素求其平衡点,这样多尺度处理的特性,也可以使得模型可以进行多任务的学习。在本文中作者主要将其应用到图像分类与语义分割两个任务上。在图像领域,一张图片可能会包含上百万个像素,这使得多尺度操作显得尤为重要,这一般包括如向下采样以及向上采样的过程

2021-03-11 11:27:05 1301

原创 论文阅读笔记--Google’s Neural Machine Translation System: Bridging the Gap between Human and Machine Trans

2021.1.27 Google’s Neural Machine Translation System: Bridging the Gap between Human and Machine Translation本文时间较早,所介绍的GNMT是全球第一个正式上线的NMT系统,并达到了当时的SOTA的水平,GNMT使用了8层的LSTM的encoder、8层LSTM的decoder以及attention方法。作者充分考虑了NMT模型当时的弊端如训练速度、推断速度、未知词等问题,分别对上述问题进行了解决。

2021-01-27 15:46:09 926

原创 论文阅读笔记--Learning Light-Weight Translation Models from Deep Transformer

本文探究了一种知识蒸馏和一种skipping sub-layer方法去实现将深层模型所学的知识转移到一个浅层网络当中。Compression of Deep Transformer本文的核心思想:将一个大型网络所学习到的知识转移到一个小的轻型网络当中。具体来说,本文使用的方式是知识蒸馏,即使小的模型学习大的模型的输出分布,作者所基于的知识蒸馏并不是传统的知识蒸馏的形式,而是equence-level knowledge distillation (SKD)。同时作者具体的训练策略为:1、在训练tea

2021-01-25 10:30:45 336

原创 python-生成一个句子所有可能的分词组合

本任务目标:给定abcd生成['abcd']['a', 'bcd']['ab', 'cd']['abc', 'd']['a', 'b', 'cd']['a', 'bc', 'd']['ab', 'c', 'd']['a', 'b', 'c', 'd']即所有可能的分词情况废话不多说了,下面是代码from itertools import combinationssenc = ['a','b','c','d']s = "".join(senc)# 用于记录切分的位置cut_in

2021-01-22 18:46:50 815 1

原创 论文阅读笔记--Deep Residual Learning for Image Recognition

随着大量深层网络的应用,深层网络表现出优异的性能,但存在以下两个主要问题:梯度消失/梯度爆炸性能退化问题其中,梯度的消失/爆炸可通过较好的初始化或者正则化手段进行缓解,但性能退化问题却无法通过上述手段进行解决,起初人们认为性能退化的原因来自于过拟合,但在文中作者认为,性能的退化并不是因为过拟合所导致,如图1所示:从图中我们可以看到,随着层数的增加,训练误差也上升显著,这说明退化问题的根源并不是过拟合问题。作者在文中提及的一种当时时间节点上的解决方案是通过添加恒等变换层(identity ma

2021-01-21 16:35:26 171

原创 pytorch(fairseq) debug经验--CUDA ERROR: device-side assert triggered

痛苦又充实的回忆????在跑自己修改的模型时,遇到了这个令人摸不到头脑的问题,从网上的博客中查找,大部分是说,数据集的标签出了问题,从而导致越界,而在项目运行中一直使用的是同一个数据集,同时过去的实验代码都是在同一个数据集及预处理程序下使用的,所以果断排除该问题所导致的。这个问题更坑的地方在于,他抱错的地方并不是错误发生的地方,这就导致了定位的困难,回去看日志信息,捕捉到了一条关键信息,Assertion srcIndex < srcSelectDimSize failed.我意识到,是不是自己

2021-01-07 16:54:54 886

原创 Pytorch关于高维tensor的dim上操作的理解--以cosine_similarity的dim参数为例

问题的引出关于pytorch中dim的描述个人总是弄的不是很清楚,好多地方存在着疑问,这次在实验过程中需要比较两个高维tensor的相似度,由于需要确定在哪一维进行比较,故去测试了pytorch中关于tensor维度的一些现象。dim关于dim许多博客都有比我更加专业的解释,dim具体的解释也不是本文的重点,这里盗用其他博客里的一张图,这张图也是我认为对dim比较好的直观的解释(原文链接),本文的重点在于对高维tensor维度上操作,即不同的操作在不同的维度上进行会有怎样的不同Cosine_sim

2021-01-07 11:21:56 3290 4

原创 计算机体系结构--基于硬件的动态预测

基于硬件的动态预测在解析控件依赖关系之前,继续动态发出并执行在动态预测的分支方向上传递条件分支的指令。这克服了基本块大小的ILP限制。在运行时创建动态推测的指令,不支持编译器方式。如果一个分支被错误预测,必须防止所有这些动态推测的指令改变机器的状态(寄存器,存储器)。增加提交(退出或重新排序)阶段,并强制指令按照代码中的顺序提交(即将结果写入寄存器或存储器)。精确的异常是可能的,因为指令必须按顺序提交。算法的四个阶段:发射: 从FP Op队列获取指令。 如果一个预留站和一个重新排序缓

2020-12-27 14:24:32 415

原创 计算机体系结构--多指令发射

多条指令发射为了使流水线的CPI更好(更小)于1,并更好地利用指令级并行性(ILP),必须在同一流水线周期中发出多个独立的指令。两种类型:超标量:在同一周期内发出多条指令(2-8条),由编译器静态调度或动态调度(Tomasulo)。超长指令字:固定数量的指令(3-6)被格式化为一个长指令字或包(由编译器静态调度)。静态调度超标量流水线每个周期可以发出两条指令(two-issue超标量)。其中一个指令是integer(包括load/store,branch)。另一条指令是浮点运算。超长指令

2020-12-27 14:22:53 1972

原创 计算机体系结构--条件分支预测

静态条件分支预测支路预测方案可分为静态方案和动态方案。静态方法通常由编译器执行。它们是静态的,因为预测在程序执行之前就已经知道了。一些静态预测方案包括:预测所有要采取的分支。这利用了大多数分支被取走的观察结果。这种原始的机制产生60%到70%的精确度。使用分支的方向来进行预测。预测要采取的向后分支(减少PC的分支)和不采取的向前分支(增加PC的分支)。在一些商用处理器中可以发现这种机制作为一种次要机制。分析也可以用来预测分支的结果。如果给定的分支可能被采取或不采取,则程序的先前运行用于收集信息,并

2020-12-27 14:18:13 2486

原创 计算机体系结构--Tomasulo算法

起源由IBM开发,并于1966年在IBMS360/91大型机中首次实现,大约是在CDC6600中记分板首次亮相之后的3年。动态调度硬件中的流水线,减少停顿。结构Tomasulo与记分牌提起Tomasulo算法一个经常与他进行对比的算法就是记分牌算法,有关记分牌的有关概念可以去看一下这篇博文文章传送门它们的主要区别如下:Tomasulo:控制与buffer分布在功能单元中。功能单元缓冲器被称为保留站,其具有未决指令和操作数以及其它指令状态信息。保留站有时被称为物理寄存器或重命名寄存器

2020-12-25 17:32:22 5327 1

原创 计算机体系结构--记分牌算法

记分牌记分板是一种硬件机制,它通过在操作数可用且没有危险条件阻止的情况下立即执行指令来维持每周期一条指令的执行速率。它用四个阶段:ID1,ID2,EX,WB代替ID,EX,WB每个指令都要经过记分板,在记分板上构建数据依赖关系的记录(对应于指令发布)。假设具有记分板的系统具有多个功能单元,其状态信息报告给记分板。如果记分板确定一条指令不能立即执行,它将执行另一条等待指令,并继续监视硬件单元的状态,并决定该指令何时可以继续执行。记分板还决定指令何时可以将其结果写入寄存器(危险检测和解决集中在记分

2020-12-25 16:32:12 3887 1

原创 Neural Machine Translation of Rare Words with Subword Units论文阅读笔记

作者的观点:在本文中作者认为神经机器翻译(Neural machine translation,NMT)模型通常使用固定的词汇量进行操作,但翻译是一个开放的词汇量问题。以前的工作是通过回退到字典(去了解后进行补充) 来解决词汇外词的翻译问题。在本文中作者引入了一种更简单有效的方法,通过将稀有和未知词编码为子词单元序列,使NMT模型能够进行开放词汇翻译。本文的核心思想为:不同的词类可以通过比单词更小的单位翻译,例如名称(通过字符复制或音译),复合词(通过组合翻译),同源词和外来词(通过音系和形态转换)。

2020-12-24 10:49:24 260

原创 c++进阶--申请和释放动态数组

分配和释放动态数组分配:new 类型名T [数组长度]注意:数组长度可以是任何整数类型表达式,在运行时计算。释放 : delete[] 数组名p注意:释放指针p所指向的数组,p必须是new分配得到的数组首地址。delete后面的[]不可省略,否则会只释放p的地址。动态创建多维数组new 类型名T [第一维数组长度][第二维数组长度]->如果内存申请成功,new运算返回一个指向新分配内存首地址的指针。但返回的还是正常的指针吗?答案是否定的,他应该返回一个指向数组的指针,即对其加一

2020-10-22 22:38:03 2219

原创 论文精读(1)-- Lipschitz constrained parameter initialization for deep transformers

概览改变residual connection与layer normalization的位置可以缓解深层Transformer难以优化的问题。作者比较了计算顺序(residual connection与layer normalization的位置)上的细微差别,并提出了一种参数初始化方法,该方法利用Lipschitz约束对Transformer的参数进行初始化。即使不调整原来的计算顺序,应用Lipschitz约束进行参数初始化,也可以使得模型正常收敛。1、引言多层网络可以增强模型的容量,但同

2020-09-22 16:47:04 360

原创 C++进阶--对象指针

对象指针定义形式类名 *对象指针名;例:Point a(5,10);Point *ptr;ptr = &a;通过指针访问对象成员对象指针名->成员名例:ptr->getx()//就相当于 (*ptr).getx();

2020-09-22 15:55:51 367

原创 C++进阶--指针与函数

以指针作为函数的参数为什么需要用指针做参数?需要数据双向传递时(饮用也可以达到此效果)。需要传递一组数据,值传递首地址运行效率比较高。

2020-09-20 21:59:20 816

原创 C++进阶--指针与数组

定义指向数组元素的指针定义与赋值:int a[10],*pa;pa = &a[0];//或者 pa = a;则等效写法:*pa就是a[0], *(pa+1)就是a[1] …pa[I]就是a[I]指针数组数组的元素是指针类型:

2020-09-20 21:35:15 106

原创 C++基础(常量指针、指针常量)

常量指针const修饰的变量的指针如:int a = 10;int b = 10;const int * p = &a;特点:指针的指向可以修改,而指针指向的值不可以修改*p = 20; //错误,不可修改指针指向的值p = &b; //正确,可以修改指针的指向指针常量const修饰的指针如:int a = 10;int b = 10;int * const p = &a;特点:指针的指向不可以修改,但指针指向的值可以进行修改。指向常量的常量指

2020-09-14 11:07:34 116 1

原创 C++基础教程(数组)

一维数组一维数组的定义方式特点:存放在一块连续的内存空间中每个元素都是相同的数据类型一维数组名的用途可以统计整个数组在内存中的长度。sizeof(arr)可以获取数组在内存中的首地址。第一个元素的地址。二维数组的定义方式...

2020-09-14 10:10:31 307

原创 C++基础教程(变量)

定义常量的两种方式:1、宏常量 #define 宏常量名 常量值2、const 修饰的变量数据类型:int:1、short 2字节2、int 4字节3、long win下4字节、linux下32位系统是4字节、64位是8字节4、long long 八字节可以使用sizeof()求出数据类型占用内存大小,具体用法:sizeof(数据类型||变量)实型:1、单精度 float (4字节)有效数字7位:在使用时 float a = 1.2f 需加f,不然小数默认为双精度,然后转换2、双精

2020-09-14 09:49:51 223

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除