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

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

读完这篇论文之后我觉得 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. 2019-11-29-如何入门-C++-AMP-教程

    title author date CreateTime categories 如何入门 C++ AMP 教程 lindexi 2019-11-29 08:20:37 +0800 2018-2-13 ...

  2. STM32F10x 串口使用DMA

    一.DMA简介 DMA(Direct Memory Access,直接存储器访问) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载.否则,CPU 需要 ...

  3. 批量解压上传SAP Note

    最近在做印度GST相关的东西,需要手动给系统实施上百个SAP Note,十分繁琐. 标准事务代码SNOTE只支持每次上传一个Note,逐个上传大量Note会很麻烦,为此摸索出一个批量解压上传的流程,下 ...

  4. 教你如何破解虚拟机root密码

    一.开机时按e键,即可进入grub编辑界面,光标选择第一条,e表示进入编辑模式. 当机器开机出现如图1所示的kernel菜单后,按e键. 二.将光标移动到以linux开头的行,对图2中标注的位置进行修 ...

  5. $KMP$学习记

    <不浪漫罪名>--王杰 没有花 这刹那被破坏吗 无野火都会温暖吗 无烟花一起庆祝好吗 若爱恋 仿似戏剧那样假 如布景一切都美化 连相拥都参照主角吗 你说我未能定时 令你每天欢笑一次 我没说 ...

  6. PageOffice 在线打开 word 文件并添加水印

    一.服务器端方法插入水印 1.插入文字水印 WordDocument doc = new WordDocument(); //添加水印 ,设置水印的内容 doc.getWaterMark().setT ...

  7. Prompt提示词助力AI写作

    AI以极高的效率和还可以的输出质量,得到了许多写作人的青睐,Prompt作为AI写作的核心,通过简短的提示来引导AI生成文本,让写作新手也能轻松自如. 1. 看不下去的行业乱状 让人不禁遗憾的是,国外 ...

  8. Python:Python对象模型与序列迭代陷阱

    1. Python对象模型与浅拷贝/深拷贝 1.1 Python对象模型和引用 在我们讲解Python的序列修改陷阱之前,先巩固一下Python的对象模型和浅拷贝/深拷贝的知识. 众所周知,Pytho ...

  9. echarts下划线实现

    echarts中无下划线实现,我采用图片填充文本块背景的方式实现 这是从 长空雁叫霜晨月 的博客中得到启发https://www.cnblogs.com/volodya/p/Echarts.html ...

  10. 高效C#编程:通过智能线程池管理提升性能

    前言 C#编程中,线程池(Thread Pool)是一个重要的概念,它允许开发者更有效地管理和利用系统资源.通过线程池,我们可以避免频繁地创建和销毁线程,从而减少系统开销并提高程序的响应速度和吞吐量. ...