NIUHE

日々私たちが过ごしている日常というのは、実は奇迹の连続なのかもしれんな

德州扑克AI算法浅析

不完全信息的博弈是一种玩家对正在玩的游戏没有共同知识的博弈,也就是说,不能只通过子游戏的信息解决子游戏,这样通常达不到全局最优。在相关研究中,通常的做法是逼近游戏中的纳什均衡策略,也就是每个玩家都无法通过只改变自己的策略来提高自己的收益。在零和游戏中,如果每个玩家都选择对对手的最优策略,那么游戏整体就达到了纳什均衡,每个玩家的策略就是最优策略(纳什均衡策略)。

这几年有明显突破的领域是双人不限注德州扑克,阿尔伯塔大学的DeepStack和CMU的Libratus都取得了明显的突破,尤其是Libratus,已经完胜了顶级人类玩家和其他AI。顺便说一下,限注的德州扑克的决策点的数量是\(10^{14}\),已经可以被完全搜索;不限注的德扑的决策点数量是\(10^{161}\),和围棋的\(10^{170}\)很接近。而在其他领域,尤其是多人游戏,如麻将(\(10^{150}\)),AI还没有显著成果。这篇文章主要介绍DeepStack和Libratus的算法。

PyTorch源码浅析(5):Python扩展

这篇是本系列最后一篇博客了,介绍一下前面的C++代码怎么与Python交互,或者说Python里怎么调用C++代码进行高效的计算。首先简单介绍一下预备知识,既Python的C扩展通常怎么写;然后以比较核心的数据结构 Tensor 和 Storage 为例看一下它们怎么转换为Python类型的;最后稍带点儿Python自微分函数的实现。

PyTorch源码浅析(4):Autograd

这篇博客介绍 PyTorch 中自动微分引擎的实现,主要分为三部分:首先简要介绍一下计算图的原理;然后介绍 PyTorch 中与 autograd 的相关数据结构和 backward()函数的实现,数据结构包括 torch::autograd::Variable, torch::autograd::Function 等;最后讲一下动态建立计算图的实现,这部分代码涉及到动态派发机制,而且都是用脚本生成的,不太容易理解。

PyTorch源码浅析(3):NN

THNN是一个用C语言实现的神经网络模块的库,提供的功能非常底层。它实现了许多基础的神经网络模块,包括线性层,卷积层,Sigmoid等各种激活层,一些基本的loss函数,这些API都声明在THNN/generic/THNN.h中。每个模块都实现了前向传导(forward)和后向传导(backward)的功能。THCUNN则是对应模块的CUDA实现。

PyTorch源码浅析(2):THC

这篇主要看 Torch CUDA 部分,对应源码目录aten/src/THC,里面包含了许多C++和CUDA代码。这部分实现了操作 THCTensor 和 THCStorage 的接口,不过底层用的数据结构还是TensorImplStorageImpl。THC里的接口也是通过C语言范式实现的,但是Apply系列操作不再由宏来实现,而是使用了C++模板。其他的区别还有allocator不同,以及多了 THCState 结构。

PyTorch源码浅析(1):THTensor

PyTorch中Tensor的存储和表示分开,多个THTensor可能共享一个THStorage,每个THTensor可能拥有不同的view(e.g. size, stride)。这样设计的好处是,有时看起来不一样的数据底层是共享的,比如矩阵与矩阵的转置、二维矩阵与二维矩阵变成一维时的矩阵。这部分的主要实现在pytorch/aten文件夹中,这里面既实现了底层的Tensor操作库,也封装了名为 ATen 的 C++11接口。

PyTorch源码浅析:简介

这个系列文章自底向上针对PyTorch核心源码进行解析,从Tensor库\(\rightarrow​\)神经网络算符\(\rightarrow​\)自动微分引擎\(\rightarrow​\)Python扩展,一共五篇。代码较多,理解有限,如发现理解不当或表达不妥的地方,还请在评论区指出。

Powered by Hexo and Theme by Hacker
© 2019 NIUHE