Category: Machine Learning

Phase-Functioned Neural Networks for Character Control

理论部分:     http://theorangeduck.com/page/phase-functioned-neural-networks-character-control     视频内容: 讲者背景:角色动画机器学习方向的博士毕业, 动画系统,中间的就是黑盒,就是动画系统 用户输入动画系统的是按钮的指向信息,如图所示的平面的指向,是比较高级的指令,比如我们想走向哪个方向。 动画系统则像是巨大的状态机,不同的状态对应不同的动画,之间会有动画混合。这个复杂的系统直接写代码比较复杂,很难维护, 因此我们重新考虑能不能用一个简单的算法来实现这个复杂的动画交互系统。 我们希望动画系统的输入输出就变成一些参数而已。 我们再来看原来的复杂的动画系统,如果把输入输出看作是动画模型的参数,那么也是可以做到的,就像是在一个巨大的数据库里面挑东西输出。 因此我们希望做到的第二点就是直接输出下一个pose 当然可以,基本思想就是把动画系统当作是黑盒,我们给一些输入就有想要的输出,后面具体讲做法。 输入x:Trajectory Positions, Directions, Heights;Previous Joint Position, Velocities… 输出y:各关节的transform信息 要做训练我们首先需要数据,采用的是动作捕捉,每一段约十分钟,一共约两小时的非结构化的数据。 高度匹配的问题,我们捕捉的数据默认脚就是完全贴合地面的,以此来训练,我们是了大量的各种不同的地面来获得相关的数据。 然后我们来看怎么学习 一个神经网络事实上就是一个函数, 比如这个函数就可以让输入得到相应的输出 我们的函数的输入输出如图所示 而这个可以量化为vectors作为输入输出 如果是单层的最简单的NN举个例子可以像是这样,wb这两个参数就是我们需要学习得到的结果。 输入就是已知的xy 输出就是学习得到的结果wb,如这里所示 最终我们得到的这个函数叫做行为函数 这里可能涉及各种不同的函数,比如这个是非线性混合函数 这两个就是很类似的 如果是深度学习的多层的函数,其表现就是这样 这个例子就是一个三层的神经网络公式 训练的做法就是每次输入值,然后跟据得到的结果衡量错误,然后在调整网络的参数,这就是基本的思路 我们采用了GPU运算节省时间 Phase-functioned NN意思就是我们采用了一种特殊的NN方法,对于不同的motion采用不同的网络权重,避免混合motions,细节请看paper 这是我们最终获得的,简单的动画驱动模型来替代state machineg和blend tree 然后展示demo 性能展示 结论     首先完整看一遍PPT: SIGGRAPH上面的演讲PPT 目标:游戏中的角色控制做到快速紧凑的表现力 最终结果展示
Read More

AIAnimation使用代码分析

历尽艰难跑起来了,问题是没有办法操作,猜测Ubuntu和windows的操作代码不兼容,代码分析部分的主要目标之一就是把操作改掉:     代码结构分析 一切从main函数开始: 首先是SDL初始化,Simple DirectMedia Layer(SDL) is a cross-platform development library designed to provide low level access to audio, keyboard, mouse, joystick, and graphics hardware via OpenGL and Direct3D. 可以说是一个常用的跨平台opengl支持库。 这边就是想到应该不会是操作兼容性的问题导致不能动,一看代码原来是只支持手柄。 可惜的是,windows平台上面跑起来好卡,感觉帧率小于10帧! GLEW初始化 资源加载 Options 里面定义的是一些我们可以修改的设置选项: CameraOrbit 则是相机初始化设置 LightDirectional 场景光照初始化设置 这里就是一堆GL设置 Character 角色初始化设置 这部分是这里的角色的定义信息和加载,这部分很重要! 首先我们来看一下存储的角色数据的文件包涵下面四个,坑爹的采用了二进制存储: 顶点,三角形,父子关系,xforms信息分别四个文件。 读文件的函数这边也很简单,将数据直接存进对应的容器,角色数据结构信息如下: 这部分最后就是一个前向动力学的实现,这个很简单,就是子类跟着父类运动。 Trajectory 路径初始化设置 这里就是定义了运动路径的数据结构,如下所示: IK 初始化设置
Read More

AI4Animation 工程

这里尝试非常多次还是没有办法对于里面的demo信息完整打开且没有报错,可以跑的demo。 因此我们在AIAnimation的基础上首先来看看这个工程怎么使用起来。     首先来看重点在角色,我们来看其角色的构造: 上面是两个demo的使用结构,可以看到就一个重要的csharp文件,我们来对比分析。 Original对应的是Siggraph17的内容,Adam对应的是Siggraph18的内容,我们先来看17。     首先看大的结构: 第二个类继承Editor对象,作用是在editor里面形成层级菜单Animation,其余的三个则是分别由另外的三个类来完成。 这三个对象也分别形成了三个子标签菜单项,如上面所示的图。 NeuralNetwork 这个类,里面只做了一件事情,就是让用户选择NN模型,也就是说这个类处理的是交互UI表现和逻辑,没有其他。NN里面应该包含的信息都在Model这个类里面。下图就是model里面存储的数据结构: 然后我们来看接口函数: 这边是为了兼容和扩展多种的NN方法设置的接口。 剩下的就是一些Tensor相关的函数,Tensor是对Eigen数据的封装,其真实的计算实现都是由Eigen实现的,这边同时提供了一堆的数据结构关联操作的方法。 最后model里面涉及的比较重要的内容就是Parameters,这边unity里面主要做的就是加载读取和存储方法。 Controller 这个类,处理的是Input,主要就是WSADQE. 还有一个很重要的变量是Styles数组,记录的应该是状态权重。 Character 这里做的就是驱动骨架运动。 而作为核心的中介数据 Trajectory 这个类,其就是一组数据点数组,并且包含对这个数组,单个点的操作方法。单个点的数据内容很丰富,包括各种变换和状态等:     所有的核心使用方法就是在Update函数里面,这边的做法应该是和AIAnimation里面是一模一样的,我们可以对比一下: 只有存在NN模型的情况下,才会执行下面的所有内容。 Update Target Direction / Velocity 这里做的就是: TargetDirection = TargetDirection 与 Trajectory定义的当前位置 跟据 TargetBlending 权重混合。 TargetVelocity = TargetVelocity 与 Controller输入速度 跟据 TargetBlending 权重混合。 Update Gait Trajectory.Points[RootPointIndex]
Read More

AIAnimation 工程安装

GLEW,GLUT库安装: http://newx3d.cn/2017/07/13/%E5%9C%A8win10%E5%92%8Cvs2017%E4%B8%8B%E5%AE%89%E8%A3%85opengl%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83/ 主要就是搜索路径:Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.10.25017\lib\x64 opengl安装非常关键,结果路径是: SDL库安装: https://blog.csdn.net/bo_wen_/article/details/49080631 Eigen配置(不行就编译一下): https://blog.csdn.net/sda42342342423/article/details/78201170 glm安装: 同eigen,只需要链接正确就行! 最后千万不要忘记了:    

Machine Learning Techniques Lecture 15: Matrix Factorization

    内容: Matrix Factorization(矩阵分解)模型,一开始先讲linear network里面通过对ID这样的特征编码来萃取特征,然后讲基本的 matrix factirization演算法,要做的事情就是在两个特征之间交互的 做 linear regression,同时你也可以用SGD来做,这是一个有效率的方法,而且可以根据应用做适当的调整,最后总结了一下 extraction model。         上一讲: Raidal Basis Function Network,就是把原来的原始数据通过k-means算法来找出代表,通过使用RBF函数来替代,然后整个方法就可以转化成linear aggregation问题来求解了。     这里: Matrix Factorization         我们首先来回到机器学习基石课程最早讲过的,机器学习的目标就是从资料里面学习的到技能。例如从很多使用者那里收集的到了很多喜欢的电影的数据,每一笔资料就是某个使用者给某一部电影的分数,我们目标是得到那个使用者喜不喜欢还没上映的那部电影。棕色框就是一个实际问题的例子。     在上面的例子里面,x是一个抽象的特征,是一个编号。这样的数据怎么去做机器学习,就是这里要讲解的问题。         X 是抽象的,就是数值上没有意义,只是用来分类别的数据,比如ID,血型,程序语言。     但是我们目前学过的ML Model都作用于有数值特征的数据,例如线性模型,算分数的方式的前提就是数值有举例意义,NN等基于线性模型的方法也有这个要求。只有很少数的机器学习方法可以直接处理类别特征数据,比如讲过的 decision tree。     所以如果我们要对类别特征做机器学习,那么第一步就是将类别特征数据转换成数字数据特征,这个过程叫做encoding。     一种简单的encoding方法叫做 Binary
Read More

Machine Learning Techniques Lecture 14: Radial Basis Function Network

    内容: Radial Basis Function Network 模型,其hypothesis就基本是一堆RBF,比如高斯函数,用这些RBF作为代表来取代NN里面的神经元;学习的过程中如果决定了中心是哪些之后,剩下的就是做一步linear aggregation;然后我们介绍了k-means演算法来用于决定中心,其算法的核心就是 alternating potimization,对里面的变数交叉做最佳化;最后我们举例图示加深印象。         回顾:Deep Learning 是NN的延伸,NN很多很多层的时候,要怎么克服一些困难,比如训练的时候需要好的初始值,denoising autoencoder 就是一种做法(non-linear PCA),其和统计里面用来做资料处理的PCA 有一定的关联性     这里: Radial Basis Function Network         回顾一下很早以前讲的 Gaussian SVM,在SVM里面配合上gaussian kernel,就可以做到在一个无线多维转换的空间里面想办法找一个胖胖的边界。     如果从最后的结果得到的hypothesis来看,我们也可以说Gaussian SVM做的事情就是拿一堆Gaussian来,然后把他们做线性组合,他们的中心在Support Vector这些资料点上。     Gaussian Kernel 也叫做 Radial Basis Function(RBF) kernel,radial 代表你今天算的函数值只和x与中心点的距离有关,basis function 表示的是我们要拿来做线性组合的系数。  
Read More

Machine Learning Techniques Lecture 13: Deep Learning

    内容: Deep Learning模型,是之前讲的类神经网路的延伸,他是一个困难的问题,要经过很多层层层淬炼;然后讲了autoencoder,在deep learning里面它的作用就是帮我们预训练出好的weight,本质上做的事情是从资料里面找出最好的表现方式,做法是用一个浅浅的NN来找到一个好的表现方式;进一步讲到denoising autoencoder 就是在原来的资料里面埋了一些杂讯进去做学习已达到可以抗杂讯的autoencoder的效果;最后讲到这些非线性的autoencoder如果退回来变成线性的话,其实就是PCA方法,作用都是帮助我们降低资料的维度。         回顾:NN模型里面有一层一层的神经元,他们的作用就是帮我们萃取出资料面的模式(特征),通过backprop工具来计算梯度,从而通过GD/SGD法来学习的到NN模型里面的w参数。     这一讲:Deep Learning         类神经网络的核心就是一层一层的神经元和他们之间的连接关系。那么问题是我们要用多少个神经元呢?我们要用多少层呢?我们的NN结构是怎么样的呢?或者你可以主动的去设计;或者你可以把模型的结构当作是参数,通过validation来选择最好的。     在NN里面决定使用什么样的网络结构是非常核心,也是非常困难的问题。         我们这课里面不会把所有的网络结构列出来比较好坏,而是来比较基本的两种。     Shallow(浅): 相对来说学习效率很高,计算量比较小;结构简单,参数比较少;层数比较少,但是每一层放足够多的神经元,一样可以做到很复杂的事情。     Deep(深): 训练的时候一定会花更多的力气,计算量大;对结构的决定会很复杂,参数量大;层数足够多,一样可以做到很复杂的事情;deep这几年很流行的一大关键原因就是其可以得到比较有物理意义的特征。         什么叫做 Meaningful?这里举例手写识别来说明。比如我们要辨识1/5,那么每一层萃取出越来越复杂的各个部位的特征,也就是每一层代表了不一样的物理意义,最后再做辨识。越多层就可以表示越多种不一样的变化,每一层要做的事情相对就变简单了,层与层之间的物理意义就是从简单到复杂的转换。     如果今天你最终要区分的是比较复杂的高级特征,你不能一步登天,像这样每一层做的都是区分非常简单的特征,一层一层的处理合成起来也就可以处理复杂的辨识。在计算机视觉,语音等领域很流行。         深度学习里面的困难点和对应的关键技术如下。     决定整个网络的架构
Read More

Machine Learning Techniques Lecture 12: Neural Network

    内容: Neural Network模型,出发点是把原来的perceptron变成更多层来达到越来越复杂,越来越powerful的效果,这样的链接在生物学上模仿的就是神经元的连结。在NN里面一个网络w固定了的话就是一个hypothesis,每一层做的事情就是根据这些权重来萃取pattern,一层一层萃取出来到最后一层是直接输出。NN学到这些权重的基本方法就是gradient descent(GD),透过backprop的方去很快的算这些梯度到底是多少。最后讲到这样的基本模型还需要小心的是怎么去初始化,用什么regularizer,以及透过early stopping的机制来避免overfit。         上一讲: Gradient Boosted Decision Tree 模型透过 functional gradient 的方式去得到一棵棵不一样的树,然后再给每一棵树以 steepest descent 的方式得到其对应的权重,合起来以后可以做到处理任何的error measure。     这一讲: Neural Network         我们已经学过了 Perceptron 模型,就是把你的输入乘上一堆权重算出一个分数,然后判断这个分数大于0就是正一,小于0就是负一。     如果我们今天把一堆 Perceptron 用 linear aggregation 的方式组合起来的话,就如上面的图所示,从输入出发,乘上第一组的权重得到g1,乘上第二组权重得到g2,以此类推得到一堆的 Perceptron,之后各个g乘上各自的权重alpha,组合起来得到最后的G。     数学表达式如右边所示: 这个过程里面有两组权重,第一组是从输入乘上对应的权重得到一堆的g,权重是w_t;第二组是g_t投票的权重alpha_t。 这个过程里面还有两次取sin的过程,第一次是得到g,第二次是得到G。图示中使用红色的阶梯函数来表示这个动作。     这样的模型到底可以做到什么样的边界。    
Read More

Machine Learning Techniques Lecture 11: Gradient Boosted Decision Tree

    内容: Gradient Boosted Decision Tree,一开始现讲怎么把adaboost和decision tree搭配起来,需要引进sampling 和pruning才能搭配得很好;然后讲了怎么从优化的角度来看adaboost,找到好的 hypothesis 就是找一个好的方向,找到alpha其实就是走一个适当的步长,对应到adaboost里面的exponential error这样的函数就是优化问题;我们可以把优化观点下的adaboost延伸到其他不同种的错误衡量,映入了gradientboost,他做的事情就是residual fitting,根据余数还剩多少来更新regression的问题,看看能不能做得更好;最后总结了一下aggregation的方法。         上一讲: Random forest模型,就是一堆的decision tree,利用bagging的方式做出一些不一样的decision tree,再把他们合起来。除了基本的bagging和decision tree之外,再加上一些额外的random机制,做到了自动的validation和特征选择。     这里: Gradient boosted decision tree         上一次讲的random forest,外层是个bagging,里面是decision tree。这里把decision tree结合到adaboost一起的话,就是 Adaboost-Dtree: 每一轮给我们的资料一群新的weight; 通过这些weight来使用decision tree学一个g; 使用linear的方式把g合起来成为G     要把decision tree搭配adaboost的话,需要把decision tree改造成可以接受权重的形式。         带权重的decision tree算法应该要根据权重来最佳化Ein。  
Read More

Machine Learning Techniques Lecture 10: Random Forest

    内容: Random forest,演算法就是做bagging,然后在bagging里面做decision tree,为了让decision tree更加随机一点,通常会做randomly projected subspaces,就是随机的选择features下刀。在这样的模型里面,因为采用了bagging,可以得到Out-of-bag(OOB)结果,用来代替validation达到self-validation的效果。有了这个机制,配合premutation test(采用随机排序的特征)来测试每一个特征到底是不是你需要的,其重要性。最后图示该算法的表现。         上一讲: 决策树模型,演算法的核心是想办法通过递归的方式切割资料,切割资料的标准就是希望你的资料越纯越好。切开后就得到conditional aggregation的效果,就是根据不同的情况使用不同的小g,就是树叶。     这一讲: 随机森林         先来复习一下两个机器学习模型     Bagging:通过bootstraooing的方式得到不一样的资料,然后把这些不一样的资料送到base算法里面得到不同的小g,最后让这些不同的小g来投票得到结果。 特点是:小g的变化越大,bagging降低variance的效果越明显。     Decision Tree:拿到资料后想办法建立一棵树,通过递归的方式利用条件分割资料得到g,分割的依据是资料的纯度。 依据是:variance很大,资料稍微变一点点得到的树可能就差很多。     两者结合是不是能取长补短呢?         Random forest:random(Bagging过程里面的随机性) + forest(Baggin下面的hypothesis是由fully-grown C&RT decision tree得到)     基本算法: 每一轮的时候想办法用bootstripting的方式得到不同的资料,然后送到完全长成的Decision Tree里面得到g,然后把结果公平的投票得到大G。  
Read More