©PaperWeekly 原创 · 作者|苏剑林

单位|追一科技

研究方向|NLP、神经网络

在 Seq2Seq 的解码过程中,我们是逐个 token 地递归生成的,直到出现 标记为止,这就是所谓的“自回归”生成模型。然而,研究过 Seq2Seq 的读者应该都能发现,这种自回归的解码偶尔会出现“根本停不下来”的现象,主要是某个片段反复出现,比如“今天天气不错不错不错不错不错...”、“你觉得我说得对不对不对不对不对不对...”等等,但就是死活不出现 标记。

ICML 2020 的文章 Consistency of a Recurrent Language Model With Respect to Incomplete Decoding 比较系统地讨论了这个现象,并提出了一些对策,本文来简单介绍一下论文的主要内容。

论文标题:Consistency of a Recurrent Language Model With Respect to Incomplete Decoding

论文来源:ICML 2020

论文链接:https://arxiv.org/abs/2002.02492

解码算法

对于自回归模型来说,我们建立的是如下的条件语言模型:

那么解码算法就是在已知上述模型时,给定 x 来输出对应的 来。解码算法大致可以分为两类:确定性解码算法随机性解码算法,原论文分别针对这两类解码讨论来讨论了“根本停不下来”问题,所以我们需要来了解一下这两类解码算法。

1.1 确定解码

确定性解码算法就是当输入文本固定之后,解码出来的输出文本也是固定的,这类算法包含贪心搜索(Greedy Search)和束搜索(Beam Search),事实上贪心搜索是束搜索的一个特例,所以只需要讨论束搜索。

束搜索我们需要固定一个“束”的大小(Beam Size),然后从左往右逐个 token 地解码,每步只保留总得分最高的 k 个序列。比如 ,token 空间为 ,那么解码流程示例如下:

第一步,算 ( 是固定的起始标记 ),然后保留最大的两个,比如 ,并记录它们的得分(概率对数);

第二步,算 和 ,这时候候选序列一共有 个,保留总得分(也就是当前 token 分数加上 a,b 本身的分数)最大的两个,比如 ,并记录各自的总得分;

第三步,算 和 ,这时候候选序列一共有 个,保留总得分(也就是当前token分数加上 本身的分数)最大的两个,比如 ,并记录各自的总得分;

...

依此类推,每个序列直到出现 就停止,最后从这 个已经完成终止的序列中选最优的那个输出。一般有两种选择,一是输出总得分最大的,二是输出平均得分最大的(处以各自 token 数),有时候还会根据实际需求加入长度惩罚等。

1.2 随机解码

随机性解码算法,顾名思义,就是哪怕输入文本固定了,解码出来的输出文本也不是固定的,比如从训练语言模型进行随机采样就是这这种算法(参考《现在可以用 Keras 玩中文 GPT2》[1] )。

对于 Seq2Seq 来说,我们很多时候希望得到确定性的结果,所以多数场景下我们都是用 Beam Search。但是 Beam Searc 的生成结果可能会出现过于单一的现象(即类似“好的”、“不知道”、“谢谢”这类比较“安全”的回复)。

或者有时候我们希望增加输出的多样性(比如我们之前开源的做相似句生成的 SimBERT [2] 模型),这时候就需要随机性解码算法,它包含三种情况:原生随机解码、top-k 随机解码、Nucleus 随机解码。

原生随机解码很简单,就是每步按概率随机采样一个 token,比如第一步算 ,然后按概率随机采样一个 token,比如 c;然后第二步算 ,接着按概率随机采样一个token,比如 a;那么第三步就算 ,再按概率随机采样;...;依此类推,直到采样到 停止。

top-k 随机解码出自文章 Hierarchical Neural Story Generation [3],其实就是在原生随机解码基础上加了个截断:每一步只保留概率最高的 个 token,然后重新归一化后再采样,这样做是希望在“得分高”和“多样性”方面做一个折中。显然,当 时,其实就等价于贪心搜索。

Nucleus 随机解码则来自文章The Curious Case of Neural Text Degeneration [4],跟 top-k 随机解码类似,也是对采样空间做了个截断,截断方式是:固定 ,然后只保留概率最高的、概率和刚好超过 p 的若干个 token,所以它也叫 top-p 采样。

除了 top-k 和 top-p 这两种截断方式外,还有一些自适应的截断方式,比如论文 Sparse Sequence-to-Sequence Models [5] 将最后预测分布的 softmax 函数换成了稀疏版本的 softmax,它能自动让大部分不可能的 token 概率变为 0,而不需要认为地选择 k 或 p。

适可而止

从 Seq2Seq 的模型设计和上面介绍的解码算法来看,并没有任何的理论保证解码过程一定能停下来,也就是说并没有东西保证一定会出现 标记,这只能靠模型自己学出来,而当模型学得不够好时,就会出现“根本停不下来”的现象了。而原论文则针对不同的解码算法做了相应的分析,提出了对应的策略,让解码过程能够“适可而止”。

2.1 有界的隐向量

建模概率(1)的经典方式就是:

也就是说,先算一个隐向量 ,然后接一个全连接,然后 softmax 激活。在这种形式下,原论文说:

如果对于任意的 t, 是有上界的,那么原生随机解码就能够“适可而止”。

看上去很强很实用的一个结论是不是?让 是有上界是一个很简单的事情,比如加个 Layer Norm 就可以了,那是不是说加个 Layer Norm 就可以解决所有的问题呢?

并不是。上述结论理论上是对的,推理过程是:因为 是有上界的,所以对于任意的 t、任意的 token, 是有正的下界的(因为 不会无穷大,所以 也不会无穷大,归一化后也不会无限接近于 0),那也就意味着存在一个正数 ,总有 ,因为概率是一个正数,因此只要你采样足够多步,总有机会采样到 的,所以不会永远停不下来。

这推理过程是不是有点让人啼笑皆非?没错,是能停,但是要采样足够多步,感觉就像是“只要你买足够多张彩票就一定能中头奖”一样,并没什么确切的实际价值。

采样足够多步之后,该循环的、该重复的 token 可能都已经重复多次了,就算能停下来,得到的输出可能也没有意义了,或许还不如直接按长度截断。

2.2 主动添加

注意上述结论还只是对原生随机解码成立,对于 top-k 随机解码和 Nucleus 随机解码不一定成立,因为经过截断后 就不一定出现在采样空间中了,当然,我们可以手动把 添加进采样空间,所以就有了如下的结论:

如果对于任意的 t, 是有上界的,并且我们把 也加入到采样空间中,那么 top-k 随机解码和 Nucleus 随机解码就能够“适可而止”。

只不过,这有点像是废话...

2.3 自截断设计

注意,上面的两个结论都只能用于随机解码,对于确定性解码来说,因为没有了随机性,所以我们没法保证一定能碰到 。为此,原论文提出了一个自截断的设计:想办法让 有正的下界,而且这个下界随着 t 的增大而增大,最终逐渐趋于 1。

这种自截断的设计也不复杂,就是定义 ,其中:

这里的 负责将 映射到 ,比如可以用 。设计好 后,剩下的 token 概率还是按照原来的 softmax 方式计算,然后乘以 即可。

现在我们有:

显然只要:

也就是说,对于贪心搜索来说必然在 步内停止,而对随着 越来越接近 1,显然 Beam Search 也能在有限步停止。

个人评价

原论文的主要内容大体上就是这样了,总的来说,它确实给我们提供了对解码算法的一些新认识,以及提供了一些缓解“根本停不下来”问题的有效策略。但是,作为一篇 ICML 论文来说,我觉得原论文的视角并不高,总体显得有些显浅。

原论文的大部分篇幅,是在用数学化的语言来重新表述已有的内容,比如什么是解码算法、什么是 top-k 随机解码、什么是 Beam Search、什么是“根本停不下来”等等,原论文都给下了个数学定义,这不能说没有意义,但对论文本身要探讨的问题并没有什么价值,而除去这部分东西,原论文就没多少内容了。

其次,原论文的结论太弱,关于随机解码的应对策略前面已经点评过了,结论是对的,但基本没实用价值;而对于确定性解码的自截断设计,其实很生硬,有种粗暴截断的感觉,完全没有优雅感。

最关键的问题是,对于“根本停不下来”这个问题,论文通篇都是在回答“是什么”、“怎么办”这两个问题,没有探讨“为什么”,没有提供任何关于理解“根本停不下来”本质的有用信息,从而并没有得到更贴近本质的应对策略,这是笔者觉得相当难以接受的。

文章小结

本文介绍了 Seq2Seq 的解码算法,讨论了解码过程中可能出现的“根本停不下来”的现象,并介绍了 ICML 2020 的一篇论文中提供的应对策略。

参考链接

[1] https://kexue.fm/archives/7292

[2] https://kexue.fm/archives/7427

[3] https://arxiv.org/abs/1805.04833

[4] https://arxiv.org/abs/1904.09751

[5] https://arxiv.org/abs/1905.05702

更多阅读

#投 稿 通 道#

 让你的论文被更多人看到 

如何才能让更多的优质内容以更短路径到达读者群体,缩短读者寻找优质内容的成本呢?答案就是:你不认识的人。

总有一些你不认识的人,知道你想知道的东西。PaperWeekly 或许可以成为一座桥梁,促使不同背景、不同方向的学者和学术灵感相互碰撞,迸发出更多的可能性。

PaperWeekly 鼓励高校实验室或个人,在我们的平台上分享各类优质内容,可以是最新论文解读,也可以是学习心得技术干货。我们的目的只有一个,让知识真正流动起来。

???? 来稿标准:

• 稿件确系个人原创作品,来稿需注明作者个人信息(姓名+学校/工作单位+学历/职位+研究方向)

• 如果文章并非首发,请在投稿时提醒并附上所有已发布链接

• PaperWeekly 默认每篇文章都是首发,均会添加“原创”标志

???? 投稿邮箱:

• 投稿邮箱:hr@paperweekly.site

• 所有文章配图,请单独在附件中发送

• 请留下即时联系方式(微信或手机),以便我们在编辑发布时和作者沟通

????

现在,在「知乎」也能找到我们了

进入知乎首页搜索「PaperWeekly」

点击「关注」订阅我们的专栏吧

关于PaperWeekly

PaperWeekly 是一个推荐、解读、讨论、报道人工智能前沿论文成果的学术平台。如果你研究或从事 AI 领域,欢迎在公众号后台点击「交流群」,小助手将把你带入 PaperWeekly 的交流群里。

如何应对Seq2Seq中的“根本停不下来”问题?相关推荐

  1. Seq2Seq中Exposure Bias现象的浅析与对策

    ©PaperWeekly 原创 · 作者|苏剑林 单位|追一科技 研究方向|NLP.神经网络 前些天笔者写了CRF用过了,不妨再了解下更快的MEMM?,里边提到了 MEMM 的局部归一化和 CRF 的 ...

  2. Seq2Seq中的Attention

    <Seq2Seq中的Attention>   Sequence to Sequence的结构在整个深度学习的进程中占有重要的角色,我在2017年做OCR的时候用这个,当时语音组做语音识别的 ...

  3. 1期精彩推荐:如何应对工作中的冲突?

    问题:在人们的日常工作和生活中,沟通是非常重要的.软件开发的工作也是如此,既然是沟通,就很有可能会发生冲突,那么技术人员应该如何应对工作中与别人发生的冲突呢?   特邀嘉宾: 胡百师:中国微软培训中心 ...

  4. (转)如何应对工作中的冲突?

    问题:在人们的日常工作和生活中,沟通是非常重要的.软件开发的工作也是如此,既然是沟通,就很有可能会发生冲突,那么技术人员应该如何应对工作中与别人发生的冲突呢?   特邀嘉宾: 胡百师:中国微软培训中心 ...

  5. 如何应对工作中的冲突?

    摘自<程序员>官网 问题:在人们的日常工作和生活中,沟通是非常重要的.软件开发的工作也是如此,既然是沟通,就很有可能会发生冲突,那么技术人员应该如何应对工作中与别人发生的冲突呢? 胡百师: ...

  6. 如何应对面试中的常见问题?

    在面试中,很多人会遇到一些经典的问题.虽然这些问题听起来简单,但是它们其实是挑战你的能力,帮助面试官更好地了解你的背景和个性.如何应对面试中的常见问题?下面小编就来详细为大家分享! 常见问题有哪些? ...

  7. 如何应对生活中的临时突发事件?

    "生活就是充满了种种意外" 生活中的临时突发事件是层出不穷的,其实总结下来,就下面这一个原因: 人是群居动物,人生活在社会中,这就决定了你的时间有一部分是需要由别人决定的. 举个例 ...

  8. seq2seq中的beam search算法过程

    在seq2seq模型中,我们以自然语言处理技术的集大成者机器翻译为例: 在模型训练好了之后,我们开始测试我们的模型(中文翻译成英文),比如Encoder中输入"我 是 中国 人"( ...

  9. 十倍业务增长下,饿了么技术如何应对(中)?

    在上一篇文章<十倍业务增长下,饿了么技术如何应对(上)?>中,我介绍了饿了么最早期 All in One 阶段的架构,以及第二阶段业务系统拆分与团队运营的一些思考,以及我对于架构师职责的感 ...

最新文章

  1. 昨天还在 for 循环里写加号拼接字符串的那个同事,今天已经不在了
  2. Win32 C 语言程序编译多个文件和在多个文件中声明外部变量
  3. 携程基于云的软呼叫中心及客服平台架构实践
  4. 2014年3月29日缅甸将举行人口普查
  5. Nginx入门简介和反向代理、负载均衡、动静分离理解
  6. 修改linux bash shell PS1
  7. ubuntu16.04字体安装
  8. Spring ConfigurationClassPostProcessor Bean解析及自注册过程
  9. linux更改cxxflags环境变量,在64位的ubuntu 14.04 上开展32位Qt 程序开发环境配置(pro文件中增加 QMAKE_CXXFLAGS += -m32 命令)...
  10. 1.6_quick_sort_快速排序
  11. 阿里字节面试题,多线程打印程序
  12. python相等的表达式_02-python-运算符与表达式
  13. Windows live messenger (WLM)邀请大放送--MSN8.0版(有条件)
  14. Flash Remoting+ Visual Studio .NET学习总结
  15. JAVA对接SAP接口使用sapjco3的见解
  16. 【程序员的吃鸡大法】利用OCR文字识别+百度算法搜索,玩转冲顶大会、百万英雄、芝士超人等答题赢奖金游戏...
  17. 微信公众号互助、开白群,小白报团取暖
  18. CentOS6.5服务器端口捆绑
  19. [论文总结]:Mixed Precision Training 混合精度训练 百度和英伟达联合发表 ICLR 2018
  20. 怎样给图片降噪?这几个图片降噪软件可以帮助你

热门文章

  1. 反射如何拿到私有属性_JAVA中反射机制的价值
  2. java a3 套打印_Java - apache PDFBox兩個A3論文到一個A2?
  3. join 高性能_内置的数据无法实现高性能
  4. C#引用类型转换的几种方式
  5. Ajax系列之三:UpdatePanel
  6. Pl/sql 如何将oracle的表数据导出成excel文件?
  7. 【转载】Linux截图工具
  8. Windows和Linux环境下搭建SVN服务器
  9. 怪自己,好好的服务器,装啥播放器。。。
  10. 设计模式实践-策略模式