基于强化学习的文本生成技术

部署运行你感兴趣的模型镜像

2013年以来Deep mind团队相继在NIPS和Natures上发表了用深度增强(强化)学习玩Atari游戏,并取得良好的效果,随后Alpha go与李世乭的一战更使得深度增强学习家喻户晓。在游戏上取得了不错的成果后,深度增强学习也逐渐被引入NLP领域。本期介绍目前NLP领域较为热点的研究方向,基于强化学习的文本生成技术(NLG),共选择了三篇文章,分别为:

1.             《Generating Text with Deep Reinforcement Learning》

应用Deep Q-Network作为生成模型用于改善seq2seq模型

2.             《Deep Reinforcement Learning for Dialogue Generation》

应用强化学习进行开放领域的文本生成任务,并对比了有监督的seq2seq加attention模型和基于最大互信息的模型

3.             《Hierarchical Reinforcement Learning for Adaptive TextGeneration_lshowway》

以任务为导向的户内导航对话系统用分层强化学习进行文本生成

以下为三篇文章的主要信息:

一、 《GeneratingText with Deep Reinforcement Learning》

1、作者:Hongyu Guo

2、单位:National Research Council Canada

3、关键词:Reinforcement Learning、seq2seq、text generation

4、来源:NIPS2015 Workshop (2015.10.30)

5、问题:本文提出将Deep Q-Network作为生成模型用于改善seq2seq模型,将decoding修改为迭代式的过程,实验表明本模型具有更好的泛化性。

6、模型:

           对seq2seq模型改进的论文层出不穷,本文率先引入深度强化学习的思想,将DQN用于文本生成。对DQN还不了解的同学可以先阅读DeepMind的论文Playing Atari with Deep ReinforcementLearning。

           本文的模型如下:

           如同一般的神经网络,我们也可以把DQN当做一个黑盒来使用。只需要准备好DQN需要的四个元素s(i),a(i),r(i),s(i+1),分别代表i时刻下state,action,reword和i+1时刻的state。

           对照上图我们把算法解剖分为4个步骤:

           1)   先是传统的seq2seq模型。通过LSTM先把输入序列encode为一个定长向量EnSen(i),然后作为decode阶段的初始状态依次生成新的序列DeSen(i)(decoding search使用beam search算法来 expand next words)。经过第一步我们得到初始state:(EnSen(i), DeSen(i))和action集合:每个位置的hypotheses。

           2)   接下来从hypotheses(actions)中选择一个可以获得最大reward的单词(action)作为该位置新生成的词,用新单词来代替之前的旧词,于是生成新的state:(EnSen(i), DeSen(i+1))。

           3)   接着就是标准的DQN的部分,计算Loss函数并对其应用梯度下降。

           4)   回到步骤(2),对得到的state继续迭代,每一次迭代都只生成一个新词来代替旧词,直到迭代次数达到设好的值(作者将次数定为句子长度的两倍,同学们可以思考一下理由)。

           总结DQN所需的四个元素对应如下:

           i时刻下的state:(EnSen(i), DeSen(i));

           i时刻下的action:beam search得到的每个位置的hypotheses;

           i时刻下的reword:target sentence和DeSen(i+1)的相似度(BLEU score);

           i+1时刻下的state:(EnSen(i), DeSen(i+1));

 

           为了更好的提取句子的特征,作者在decode阶段使用了双向LSTM。同时还在reinforcement learning中加入attention机制,可以达到先decode比较简单的部分再处理困难部分的效果。

           最后在生成相似句子的实验中得到了比只用LSTM decoder效果更好的结论:

 

7、related work

 

 

8、简评

           本文的思想其实非常符合写作的一种情况,就像贾岛推敲的故事,回想小时候刚学习写句子时,也不能一次写好,总会不断对一些词语进行修改。Google DeepMind的文章《DRAW:A Recurrent Neural Network For Image》也和本文异曲同工:画画也不是一次画好,也要不断的完善。不同之处在于本文率先引入DQN做文本生成。在机器学习各个分支下,强化学习和人类与环境的交互方式非常相似,在许多领域开始初露头角,期待看到更多将强化学习结合语言模型的应用。

 

 

 

二、 《DeepReinforcement Learning for Dialogue Generation》

1、作者:Jiwei Li

2、单位:斯坦福

3、关键词:Reinforcement Learning、seq2seq、text generation

4、来源:arXiv.org(2016.06.25)

5、问题:本文提出利用强化学习进行开放领域的文本生成任务,并对比了有监督的seq2seq加attention模型和基于最大互信息的模型

6、模型:

           强化学习中的reward

易被响应(Ease of answering),不容易出现对话僵局,其中 S 是无意义回答合集,s是某一时刻的响应

信息流,若开辟新的话题,有利于对话的继续发展,隐层表示 hpi 和 hpi+1 的夹角余弦

 (3)

语义连贯性,减少与对话无关问题的影响,其中,pseq2seq(a|pi,qi) 是由上一轮状态得到响应的概率,后一项是由当前产生响应通过网络生成之前的 qi 的概率。

最终的reward是对三者加权求和,系数分别为:0.25、0.25、0.5

 

对比试验:

Ÿ   对话初始状态为一个SEQ2SEQ加attention的模型作为强化学习的初始状态

Ÿ   在前面的基础上将最大互信息加入其中作为reward,对于一个给定的输入[pi,qi],可以根据模型生成一个候选回答集合A。对于A中的每一个回答a,从预训练模型中得到的概率分布上可以计算出互信息的值 m(a,[pi,qi])。

Ÿ  


将互信息训练过的模型作为初始模型,用策略梯度更新参数并加入课程学习策略,最终最多限定五轮对话

7、related work

 

8、简评

           本文作者提出了一个强化学习框架,模拟两个agent让其自动对话训练神经网络SEQ2SEQ模型,将Encoder-Decoder模型和强化学习整合,从而能保证使对话轮数增加。文中使用的模型非常简洁,reward函数定义清晰,评价指标也较为科学,可以生成信息更为丰富、易于响应的对话系统。

 

三、 HierarchicalReinforcement Learning for Adaptive Text Generation_lshowway

 

文章作者

德国不莱梅大学的Nina Dethlefs, Heriberto Cuay´ahuitl

 

文章来源和时间

2010年发表于国际自然语言生成会议INLG

 

关键词

NLG, 分层强化学习, 文本生成,wayfinding

 

文章解决的问题

在wayfinding(户内导航对话系统)领域利用分层强化学习进行文本生成。该方法的目标是对wayfinding的NLG任务整合进行优化,并在模拟系统中验证该方法的有效性。

 

相关工作

1.             rule-based

2.             n-gram

3.             flat RL

 

文章思路

本文任务在wayfinding中的NLG任务有多个,且各个任务之间并非独立。从而提出应该根据用户类型,导航距离, 环境条件等作出不同的导航策略,介绍了分层强化学习。

文章将户内导航对话系统的文本生成问题分为四块:

Content Selection:给不熟悉环境的用户的导航要比熟悉环境的用户的导航更细致

Text Structure:根据导航距离以及用户熟悉环境程度给予不同类型的导航,如大白话的,以fisrt, second…表达或者示意性的。

Referring Expression Generation:一间房间可以叫“A203”,也可以叫“办公室”或者“小白楼”

Surface Realisation:往前走可以用“go”也可以用“walk”等。

强化学习示意图如下,分层强化学习的思想与强化学习类似,但在强化学习的基础上加上层次,不同层次的模型处理不同层次的问题。

agent根据当前状态,执行动作a与环境交互,之后环境产生一个新的状态s并返回给agent一个奖赏r(可正可负),强化学习的目标函数便是使agent获得奖赏r最大。

分层增强学习包含L个层,每层N个模型,如Figure 1是有15个agents的hierarchy,其中不同的agent负责不同的层次。例如编码空间环境和用户类型信息,编码句子结构信息等。

每个agent定义为半马尔科夫决策过程,可以表示成一个四元组分别为状态集, 动作集, 转换函数,奖励函数。奖励函数表示agent在时间t状态s是执行动作a转换到新的状态s’所获得的奖励。半马尔科夫的目标是找到policy π*,

使得在从当前状态转换到新的状态获得的累计奖励最多

本文使用两种奖励函数,一种着重在 interaction length, 另一种着重在alignment and variation之间的平衡(具体公式可见论文)。root以及使用第一种, 使用第二种(分层由此可见)。

本文是在模拟环境中进行试验,其中模拟环境包括user type(熟悉环境,不熟悉环境), information need(高,低),length of the current route(短,中长,长),next action to perform(转,直走),current focus of attention(继续走,关注标识)。baseline为为部分agent随机选择action,即不考虑用户类型,导航距离等因素。经与baseline比较,效果较好。

 

资源

文章使用了用于抽取grammatical categories的词性标注工具:http://nlp.stanford.edu/software/tagger.shtml

 

简评

将来的工作:将分层强化学习应用于其他NLG任务

不足之处:实验是在模拟环境下进行的,未来应该在真实环境进行评估。

 

           这三篇文章皆是强化学习在NLP领域的应用,第一篇主要侧重点在于应用DQN进行文本生成,并用BLUE指标进行评价,对比传统的LSTM-decoder和加入DQN之后的结果;第二篇文章侧重点在于虚拟两个Agent,在传统Seq2Seq的基础上加入强化学习从而使得聊天能够持续下去;第三篇文章侧重点在于任务驱动的对话系统应用分层强化学习,针对不同情况进行分层处理。

以上为本期Paperweekly的主要内容,感谢lshowway、美好时光海苔、Tonya三位同学的整理。

您可能感兴趣的与本文相关的镜像

Qwen3-8B

Qwen3-8B

文本生成
Qwen3

Qwen3 是 Qwen 系列中的最新一代大型语言模型,提供了一整套密集型和专家混合(MoE)模型。基于广泛的训练,Qwen3 在推理、指令执行、代理能力和多语言支持方面取得了突破性进展

### 强化学习文本生成中的应用 强化学习(Reinforcement Learning, RL)是一种通过与环境交互来学习最优策略的机器学习方法。在自然语言生成(Natural Language Generation, NLG)任务中,RL被用来优化生成文本的质量和多样性,特别是在需要长期规划和复杂决策的任务中表现突出。 #### 1. **Seq2Seq模型与强化学习结合** 传统的文本生成方法通常基于序列到序列(Sequence-to-Sequence, Seq2Seq)模型,该模型由编码器和解码器组成。编码器负责将输入序列转换为一个固定长度的上下文向量,解码器则根据这个上下文向量生成目标序列。然而,这种结构在训练过程中依赖于教师强制(Teacher Forcing),即每一步都使用真实的前一步输出作为下一个时间步的输入,而在推理阶段则是使用模型自身生成的输出作为下一步的输入,导致了训练和推理之间的不一致问题。 为了克服这一问题,研究者引入了强化学习的思想。通过将文本生成视为一个马尔可夫决策过程(Markov Decision Process, MDP),模型可以在每一步选择动作(即生成下一个词),并根据全局奖励函数获得反馈,从而调整其策略以最大化累积奖励。这种方法被称为**Policy Gradient**,它允许模型直接优化与最终输出质量相关的指标,如BLEU、ROUGE等自动评估指标或人类评价指标。 例如,在对话系统中,可以设计一个奖励函数来衡量生成回复的相关性、流畅性和多样性,使得模型能够更好地满足用户的期望[^1]。 #### 2. **深度强化学习框架的应用** 在实际应用中,深度强化学习(Deep Reinforcement Learning, DRL)技术被广泛应用于文本生成任务。DRL结合了深度神经网络的强大表示能力与强化学习的决策机制,能够在复杂的环境中进行有效的学习。常见的DRL算法包括深度Q网络(Deep Q-Network, DQN)、Actor-Critic架构以及近端策略优化(Proximal Policy Optimization, PPO)等。 - **DQN**:适用于离散动作空间的问题,但在文本生成中由于词汇表较大,直接应用DQN可能会面临维度灾难的问题。 - **Actor-Critic**:该方法同时维护两个模型——Actor用于生成动作,Critic用于评估当前状态的价值。这种双模型结构有助于更稳定地更新策略,因此在文本生成任务中得到了广泛应用。 - **PPO**:作为一种改进版的Policy Gradient方法,PPO通过引入信任区域的概念来限制每次更新的幅度,从而保证训练过程更加稳定和高效。 此外,OpenAI Gym、TensorFlow和PyTorch等工具和框架也为实现这些算法提供了便利。其中,PyTorch因其动态计算图的优势,在处理变长序列数据时表现出色,成为许多研究人员的首选工具之一[^2]。 #### 3. **奖励函数的设计** 在使用强化学习进行文本生成时,奖励函数的设计至关重要。合理的奖励函数不仅可以引导模型生成高质量的文本,还可以加速训练过程。常见的奖励函数设计方式包括: - **自动评估指标**:如BLEU、ROUGE、METEOR等,它们可以量化生成文本与参考答案之间的相似度。 - **人类反馈**:通过收集用户对生成文本的评分或偏好信息,构建基于人类感知的奖励信号。InstructGPT项目就采用了这种方式,通过对预训练模型进行微调,并结合强化学习进行人类偏好对齐,显著提升了模型的表现[^3]。 - **内部一致性**:检查生成文本是否前后连贯,逻辑是否自洽。 - **新颖性**:鼓励模型生成具有创意性的内容,避免重复或过于保守的结果。 #### 4. **挑战与解决方案** 尽管强化学习文本生成领域展现出了巨大潜力,但也面临着一些挑战: - **稀疏奖励问题**:在某些情况下,模型可能很难获得有意义的奖励信号,尤其是在初期阶段。为了解决这个问题,可以采用课程学习(Curriculum Learning)策略,逐步增加任务难度;或者利用模仿学习(Imitation Learning)先让模型学会模仿专家行为,再过渡到完全自主探索。 - **多任务并行问题**:当需要同时处理多个相关任务时,如何有效地共享知识并协调不同任务之间的关系成为一个难题。一种可能的解决方案是采用多智能体强化学习(Multi-Agent Reinforcement Learning, MARL)框架,让每个任务对应一个独立但相互协作的智能体。 - **收敛速度慢**:相比于监督学习,强化学习的训练周期往往较长。为此,可以通过分布式并行训练(Distributed Parallel Training)来加速训练过程,例如使用A3C(Asynchronous Advantage Actor-Critic)算法或多GPU/TPU集群进行大规模并行计算。 综上所述,强化学习文本生成提供了一种全新的视角和强有力的工具。通过合理设计奖励函数、选择合适的算法及优化策略,可以在多种NLG任务中取得优异的成绩。未来的研究方向可能集中在进一步提升模型泛化能力和鲁棒性,以及探索更多实际应用场景等方面。 ```python # 示例代码:简单的Policy Gradient实现 import torch import torch.nn as nn import torch.optim as optim class PolicyNetwork(nn.Module): def __init__(self, vocab_size, embedding_dim, hidden_dim): super(PolicyNetwork, self).__init__() self.embeddings = nn.Embedding(vocab_size, embedding_dim) self.lstm = nn.LSTM(embedding_dim, hidden_dim) self.linear = nn.Linear(hidden_dim, vocab_size) def forward(self, inputs, hidden): x = self.embeddings(inputs) x, hidden = self.lstm(x.unsqueeze(0), hidden) x = self.linear(x.squeeze(0)) return x, hidden def train_policy_gradient(model, optimizer, episodes, max_len=20): model.train() for episode in range(episodes): hidden = None rewards = [] log_probs = [] # 假设inputs是已有的历史输入 inputs = torch.randint(low=0, high=vocab_size, size=(max_len,)) target = torch.randint(low=0, high=vocab_size, size=(max_len,)) total_reward = 0 for t in range(max_len): output, hidden = model(inputs[t], hidden) action_logits = output action_dist = torch.distributions.Categorical(logits=action_logits) action = action_dist.sample() # 计算即时奖励(这里仅为示例) reward = compute_reward(action.item(), target[t].item()) total_reward += reward log_prob = action_dist.log_prob(action) log_probs.append(log_prob) rewards.append(reward) # 计算总回报并更新策略 discounted_rewards = discount_rewards(rewards) policy_loss = [-log_prob * r for log_prob, r in zip(log_probs, discounted_rewards)] loss = torch.stack(policy_loss).sum() optimizer.zero_grad() loss.backward() optimizer.step() print(f"Episode {episode+1}, Total Reward: {total_reward}") # 辅助函数:折扣奖励 def discount_rewards(rewards, gamma=0.99): R = 0 discounted_rewards = [] for r in reversed(rewards): R = r + gamma * R discounted_rewards.insert(0, R) return discounted_rewards # 辅助函数:计算奖励(此处仅为示例) def compute_reward(predicted_token, true_token): if predicted_token == true_token: return 1.0 else: return -0.1 # 初始化参数 vocab_size = 10000 embedding_dim = 256 hidden_dim = 512 learning_rate = 0.001 episodes = 100 model = PolicyNetwork(vocab_size, embedding_dim, hidden_dim) optimizer = optim.Adam(model.parameters(), lr=learning_rate) train_policy_gradient(model, optimizer, episodes) ``` ---
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值