2026-8-3 15:12:14 [显示全部楼层]
50浏览
查看: 50|回复: 0

强化学习:驯服小狗App

[复制链接]
本帖最后由 szjuliet 于 2026-8-3 16:43 编辑

强化学习:驯服小狗App

挑战

强化学习:驯服小狗

学习是一种奇妙的现象,指人类与动物学习做出特定行为,用以响应环境刺激的过程。但毋庸置疑,在学习过程中引入反馈机制(奖励与惩罚),能够巩固学习效果、加快学习进程。

在本项目中,你将接触一种机器学习算法 ——强化学习(RL),学习如何利用奖励与惩罚机制,模拟并强化学习过程。

一、App制作教程

(难度:高级)

1. 引言

在本项目中,我们将探究强化学习(RL)。强化学习是人工智能领域主流机器学习方法之一,与监督学习、无监督学习并列。我们将以 “训狗” 这一场景为例,讲解强化学习的核心思想。在本次模拟场景中,我们需要训练一只初始处于站立状态的小狗:

当主人发出指令 “坐下!” 或 “握手!” 时,让小狗做出坐下或握手的动作。

小狗一开始听不懂任何指令,会随机做出各种动作。不过,每一次下达指令后,主人都会给予小狗正向反馈(即奖励,例如:“乖狗狗!”)或是负向反馈(即惩罚,例如:“不行!”)。

依靠不同类型的反馈(奖励 / 惩罚),小狗形成训练 “记忆”,也就是记住什么动作会带来什么样的结果

不断累积的奖励与惩罚数值,会存放在一张 2×2 的表格中,我们称之为Q 表(Q-Table)

表格行标题为主人发出的指令:“坐下!”、“握手!”

表格列标题为小狗执行的动作:坐下、握手。

(为简化表述,我们统一将指令和动作简称为 SIT(坐下)、SHAKE(握手))

表格单元格内的初始数值全部为 0。在每一轮训练过程中,程序会通过公式更新数值(教程最后部分会讲解该公式!):

其中:

Q(c,a):Q[command,action]

α: 学习率(Learning Rate)

专业术语

  • Q-Table:Q 表,强化学习 核心数据表
  • Learning Rate (α):学习率,控制模型更新幅度

2. 用户界面(UI)

为方便大家专注理解本项目中强化学习的核心原理,配套的用户界面(UI)已经预先搭建完成。

注意:若在用户界面默认的手机尺寸视图下,无法完整显示整个界面,可以切换至平板尺寸,就能一次性查看全部内容。

3.变量初始化

接下来切换到逻辑设计。

程序首先需要对将要使用的变量进行初始化。

变量 STAND(站立)、SIT(坐下)、SHAKE(握手) 代表小狗的不同状态,分别赋值数字 0、1、2(而非文本),方便程序进行数值运算与处理。

变量 command(指令)与 action(动作)初始值均设为 0,后续用来记录用户下达的当前指令,以及小狗选择执行的动作。这两个变量后续会被赋值为 SIT(1)或者 SHAKE(2)。

变量 reward(奖励)初始化为 0。小狗获得奖励时该值为 + 1,受到惩罚时该值为 - 1。

变量 counter(计数器)用于统计训练的轮次,初始值设为 0。

变量 learningRate(学习率)控制小狗的学习速度,代表小狗从过往经历中学习的快慢。举例:当学习率为 1(100%),小狗会立刻根据本次奖励或惩罚记住该怎么做、不该怎么做;当学习率为 0(0%),无论得到奖励还是惩罚,小狗都无法从中学习。本项目学习率初始设置为 0.5(50%),介于完全学会和完全无法学习两者中间(或许这比较贴近真实小狗的学习水平?)。

变量 Qtable(Q 表)用来存储前文提到的 2×2 矩阵,也就是小狗的训练记忆。(App Inventor 原生没有矩阵数据结构,因此我们使用列表嵌套列表存放数据。你务必理解嵌套列表如何对应 2×2 矩阵,后续会频繁操作 Q 表。)

在训练开始前,没有任何训练记忆,因此矩阵内所有数值初始都为 0:

按照下文所示,初始化变量 Qtable。

4. Q 表过程

研读下面这几个 Q 表过程:

  • 第一个过程用于读取 Q 表中的一行,一行由两个数字组成的列表构成;

  • 第二个过程用于读取 Q 表里指定单元格的数值;

  • 第三个过程用于给 Q 表中指定单元格赋值。

请注意:后两个过程在定义时,都调用了第一个过程。

下面提供一些示例,帮助加深你对 Q 表的理解。注意:你不需要在代码里复现这些示例。

以下方的 Q 表为例

(等价于这份 Q 表)

Q 表第 1 行是包含两个数字的列表:[0.25, -0.15]

在代码中,过程 get_QTableRow(1) 会返回由 0.25 和 -0.15 组成的列表。

同理,Q 表第 2 行是包含两个数字的列表:[-0.35, 0.45]

在代码中,过程 get_QTableRow(2) 会返回由 -0.35 和 0.45 组成的列表。

下面定位 Q 表中某个单元格:Q 表第 2 行第 1 列,数值为:-0.35。

在代码中,过程 get_QTableCell(2,1) 返回数值 -0.35。

思考:Q 表第 1 行第 2 列的值是多少?

也就是过程 get_QTableCell(1,2) 会返回什么数值?

Q-Table (1,2)

参考答案
-0.15

思考:调用过程 set_QTableCell(1,2,-0.75) 的作用是什么?

Q 表赋值操作

参考答案
调用该过程会修改 Q 表第 1 行、第 2 列对应的单元格;

将原本的数值 -0.15 替换为 -0.75,表格就会更新为如下状态。

借助这些过程,访问、修改 Q 表矩阵,会比直接操作嵌套列表更加简便。

5. 学习率滑动条

研读这段积木代码。你能否说明移动学习率滑动条(LearningRateSlider)时,程序会执行什么操作?

解析

变量 learningRate 会被赋值为滑动条的滑块位置数值,同时界面上对应的文本标签会同步更新,在用户界面展示该数值。

6.重置RESET按钮

研读这段代码,尝试说明点击【重置】按钮时会发生什么。

解析

  • Q 表内所有数值重新初始化为 0,并通过printQTable子程序在界面上展示这些数值。

  • 变量counter(训练计数器)与reward(奖励值)设为 0;变量command(指令)和action(动作)同样初始化为 STAND(对应数字 0)。

  • learningRate(学习率)、对应的文本标签,以及学习率滑动条滑块位置,全部重新初始化为 0.5。

  • 显示训练轮次的标签重置为 0。

  • 小狗图片切换为 “站立” 状态图片。

  • 指令提示标签恢复初始文字:“你想让小狗做什么?”

  • 奖励按钮与惩罚按钮设置为不可点击;坐下按钮、握手按钮设置为可点击。

所有内容恢复至训练开始前的初始状态。

7. 坐下SIT按钮与握手SHAKE按钮

研读这段代码。请说明点击【SIT】按钮时程序执行的逻辑。稍后我们会讲解 chooseActionshowDogAction 这两个过程的作用。留意点击按钮时,counter(计数器)变量是如何更新的。

接下来,参照上述代码编写 whenShakeButton.Click 事件处理程序。你可以大量使用复制粘贴(快捷键 Ctrl-C / Ctrl-V),仅做少量修改即可完成。

参考实现方案

8. 过程:findMaxAction(寻找最优动作)

接下来定义过程 findMaxAction。该过程借助 Q 表,根据用户下达的指令选出最优行动方案。

当收到指令 “坐下!” 时,程序读取 Q 表的第一行,对比该行两个单元格内的 Q 值,选择数值更大的一项对应的动作。

当收到指令 “握手!” 时,程序读取 Q 表的第二行,对比该行两个单元格内的 Q 值,选择数值更大的一项对应的动作。

举个例子:训练过程中某一刻 Q 表数值如下所示:

此时用户发出指令 “坐下!”。程序检索矩阵第一行,第一个单元格数值为 0.25,大于 - 0.15。因此依据 Q 表,小狗的最优动作就是坐下。

参考实现方案

注意:【列表最大值】积木位于【数学】分类模块中,在【算术平均数】(平均数)积木的下拉菜单内可以找到。

该过程会返回拥有更大 Q 值对应的列索引:1(坐下 SIT)或者 2(握手 SHAKE)。

这也就是我们将变量 SIT、SHAKE 设置为数字 1、2,而非文本格式的原因。

9. 过程:chooseAction(选择动作)

接下来定义 chooseAction 过程。该过程根据用户发出的指令,决定小狗做出何种行为。

定义这个过程有多种方式。我们先采用下面这套简易方案:在前 10 次训练尝试中,假定小狗毫无头绪,无论收到什么指令,只是随机做出坐下或者握手的动作。小狗需要一段时间,才能意识到指令、自身动作与后续奖励之间存在关联。

10 次尝试之后,小狗逐渐学会思考,开始参考训练记忆,依据 Q 表给出的最优动作执行行为。最优动作将由 findMaxAction 过程计算得出。

参考实现方案

提示:在本项目的拓展任务中,你可以尝试使用更进阶的方式编写该过程。

10. 过程:showDogAction(展示小狗动作)

该过程根据小狗执行的动作,决定显示小狗对应的图片。请再次核对,确保理解这段逻辑。

11. 奖励按钮RewardButton与惩罚按钮PenaltyButton

下方代码演示完整流程:用户下达指令,小狗做出动作,用户点击【Reward奖励】按钮给予反馈。

首先,变量 reward 赋值为 +1。(如果点击【惩罚】按钮,reward 值设置为 -1)。随后程序执行运算(后续讲解),更新 Q 表,并在界面上展示更新后的 Q 表。
执行完成后,需要禁用【RewardButton】和【PenaltyButton】,同时启用【SitButton】与【ShakeButton】,开启新一轮训练。

以【RewardButton】代码作为参照,编写 PenaltyButton.Click(惩罚按钮点击) 事件处理程序。你可以直接复制代码再修改。

参考实现方案

12. 过程:printQTable(打印 Q 表)

该过程用于展示 Q 表当前状态:读取 Qtable 变量里每行、每列的数据,将内容填充到界面对应的标签组件上。

13. 更新 Q 表

接下来我们学习强化学习中的核心公式:当用户下达指令 (c)、小狗执行动作 (a),并且用户根据小狗的行为给出反馈(奖励 + 1 或惩罚 - 1)时,如何更新 Q 表数值。

(Q(c,a)) 代表在用户指令 (c)、小狗动作 (a) 对应的 Q 表数值。(记住:指令对应表格行,动作对应表格列)下方公式用于更新 (Q(c,a)):

式中 α:学习率

结合示意图理解公式:

新 Q 值是 当前奖励(+1 或 - 1)原有 Q 值(过往训练记忆) 的加权平均值。

公式通过权重 (\alpha)(学习率)与 (1-\alpha)(学习率补数),决定更侧重当下的奖励反馈,还是过往训练积累的经验。

举例说明:

若学习率为 100%(小狗瞬间完全学会),(\alpha=1,1-\alpha=0),新 Q 值直接等于本次奖励(+1 或 - 1)。

反之,学习率 0%(小狗完全无法学习),(\alpha=0,1-\alpha=1),新 Q 值与旧 Q 值保持不变,没有任何更新。

再举一例:

沿用上述 Q 表,学习率设置为 0.7(70%),指令为 “坐下!”,小狗做出坐下动作。

位置 Q [1,1] 新 Q 值计算:

(Q[1,1] = 0.7×(+1)+(1-0.7)×0.25 = 0.7×1+0.3×0.25 = 0.775)

根据上面 Q 表更新规则编写对应过程:

参考实现方案

想要让加法积木与 QTable (行,列) 积木布局更紧凑,可以右键积木,选择【外部输入】。该设置会将参数由横向排布改为纵向对齐。

14. 测试

使用 AI2 伴侣生成的二维码扫码,测试你的应用。

全面测试所有功能,观察小狗在前 10 次随机动作之后,能否按照设定的学习率进行学习。

尝试设置不同学习率(例如:0.00、0.25、0.50、0.75、1.0),验证学习效果和学习率参数相匹配。

恭喜!你完成了第一个人工智能强化学习(RL)项目。

二、拓展你的应用

深入探究1

当你成功训练小狗之后,能否再 “逆向训练” 它,让它总是做出错误动作?

深入探究2

你能否添加学习曲线图,展示正确动作的累计占比?

界面中已经预置好图表组件 Chart1,只需将其设置为可见即可使用。注意:你可能需要在界面中向下滚动,才能看到该图表。

深入探究3

新增一个名为记忆响应度(Memory Responsiveness)的参数,用于衡量小狗对过往训练记忆的敏感程度。大多数动物(包括人类)都需要一段时间,才会开始参考训练记忆。记忆里积累的奖惩感受,需要达到足够高的阈值,生物才能够理解训练传递的信息,进而做出合适的行为。

基于这个新参数修改 chooseAction 过程。原先我们硬性设定:前 10 次训练随机行动。现在依靠该参数,可以优化逻辑,让程序根据 Q 表数值何时具备参考价值,更自然地切换行为策略。

在界面中,将存放滑动条的【水平布局 1】与【水平布局 2】设置为可见。

提示

如果小狗的记忆响应度很高,即便微小的 Q 值(接近 0),也会促使小狗依照训练经验行动;

如果记忆响应度很低,即便 Q 值很大(接近 + 1 或 - 1),小狗也难以依靠记忆做判断。

下文提供一份参考修改方案,改造 chooseAction 过程,引入记忆响应度参数。

深入探究4

如果指令不再是 2 种,而是 3 种,本项目需要做出哪些改动?

新增指令:“坐下!”、“握手!” 以及 “打滚!”

修改界面与代码,实现这个新版本。

你还有哪些很棒的拓展创意?



RL_TametheDog_Starter.zip

75.38 KB, 下载次数: 0

售价: 1 创造力  [记录]  [购买]

App Inventor项目初始文件

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2026 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail