cp的小屋

not yet

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  31 随笔 :: 0 文章 :: 268 评论 :: 12万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

2017年3月23日

从婴儿学走路说起。经历过婴儿学走路的父母都知道婴儿学走路的时候就是让他不停地走,有时摔倒,有时走得稳些。我们不会指导他该怎么走,甚至不会和他说话,反正他也听不懂。就这样走着走着宝宝突然会走路了。这像极了人工神经网络的学习过程,大量的训练数据,大量试错,自动提取模式。当宝宝长大到4、5岁开始学自行车的时候,学习模式已经和婴儿时有所不同,我们不再满足于让他自由试错,任其跌倒、爬起,而是会通过给宝宝讲骑车的知识帮助他缩短训练过程。比如我们会说“重心再靠前点”。这里“重心”、“靠前”都是我们总结出来的知识,这些知识是如何传授给宝宝的,又是如何帮助宝宝加快学习过程的呢?

关于知识是如何传授给宝宝的我们后面再说,先说说知识是如何加速训练过程的。我们通过“重心再靠前点”这样的知识可以让宝宝减少重心比较靠后的训练状态,也就是说对他的训练数据进行了过滤,或者说剪枝。让他把精力更多地集中到重心靠前的训练数据上去,使他更多地得到成功的训练体验,每次成功的训练体验会使他脑内那些成功模式得到强化,不成功的模式会被慢慢遗忘。但我认为对训练数据进行过滤、剪枝并不是知识加速训练的全部,当知识和训练体验产生了某种模式匹配后,我们会感受到强烈的兴奋或者喜悦,这种强烈的神经反应会加速对成功模式的固化。如果我们只是产生了成功的训练体验但并没有与相关的知识匹配,神经兴奋度是较低的,就需要更多的成功体验才能将成功模式固化。也就是说知识能非常强烈地确认我们的训练是成功的,告诉大脑“就是它了,快点固化它”,在没有相关知识的情况下大脑不太确认这次训练是否真的成功,需要再多一些训练来确认。

现在说说知识是如何传授给宝宝的。像“重心”、围棋中的“势”、“空”这样的知识是怎样传递给其他人的呢?当我们说“势、空”的时候我们会拿一些围棋盘面给别人看,告诉他们这就是势或者空。看到这些盘面,学习者头脑中会出现一组模式,我们不去研究到底是什么样的模式只用代号表示它们,比如这组模式是ab、c、d、e、f、g。学习者的大脑就将这组模式和势或者空这个概念建立起关联。然后我们给他看另一组盘面,告诉他这也叫势或者空,这时他脑子里出现了新的一组模式ab、d、e、g、m、n,这些模式中ab、d、e、g与之前的模式相同,与概念的连接得到加强,c、f、m、n这几个模式前后两次没有匹配上,与概念的连接较弱。经过多次训练大脑就找出了与“势、空”这样的知识点相关度最高的模式,也就实现了知识的学习和传递。

如果上面我们对人脑学习的认识是正确的,那么可以总结出一些对学习有帮助的方法和原则:
    1. 大量训练、大量试错
    2. 想办法增加训练时的成功体验,减少失败体验。失败体验是无效的,是需要被遗忘的,只会增加训练时间。
    3. 通过知识对训练数据进行剪枝、过滤,大幅增加成功的训练体验的概率,并在体验到成功训练时增加神经的确认强度。我们都知道一两次成功的训练体验我们就觉得基本上学会了,比如一两次成功的换气就基本学会了游泳,一两次成功的滑行就基本上学会了滑板。这也是名师出高徒的原因,教得好学得快。

下面是一些零散的想法,随时补充:

深度学习对人类知识的利用基本也是对训练数据进行过滤,或者对训练结果进行判断,但没有人脑这样简单和自动化,需要专业技术人员根据特定应用环境特殊编码。未来能否出现用知识加速训练的通用方案?

现在的深度学习只能提取模式不能提取知识,知识是模式之上的模式,很可能需要意识这样的东西的帮助才能提取。是否将神经网络提取的模式再输入另一个网络,如此迭代、循环就产生了意识?

需要设计一个通用神经网络可以不用在意数据的模式(音频、视频、已经由音频视频提取出的模式再作为数据输入),不用像现在这样为每一种数据源单独设计网络结构。

很多人将人脑的一切特性都归因于训练,比如说人脑可以只看几张图片就学会识别猫,他们会说这是因为人一出生就无时无刻不在训练,只看几张图片就能识别猫是建立在之前的大量训练上的。但是我们都知道小马、小羊一出生很快就能站立走路,跟着妈妈。它们的视觉能力并没有足够的时间来训练。因此我认为人脑的有些能力是一出生就有的,是脑结构所固有的,不需要通过训练产生。比如我们要识别一只猫确实需要训练一下,但我们可以不经训练就能识别出图像里的不同物体,虽然不知道它是什么,但我们知道这是一个独立的物体,那是另一个物体,这种能力我认为是脑结构天生具有的。人工神经网络是否能设计出这种不经训练,内化于结构中的物体识别、分离能力?

人脑经过简单的训练就可以完成对手写数字的识别,而且在完成这个训练后不需要更多的训练就可以识别用细麻绳、粗麻绳绕成的数字,甚至用几个香蕉摆出的数字也能轻松识别。在这个过程中并不是完全的模式提取和匹配,人脑会对输入图像进行很多的脑补工作,如降噪、填充、替换材质、局部变形等等变换,如果经过一系列的变换后输入图形能映射到记忆中的标准数字形状我们就认为识别出了这个数字。想想你识别用麻绳绕成的数字8时是不是这样的过程。我认为对图形的各种变换能力(降噪、填充、替换材质、局部变形等等)也是内置于脑结构中的,并非学习得来。
posted @ 2017-03-23 15:40 cproom 阅读(336) 评论(0) 推荐(0) 编辑

2016年3月4日

摘要: 相信记忆魔方公式对大部分人来说不是一件轻松的事情。魔方公式一般表示为一串字母和符号的组合,以我所学的GAN356魔方说明书上的基础公式为例,需要记住7个公式,分别是: 公式4:(U R U’ R’ U’) (F’ U F) 公式5:(R' F’ R U) (R U’ R’ F) 公式6:F(R U 阅读全文
posted @ 2016-03-04 16:25 cproom 阅读(10636) 评论(1) 推荐(0) 编辑

2008年11月21日

摘要: 用Nvidia的PerfHud剖析Direct3D程序有两个关键步骤,一是找到CreateDevice()的调用位置,二是修改传入CreateDevice()的前两个参数使之满足PerfHud的要求,在一般的系统上第一个参数传1,第二个参数传2,也可以将应用程序原来传入的前两个参数分别加一。定位CreateDevice()有两种方式,一是动态跟踪,二是静态分析。动态跟踪就是用调试器起动应用程序,在D3d9.dll中的CreateDevice()函数处下断点。动态跟踪具有速度快、定位准确的特点,是首选。但很多时候网络游戏的客户端都是通过另一个程序起动的(比如自动更新程序),无法由调试器直接起动,也就无法动态跟踪,这时可以考虑静态分析的方法,后面本文会有详细介绍。 阅读全文
posted @ 2008-11-21 22:23 cproom 阅读(5872) 评论(18) 推荐(0) 编辑

2008年10月30日

摘要: 但是随着我们对游戏表现力要求的提高,我们不再满足于仅仅按设定好的参数回放特效效果,而是希望特效表现与游戏逻辑挂钩,使某些特效元素的某些参数随着游戏逻辑动态变化。比如我们有一个发动机尾烟的特效,其中有一个白烟粒子系统,一个黑烟粒子系统和一个公告板。我们希望让这个特效的表现对应于一个逻辑变量“强度”,它是一个浮点数,用fPower来表示。我们希望随着强度不同白烟粒子系统的发射速度会变化,黑烟粒子系统的大小和生命期会变化,公告板的大小和透明度会变化。面对这样的需求最直接能想到的解决方案就是提供一种可以遍历特效内部所有元素的方法,遍历过程中根据元素的不同类型反回不同的接口,然后调用这些接口修改不同元素的不同参数。遗憾的是这个方法很差劲,怎么想都不够好,举出两个最致命的缺点,一是要开放大量设置元素内部状态的接口函数,二是根据fPower设置特效元素参数的代码必须非常了解这个特效的内部结构,它要知道那个粒子系统是白烟,哪个是黑烟,哪个是公告板,哪些元素是不相干的。 阅读全文
posted @ 2008-10-30 15:26 cproom 阅读(2150) 评论(7) 推荐(0) 编辑

2008年9月4日

摘要: 3D游戏中的骨骼动画一般都是由美术在3DMAX这样的软件中做好的,在游戏中直接播放,游戏逻辑除了播放速度外很难施加更多的控制。但是我们在一些游戏中看到人物的身体部位可以根据玩家的选择改变大小、粗细、长短,在一些游戏中NPC可以将头转向走过身边的玩家角色,目光始终注视着玩家,头也随着玩家角色的移动而转动。在《古墓丽影》中,劳拉拿着枪的手会自动指向目标,并跟随目标的移动而转动。这些功能的实现并不需要复杂的逆向动力学,只要通过游戏逻辑对角色局部骨骼的状态施加一些影响,进行一些修改就行了。 阅读全文
posted @ 2008-09-04 21:32 cproom 阅读(3490) 评论(6) 推荐(0) 编辑

2008年4月21日

摘要: 在游戏聊天文本框中支持类似QQ的表情动画以及各种转义符号已经成为网络游戏的必然选择,表情动画大家都很熟悉,转义符号是指在文本中嵌入一些特殊字符以表示文本属性或者一些特定的输出控制。其实表情动画也是通过转义符号表示的,只不过你不必直接输入这些转义字符,而是通过在表情列表框中选择表情,系统自动帮你输入这些符号。举例来说,用#R、#G、#B表示后面的文字分别以红、绿、蓝颜色显示,#b表示后面的文字闪烁,#n表示把后面的文字属性恢复到默认值,#加三个数字表示特定的表情符号,如#001表示一号表情,比如是一个笑脸。 阅读全文
posted @ 2008-04-21 22:46 cproom 阅读(3581) 评论(7) 推荐(0) 编辑

2007年12月8日

摘要: 说到界面系统,在windows平台上用c++编程的人多少都会知道MFC,我也曾仿照MFC的设计实现过一款单机游戏的界面系统。然而现在多数人认为MFC是一个设计不佳,复杂且难于使用的系统。使用MFC编程需要很长的学习过程,界面逻辑被分散到各个窗口类中,为了实现一个复杂界面,你不得不为界面中几乎每一个窗口创建派生类,并将界面逻辑嵌入到这些窗口类中。整个界面形成一个父窗口、子窗口、控件等对象组成的树状结构,许多消息在这个树状结构中通过广播的方式找到它的处理函数。要操纵子窗口或者控件完成一些事情不得不先找到包含它们的父窗口,再通过父窗口函数或者成员变量来访问子窗口或控件。这些特点迫使界面逻辑要了解界面的组织结构,甚至依赖于这个组织结构,难以实现逻辑和界面结构、布局的分离。 游戏界面有其自身的特点,比如游戏的界面往往比较简单,不需要太复杂的结构和布局,能够满足特定游戏的需求就行,不会象MFC那样被用来实现各种各样的应用程序,面对大量的不同需求,甚至要实现不可预期的需求,这就要求MFC这样的系统具有极大的灵活性,和可定制性。另外游戏界面系统往往用c++语言实现,而 阅读全文
posted @ 2007-12-08 23:41 cproom 阅读(3387) 评论(4) 推荐(0) 编辑

2007年11月26日

摘要: 随着多核CPU的普及,多线程设计对3D引擎已经变得越来越重要,很难想象一两年后推出的3D引擎还在使用单线程方式。但是多线程的引入使引擎变得更加复杂,不良的设计带来的性能提升非常有限,甚至在单核环境下还会出现明显的性能下降。所以找到一种清晰、简洁、高效的设计方式就变得至关重要。目前多线程3D引擎设计的资料还很少,多数只讨论一些原则性的概念,缺少具体实例的分析。 本文提出一种具体的3D引擎多线程实现方案,这种方案只是初步实现,还缺乏大量的测试和长期运行的考验,但其中的思路也许可以给大家提供一些参考。目前流行的线程功能划分一般会把资源加载和图像渲染分别独立到一个线程中,这也是非常直观的划分方式,本文也不例外,也是采用这种线程功能的划分。 阅读全文
posted @ 2007-11-26 11:41 cproom 阅读(5465) 评论(9) 推荐(0) 编辑

2007年9月14日

摘要: 场景图一直被认为是适合游戏的通用场景管理算法,仿佛没实现过场景图就不算写过引擎。但是经过思 考和分析,我觉得场景图并不适合作为一种通用的场景组织方式,在下面我会说明理由,并提出一种替代的 适合目前mmorpg网游的场景管理方式。如果大家有什么不同看法可以和我讨论。 阅读全文
posted @ 2007-09-14 20:39 cproom 阅读(4599) 评论(4) 推荐(0) 编辑

2007年7月16日

摘要: 在上一篇中提到了通过对大规模草地的快速排序实现理想草地绘制效果的方法,今天在浏览www.gamedev.net论坛的时候意外发现了一种方法,可以避免对草地、树林这样通过alpha test方式绘制的对象进行排序又能达到接近排序效果的小技巧。这种方法需要两个pass绘制,消耗一些额外的像素填充率,但效果非常不错。在你无法对大量植被进行快速排序或者象交叉面片这种无法排序的情况不妨考虑一下这种方法。现在你可以在排序、不排序的普通alpha test绘制和这种两pass alpha test绘制之间做出明智选择了。 阅读全文
posted @ 2007-07-16 16:57 cproom 阅读(2386) 评论(5) 推荐(0) 编辑

点击右上角即可分享
微信分享提示