MASS: Masked Sequence to Sequence Pre-training for Language Generation

微软亚洲研究院的研究员在ICML 2019上提出了一个全新的通用预训练方法MASS, 在序列到序列的自然语言生成任务中全面超越BERT和GPT。

论文地址:
https://arxiv.org/pdf/1905.02450.pdf

引言

BERT在自然语言理解(比如情感分类、自然语言推理、命名实体识别、SQuAD阅读理解等)任务中取得了很好的结果,受到了越来越多的关注。然而,在自然语言处理领域,除了自然语言理解任务,还有很多序列到序列的自然语言生成任务,比如机器翻译、文本摘要生成、对话生成、问答、文本风格转换等。在这类任务中,目前主流的方法是编码器-注意力-解码器框架。

编码器(Encoder)将源序列文本X编码成隐藏向量序列,然后解码器(Decoder)通过注意力机制(Attention)抽取编码的隐藏向量序列信息,自回归地生成目标序列文本Y。

新的预训练方法——MASS

专门针对序列到序列的自然语言生成任务,微软亚洲研究院提出了新的预训练方法:屏蔽序列到序列预训练(MASS: Masked Sequence to Sequence Pre-training)。MASS对句子随机屏蔽一个长度为k的连续片段,然后通过编码器-注意力-解码器模型预测生成该片段。
图 1 MASS训练结构
如上图所示,编码器端的第3-6个词被屏蔽掉,然后解码器端只预测这几个连续的词,而屏蔽掉其它词,图中“_”代表被屏蔽的词。
MASS预训练有以下几大优势:

1.解码器端其它词(在编码器端未被屏蔽掉的词)都被屏蔽掉,以鼓励解码器从编码器端提取信息来帮助连续片段的预测,这样能促进编码器-注意力-解码器结构的联合训练;
2.为了给解码器提供更有用的信息,编码器被强制去抽取未被屏蔽掉词的语义,以提升编码器理解源序列文本的能力;
3.让解码器预测连续的序列片段,以提升解码器的语言建模能力。

###统一的预训练框架
MASS有一个重要的超参数k(屏蔽的连续片段长度),通过调整k的大小,MASS能包含BERT中的屏蔽语言模型训练方法以及GPT中标准的语言模型预训练方法,使MASS成为一个通用的预训练框架。

MASS预训练的loss 函数如下:

当k=1时,根据MASS的设定,编码器端屏蔽一个单词,解码器端预测一个单词,如下图所示。解码器端没有任何输入信息,这时MASS和BERT中的屏蔽语言模型的预训练方法等价。
图 2 遮蔽方法,k=1
当k=m(m为序列长度)时,根据MASS的设定,编码器屏蔽所有的单词,解码器预测所有单词,如下图所示,由于编码器端所有词都被屏蔽掉,解码器的注意力机制相当于没有获取到信息,在这种情况下MASS等价于GPT中的标准语言模型。
图 3 遮蔽方法,k=m
可以看到,当K=1或者m时,MASS的概率形式分别和BERT中的屏蔽语言模型以及GPT中的标准语言模型一致。

序列到序列自然语言生成任务实验

MASS只需要无监督的单语数据(比如WMT News Crawl Data、Wikipedia Data等)进行预训练。MASS支持跨语言的序列到序列生成(比如机器翻译),也支持单语言的序列到序列生成(比如文本摘要生成、对话生成)。当预训练MASS支持跨语言任务时(比如英语-法语机器翻译),我们在一个模型里同时进行英语到英语以及法语到法语的预训练。需要单独给每个语言加上相应的语言嵌入向量,用来区分不同的语言。我们选取了无监督机器翻译、低资源机器翻译、文本摘要生成以及对话生成四个任务,将MASS预训练模型针对各个任务进行精调,以验证MASS的效果。

无监督机器翻译

在无监督翻译任务上,我们和当前最强的Facebook XLM作比较(XLM用BERT中的屏蔽预训练模型,以及标准语言模型来分别预训练编码器和解码器),对比结果如下表所示。

文本摘要生成

在文本摘要生成(Gigaword Corpus)任务上,我们将MASS同BERT+LM(编码器用BERT预训练,解码器用标准语言模型LM预训练)以及DAE(去噪自编码器)进行了比较。从下表可以看到,MASS的效果明显优于BERT+LM以及DAE。

在不同的序列到序列自然语言生成任务中,MASS均取得了非常不错的效果。接下来,我们还将测试MASS在自然语言理解任务上的性能,并为该模型增加支持监督数据预训练的功能,以期望在更多自然语言任务中取得提升。未来,我们还希望将MASS的应用领域扩展到包含语音、视频等其它序列到序列的生成任务中。



扫码识别关注,获取更多论文解读

<think>好的,我现在需要解决用户提到的Docker服务在Ubuntu上启动失败的问题,特别是关于systemd的错误。首先,用户提供了几个引用,我需要结合这些信息和自己的知识来给出解决方案。 首先,根据引用[1],用户尝试了删除lib文件、禁用防火墙、重启docker服务,以及运行hello-world容器。但可能还存在其他原因导致启动失败。引用[2]提到docker被mask的情况,需要解除mask并启动服务。这可能是一个关键点,因为如果服务被mask,systemctl start会失败。 接下来,我需要回忆常见的Docker启动问题。可能的原因包括:Docker未正确安装、配置文件错误、权限问题、与其他服务的冲突、或者存储驱动不兼容等。此外,systemd的日志(journalctl)是排查问题的重要工具,应该建议用户查看日志获取具体错误信息。 步骤方面,应该先检查服务状态,确认是否被mask。如果是,按照引用[2]的方法解除mask。然后,重新启动服务。如果问题依旧,可能需要检查Docker的安装是否正确,比如通过官方渠道安装,或者使用apt-get重新安装。此外,检查存储驱动是否正确,比如在/etc/docker/daemon.json中配置。用户之前删除了/var/lib/docker,可能需要重新初始化存储结构。另外,SELinux或AppArmor的安全策略有时也会导致问题,检查是否需要调整。 还有可能的问题包括Docker的socket文件未被正确配置,或者依赖的服务如containerd没有启动。用户可能需要确保所有依赖项已正确安装和运行。防火墙和UFW的设置也需要检查,虽然用户已经禁用了ufw,但可能需要彻底关闭或者调整规则。 最后,建议用户在完成步骤后运行docker run hello-world来验证是否成功,如果仍有问题,根据日志中的具体错误进一步排查。可能还需要查看磁盘空间、内存是否充足,或者是否有残留的docker进程影响启动。 整理这些思路后,需要将解决方案分步骤写出,确保用户能逐步操作,并引用相关的引用内容作为支持。同时,生成的相关问题要针对常见后续疑问,比如日志查看、卸载重装、存储驱动配置等。</think>### Docker服务启动失败解决方案(Ubuntu系统) 当遇到`docker.service failed to start`错误时,可按以下步骤排查: #### 1. **检查服务状态及解除mask状态** ```bash systemctl status docker.service # 查看服务状态 ``` - **若发现服务被mask**(如提示`Unit docker.service is masked`): ```bash sudo systemctl unmask docker.service # 解除mask状态[^2] sudo systemctl unmask docker.socket sudo systemctl start docker # 重新启动服务 ``` #### 2. **清理残留文件并重启** ```bash sudo rm -rf /var/lib/docker # 删除旧的Docker存储文件[^1] sudo systemctl stop docker sudo systemctl start docker # 重启服务 ``` #### 3. **检查依赖与配置文件** - **查看日志定位具体错误**: ```bash journalctl -xe -u docker.service # 查看systemd日志 ``` - **验证Docker安装完整性**: ```bash sudo apt-get install --reinstall docker-ce # 重新安装Docker ``` #### 4. **处理安全策略冲突** - **临时禁用防火墙**: ```bash sudo ufw disable # 关闭Ubuntu防火墙[^1] ``` - **检查SELinux/AppArmor**: ```bash sudo aa-status # 查看AppArmor状态 ``` #### 5. **验证服务是否正常** ```bash sudo docker run hello-world # 测试基础功能 ``` #### 6. **配置存储驱动(可选)** 编辑`/etc/docker/daemon.json`: ```json { "storage-driver": "overlay2" } ``` 重启服务: ```bash sudo systemctl restart docker ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值