token生成算法_基于Actor-Critic算法的序列预测

本文深入探讨了一种基于强化学习的Actor-Critic算法在序列生成任务中的应用,旨在解决训练与预测之间的不一致问题。论文提出使用critic网络来指导序列预测网络(actor)的训练,通过优化与任务相关的指标而非传统的log-likelihood。这种方法利用强化学习的reward机制,结合target network和temporal-difference学习,有效应对大规模动作空间的挑战,实现了序列预测性能的提升。
摘要由CSDN通过智能技术生成

8b4409517368740b1d1f64c3efd5450a.png

这篇文章主要介绍发表在ICLR 2017上的论文

An Actor-Critic Algorithm For Sequence Prediction​arxiv.org

该论文利用强化学习中的Actor-Critic算法来训练神经网络并生成序列。基于log-likelihood的训练方法模型在训练和预测是不一致的。在训练的时候模型输入ground-truth tokens来生成下一个token,然而在预测时使用模型输出的tokens来生成下一个token。而作者提出的方法能够使训练过程和预测尽可能的相近,并且可以直接优化与任务相关的指标。下面具体介绍这篇论文。

1、Introduction

标准的训练RNN来生成序列的方法是最大化给定正确序列预测下一个token的log-likelihood,这种方法也叫做 teacher forcing 。在预测时,通过使用beam search等方法来根据学到的分布产生最可能正确的候选序列。但是在搜索过程中,模型是根据自己之前的输出来预测分布,而不是根据真实输出,这就是训练和预测矛盾的地方。已有的方法通过训练时从模型输出中采样的方法来尽可能避免这种问题,而这篇论文作者提出用强化学习的方法来直接提升测试指标(不再是log-likelihood)。作者使用critic网络来输出每个token的value,作者将其定义为如果网络输出token后并持续的根据概率分布采样输出时与具体任务相关的期望分数,也就是和状态动作值函数类似。这些预测的value可以指导序列预测网络的训练,也就是actor。

强化学习研究的是一种形式为reward的弱监督信息,这个reward和某个与具体任务相关的指标是标记类似的,而序列生成任务属于有监督学习的范畴,在这种设置下作者让critic的输入为ground-truth序列,也就是critic可以得到有更好reward甚至最优reward的专家动作序列。作者用时序差分的方法来训练critic,当然也用了“deep RL”的方法,比如target network。

2、Background

首先介绍论文中的符号。输入为

,输出序列为
是所有token的集合。用
表示子序列
。训练好的模型为
,用与具体任务相关的指标
来评估
,其中
。用
来表示输出序列的长度,为了方便忽略每个输出长度不同的事实。用
表示
时刻RNN的输出,
表示输入,通过
来得到概率分布,那么得到序列的方法如下

4677febd581ca9d1bf669d42d1569f7e.png

作者用soft attention机制来生成序列,也就是下面的公式

e77186aff6c4b45b1e945cd674d09e02.png

是attention函数,可以用一个MLP来计算。
是将
编码后的vector,可以看作是encoder的输出。作者将上面的RNN看作是生成actions的policy,并且将具体任务的指标(比如BLEU分数)作为 return。更一般的,作者将return
定义为可以在中间过程得到的reward的形式,也就是
。有中间reward会使cirtic的学习更容易,在后文中作者也提出一个奖励重塑的方法。给定policy,actions和reward,作者定义值函数 value为基于当前状态的未来回报的期望,具体定义如下

de65f8e78e664c15bec422c12204715e.png

状态动作值函数如下,

5363b98950dc8a087a2ca22439c5f2c0.png

3、Actor-Critic For Sequence Prediction

表示actor的参数,值函数对参数的梯度为

187d01478db2ef514d47d57cbf9beb74.png

注意到作者在公式里使用了概率而没有使用概率的log形式。上式直观的意义是使得高value的动作的概率更大,降低 value的动作概率。上式的无偏估计为

ce72438166da6ffba9d0618847b998f6.png

为了降低方差,可以用参数化的

来代替
,也即是critic。与REINFORCE算法对比,REINFORCE的内部求和可以看作是1-sample的估计,也就是下式,因此方差会比较大

7563cb89f16ebbe11c4c75bac3b11f01.png

作者用参数为

的RNN实现critic,critic用来输出
。与actor的不同是cirtic的输入是ground-truth的
,因为
是关于
的函数。critic也只是在训练的过程中使用,在预测时并不需要critic。整体训练过程如下

732b05f031fddcaf634cf6f38f73cf9f.png

Temporal-difference learning 如果用Monte-Carlo的方法得到回报然后用最小化均方误差的方法会早成比较大的方差,作者使用时序差分的方法来训练critic,也就是用

dcf3c4c4a2bfd274bc7eca44d258ff4f.png

作为

的目标。

Applying deep RL techniques 作者使用target network并用DDPG的方法来更新参数,这样会使得critic的输出更稳定。

Dealing with large action spaces 由于NLP中词表中词的个数巨大,因此动作空间也是非常大的,训练不容易收敛。作者对于不常被采样的词加了一个限制,也就是使得每次的输出与平均值更接近

9ba37b18e01d1e0594b839ce457983a7.png

Reward shaping 由于在最后一个时刻得到的score是一个非常稀疏的训练信息,作者对于不完整的序列有

,对于完整序列有
。也就是对于一个预测序列
,计算所有前缀的score
,这样有

Putting it all together 将以上方法整合在一个,论文的算法如下

64e99a4e109e7ad1b7e5d59b793c5439.png

b0078a5996d8dbad356827513335f47b.png

文中的实验部分此处不再赘述,感兴趣的可以参考原文。

Python中的文本相似度可以通过基于TF-IDF和余弦相似度算法来实现。TF-IDF(Term Frequency-Inverse Document Frequency)是用于评估一个词语在一个文档中的重要程度的方法。 首先,我们需要使用Python中的文本处理库(如nltk)来对文本进行预处理,包括分词、去除停用词、词干化等。接下来,我们可以使用sklearn库中的TF-IDF向量化器来将文本转换为TF-IDF特征向量。 然后,我们可以使用余弦相似度算法来计算两个文本之间的相似度。余弦相似度是通过计算两个向量之间的夹角来度量它们的相似程度的。 以下是一个简单的示例代码: ```python import nltk from nltk.corpus import stopwords from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity def preprocess_text(text): # 分词 tokens = nltk.word_tokenize(text) # 去除停用词 stop_words = set(stopwords.words('english')) tokens = [token for token in tokens if token.lower() not in stop_words] # 词干化 stemmer = nltk.PorterStemmer() tokens = [stemmer.stem(token) for token in tokens] # 返回处理后的文本 return " ".join(tokens) def calculate_similarity(text1, text2): # 预处理文本 processed_text1 = preprocess_text(text1) processed_text2 = preprocess_text(text2) # 转换为TF-IDF特征向量 vectorizer = TfidfVectorizer() tfidf_matrix = vectorizer.fit_transform([processed_text1, processed_text2]) # 计算余弦相似度 cosine_sim = cosine_similarity(tfidf_matrix[0], tfidf_matrix[1]) # 返回相似度 return cosine_sim[0][0] text1 = "今天天气不错" text2 = "今天天气很好" similarity = calculate_similarity(text1, text2) print("文本1和文本2的相似度为:", similarity) ``` 在以上示例中,我们先对文本进行了预处理,并使用TF-IDF向量化器将其转换为特征向量。然后,我们使用余弦相似度算法计算了文本1和文本2之间的相似度,并输出结果。 这只是一个简单的示例,实际应用中可能需要更多的预处理步骤和参数调整来获得更好的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值