【AI浅谈】AI算法,用尽可能简单的话讲懂AI的原理【3】

上接:

【AI浅谈】AI算法,用尽可能简单的话讲懂AI的原理【1】

【AI浅谈】AI算法,用尽可能简单的话讲懂AI的原理【2】

事前说明

学无止尽,个人能力不足,如有错误之处烦请见谅,感谢您的阅读与指出!

PS:小伞是一直在学习的唐伞妖怪欧,由于只是一只菜菜的妖怪,所以学习的地方可能会有些不对(||๐_๐),感谢各位大佬的指正!

再来就是模型了

接上面的例子,我们想要训练一个能够识别20种水果的AI模型,标签很简单,把20种水果进行编码,从0~19分别对应20种水果,然后让AI猜数字,猜0~19的任意一个数字即可。在这个过程中根据模型的学习能力和学习特点,选择一个合适的模型也是很重要的。 那么问题就回到了,我们有什么样的模型这一点了。

之前说过,AI模型是根据数学公式来猜数字的,他接收你传进去的数值输入,然后根据这些数值输入进行一堆数学运算,然后最后得到结果,并将它作为猜出来的数字给你,这个就是AI猜数字的原理。

那么首先我们从小学到高中接触过的那几样模型肯定是可以的,例如一次函数二次函数,三次函数,多项式函数,这些都可以作为AI模型。

至于怎么将它运用到数值矩阵吗?

线性代数矩阵的乘法(狗头)

当然,我们也可以用决策树,卷积base模型,注意力机制base模型等等,这些模型各有各的特点,他们也适用于不同的问题。

然后是训练

已经解决好了数据和模型的问题,接下来就是如何训练了。

在训练之前我们首先要做一件事,就是让数据作为输入的时候,它的接口是适配于模型的输入的——说白了就像我们小时候玩玩具一样,让数据的形状跟模型可以拼接的上。就好像你想学日语,但是连日语最基本的五十音都认不全,就不要提怎么能学好了。 好不容易解决了接口的问题,那么接下来数据是喂进去了,但是我们怎么看出来这个模型它就开窍了呢?

首先对于无监督的模型,你训练数据喂进去了,他是不存在反馈的,也就是这种模型通常都不复习,学什么管他对还是错,学了就完事了。这种模型不需要考虑反向传播问题,训练集训练完之后拿出来测试集马上可以跑,并且一般马上会有结果,决策树大类就是这样的一类模型。

复习还是要的(doge)

不过我们之前也提到过,老是学习不复习是比较要命的,所以后来就有人想了个办法,让一些模型具有了复习的功能,说白了就是反向传播,反向传播的方法有两种,第1种就是让模型学习完之后去考试,考试结果出来了之后不复习,学错题。第2种就是让模型学习完之后,做一套练习卷,做完练习卷之后,根据练习卷的正确率复盘题目。其实说白了,这两种方法是一样的。

第1种通常指代决策树的变体梯度提升树,第2种就是我们之前提到过的人工神经网络大类。

但是两者在知识体系的学习上还是有一点区别的,例如梯度提升树的知识体系构建方法是我学完所有知识之后做题目,做完题目之后有错题,我再基于这些错题构建一套新的知识体系。以此类推。这样子若干次之后,我就有了几十个同样,但是侧重点不同的知识结构,下次我在做题的时候,我根据这些知识结构进行综合判断(投票!),选取可信度最高的一个。

而人工神经网络的方式是学习完之后立刻做一套练习卷,根据练习卷的错题更新自己的知识体系结构。

我们将第1种学习方法叫做集成学习

当然随着时代进步,终身学习,成为了我们必要的一种学习手段和生活方式,AI也是不例外的,对于已经学习完一套知识体系的AI,如果又有新知识进来的话,就把这些新知识再整理给他,让他学习,这样子的学习方法,我们叫做增量学习

同样的随着时代进步,人类的知识体系不断增加,就会造成网络上总会有一些假数据和一些不真实的信息,换句话来讲,就是我们拿给AI做的题目,他可能有些答案是错的,在这种情况下,我们还想让AI学习到正确的知识,就需要用一点小手段,这种学习方法就被称为了带噪学习......现实中有多种多样的应用场景,也就衍生出了各种各样的学习方式。

卷王的故事(doge)

这边不得不提一嘴联邦学习,这玩意儿说白了就是你是卷王,你的同桌也是个卷王,你们俩平时竞争挺激烈的,但是线下是好朋友,所以你平时会跟他交流心得体会,但是你那几套宝贝卷子不会拿给他看,他同样也是。但是在交流心得体会的过程中,你们两个都获取到了对面的信息(但是没看卷子),所以彼此都有所长进。这就是联邦学习了。

当然,现实生活中的应用情景,随着数据的爆炸与日俱增,由此根据关键的三要素:有什么,学什么,怎么学3点衍生出了多种多样的学习方式,这些以后再跟大家慢慢讲吧。

To Be Continue...

在C语言中实现行为树(Behavior Tree)的游戏AI逻辑可以相对复杂,因为C不是设计用于图形化编程的语言,但它仍然可以编写基本的控制结构。由于这是一个简化的例子,我们假设行为树有三种基础节点:选择、顺序执行和动作节点。 ```c typedef enum { IDLE, SEARCH, ATTACK } AIState; typedef struct Node { void (*execute)(void); AIState state; } TreeNode; // 动作节点示例,这里仅表示向前移动 void moveForward(TreeNode* node) { // 简化版的前进操作 printf("AI moving forward.\n"); } // 行为树节点 struct BehaviorTree { TreeNode* root; }; // 行为树创建一个搜索节点,如果找不到敌人则切换到IDLE TreeNode* searchEnemy(BehaviorTree* bt) { TreeNode* searchNode = (TreeNode*)malloc(sizeof(TreeNode)); searchNode->execute = &findEnemy; // 假设有一个findEnemy函数查找敌人 searchNode->state = SEARCH; return searchNode; } // 行为树创建一个序列节点,先搜索再攻击 TreeNode* makeSequence(BehaviorTree* bt) { TreeNode* sequence = (TreeNode*)malloc(sizeof(TreeNode)); sequence->root = searchEnemy(bt); // 创建搜索节点 sequence->execute = &executeSequence; // 假设executeSequence处理序列执行 sequence->state = SEQUENCE; // 假设SEQUENCE代表执行顺序 return sequence; } // 伪函数,展示如何执行行为树 void executeBehaviorTree(BehaviorTree* bt) { if (bt->root == NULL) return; bt->root->execute(); // 根据当前状态执行相应的行为 } int main() { BehaviorTree ai; ai.root = makeSequence(&ai); // 初始化行为树 while (true) { executeBehaviorTree(&ai); // 游戏主循环,可能需要检查是否需要更新AI状态或切换到IDLE if (!findEnemy()) ai.root->state = IDLE; } return 0; } ``` 请注意,这只是一个非常基础的示例,实际游戏中你需要实现更复杂的搜索、攻击、躲避等行为,并管理状态转换。此外,行为树的真正实现通常会涉及到递归和数据结构的更新,而这超出了C语言的基础语法范围。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值