求证人类的本质是复读机
前言啊哈,我又来更新了,原本是想结束了来着,但是又找到了几个好玩的题,所以来更新一下,顺便把之前欠的补了,完整代码见 https://github.com/zong4/AILearning。
石头剪刀布不知道当你看到这个题目的时候想到了什么策略,总之强化学习肯定是用不了的,因为纯概率游戏是没有最优策略的,给大家看看我写的三个策略。
策略1出能赢对手上次出的那一手。
123456789# Strategy1: play the winning move of the opponent's last moveif prev_play == 'R': return 'P'elif prev_play == 'P': return 'S'elif prev_play == 'S': return 'R'else: return random.choice(['R', 'P', 'S' ...
Uncertainty篇(一),用马尔可夫链求PageRank
前言说实话,感觉也没什么好说的,都是大学概率统计学的内容,就挑重点讲一下吧,完整代码见 https://github.com/zong4/AILearning。
马尔可夫链马尔可夫链直白点说就是状态转移,如下图所示。
通过这样一个转移概率图,我们可以求出转移矩阵,类似下图。
通过这个矩阵,我们可以做很多事情,如下图,不过具体的还是来个实战吧。
Page RankPage Rank 就是用来评估网页的价值的(被更多网站引用的网站一般价值会更高)。
那我们这边主要用两种方法来计算,一种是随机冲浪者模型,另一种是迭代算法。
随机冲浪者模型这模型说白了就是在模拟大家平时浏览网站的操作。
假设大家随机从一个网站开始,当我们浏览完毕后,我们有一定概率(DAMPING)会去浏览它引用的其中一个网站,还有一定概率会重新再选一个网站浏览(1 - DAMPING)。
于是我们就可以写出如下代码。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 ...
Uncertainty篇(二),用隐式马尔可夫链解遗传问题
前言完整代码见 https://github.com/zong4/AILearning。
隐式马尔可夫链隐式马尔可夫链就是在马尔可夫链的基础上多了观察变量,如下图上半部分就是我们上一篇讲的马尔可夫链,具体可以阅读这一篇。
OK,那除此之外,在显式马尔可夫链中,我们是知道整个转移模型的(也就是上图的绿线),而在隐式马尔可夫链中我们只知道转移模型中的各状态对应传感器状态(也就是观察变量)的概率(也就是上图的红线)。
那自然我们除了之前的转移矩阵还有一个新的矩阵如下图所示。
于是我们就可以去计算各种情况的发生概率了。
不过大部分情况,我们之所以要用隐式马尔可夫链是因为我们不知道显式的马尔可夫链,比如下图的问题,对于这样的 笑脸 -> 笑脸 -> 苦脸 的顺序,天气的顺序最有可能是怎么样的?概率又是多少呢?
具体的计算思路就是类似于有记忆的递归算法,如下哦,这就不多说了吧,毕竟概率也是左加右嘛。
遗传问题OK,接下来就让我们来试着解一下遗传问题。
我们可以将任何遗传问题用下图表示。
超参数
来吧,首先是人群中(独立)携带指定基因的概率,用来算一开始第一步的概率,相当于初始 ...
Uncertainty篇(三),用递归解遗传问题
前言上一篇说了要给大家用递归来解,昨天的那个算法太诡异了,接下来我们来讲一下,完整代码见 https://github.com/zong4/AILearning。
代码逻辑数据结构我这次用的是节点,如下,基本就是把表格信息都存下来了。
12345678910111213141516class Node: def __init__(self, name, father=None, mother=None, trait=None): self.name = name self.father = father self.mother = mother self.trait = trait ...# name,mother,father,trait# Harry,Lily,James,# James,,,1# Lily,,,0james = Node("James", None, None, True)lily = Node("Lily", None, None, False)h ...
Uncertainty篇(四),让AI写福尔摩斯故事
前言今天玩太爽了,忘记要写,赶紧来补一篇。
今天给大家搞个好玩的,来让 AI 生成福尔摩斯小说,完整代码见 https://github.com/zong4/AILearning。
代码逻辑首先要生成马尔可夫链,n_gram=2 来划分所有词(这边是两两一组),然后计算文本中从一组词转移到另一组词的概率,也就是说这样的转移在所有文本中出现的概率,如下图。
12345678910111213141516171819202122232425def make_markov_model(cleaned_stories, n_gram=2): markov_model = {} for i in range(len(cleaned_stories)-n_gram-1): curr_state, next_state = "", "" for j in range(n_gram): curr_state += cleaned_stories[i+j] + " ...
Optimization篇(一),让AI解填字游戏
前言又忘写了,赶紧来补,完整代码见 https://github.com/zong4/AILearning。
Optimization虽然一般都会把优化问题分成下图三类,但是其实如果大家仔细思考一下,就会发现。
优化从本质上来说也是一种 Search,在限制下寻找可行解或者更优解。
Local SearchOK,先给大家举个例子。
比如说,我们要从下图中找出最高的柱子,但是我们只知道我们目前的柱子和相邻的柱子。
那解这个问题最简单的方法就是比一比相邻的柱子,那边高就往那边爬,那如果都比现在低,那就不走了。
但是这样的话就很容易陷入局部最优解了,那具体如何解决,我们先按下不表,最后再来讲。
Linear Programming线性规划相信大家肯定不陌生,都是初中的知识了。
一般线性规划都会分成两部分。
目标函数(花费函数),也就是要优化的东西。
限制,一般都会有好几条。
当然了,目标函数其实也可以有好几个,但是我们都会将它转换成一个。
那大家应该发现了相比局部搜索,线性规划中我们的视角是全局的。
Constraint Satisfaction那这听名字就知道这种问题是找可行 ...
Learning篇(一),用机器学习做分类任务
前言不多说了,今天争取写两篇,完整代码见 https://github.com/zong4/AILearning。
Supervised Learning先来讲讲监督学习。
监督学习最大的特点就是有数据标签,会有人告诉 AI 那个东西是什么,这样的话准确性肯定会高一些。
最常见的应用的话就是 Classification(分类),我们也来试一下,基本就是一通百通。
预测用户是否购买在这个例子中我们将根据给出的数据来预测用户在网上购物时是否会购买商品,从而判断是否给它推广告。
主函数先来看看主函数。
首先需要加载数据,并分成训练集和预测集。
然后的话就开始训练模型。
再让模型去预测集上跑一遍输出预测结果。
最后来算一算模型的 Sensitivity(真阳率)和 Specificity(真阴率)。
123456789101112131415161718def main(): # Load data from spreadsheet and split into train and test sets evidence, labels = load_data("./ ...
Neural Networks篇(一),理解模型的结构并实战
前言上一篇说这篇要完善狼人杀的代码来着,后来感觉干脆等 Language 篇讲完再做会比较好一些。
所以今天就继续来讲神经网络,完整代码见 https://github.com/zong4/AILearning。
模型结构一维输入神经网络在我眼里其实本质是泰勒展开,即所有连续函数都可以用一长串多项式来表示。
那至于不连续函数就需要请出激活函数了,通过激活函数我们可以做到截断一些函数再组合,从而实现特殊的图案。
给大家看个好玩的,如下图,我们现在要搭建一个模型来完成这个分类任务。
那目前我们只有输入层和输出层,也就是机器学习,很明显它没有办法把中间的蓝色包裹起来,只能划出一条斜线。
现在我们试着加入一层隐藏层,也就是中间层,可以看到当中间层有三个节点时,它就已经能完成分类任务了。
这三个节点的输出分别是三条线,如下。
这就是我上面所说的通过激活函数配合多项式来实现一些特殊图案,至此我们就理解了为什么 AI 能处理所有的一位数据,接下来我们来看看多维数据。
多维输入多维数据中首当其冲的就是图像了,那我们该如何让 AI 处理这二维数据呢,或者说我们该如何讲二维数据转换成一维数据呢? ...
Language篇(一),让模型理解语法和语义
前言哈哈哈,终于来到我的专业领域了,完整代码见 https://github.com/zong4/AILearning。
语法大语言模型主要是需要解决两个问题,首先就是语法。
马尔可夫链那其中一种解决方法我们之前试过了,没错,就是当时用马尔可夫链生成福尔摩斯故事。
它的本质就是通过每组词的转移概率来分析语法,同时也可以起到预测下一组词的作用。
上下文无关语法除此之外我们也可以主动给 AI 提供语法,任何文本都可以用下面的语法树来表示。
不过这棵比较简单,实际情况遇到长难句会非常复杂,给大家看一句。
我输入的语法模型是这样的,不知道有没有穷尽,但是至少也分析出来了。
123456789101112131415161718192021TERMINALS = """Adj -> "country" | "dreadful" | "enigmatical" | "little" | "moist" | "red"Adv -> &q ...
Language篇(二),生成并观察注意力热力图
前言这是理论学习的最后一篇了,完整代码见 https://github.com/zong4/AILearning。
模型结构序列模型先来讲讲模型结构吧,如果你之前的文章有认真看,肯定会想到可以用处理序列输入和输出的模型结构。
首先将文本如下按序输入进去。
然后当输入到 [end] 符时就生成第一个输出词,然后再把输出的词按序输入,就能得到完整的输出。
这样做确实可以,唯一的缺点就是不能并行,所以当数据量大的时候,消耗的时间和算力就会成倍上升。
Transformers在 Transformers 中,我们可以做到让模型如下同时接收 Input 信息,然后处理生成 Output 信息。
但是该有的信息还是一个都不能少,所以我们首先就得补充顺序信息,如下就是通过添加位置编码来实现的。
有了信息之后我们可以通过自注意力机制分析不同词之间的关联度,从而让模型更加专注于有价值的内容,如下图就是一张学会了顺序信息的注意力热力图。
那最后为了在输出的过程中,让模型知道自己之前输出了什么,就需要将之前的未解码的输出重新输入进来并计算交叉注意力。
注意力机制原理和实现关于注意力的原理我非常推荐 ...