AI算法实现与云平台应用( 六 )


图13 蒙特卡洛搜索树
MCTS是一种启发式的搜索算法,在有限的计算空间里面可以找到相对好的结果 。它这里并不一定能够给你找到绝对值 。能不能证明一定是最好的下法?肯定不能,因为它并没有探索完 。但是通过这种方法,找到了一种胜率又高,探索过的地方又比较多的算法 。图13是原生的MCTS的四个阶段 。包含了几个函数:
这是一种启发式的算法,访问次数也是一个参考的因素,若发现访问次数太低,会先忽略胜率,我去试一下看会不会赢 。这就是数搜索里面的一种启发式算法,现在的计算能力很强,这种算法就很好的 。
图14
图14是从论文里面截取出来的,它也有四个阶段,名字与前文中的类似,因为它用的就是MCTS 。一开始的神经网络的预测是很不准的,初始化会随机生成一些浮点数,乘起来发现赢棋概率和真实概率并不一样,我们就要训练这个模型,就需要生成样本 。模型里面有一个值但不知道这个值好不好,就需要把整个棋局下完,如果赢概率就设为1,否则设为0 。最后是loss函数的实现,这里用了两个神经网络,有两个权重,所以loss会有两部分 。
图15
图15中有一些公式和定义,这里不一一介绍了,大家可以感受一下 。围棋是一棵树,怎么选节点考虑到两个因素,一是节点赢棋的概率,比如说70%的赢棋,赢棋概率越大,下次多选这个;C是一个常亮参数;P和V都是神经网络生成的参数 。标准的UCB里面有一个权重(1/C),访问次数越大,UCB值越小;你的访问次数越小,这个值越大,大到一定的程度可能就不会考虑这个因素了,让他去多探索 。除了这些还有一些优化,让它尽可能的早期的时候多探索 。
图16 自动求导
用户在写代码的时候只是把loss函数写上去了,但在训练的时候要让loss变低,需要求导 。其实做了这个事情,我们自己也可以做 。这是很简单的数学问题,算子的求导在数学上已经有一个公式了(变量的加减乘除求导公式) 。使用时会定义很多的op(加减乘除),在op的实现里面就给你实现了求导的规则 。把所有数学上可能用到的一些操作,把它的算法写出来,可能用到数学上面的链式法则 。我们其实也可实现自动求导 。梯度下降的方式其实就是求导完以后让所有权重加上梯度乘以 rate 。
图17 自动求导
我们自己做了求导的实现,发现用纯的实现会比快很多,做10万次加法大概是12秒,用大概是0.16秒 。包括跑减法还有逻辑回归的训练,这是特定场景下的测试,没有考虑分布式和GPU 。后端是C++实现的,它的主要开销在和C++的交互,这一步非常耗时,比纯实现的op性能还要低很多 。
云机器学习平台架构实现
图18 架构设计
只用就可以搭建云机器学习平台了吗?实现LR可以在单机上训练10亿维稀疏模型 。大家知道10亿维的模型大小是一个十亿维的浮点数数组,如果内存够大我们可以支持更多,但是单机不可能支持10万亿维,因为10万亿维就是400T的量级,即使用分布式的训练也很难找到400T的内存 。解决方案是考虑到定义模型时会初始化,没有出现过的值都用0表示,我们自己实现的框架样本格式可以很灵活 。开源框架与自研框架的集成 。
我们自己的平台架构设计里面要考虑的是支持开源的,因为它很流行,我们可以在上面实现很多模型 。另外我们自研的C++机器学习框架也要支持 。
对异构计算集群的支持,比如DNN需要GPU 。我们需要支持异构计算集群(CPU、GPU、虚拟机、云平台) 。
最后一个是机器学习工作流的支持 。机器学习的工作流是确定的,应该有更好的工具来支持 。