【论文笔记】Controllable Natural Language Generation with Contrastive Prefixes

本文提出了一种新的基于GPT2的可控文本生成方法,使用属性特定的前缀引导生成。与Prefix-Tuning不同,该方法考虑了前缀之间的关系,通过监督和无监督方法训练单方面和多方面控制。实验显示,这种方法在保持语言质量的同时,能有效引导生成具有期望属性的文本。无监督方法中的对比损失对于提高属性对齐尤其有效,而在多方面控制中,通过拼接或半监督学习也能实现良好的控制效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Controllable Natural Language Generation with Contrastive Prefixes


在这里插入图片描述

会议:ACL2022 Findings

任务:可控文本生成

原文链接

Abstract

本文提出了一个新颖的基于GPT2的可控文本生成方法,该方式使用一系列小的属性特定(attribute-specific)的向量,称之为prefix,以此来引导自然语言生成。

  • 不同于以往的Prefix-Tuning相关工作,我们将prefix之间的关系纳入考虑,同时训练多个前缀。
  • 本文提出了一个新颖的监督方法无监督方法和新颖的目标来训练单方面(single-aspect)的生成控制,并且通过连接两种方法可以实现多方面(muti-aspect) 的GPT-2生成控制。
  • 实验结果表明,本文的方法在单方面和多方面生成控制上都能够在保持语言质量的同时,引导生成期望的属性。本文的工作为单方面控制和多方面控制提供了一个统一的视角。

在这里插入图片描述

Motivation

  • 过去的CTG相关模型存在许多缺点,如训练成本高(CTRL),推理速度慢(PPLM),GeDi(额外引入了大量参数)。
  • Prefix-Tuning是轻量级微调框架,它引入的额外参数少,且能和最初的LM保持相当的推理速度。
  • 一个方面在可控文本生成任务里可能包括多个属性,属性之间可能存在着相互之间的关系。如情感控制,就有正面和负面两个属性,它们是相互对立的,话题控制则可能有多个属性。我们认为这种相反的关系有助于提高prefix的控制能力

Main idea and Framework

Prefix是自由参数,记为 P θ P_θ Pθ,其大小为 N × M × D N × M × D N×M×D N N N是前缀个数,对于当方面控制而言, N N N即为属性个数,如本文实验中的普通的情感控制任务,情感方面包括正面和负面,故 N = 2 N=2 N=2 M M M是前缀长度, D = 2 × L × E D = 2 × L × E D=2×L×E是GPT激活维度大小, L L L是层数, E E E是隐层大小,2表明GPT模型隐层包括Key向量和V向量。和Prefix-Tuning那项工作相同,本文也采用了重参数化操作, H θ [ i , j , : ] = W i H ′ θ [ i , j , : ] H_θ[i, j, :] = W_i H′_θ[i, j, :] Hθ[i,j,:]=WiHθ[i,j,:],训练完成了仅有 H θ H_θ Hθ需要保存,其余可以丢弃。

在这里插入图片描述

Prefixes可以使用监督、半监督、无监督方法训练,半监督即是无监督和监督的连接。本文仅介绍监督和无监督的方法。为清晰起见,本文介绍当方面控制下的方法。

Supervised Method

假设当前控制方面的属性集为 Y Y Y,训练样本为 ( x , y ) (x,y) x,y x x x是输入文本, y y y是属性标签, y ∈ Y y ∈ Y yY,属性标签表明了其在 H θ H_θ Hθ中的正确索引。

  • discriminative loss

引入一个额外的判别损失来同时训练多个prefix,最终的损失即语言模型损失和判别损失的加权和。其中, l o g p ( x t ∣ x < t , y ) log_p(x_t|x_{<t}, y) logp(xtx<t,y)参数化为 l o g p θ , γ ( x t ∣ x < t , H θ [ y , : , : ] ) logp_{θ,γ}(x_t|x_{<t}, H_θ[y, :, :]) logpθ,γ(xtx<t,Hθ[y,:,:]) γ γ γ是固定住的GPT2参数, θ θ θ是可学习的prefix参数。

每个prefix是可以独立训练的。 L L M L_{LM} LLM训练的prefix中融入了鼓励生成的信息,然而,我们观察到在可控的NLG中,给prefix注入不鼓励生成的信息也是有帮助的。 给定一个样本 ( x , y ) (x,y) (x,y),前缀 H θ [ y , : , : ] H_θ[y, :, :] Hθ[y,:,:]应该被优化为生成 x x x,而其他prefix应避免生成 x x x。为了达到整个目标,所有的prefix应该被同时训练,因此引入判别损失。

根据公式3,优化 L d L_d Ld,提高了属性对齐 p ( y ∣ x ) p(y|x) p(yx)通过增强 p ( x ∣ y ) p(x|y) p(xy)和同时减小 p ( x ∣ y ‾ ) p(x|\overline{y}) p(xy) y ‾ ∈ Y / { y } \overline{y}∈Y/\{y\} yY/{y},假设均匀先验分布,所以公式3中 p ( y ) p(y) p(y) p ( y ′ ) p(y') p(y)可以被约去。

在这里插入图片描述
在这里插入图片描述

Unsupervised Method

无监督训练方式如图所示:

在这里插入图片描述

在无监督场景下,假设属性集 Y Y Y是已知的,训练的样本的输入仅包含文本 x x x,属性标签 y y y不可用,因此 x x x对应的prefix索引也是未知的。换言之, x x x对应的prefix索引是一个隐变量 z z z,其后验分布服从类别分布

  • 离散型隐变量

VQ-VAE启发,本文视prefixes为离散型隐变量。(个人理解离散的意思是这个prefix的隐变量空间大小是固定的,比如K*R,根据计算得到的z查询这个prefix空间得到1XR的向量作为prefix,具体理解还得参照VQ-VAE。参考1参考2

引入一个编码器来学习类别分布 q ( z ∣ x ) q(z|x) q(zx)(个人理解这个类别分布的概率分布是即one-hot的,体现出离散),根据 q ( z ∣ x ) q(z|x) q(zx),前缀索引 z z z可以被选取,相应的前缀 H θ [ z , : , : ] H_θ[z, :, :] Hθ[z,:,:]被送入解码器来重构文本 x x x

  • Gumbel-Softmax

因为选择prefix索引的过程是不可导的,因此引入Gumbel-Softmax(GS)。

  • 后验分布的学习

q ( z ∣ x ) q(z|x) q(zx)的计算方式如下,其中 τ τ τ是GS的温度系数, E n c Enc Enc是编码函数,本文使用预训练的GPT-2+线性层作为编码器。

  • 个人理解:这里最小化二者的欧氏距离,有点类似于最近邻的查找方法,像聚类,到Prefix这个离散的隐变量空间中查找与编码x后的表征最相似(距离最小)的向量的索引 z z z,然后解码的时候拿着这个索引 z z z到prefix向量空间中查找。这里是在学习这个类别分布,即如何学习到一个能区分数据的索引z。根据作者图中所示,拿到 q ( z ∣ x ) q(z|x) q(zx)后与prefix空间做一个矩阵相乘操作,即是在根据索引 z z z查找prefix。
  • 另一种理解,相当于输 q ( z ∣ x ) q(z|x) q(zx)是Query, H θ H_θ Hθ是Key和Value。这个Query根据Enc(x)和 H θ H_θ Hθ计算相似度得到,然后再和V进行矩阵相乘得到最终加权结果。

在这里插入图片描述
在这里插入图片描述

  • 无监督对比损失

类似于监督学习的判别损失,引入无监督对比损失 L c L_c Lc,如下所示,其中 m m m是预置的边缘。对比损失旨在通过将 p ( z ∣ x ) p(z|x) p(zx)推离 p ( z ‾ ∣ x ) p(\overline{z}|x) p(zx)一定距离来提高属性对齐率。

在这里插入图片描述

在这里插入图片描述

因此,为了同时训练多个prefix,无监督损失函数为下列损失的加权求和。为了保证后验概率尽可能准确,引入 L K L L_{KL} LKL,即KL散度,假设先验 p ( z ) p(z) p(z)是均匀的,这两项构成了VAE的损失函数,优化这两项损失提高了 l o g p ( x ) logp(x) logp(x)的证据下界。

在这里插入图片描述

相关的两篇文献

Toward controlled generation of text.ICML2017,VAE用于可控文本生成。

Attribute alignment: Controlling text generation from pretrained language models.

Experiments

Unsupervised Setting

在无监督场景下,GPT-2+提示工程表现出很好的控制力,但是在去毒任务上这一方法表现不好。

本文提出的无监督方法在去毒任务上表现很好,并且消融实验表明对比损失起到了关键作用。但是在情感控制上表现不佳,特别是当目标属性是negative时属性对齐率较差,但是当是positive时却很好。原因可能是:相比毒性和中性句子之间的差别,正向情感和负向情感之间的差异更加微弱不明显,模型难以学习到句子情感级别的差异。因此,对于我们的无监督模型中的GPT2编码器来说,将未标注数据准确地分离为两种情感更加具有挑战性。这导致的结果就是,编码器对输入文本进行分类的隐含标准可能不完全是情感,这也是为什么在无监督损失函数中去掉对比损失后,负面情感负面情感的相关度更高,正面情感更低的原因。

Supervised Setting

在监督学习场景下,少样本学习仍然能对三个任务都保持一定的控制能力,展示了我们的方法对于训练数据规模大小的鲁棒性。

消融实验表明,判别损失在监督学习方法中很重要。去掉判别损失和之间使用GPT-medium表明了直接使用Prefix-Tuning在情感控制和话题控制上可以达到效果,但是对于去毒任务却无效。原因可能是任务特点不同,去毒需要模型根据上下文阻止一些词或短语的生成,这对于prefix-tuning来说很难达到,这就是判别损失的意义。

在DBPedia话题控制任务上,判别损失也使得模型在属性对齐上效果提升很大,这是因为话题控制比之其他任务属性更多,故融合判别损失使prefixes更能高效的捕获到每个话题的唯一可区分特征

Multi-Aspect Control

多方面标注数据难以获取,但是我们有来自多个方面的单方面标注数据,可以达到多方面控制。方法如下:

  • concatenate:监督学习,为每个方面训练一系列前缀,然后拼接起来。
  • 半监督:通过考虑每个单方面标注数据为部分标注,为多方面同时训练多个前缀,连接监督学习和无监督学习的方法,模型结构和无监督方法一样。损失函数如下图所示,其中隐变量 z z z由监督方面和无监督方面拼接而成,引入编码损失是因为部分有标注的样本在标注方面隐含了前缀索引的ground truth,为prefix和编码器提供了监督信息。
    在这里插入图片描述
    实验结果表明,concatenate方法在情感+话题控制方面表现较好,且prefix的顺序不影响结果。另一方面,半监督方法可以在不牺牲太多语言质量的情况下,进一步提升属性对齐率。和前面当方面控制的结果一样,去掉判别损失显著降低属性对齐率,特别是话题控制,删除编码损失可以达到更高的属性对齐率,但是语言质量显著降低了。
### 图像质量评估论文阅读笔记与总结 #### 关于无参考图像质量评估的研究进展 无参考图像质量评估(No-Reference Image Quality Assessment, NR-IQA)是一种无需原始参考图像即可对失真图像的质量进行量化的方法。近年来,基于深度学习的技术显著提升了NR-IQA模型的表现能力。 MetaIQA 是一种采用元学习框架的无参考图像质量评估方法[^1]。它通过模拟不同类型的图像退化来训练模型,使其能够适应多种未知场景下的图像质量预测任务。这种方法的核心在于引入了一个可微分的优化过程,从而使得模型能够在少量样本上快速泛化到新的分布环境。 另一篇重要工作 Controllable List-wise Ranking 提出了针对通用型无参考图像质量评估的新思路[^2]。该研究设计了一种可控列表排序机制,允许用户根据实际需求调节评分标准中的某些特性权重,比如清晰度或者色彩还原准确性等方面的重要性程度。这种灵活性极大地增强了算法的实际应用价值。 对于希望深入了解这些技术背后原理以及其实验细节的人来说,可以参考上述两篇文章的具体实现部分及其附带的数据集说明文档等内容来进行更深入的学习理解。 此外,在数据分析领域也有不少关于如何有效展示研究成果的好例子可供借鉴。例如有学者分享过利用 Excel 和 Gephi 工具制作复杂关系网络图的经验教程[^3],这对于整理归纳大量文献资料非常有用处;而另一个案例则是展示了怎样从人民网获取公开新闻资源并进一步加工处理成适合输入给图形渲染引擎使用的结构化信息形式。 ```python import pandas as pd from gephi import GephiGraphStreamer # 假设存在这样的库用于简化演示目的 # 加载节点和边数据 nodes_df = pd.read_csv('nodes.csv') edges_df = pd.read_csv('edges.csv') streamer = GephiGraphStreamer() graph = streamer.create_graph() for _, node in nodes_df.iterrows(): graph.add_node(node['id'], label=node['label']) for _, edge in edges_df.iterrows(): graph.add_edge(edge['source'], edge['target']) # 将最终生成的知识图谱导出供后续查看分析 streamer.export_to_gephi(graph) ``` 以上代码片段仅作为示意用途,显示了可能用来创建知识图谱的一个简单流程概览。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值