如何用简单例子讲解 Q - learning 的具体过程?

作者:牛阿
链接:https://www.zhihu.com/question/26408259/answer/123230350
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

2017年06月05日更新,最近重写了一遍代码,Flappy Bird Q-learning。你可以在这里试着训练一下,加到最大帧数,在一两分钟内就可以达到10+的分数。原答案:最近看到了一个回答。答主用汇编语言写了一个flappy bird并在其之上加了一个Q-learning的算法让小鸟自己学习怎么飞。程序员们有些什么好玩儿的程序分享? - 岳大禹的回答我觉得挺有趣的,就研究了一下。答主的汇编项目没有仔细看(因为不懂汇编语言),不过看了他提到的JavaScript项目(Flappy Bird hack using Reinforcement Learning),并且尝试自己照着实现了一下,效果还不错。看到这道题题主希望用简单的例子介绍Q-learning,于是就想通过小鸟的例子,介绍一下Q-learning的过程。问题分析 让小鸟学习怎么飞是一个强化学习(reinforcement learning)的过程,强化学习中有状态(state)、动作(action)、奖赏(reward)这三个要素。智能体(Agent,在这里就是指我们聪明的小鸟)需要根据当前状态来采取动作,获得相应的奖赏之后,再去改进这些动作,使得下次再到相同状态时,智能体能做出更优的动作。状态的选择
在这个问题中,状态的提取方式可以有很多种:比如说取整个游戏画面做图像处理啊,或是根据小鸟的高度和管子的距离啊。在这里选用的是跟SarvagyaVaish项目相同的状态提取方式,即取小鸟到下一根下侧管子的水平距离和垂直距离差作为小鸟的状态:(图片来自Flappy Bird RL by SarvagyaVaish)记这个状态为,为水平距离,为垂直距离。动作的选择
小鸟只有两种动作可选:1.向上飞一下,2.什么都不做。奖赏的选择
这里采用的方式是:小鸟活着时,每一帧给予1的奖赏;若死亡,则给予-1000的奖赏;若成功经过一个水管,则给予50的奖赏。关于Q 提到Q-learning,我们需要先了解Q的含义。Q为动作效用函数(action-utility function),用于评价在特定状态下采取某个动作的优劣,可以将之理解为智能体(Agent,我们聪明的小鸟)的大脑。我们可以把Q当做是一张表。表中的每一行是一个状态,每一列(这个问题中共有两列)表示一个动作(飞与不飞)。例如:这张表一共 行,表示 个状态,每个状态所对应的动作都有一个效用值。训练之后的小鸟在某个位置处飞与不飞的决策就是通过这张表确定的。小鸟会先去根据当前所在位置查找到对应的行,然后再比较两列的值(飞与不飞)的大小,选择值较大的动作作为当前帧的动作。训练 那么这个Q是怎么训练得来的呢,贴一段伪代码。Initialize Q arbitrarily //随机初始化Q值
Repeat (for each episode): //每一次游戏,从小鸟出生到死亡是一个episode
Initialize S //小鸟刚开始飞,S为初始位置的状态
Repeat (for each step of episode):
根据当前Q和位置S,使用一种策略,得到动作A //这个策略可以是ε-greedy等
做了动作A,小鸟到达新的位置S’,并获得奖励R //奖励可以是1,50或者-1000
Q(S,A) ← (1-α)Q(S,A) + α[R + γ*maxQ(S’,a)] //在Q中更新S
S ← S’
until S is terminal //即到小鸟死亡为止
其中有两个值得注意的地方1.“根据当前Q和位置S,使用一种策略,得到动作A,这个策略可以是ε-greedy等。”这里便是题主所疑惑的问题,如何在探索与经验之间平衡?假如我们的小鸟在训练过程中,每次都采取当前状态效用值最大的动作,那会不会有更好的选择一直没有被探索到?小鸟一直会被桎梏在以往的经验之中。而假若小鸟在这里每次随机选取一个动作,会不会因为探索了太多无用的状态而导致收敛缓慢?于是就有人提出了ε-greedy方法,即每个状态有ε的概率进行探索(即随机选取飞或不飞),而剩下的1-ε的概率则进行开发(选取当前状态下效用值较大的那个动作)。ε一般取值较小,0.01即可。当然除了ε-greedy方法还有一些效果更好的方法,不过可能复杂很多。以此也可以看出,Q-learning并非每次迭代都沿当前Q值最高的路径前进。2. 这个就是Q-learning的训练公式了。其中α为学习速率(learning rate),γ为折扣因子(discount factor)。根据公式可以看出,学习速率α越大,保留之前训练的效果就越少。折扣因子γ越大,所起到的作用就越大。但指什么呢?小鸟在对状态进行更新时,会考虑到眼前利益(R),和记忆中的利益()。指的便是记忆中的利益。它是指小鸟记忆里下一个状态的动作中效用值的最大值。如果小鸟之前在下一个状态的某个动作上吃过甜头(选择了某个动作之后获得了50的奖赏),那么它就更希望提早地得知这个消息,以便下回在状态可以通过选择正确的动作继续进入这个吃甜头的状态。可以看出,γ越大,小鸟就会越重视以往经验,越小,小鸟只重视眼前利益(R)。根据上面的伪代码,就可以写出Q-learning的代码了。成果 训练后的小鸟一直挂在那里可以飞到几千分~

<think>好的,用户想了解Learning to Rank(LTR)在精排阶段的应用场景和具体实现方式。首先,我需要回顾一下LTR的基本概念和分类,确保自己理解正确。根据引用[2],LTR是机器学习的一个子领域,专注于训练模型来对实例进行排序,常用的方法有Pointwise、Pairwise和Listwise三种。用户提到的是精排阶段,通常在推荐系统或搜索引擎中,精排是在召回和粗排之后进行的,用于对少量候选进行更精细的排序。 接下来,应用场景方面,常见的应该是搜索引擎、电商推荐、广告排序等。需要结合引用中的例子,比如引用[3]提到用XGBoost实现,这可能是一个具体的应用实例。需要说明不同场景下LTR如何应用,比如在电商中按用户偏好排序商品,搜索引擎中按相关性排序结果等。 然后是具体实现方法,这里要分步骤说明。首先数据准备,需要标注好的数据,比如点击率、购买行为等作为标签。然后特征工程,提取用户、物品、上下文等特征。模型选择方面,Pointwise、Pairwise、Listwise各有不同,根据引用[1],Listwise方法效果更好,可能需要详细解释。例如,ListNet或LambdaMART这样的模型。引用[3]中的XGBoost实现可能用的是LambdaMART,因为XGBoost支持这样的目标函数。 还要考虑模型训练和评估,使用NDCG、MAP等指标。最后模型上线,如何集成到系统中,比如实时排序服务。需要确保每个步骤都清晰,并且结合引用中的信息,比如引用[3]的代码示例,说明具体实现时可以使用的工具和库。 用户可能还希望了解不同方法之间的比较,比如为什么Listwise更好,这时候可以引用[1]中的研究结果。此外,是否需要提到优化技巧,比如特征选择、模型调参等?可能对用户有帮助,但根据问题,主要关注应用场景和实现方法,所以可以简要带过。 最后,检查是否需要生成相关问题。用户的问题末尾可能需要相关问题,比如不同方法的区别、评估指标、具体框架的使用等。需要确保问题与主题相关,并引导进一步学习。 总结回答结构:先介绍LTR在精排的应用场景,再分步骤讲解实现方法,结合引用中的例子,最后给出相关问题。</think>### Learning to Rank在精排阶段的应用与实现 #### 一、应用场景 Learning to Rank(LTR)在精排阶段主要用于对候选集进行精细化排序,典型场景包括: 1. **搜索引擎**:根据用户查询对搜索结果按相关性排序,例如Google的网页排序[^2]。 2. **电商推荐**:基于用户行为(点击/购买)对商品列表排序,如淘宝的“猜你喜欢”。 3. **广告系统**:按点击率或转化率对广告候选进行排序,最大化平台收益。 4. **新闻/视频推荐**:结合内容相关性和用户兴趣对内容优先级排序。 #### 二、实现方法 ##### 1. 数据准备 - **标注数据**:使用隐式反馈(点击、停留时长)或显式评分(用户打分)作为标签,构建三元组$(q, d, y)$,其中$q$为查询/用户,$d$为文档/商品,$y$为目标值。 - **特征工程**: - **用户特征**:历史行为、人口属性 - **物品特征**:文本内容、类别标签 - **上下文特征**:时间、地理位置 - **交互特征**:CTR、转化率 ##### 2. 模型选择 - **Pointwise**:将排序问题转化为回归或分类任务,直接预测单个物品的得分。例如用XGBoost预测点击概率[^3]。 - **Pairwise**:比较物品对的相对顺序,常用RankSVM或GBDT实现。 - **Listwise**:直接优化列表级指标(如NDCG),例如ListNet或LambdaMART。研究表明Listwise方法效果最优[^1]。 ##### 3. 模型训练(以LambdaMART为例) ```python import xgboost as xgb # 定义排序目标函数 params = { "objective": "rank:ndcg", "eval_metric": "ndcg@5", "eta": 0.1 } # 训练模型(需提供query分组信息) model = xgb.train(params, dtrain, num_boost_round=100, evals=[(dtrain, "train")]) ``` ##### 4. 评估与部署 - **评估指标**: - NDCG@K:考虑位置权重的排序质量 - MAP:平均准确率 - MRR:首个相关结果的位置倒数 - **线上部署**:将模型封装为API服务,实时接收候选集并返回排序结果。 #### 三、实例说明 **案例:电商精排系统** 1. 输入:召回层返回的100个商品候选 2. 特征提取:商品价格、历史CTR、用户浏览记录等200+维度 3. 模型推理:通过预训练的LambdaMART模型计算得分 4. 输出:按得分降序排列的TOP10商品列表 实验表明,使用Listwise方法可使NDCG@10提升15%以上[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值