谈一谈暴露偏差

news2024/11/26 13:23:42

文章由参考文章重新组合而来。

暴露偏差又叫Exposure Bias,是由Teacher Forcing 导致的。

Teacher Forcing

Teacher Forcing 是一种用于序列生成任务的训练技巧,与Autoregressive模式相对应,这里阐述下两者的区别:

  • Autoregressive 模式下,在 timesteps t decoder模块的输入是 timesteps t−1 的输出 y t − 1 y_t−1 yt1 。这时候我们称 y t y_t yt−1​ 为当前预测步的 context;
  • Teacher-Forcing 模式下,在 timestep t decoder模块的输入是 Ground-truth 语句中位置的 y t ∗ − 1 y_t^*−1 yt1 单词。这时候我们称 y t ∗ − 1 y_t^*−1 yt1 为当前预测步的 context;

更具体的,我们可以看下图的例子:

在这里插入图片描述

Teacher-Forcing 技术之所以作为一种有用的训练技巧,主要是因为:

  • Teacher-Forcing 能够在训练的时候矫正模型的预测,避免在序列生成的过程中误差进一步放大。
  • Teacher-Forcing 能够极大的加快模型的收敛速度,令模型训练过程更加快&平稳。
  • Teacher-Forcing 技术是保证 Transformer 模型能够在训练过程中完全并行计算所有token的关键技术。

Teacher Forcing 的问题

由于训练和预测的时候decode行为的不一致, 导致预测单词(predict words)在训练和预测的时候是从不同的分布中推断出来的。而这种不一致导致训练模型和预测模型直接的Gap,就叫做 Exposure Bias。

除了常见的 Exposure Bias 问题之外,今年的ACL2019 最佳paper中还指出好几个存在的问题:

  1. Teacher-Forcing 技术在解码的时候生成的字符都受到了 Ground-Truth 的约束,希望模型生成的结果都必须和参考句一一对应。这种约束在训练过程中减少模型发散,加快收敛速度。但是一方面也扼杀了翻译多样性的可能。
  2. Teacher-Forcing 技术在这种约束下,还会导致一种叫做 Overcorrect(矫枉过正) 的问题。例如:

Beam Search

事实上,我们真正做题的时候并不总是这样子,假如我们卡在某步无法确定时,我们就遍历几种选择,然后继续推下去,看后面的结果反过来辅助我们确定前面无法确定的那步。对应到Seq2Seq来说,这其实就相当于基于Beam Search的解码过程。

对于Beam Search,我们应该能发现,beam size并不是越大越好,有些情况甚至是beam size等于1时最好,这看起来有点不合理,因为beam size越大,理论上找到的序列就越接近最优序列,所以应该越有可能正确才对。事实上这也算是Exposure Bias的现象之一。

简单例子

我们来举一个简单例子。设序列长度只有2,候选序列是(a,b)和(c,d),而目标序列是(a,b),训练完成后,模型的概率分布情况为

在这里插入图片描述

如果beam size为1,那么因为p(a)>p©,所以第一步只能输出a,接着因为p(b|a)>p(d|a),所以第二步只能输出b,成功输出了正确序列(a,b)。但如果beam size为2,那么第一步输出(a,0.6),(c,0.4),而第二步遍历所有组合,我们得到

在这里插入图片描述

所以输出了错误的序列(c,d)。

那是因为模型没训练好吗?并不是,前面说过Softmax加交叉熵的目的就是让目标的得分最大,对于第一步我们有p(a)>p©,所以第一步的训练目标已经达到了,而第二步在a已经预先知道的前提下我们有p(b|a)>p(d|a),这说明第二步的训练目标也达到了。因此,模型已经算是训练好了,只不过可能因为模型表达能力限制等原因,得分并没有特别高,但“让目标的得分最大”这个目标已经完成了。

对策

从上述例子中读者或许可以看出问题所在了:主要是p(d|c)太高了,而p(d|c)是没有经过训练的,没有任何显式的机制去抑制p(d|c)变大,因此就出现了“最优序列并不是目标序列”的现象。

看到这里,读者可能就能想到一个朴素的对策了:添加额外的优化目标,降低那些Beam Search出来的非目标序列不就行了?事实上,这的确是一个有效的解决方法,相关结果发表在2016年的论文《Sequence-to-Sequence Learning as Beam-Search Optimization》。但这样一来几乎要求每步训练前的每个样本都要进行一次Beam Search,计算成本太大。还有一些更新的结果,比如ACL 2019的最佳长论文《Bridging the Gap between Training and Inference for Neural Machine Translation》就是聚焦于解决Exposure Bias问题。此外,通过强化学习直接优化BLEU等方法,也能一定程度上缓解Exposure Bias。

然而,据笔者所了解,这些致力于解决Exposure Bias的方法,大部分都是大刀阔斧地改动了训练过程,甚至会牺牲原来模型的训练并行性(需要递归地采样负样本,如果模型本身是RNN那倒无妨,但如果本身是CNN或Transformer,那伤害就很大了),成本的提升幅度比效果的提升幅度大得多。

构建负样本

纵观大部分解决Exposure Bias的论文,以及结合我们前面的例子和体会,不难想到,其主要思想就是构造有代表性的负样本,然后在训练过程中降低这些负样本的概率,所以问题就是如何构造“有代表性”的负样本了。这里给出笔者构思的一种简单策略,实验证明它能一定程度上缓解Exposure Bias,提升文本生成的表现,重要的是,这种策略比较简单,基本能做到即插即用,几乎不损失训练性能。

方法很简单,就是随机替换一下Decoder的输入词(Decoder的输入词有个专门的名字,叫做oracle words),如下图所示:

在这里插入图片描述

其中紫色的[R]代表被随机替换的词。其实不少Exposure Bias的论文也是这个思路,只不过随机选词的方案不一样。笔者提出的方案很简单:

1、50%的概率不做改变;

2、50%的概率把输入序列中30%的词替换掉,替换对象为原目标序列的任意一个词。

也就是说,随机替换发生概率是50%,随机替换的比例是30%,随机抽取空间就是目标序列的词集。这个策略的灵感在于:尽管Seq2Seq不一定能完全生成目标序列,但它通常能生成大部分目标序列的词(但顺序可能不对,或者重复出现同一些词),因此这样替换后的输入序列通常可以作为有代表性的负样本。对了,说明一下,50%和30%这两个比例纯粹是拍脑袋的,没仔细调参,因为生成模型调一次实在是太累了。

对抗训练

思考到这里,我们不妨再“天马行空”一下:既然解决Exposure Bias的思路之一就是要构造有代表性的负样本输入,说白了就是让模型在扰动下依然能预测正确,而前些天我们不是才讨论了一种生成扰动样本的方法吗?不错,那就是对抗训练。实验表明通过往baseline模型里边加入对抗训练,可以提升生成效果。

参考

https://zhuanlan.zhihu.com/p/93030328

https://spaces.ac.cn/archives/7259

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/157883.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Flink系列】部署篇(一):Flink集群部署

主要回答以下问题: Flink集群是由哪些组件组成的?它们彼此之间如何协调工作的?在Flink中job, task, slots,parallelism是什么意思?集群中的资源是如何调度和分配的?如何搭建一个Flink集群?如何配置高可用服…

目标检测再升级!YOLOv8模型训练和部署

一个不知名大学生,江湖人称菜狗 original author: jacky Li Email : 3435673055qq.com Time of completion:2023.1.12 Last edited: 2023.1.12 目录 目标检测再升级!YOLOv8模型训练和部署 简介 YOLOv8创新改进点 区别 1、C2f模块是什么&…

探索与创新:低代码助力金融数字化转型发展

“十四五”规划和 2035 年远景目标纲要提出“加快数字化发展,建设数字中国”,并就打造数字经济新优势、加快数字社会建设步伐、提高数字政府建设水平、营造良好数字生态作出战略部署。这为数字中国的下一步发展指明了方向,提供了指引。可以说…

CentOS环境下Rabbit集群部署

前言本次Rabbit集群部署所使用的的软件版本erlang:erlang-23.3.3-1.el7.x86_64.rpm ,rabbitmq:rabbitmq-server-3.8.23-1.el7.noarch.rpm本次Rabbit集群部署需要安装在两台CentOS服务器分别为svr-app-rabbitmq01、svr-app-rabbitmq02&#xf…

Trime同文输入法JNI加载过程

Trime同文输入法JNI加载过程JNI初始化顺序第一步、加载librime_jni.so库第二步、自动注册机制第三步、正式加载librime_jni.so库插入一个话题、简化打印记录第四步、执行Rime.java中的init()方法LoadModules()LoadModule()rime_core_initialize()调用顺序Class不是class关键字&…

3D应用无需下载即点即用,云应用带来更轻量的元宇宙

最近一个程序员朋友告诉我,公司市场部想做一个元宇宙相关的互动游戏,于是给技术团队提了一个带用户线上沉浸式环游园区的H5开发需求。他摸着所剩无几的头发据理力争:这个需求真的做不了!我听了很疑惑,现在许多品牌都在…

工作流引擎架构设计

原文链接: 工作流引擎架构设计 最近开发的安全管理平台新增了很多工单申请流程需求,比如加白申请,开通申请等等。最开始的两个需求,为了方便,也没多想,就直接开发了对应的业务代码。 但随着同类需求不断增…

深度学习PyTorch 之 网络结构可视化

深度学习&PyTorch 之 DNN-回归 深度学习&PyTorch 之 DNN-回归(多变量) 分别介绍了DNN回归的方法和代码,但是模型建立好了,他到底是个什么样子呢? 我们这节给大家介绍一个查看模型结构的方法 可视化介绍 我们…

【信管8.1】项目人力资源管理概念及过程

项目人力资源管理概念及过程不管你做什么事,要成就什么事业,要做什么项目,这一切,都是由人来完成的。因此,人力资源对于项目管理来说,是非常重要的一个管理过程。同时,人力资源管理也是整个管理…

2023/1/11 Web前端Promise从入门到精通

ES6引入的进行异步编程的解决方案,从语法上说它是一个构造函数。 异步编程包括但不限于:文件操作、数据库操作、AJAX、定时器 为什么要用Promise? 之前进行异步编程直接通过回调函数的方式进行,会导致回调地狱。 回调函数&#…

Qt扫盲-QMenu理论总结

QMenu理论总结一、概述二、常用操作1. 添加Action2. 信号槽3. 可撕下菜单4. 展示菜单一、概述 QMenu其实就是菜单控件,菜单控件本质上就是一个选择项目。它可以是菜单栏中的下拉菜单,也可以是独立的上下文菜单。当用户单击相应的位置或按下指定的快捷键…

【大数据】第一章:了解Hadoop生态圈

大数据特点(4V) Volume(大量) 非常非常多,大企业数据接近1EB Velocity(高速) 比如在双十一,数据爆增 Variety(多样) 很多样子的数据,比如,代码,图片,视频,JSON&am…

【C++】八大排序

文章目录前言1. 插入排序2. 希尔排序3. 选择排序4. 堆排序5. 冒泡排序6. 快速排序(重点)6.1 快速排序(hoare版本)6.2 快速排序(挖坑法)6.3 快速排序(前后指针法)6.4 快速排序(非递归)6.5 快速排序(优化)7. 归并排序7.1 归并排序(递归实现)7.2 归并排序非递归实现8. 计数排序排序…

Docker搭建PHP运行环境

目录 Docker 安装 PHP Docker 安装 Nginx ​编辑运行nginx容器 nginx安装成功 Nginx PHP 部署PHP项目 启动 PHP: 启动 nginx: 查看正在运行的容器: 访问域名测试搭建结果 Docker相关命令描述 Docker 安装 PHP 这里我们拉取官方的镜像,标签…

代码随想录算法训练营第8天 344.反转字符串、541. 反转字符串II、剑指Offer58-II.左旋转字符串

代码随想录算法训练营第8天 344.反转字符串、541. 反转字符串II、剑指Offer58-II.左旋转字符串 反转字符串 力扣题目链接(opens new window) 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。 对于字符串,我…

Linux驱动开发基础__Linux 系统对中断处理的演进

目录 1 Linux 对中断的扩展:硬件中断、软件中断 2 中断处理原则 1:不能嵌套 3 中断处理原则 2:越快越好 4 要处理的事情实在太多,拆分为:上半部、下半部 5 下半部要做的事情耗时不是太长:tasklet…

154. 滑动窗口

文章目录QuestionIdeasCodeQuestion 给定一个大小为 n≤106 的数组。 有一个大小为 k 的滑动窗口,它从数组的最左边移动到最右边。 你只能在窗口中看到 k 个数字。 每次滑动窗口向右移动一个位置。 以下是一个例子: 该数组为 [1 3 -1 -3 5 3 6 7]&…

知识点滴 - 数据库视图概念

视图是数据库中一个非常简单的概念,写过SQL的人几乎大致了解视图。本文除了在回顾视图的本质及相关操作知识时,会重点阐述它蕴含的分层思想在数据分析工作中的作用。 1,视图的本质与作用 视图是一个数据库中的虚拟表,它的本质是S…

模板特化与static成员初始化

我们知道在 c 的类中&#xff0c;如果有static成员数据&#xff0c;则需要在类外进行定义&#xff0c;而类内那只是声明。这个在类模板中也是一样的&#xff0c;需要在类外进行定义。普通类模板的 static 数据的初始化&#xff0c;如下代码&#xff1a; template <class T&…

SpringBoot在Controller层接收参数的常用方法(超详细)

前言 在工作中&#xff0c;比如要实现一个功能&#xff0c;前端传什么参数&#xff0c;后端的controller层中怎么接收参数 &#xff0c;封装成了什么实体对象&#xff0c;有些参数是在URL上使用&#xff0c;有些参数是在body上使用&#xff0c;service层中做了什么逻辑&#xf…