Q-Learning以及.NET环境下的实现

写在前面

看过我的文章的朋友应该都知道,我之前一直在研究视觉相关的知识,也看了一些卷积神经网络(CNN),深度学习相关的文章。但说实话,大部分知识点和例子,我都是一知半解,明白他这样做能达到什么效果,但是不知道他为什么这么做,这样肯定不行啊!所以也是借着过年的这段时间学习了一些机器学习的基础知识,其实现在大家熟悉的深度学习也属于机器学习中的一部分。

机器学习

机器学习是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。它是人工智能核心,是使计算机具有智能的根本途径。
– 摘抄自百度百科

Q-Learning

Q-Learning则是机器学习中的一个分支强化学习中的一个算法。我们今天也是窥一斑而见全豹,见一叶而知深秋,通过学习这个算法来感受一下深度学习的伟大。
这里我用我自己的理解再介绍一下强化学习,强化学习顾名思义,突出的就是一个强化,好像听起来抽象,这样一个词怎么转换成一串表达式呢?这里其实有一个很重要的概念就是反馈,通过结果去强化原因这就是反馈,听起来更抽象了吧!但其实医学实验上经常会用到这个概念,比如在小白鼠面前放置两个可以被触发的开关,第一个开关被触发会电击小白鼠,这就是负反馈。第二个开关被触发会投放食物,这就是正反馈,同时强化了老鼠对这两个开关的认识,在不断的电击和投食后,老鼠对第一个开关的负反馈达到阈值,他将永远不会再触发第一个开关,这就是我们要用代码实现的。好吧你还是很迷茫,不过不要紧,继续往下看就行。

环境准备

环境的话就是我们最熟悉的.NET换进,只要能开发控制台程序就行。

试题准备

试题也是我再网上找的范例,比较简单。
在这里插入图片描述
这张图上一共有6个房间(我们将外面5也看成一个大房间的话),我们需要用强化学习让机器人能进入房间5(也就是外面)。

解题过程
  1. 对于机器人来说,当前房间就相当于所处的环境State,他要打开门进入下一个房间Action。由此我们稍微简化一下我们的例图
    在这里插入图片描述
    因为门都是可以进出的,所以两个环境之间的箭头也是双向的。

  2. 因为我们的目标是房间5,所以我们对指向房间5的箭头要有一些正反馈,其他正常的箭头就无反馈
    在这里插入图片描述
    这里要注意一点,房间5有个指向他自己的箭头,这是为了让机器人停留在目标房间,当然你也可以用其他方式来实现,比如不停的判断机器人当前所处的房间(这样真的太low了)

  3. 下面我们就要把这张图转化成代码了,这里说实话,让我自己想我估计永远想不明白该怎么转换,但谁叫咱们都站在巨人的肩膀上呢。这里我们要这张图转换成一个二位数组
    在这里插入图片描述
    -1,代表不存在这个箭头,0表示无反馈,100表示正反馈,简单理解一下就是房间0到房间0这个箭头是没有的,房间5到房间5这个箭头的鼓励的,房间0到房间4这个箭头是无反馈的。同时这个数组我们记作R。

int[][] R = new int[6][] { 
                new int[]{ -1, -1, -1, -1, 0, -1 },
                new int[]{ -1, -1, -1, 0, -1, 100 },
                new int[]{ -1, -1, -1, 0, -1, -1 },
                new int[]{ -1, 0, 0, -1, 0, -1 },
                new int[]{ 0, -1, -1, 0, -1, 100 },
                new int[]{ -1, 0, -1, -1, 0, 100 } };
  1. 再来一个行列相等的数据,来储存机器学习的结果,我们记作Q在这里插入图片描述
static double[][] Q = new double[6][] { new double[6], new double[6], new double[6], new double[6], new double[6], new double[6] };
  1. 然后引入我们的公式在这里插入图片描述
    这里需要注意的就是两个我们可以控制的参数:
    一个就是的α学习效率,它定义了一个旧的Q值将从新的Q值哪里学到的新Q占自身的多少比重。值为0意味着代理不会学到任何东西(旧信息是重要的),值为1意味着新发现的信息是唯一重要的信息。
    一个就是γ折扣因子,它定义了未来奖励的重要性。值为0意味着只考虑短期奖励,其中1的值更重视长期奖励。
    说实话,这个公式不太好理解,我们稍微给它删减一下,保留他最核心的内容,至于这个公式是怎么推到得出的,哥们我只能说我就是个搬运工高数也忘的差不多了。
    在这里插入图片描述
		Q[state][stateNext] = myMath(R, stateNext, state);

		static double myMath(int[][] R, int newstate, int oldstate)
        {
            double y = 0.8; //学习率
            // 选出不为负数的行为
            List<int> action = new List<int>();
            for (int i = 0; i < R[newstate].Length; i++)
            {
                if (R[newstate][i] >= 0)
                {
                    action.Add(i);
                }
            }

            // 根据这些行为,获取奖励值
            List<double> actionQ = new List<double>();
            for (int i = 0; i < action.Count; i++)
            {
                actionQ.Add(Q[newstate][action[i]]);
            }

            // 获取最大值
            double max = actionQ.Max();

            // 根据这些行为计算上一个state的奖励值
            return R[oldstate][newstate] + (y * max);
        }
  1. 现在可以开始了,先将机器人随机放到一个房间作为State,然后从与他相连的房间里选一间作为Action,也就是先确实R数组中的行数,再从那一行中非负列中随机选择一行,这样我们就完成了第一步,上代码
int stateInit = random.Next(0, 6);
test(R, stateInit);

		// 进入一次运算
        static Random random = new Random();
        static int stateNext = -1;
        // 选出不为负数的行为
        static List<int> action = new List<int>();
        // 选出奖励最大的行为,可能为多个
        static List<int> actionM = new List<int>();
        static void test(int[][] R, int state)
        {
            action.Clear();
            actionM.Clear();
            for (int i = 0; i < R[state].Length; i++)
            {
                if (R[state][i] >= 0)
                {
                    action.Add(i);
                }

                if (R[state][i] == R[state].Max())
                {
                    actionM.Add(i);
                }
            }

            stateNext = action[random.Next(0, action.Count)];
            Q[state][stateNext] = myMath(R, stateNext, state);

            if (stateNext != 5)
            {
                test(R, stateNext);
            }
            else
            {
                Q[state][stateNext] = myMath(R, stateNext, state);
            }
        }
  1. 我们通过代码还原了算法,然后通过算法训练出了模型,你可以把你自己比作那个笨笨的机器人,看看在你的模型下,是否能很快去到房间5。
    在这里插入图片描述

写在结尾

最近在研究机器学习相关的知识点,后面可能还会更新一两篇文章,在这里我要说一下,我的文章虽然是原创,但这是我在看了其他大佬的文章后理解其中内容得到的一些感悟,也有一些自己的实践创新,如果有问题的话,希望大家一起探讨,天道酬勤,与君共勉。

Q-learning是一种强化学习算法,用于解决基于奖励的决策问题。在Q-learning中,我们使用一个称为Q表的数据结构来估计在给定状态下采取特定行动的价值。通过不断地与环境交互,Q表会被更新和优化,从而提供更好的决策策略。 Q-learning的算法过程如下: 1. 初始化Q表,其中每个状态-行动对都被初始化为一个小的随机值。 2. 在每个时间步,根据当前状态从Q表中选择一个行动。这可以通过使用ε-greedy策略,在一定概率下随机选择行动,否则选择具有最大Q值的行动。 3. 执行选择的行动,并观察环境反馈的奖励和新的状态。 4. 根据Q-learning的更新规则,更新Q表的相应状态-行动对的Q值。更新的过程使用了一个学习率α和一个衰减因子γ来平衡新旧Q值的权重。 5. 重复步骤2至4,直到达到预定的停止条件或达到最大迭代次数。 通过不断地在环境中探索和学习,Q-learning可以逐渐收敛到一个最优的Q表,从而实现最佳的决策策略。这种算法的优势在于它不需要事先了解环境的具体模型,而只需要通过与环境的交互来学习和优化决策。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【强化学习】Q-Learning算法详解](https://blog.csdn.net/shoppingend/article/details/124291112)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值