Pytorch神经网络训练全流程
数据预处理直接给大家看代码吧,完整代码在这 https://github.com/zong4/Kaggle,functions 的那些函数干了什么基本也就是字面意思(剔除一些没用的列然后归一化,再把字符串列进行one-hot编码)。
12345678910111213141516171819202122232425262728293031323334353637383940414243# Load dataimport sysimport pandas as pdbasic_path = 'house-prices-advanced-regression-techniques'train_data = pd.read_csv(basic_path + "/train.csv")test_data = pd.read_csv(basic_path + "/test.csv")# Prepare environmentimport functions_pytorchfunctions_pytorch.set_seed(42)# E ...
Learning篇(二),用强化学习玩尼姆(取物)游戏并泛化至任意情况
前言很快啊,今天的第二篇,完整代码见 https://github.com/zong4/AILearning。
Reinforcement Learning终于来到我最喜欢的强化学习了。
强化学习中各要素的关系如图所示。
环境会告诉代理目前的状态,由此可以推出代理可以作出的行动。
代理根据自己的判断选择行动后,环境会给出相应的惩罚或者奖励。
不断循环上面两步直到代理成功或者失败。
继续训练,不断的开始下一局游戏
OK,那接下来我们就来看个例子吧。
尼姆(取物)游戏给大家看一眼应该大家就知道怎么玩了,我这里的话是谁最后取完谁输。
小潮院长他们最新一期羊村也玩了。
Agent这里用的学习算法是 Q-learning,公式如下。
$$Q(s, a) <- Q(s, a) + alpha * (new_value_estimate - old_value_estimate)$$
其中 alpha 是学习率,new_value_estimate = reward(现阶段的奖励)+ best_future_reward(未来最大的奖励)。
具体实现主要是下面的 updat ...
Xavier初始化
定义Xavier 初始化是一种比较常用的初始化方法,其核心思想是使得每一层的输出方差尽量相等,这样可以避免梯度消失和梯度爆炸,具体的公式如下。
$$W \sim U(-\sqrt{\frac{6}{n_{in} + n_{out}}}, \sqrt{\frac{6}{n_{in} + n_{out}}})$$
其中 $n_{in}$ 是输入神经元的个数,$n_{out}$ 是输出神经元的个数,$U(a, b)$ 是均匀分布。
优点为什么要让每一层的输出方差尽量相等呢?
避免梯度消失和梯度爆炸:如果各层输出的方差不一致,可能会导致梯度在传递过程中逐渐变小(梯度消失)或逐渐变大(梯度爆炸)。
保证信号的有效传播:如果各层输出方差不一致,可能会导致信号在某些层被放大或缩小,从而影响网络对特征的提取和学习能力。例如,当某一层的输出方差过大时,该层的输出值可能会超出激活函数的有效范围,使得激活函数饱和,从而丢失了部分信息。
交叉熵损失函数的前世今生
前言西瓜书基本都过了一遍,感觉怎么说呢,理论气息太重了,实战中的价值感觉不大,所以我又开了一本新书《动手学深度学习》,之后就是边看边把自己觉得重要和有所感悟的地方记录下来。
交叉熵损失函数先来看看交叉熵损失函数长啥样,
$$H(y^{(i)}, \hat{y}^{(i)}) = -\sum_{j} y_j^{(i)} \log \hat{y}_j^{(i)}$$
其中 $p(x)$ 是真实分布,$q(x)$ 是预测分布,$j$ 是标签类别的索引。
不知道大家看到这个会不会觉得很熟悉,反正我第一时间就想到了信息熵。
信息熵同样的我们也来看看信息熵长啥样。
$$H(p) = -\sum_{x} p(x) \log p(x)$$
其中 $p(x)$ 是概率分布。
是不是几乎一摸一样,所以交叉熵损失函数的本质就是在求预测分布所包含的信息量。
那为什么要最小化交叉熵损失函数,也就是最小化信息量呢?
因为信息量越小,意味着信息越纯净,大家可以画一下上面的函数图,会发现当且仅当 $y^{(i)} = \hat{y}^{(i)}$ 时,交叉熵损失函数取最小值,也就是说预测 ...
Knowledge篇(四),让AI玩狼人杀
前言终于,我们来玩狼人杀了,完整代码见 https://github.com/zong4/AILearning。
游戏规则规则的话,因为人越多越复杂,所以我这边就只弄了一个丐版的,五个人:三村民,一狼人,一预言,先给大家看一眼初始化游戏的代码。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859ROLES = ['citizen', 'werewolf', 'prophet']class Game: def __init__(self): number = 5 roles = {'citizen': 3, 'werewolf': 1, 'prophet': 1} players_name = ['player' + ...
Knowledge篇(三),让AI玩真假游戏
前言哎,狼人杀的逻辑好难实现,这毕竟不是大模型,给几个目标让他们自己练就可以,首先得我自己搞懂狼人杀的发言逻辑,所以今天还是先从比较简单的真假游戏开始,相信看完这篇,你也会和我一样眼前一亮,完整代码见 https://github.com/zong4/AILearning。
游戏规则同样的简单讲一下规则,这游戏我第一次接触是小学学奥数的时候。
简单来说,就是会有几个人,他们要么是骑士要么是恶魔,骑士只能说真话,而恶魔可以是假话也可以是真话,我们需要从他们说的话来判断他们的身份。
所以我们首先创建所有会用到的 Symbol。
12345678AKnight = Symbol("A is a Knight")AKnave = Symbol("A is a Knave")BKnight = Symbol("B is a Knight")BKnave = Symbol("B is a Knave")CKnight = Symbol("C is a Knight")CKnave = Symbol( ...
Knowledge篇(二),让AI玩扫雷
前言原本是要让 AI 来玩狼人杀的,后来感觉思路不是很清晰,所以干脆今天就先做个单人游戏——扫雷,先给大家看一下成果,完整代码见 https://github.com/zong4/AILearning。
游戏规则这里先给不了解游戏规则的人介绍一下游戏,扫雷中的每个数字代表的是,以此数字为中心的九宫格内有几颗地雷,如下图就表示 A~H 这八个格子里有一颗雷。
扫雷逻辑OK,那知道了游戏规则后,我们怎么来表示这个 Knowledge Base 呢?当然你可以像昨天说的那样用以下的式子来表示。
1Or(A, B, C, D, E, F, G, H)
但是,别忘了,上面的式子只能表达有至少一颗雷,但是没有表达出最多也只有一颗雷,具体还需要下面这一堆才行。
12345678910Or(And(A, Not(B), Not(C), Not(D), Not(E), Not(F), Not(G), Not(H)), And(Not(A), B, Not(C), Not(D), Not(E), Not(F), Not(G), Not(H)), And(Not(A), Not(B), ...
Knowledge篇(一),让AI具有逻辑
前言完整代码见 https://github.com/zong4/AILearning。
定义所谓的 Knowledge 就是指逻辑推理。
就像经典的苏格拉底三段论一样。
结构一个完整的可以分成什么呢?
Proposition Symbols这里的 Symbols 是指一句完整的有主谓宾的句子。
看一下代码吧,这块感觉没什么好讲的,不懂再说吧。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546class Sentence: def evaluate(self, model): raise NotImplementedError def formula(self): return "" def symbols(self): return set() @classmethod def validate(cls, sentence): if not ...
Search篇(二),让AI玩井字棋
前言完整代码见 https://github.com/zong4/AILearning。
零和博弈游戏正如之前所说,零和博弈中的最优解不是让自己来最多的分,而是让对方拿的分更少,换言之就是保证自己最坏情况下拿的分更多。
如下图,在目前的情况下,假设你(绿色玩家)下一手(上三条线),红色玩家下一手(下九条线),就达到了解空间中的其中一个状态,对应你获得的分数如下。
线是 Path,是 Transition Model。
作为绿色玩家,你应该考虑到红色玩家不会让你得最高的分,只会让你得最少的分。
因此,你此时的三种选择对应的分数分别是 min(4, 8, 5),min(9, 3, _) 和 min(2, _, _),那么目前状态下你可以获得的最高分数就是 max(4, $\leq$ 3, $\leq$ 2) = 4。
这也就是 MiniMax 的由来,来实现一下简单的井字棋。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849def minimax( ...
Search篇(一),让AI走迷宫
前言完整代码见 https://github.com/zong4/AILearning。
定义所谓 Search 就是寻找最优解。
生活中的话像导航,或者之前比较火的 AlphaGo 下围棋都算,我们就从比较有代表的迷宫开始。
Maze顺带一提,之前做雅思,好像 amaze 就是从 maze 延申出来的。
每一个 Maze,或者说每一个 Search 问题都能被分成以下几个部分。
Agent或者说 Player,如果是导航,那 Agent 就是你自己,如果是博弈游戏,那就是参与游戏的每个人。
Initial State同样的,如果是导航那就是你的起点,如果是围棋,那就是空棋盘。
Actions被规则允许的所有 Action。
Transition Model123def Result(State, Action): ... retun state
State Space没什么好说的,状态转移图。
可以被简化成有向图。
Goal Test没什么好说的,不然连解出来了都不知道。
Path Cost Function不同问题中的 Path Cost 是不一样的,可能是时 ...