为了更好的阅读体验,请点击这里

由于发不出论文,所以找点冷门方向做一做。从汉语比喻开始。

读完这篇论文之后我觉得 COLING 这方向我上我也行(ε=ε=ε=┏(゜ロ゜;)┛

题目:CM-Gen: A Neural Framework for Chinese Metaphor Generation with Explicit Context Modelling

论文链接

代码链接

发表于 2022,10 月,COLING

Chinese Nominal Metaphor —— 汉语比喻,以下简写做 NM。

本文提出了一个基于 GPT2 的结构解决三个问题,NM 的识别,NM 中部件的识别(就是本体、喻体、比喻词(e.g. 像、若、似)、上下文(比喻中蕴含的意思))以及 NM 的生成。并提了一个 6.3k 的数据集,这个数据集已被标注好并包含许多不同的比喻模式。

由于目前中文的比喻数据稀缺,作者执行自训练程序,从大规模未标记数据集中学习新发现的隐喻。自训练有三个步骤:

  1. 模型是在用于比喻识别的标记数据集上训练的;
  2. 将模型应用于未标记的语料库,以检测具有相应置信度得分的潜在比喻句;
  3. 在标记的比喻句和新发现的比喻句的组合上训练 NM 生成模型。

CM-Gen提出在识别潜在比喻成分过程中,要由比喻分类器生成的注意力权重监督。

作者认为有上下文才算成功生成了比喻句。这里的上下文是用来解释比较的一个组成部分;其定义相对灵活。有时它可以是一个简单的形容词,有时是一个关系从句,甚至在某些情况下是隐含的。以前生成比喻句的方法大多是基于模板(template-based)的方法,严重限制了生成的比喻句的多样性,并且模板方法和神经方法(neural method)都以相对简单的结构生成比喻句。最重要的是,以前的方法在其代中不提供上下文(或者只提供很少的上下文),这使得生成的结果可读性较差。

模型结构

上图是整个框架的结构图。将句子 \(S = (w_0, \cdots, w_n, w_{\text{EOS}})\) 传入 GPT2 模型中,得到特征向量 \(H = (h_0, \cdots, h_n, h_{\text{EOS}})\),其中 EOS 是特殊符号表示一个序列(sequence)的结束。

任务1:比喻识别

比喻识别利用 \(h_{\text{EOS}}\) 向量作为整个句子的特征向量,经过一个线性层和一个 SoftMax 函数,得到其概率:

\[P = \text{softmax} \left(W_m h_{\text{EOS}} + b_m \right)
\]

(吐槽原文:不明意义的 \(P_M\),\(M\) 是什么?)

Loss 函数采用了二分类常用的 BCE Loss,作者毫无疑问在此处写错了公式,而且不知道为什么审稿人居然看不出来。其中,假定 \(U\) 为整个数据集,且 \(U = \{ (x_i, y_i) \}_{i=1}^N\)。

\[L_1 = - \sum_{i=1}^N (y_i \log P(\hat{y_i}|x_i) + (1 - y_i) \log (1 - P(\hat{y_i}|x_i)) )
\]

任务2:比喻组件识别

作者认为 GPT2 有不连续的问题,而放到生成比喻句的环境中,会导致上下文生成和比喻中的比较内容不一致问题。除此之外,先天趋势经常导致文字错误(literal error,不知道具体应该翻译成什么)。

为解决上述问题,作者的模型把生成程序放到了比喻中的比较内容之上,也就是比喻的组件(本体、喻体和比喻词)上。同时作者也在训练过程中对于得分高的比喻组件进行加权以减少文字错误。

采用线性层来计算每个词元是比喻组件的概率:

\[P_c = \text{Sigmoid} (W_cH + b_c)
\]

请注意,该过程并不预测组件的类型(例如,本体),相反,它只计算每个词元的概率,指示生成应该关注每个词元的程度。

由于比喻分类器更倾向于注意比喻的组件,因此作者用这个特性来探索比喻组件。不妨设 \(\Phi\) 为在 GPT2 的 Transformer 结构最后一层中 \(h_\text{EOS}\) 与其他词元的自注意力分数,其中 \(Q\) 是自注意力中的查询矩阵,\(k\) 是 \(\text{EOS}\) 词元的值向量:

\[\Phi = \text{softmax} \left( \frac{Qk^T}{\sqrt{d_k}} \right)
\]

用 KL 散度来作为第二个损失函数,用于评估得到的概率分布 \(P_c\) 与 \(h_\text{EOS}\) 与其他词元的距离:

\[L_2 = D_{KL} (P_c \| \Phi)
\]

这里有几个问题:

  1. 存在级联误差的情况,即 \(\Phi\) 是比喻识别线性层生成的产物,它与分布 \(P_c\) 做 KL 散度,所以为什么不直接用注意力分数做比喻的组件识别呢?
  2. 为什么使用 KL 散度而非交叉熵来做这个损失函数呢?\(D_{KL} = H(P_c) + CELoss(P_c, \Phi)\),由于 \(P_c\) 不固定,因此这里最小化 KL 散度与最小化交叉熵并不等价,这里多了 \(P_c\) 自己的熵需要最小化。在最小化交叉熵的同时最小化自己的熵我认为并不是什么好选择。
  3. 更新的时候是否有固定训练参数?如果是,固定了哪些参数?如果没有固定参数的话,\(\Phi\) 会随着 GPT2 的以及比喻识别器的参数变化而变化,因此训练时这是两个一直在变化的值在做 KL 散度。

总之这几个问题突出一个难绷。

任务3:比喻生成

执行比喻生成任务三个步骤:

  1. 在比喻组件上调节生成(conditioning the generation);
  2. 强化比喻成分;
  3. 执行自训练过程

在比喻组件上调节生成 Conditioning the generation

首先,作者先求一个比喻组件表示 \(C = (c_0, \cdots, c_i, \cdots, c_n)\),(我觉得大概应该是用于求它是什么组件类型的):

\[c_i = \sum_{k=0}^i \alpha_k \cdot h_k
\]

其中,

\[(\alpha_0, \cdots, \alpha_i) = \text{softmax} P_c^{\{0,\cdots,i\}}
\]

此后将 \(h_i\) 和 \(c_i\) 拼接在一起,预测下一个词元可以写作:

\[P(w_{i+1}|w_0, \cdots, w_i) = \text{softmax} (W_l \cdot \text{concat}(h_i, c_i) + b_l)
\]

\(W_l,b_l\) 都是训练用参数。

看完这几个式子又有了几个新的问题:

  1. 首先 \(h_i\) 向量就是采用了 \([0,i]\) 区间内所有词元的信息才能求出的特征向量,然后我们再做一个前缀的加权和?

    • 暂且假定除了 \(h_\text{EOS}\) 之外的其他词元对应的特征向量受位置在其之前的词元影响不大,这个假定回答这个问题只能说是勉强。
  2. \(P_c\) 本就是刚过了激活函数 \(\text{Sigmoid}\),现在再过 \(\text{softmax}\) 得到 \(\alpha\)?过两次激活函数总感觉不大正常。
  3. 拼接和其他方法比效果如何?例如向量加权等方法。拼接是否能将二者的信息较好的融合?

强化 Emphasizing

设句子 \(S = (w_0, \cdots, w_n)\),最小化如下损失函数:

\[\mathcal{L}(S) = - \sum_{i=0}^n P_c^i \cdot \log P(w_i | w_0, \cdots, w_{i-1})
\]

同样的问题:在反向传播的过程中,由于不冻结参数,\(P_c\) 也会被更新,欲最小化上面的函数,\(P_c^i\) 会趋向于变大。

自训练 Self-training

作者采用从大规模语料库中发现新的汉语比喻的自我训练来训练比喻生成模块,从而提高生成的流畅性和多样性。

具体而言,作者用两个相同大小(论文中没提及,但是对于数据集大小都用了 \(N\))的有标签数据集 \(U = \{ (x_i, y_i) \}_{i=1}^N\) 和无标签数据集 \(V = \{ (x_i, y_i=P_M^i) \}_{i=1}^N\),其中 \(P_M^i\) 为模型判断第 \(i\) 组数据是否为比喻的概率,然后损失函数如下:

\[L_3 = - \sum_{x,y \in U \cup V} y \cdot \mathcal{L}(x)
\]

训练和推断

最终损失函数为:

\[L = \gamma \cdot L_1 + L_2 + L_3
\]

注意,当学习未标记的句子时,\(\gamma\) 被设置为 \(0\),因为这些数据缺乏比喻识别的监督标签。为了帮助模型收敛,在用 \(L\) 在混合数据上训练整个框架之前,我们首先在任务 1 的监督数据集上预训练模型。此外,在进行推理时,我们的模型只执行任务 3。

实验

数据集

  1. Chinese NM Corpus (CMC)

    • 有监督
    • 标注步骤共 5 步
      1. 从散文、文章和小说中收集了 55000 句中文句子
      2. 雇佣了三名具有 NLP 背景的中国研究生来标记每个句子是否为比喻
      3. 把多数同意作为每一句话的最终标签
      4. 识别所有比喻部件的边界(boundary),包括本体、比喻词和喻体
      5. 将现有的隐喻语料库与作者的语料库合并,以扩大整体多样性。
    • 为了鼓励生成上下文,作者确保上下文明确出现在数据集中的所有隐喻中。
    • 通过 Krippendorff 的 \(\alpha\) 计算比喻标注的内部标注的一致性,为 \(0.84\)
  2. Chinese Literature Corpus (CLC)
    • 无监督
    • 大规模

BaseLine

  • SeqGAN
  • GPT2
  • BART
  • SCOPE
  • MultiTask

实验设置

在联合优化三个特定任务的损失函数之前,CM-GEN 模型在比喻识别任务上和 CMC 预训练了三个轮次。

指标

自动指标

  • PPL
  • Dist-1, 2
  • 在 CMC 上训练一个基于 RoBERTa 的汉语比喻分类器
    • 用于测试生成输出的比喻性
    • 用于计算生成句子中比喻话语的比例
  • Novelty
  • 基于语法的方法从生成的比喻句中识别本体(TENOR)和喻体(VEHICLE)
    • 并计算训练集中不同时出现的 <TENOR,VEHICEL> 对的比例。

人工评估

  • Fluency
  • Consistency
  • Creativity

结果

自训练机制提高了生成流畅性和多样性。从模型中删除自训练很大程度上影响了四个自动指标。比喻成分强调主要有助于方法减轻文字错误,从而提高 Meta 评分。上下文条件也有利于 Meta 评分的整体框架。

人的评价也体现了自训练、强化和在比喻组件上调节生成三种机制的有效性。自训练在流利性和创造性两个方面都能提高生成的质量。调节作用主要有助于一致性得分,因为它使模型能够生成上下文描述。

【读论文】CM-Gen: A Neural Framework for Chinese Metaphor Generation with Explicit Context Modelling的更多相关文章

  1. Deep Learning 28:读论文“Multi Column Deep Neural Network for Traffic Sign Classification”-------MCDNN 简单理解

    读这篇论文“ Multi Column Deep Neural Network for Traffic Sign Classification”是为了更加理解,论文“Multi-column Deep ...

  2. (读论文)推荐系统之ctr预估-NFM模型解析

    本系列的第六篇,一起读论文~ 本人才疏学浅,不足之处欢迎大家指出和交流. 今天要分享的是另一个Deep模型NFM(串行结构).NFM也是用FM+DNN来对问题建模的,相比于之前提到的Wide& ...

  3. 论文阅读(Zhuoyao Zhong——【aixiv2016】DeepText A Unified Framework for Text Proposal Generation and Text Detection in Natural Images)

    Zhuoyao Zhong--[aixiv2016]DeepText A Unified Framework for Text Proposal Generation and Text Detecti ...

  4. 读论文系列:Deep transfer learning person re-identification

    读论文系列:Deep transfer learning person re-identification arxiv 2016 by Mengyue Geng, Yaowei Wang, Tao X ...

  5. 论文笔记——A Deep Neural Network Compression Pipeline: Pruning, Quantization, Huffman Encoding

    论文<A Deep Neural Network Compression Pipeline: Pruning, Quantization, Huffman Encoding> Prunin ...

  6. C# 读App.config配置文件[1]:.Net Framework框架

    C# 读App.config配置文件[1]:.Net Framework框架 C# 读App.config配置文件[2]: .Net Core框架 参考:https://www.cnblogs.com ...

  7. 注意力论文解读(1) | Non-local Neural Network | CVPR2018 | 已复现

    文章转自微信公众号:[机器学习炼丹术] 参考目录: 目录 0 概述 1 主要内容 1.1 Non local的优势 1.2 pytorch复现 1.3 代码解读 1.4 论文解读 2 总结 论文名称: ...

  8. [人脸活体检测] 论文:Learn Convolutional Neural Network for Face Anti-Spoofing

    [人脸活体检测] 论文:Learn Convolutional Neural Network for Face Anti-Spoofing 论文简介 这是最早期CNN用于活体检测的文章,在此之前都是手 ...

  9. Deep Learning 23:dropout理解_之读论文“Improving neural networks by preventing co-adaptation of feature detectors”

    理论知识:Deep learning:四十一(Dropout简单理解).深度学习(二十二)Dropout浅层理解与实现.“Improving neural networks by preventing ...

  10. Deep Learning 16:用自编码器对数据进行降维_读论文“Reducing the Dimensionality of Data with Neural Networks”的笔记

    前言 论文“Reducing the Dimensionality of Data with Neural Networks”是深度学习鼻祖hinton于2006年发表于<SCIENCE > ...

随机推荐

  1. WPF 从零自己实现从 RealTimeStylus 获取触摸信息

    本文将告诉大家什么是 RealTimeStylus 以及如何从零开始不使用 WPF 框架提供的功能从 RealTimeStylus 获取到触摸信息 开始之前先复习一下 Windows 的触摸演进.在上 ...

  2. 笔记04_正确使用Heterogeneous元件

    笔记04_正确使用Heterogeneous元件 1.出现错误的原因,就是一个元件的几个 部分没有分组.比如上一节创建的NE5532_HETE,当这个元件被调用两次或更多次时,存在若干个A,B部分,如 ...

  3. virutalenvwrapper安装和使用

    目录 virutalenvwrapper安装和使用 目的: 1.安装pip 2.安装virutalenv和virutalenvwrapper 3.配置环境变量 4. 创建虚拟环境 5.列出全部的虚拟环 ...

  4. RocketMQ 事件驱动:云时代的事件驱动有啥不同?

    前言: 从初代开源消息队列崛起,到 PC 互联网.移动互联网爆发式发展,再到如今 IoT.云计算.云原生引领了新的技术趋势,消息中间件的发展已经走过了 30 多个年头. 目前,消息中间件在国内许多行业 ...

  5. 使用Elasticsearch在Rails中进行全文本搜索

    使用Elasticsearch在Rails中进行全文本搜索 参考: https://blog.csdn.net/cunjie3951/article/details/106921108

  6. 08. C语言函数

    [函数基础] 函数用于将程序代码分类管理,实现不同功能的代码放在不同函数内,一个函数等于一种功能,其它函数可以调用本函数执行. C语言规定所有的指令数据必须定义在函数内部,比如之前介绍的程序执行流程控 ...

  7. 一篇文章让你掌握99%的Python运算符。干货很多,建议收藏!!!

    Python 中的运算符是编程中的基础概念,用于执行各种操作和数据计算.以下是一些 Python 中的主要运算符的概述: 运算符 1. 算术运算符 算术运算符语法规则 +:加法 -:减法 *:乘法 / ...

  8. 圣诞快乐 - Splashtop 2020 年回顾及未来展望

    ​ 我们很高兴 Splashtop 的远程访问解决方案能够在这个充满挑战的时期为全球的组织和教育机构提供帮助. 实际上,2020 年 Splashtop 的每日使用量增加了400%!不仅如此,我们还增 ...

  9. Chrome 浏览器插件 Manifest.json V3 中权限(Permissions)字段解析

    一.权限(Permissions) 再使用拓展程序的 API 时,大多数的时候,需要在 manifest.json 文件中声明 permissions 字段. 一.权限类型 在 V3 版本中可以声明以 ...

  10. JDK源码阅读-------自学笔记(十六)(java.util.Random随机数类)

    Random类简介 如果使用Math.random()计算过于复杂的话,我们可以使用例外一种方式得到随机数,即Random类,这个类是专门用来生成随机数的,并且Math.random()底层调用的就是 ...