机器学习如何自动优化oracle数据库入门的八卦

&p&官网api给出的定义:&a href=&//link.zhihu.com/?target=http%3A//xgboost.readthedocs.io/en/latest/python/python_api.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Python API Reference&/a&&/p&&figure&&img src=&https://pic3.zhimg.com/50/v2-4cd5d5ca0d58e4dcb298c1ae507e90a5_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&494& data-rawheight=&54& class=&origin_image zh-lightbox-thumb& width=&494& data-original=&https://pic3.zhimg.com/50/v2-4cd5d5ca0d58e4dcb298c1ae507e90a5_r.jpg&&&/figure&&p&其中:instance是叶子节点,weight(hessian)是不带正则项的损失函数的二阶导,也就是这个:&/p&&figure&&img src=&https://pic4.zhimg.com/50/v2-c64bfd20ff68a1f74e5b8e0_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&215& data-rawheight=&55& class=&content_image& width=&215&&&/figure&&p&那么sum of instance weight(hessian)也就是对应这个:&/p&&figure&&img src=&https://pic3.zhimg.com/50/v2-d795ed862a25d751538e_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&152& data-rawheight=&51& class=&content_image& width=&152&&&/figure&&p&直观理解,一般来说,我们定义的不带正则项的损失函数是这个:&/p&&figure&&img src=&https://pic1.zhimg.com/50/v2-a9cced84a578de41d19e5b27a43b5d42_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&108& data-rawheight=&47& class=&content_image& width=&108&&&/figure&&p&的话,那么hi=1,Hj即叶子节点上的样本数,min_child_weight就是叶子上的最小样本数啦&/p&
官网api给出的定义:其中:instance是叶子节点,weight(hessian)是不带正则项的损失函数的二阶导,也就是这个:那么sum of instance weight(hessian)也就是对应这个:直观理解,一般来说,我们定义的不带正则项的损失函数是这个:的话…
现在更多被需要的依然是CPU,只是GPU在大规模并发计算中体现出其一技之长所以应用范围逐渐变得广泛,并成为近些年的热点话题之一。&br&&br&为什么二者会有如此的不同呢?首先要从CPU和GPU的区别说起。&br&&br&CPU和GPU之所以大不相同,是由于其设计目标的不同,它们分别针对了两种不同的应用场景。CPU需要很强的通用性来处理各种不同的数据类型,同时又要逻辑判断又会引入大量的分支跳转和中断的处理。这些都使得CPU的内部结构异常复杂。而GPU面对的则是类型高度统一的、相互无依赖的大规模数据和不需要被打断的纯净的计算环境。&br&&br&于是CPU和GPU就呈现出非常不同的架构(示意图):&br&&figure&&img src=&https://pic3.zhimg.com/50/7fd9ac694e921c064bc1_b.jpg& data-rawwidth=&353& data-rawheight=&136& class=&content_image& width=&353&&&/figure&图片来自nVidia CUDA文档。其中绿色的是计算单元,橙红色的是存储单元,橙黄色的是控制单元。&br&&br&GPU采用了数量众多的计算单元和超长的流水线,但只有非常简单的控制逻辑并省去了Cache。而CPU不仅被Cache占据了大量空间,而且还有有复杂的控制逻辑和诸多优化电路,相比之下计算能力只是CPU很小的一部分。&br&&br&所以与CPU擅长逻辑控制和通用类型数据运算不同,GPU擅长的是大规模并发计算,这也正是密码破解等所需要的。所以GPU除了图像处理,也越来越多的参与到计算当中来。
现在更多被需要的依然是CPU,只是GPU在大规模并发计算中体现出其一技之长所以应用范围逐渐变得广泛,并成为近些年的热点话题之一。 为什么二者会有如此的不同呢?首先要从CPU和GPU的区别说起。 CPU和GPU之所以大不相同,是由于其设计目标的不同,它们分别针…
谨以此文纪念我的第一块显卡,nVidia Riva TNT2。&br&&br&很久以前,大概2000年那时候,显卡还被叫做图形加速卡。一般叫做加速卡的都不是什么核心组件,和现在苹果使用的M7协处理器地位差不多。这种东西就是有了更好,没有也不是不行,只要有个基本的图形输出就可以接显示器了。在那之前,只有一些高端工作站和家用游戏机上才能见到这种单独的图形处理器。后来随着PC的普及,游戏的发展和Windows这样的市场霸主出现,简化了图形硬件厂商的工作量,图形处理器,或者说显卡才逐渐普及起来。&br&&br&想要理解GPU与CPU的区别,需要先明白GPU被设计用来做什么。现代的GPU功能涵盖了图形显示的方方面面,我们只取一个最简单的方向作为例子。&br&&figure&&img src=&https://pic3.zhimg.com/50/6ceee7fbe5ec2a0290bff302a110310b_b.jpg& data-rawwidth=&267& data-rawheight=&268& class=&content_image& width=&267&&&/figure&&br&大家可能都见过上面这张图,这是老版本Direct X带的一项测试,就是一个旋转的立方体。显示出一个这样的立方体要经过好多步骤,我们先考虑简单的,想象一下他是个线框,没有侧面的“X”图像。再简化一点,连线都没有,就是八个点(立方体有八个顶点的)。那么问题就简化成如何让这八个点转起来。首先,你在创造这个立方体的时候,肯定有八个顶点的坐标,坐标都是用向量表示的,因而至少也是个三维向量。然后“旋转”这个变换,在线性代数里面是用一个矩阵来表示的。向量旋转,是用向量乘以这个矩阵。把这八个点转一下,就是进行八次向量与矩阵的乘法而已。这种计算并不复杂,拆开来看无非就是几次乘积加一起,就是计算量比较大。八个点就要算八次,2000个点就要算2000次。这就是GPU工作的一部分,顶点变换,这也是最简单的一部分。剩下还有一大堆比这更麻烦的就不说了。&br&&br&GPU的工作大部分就是这样,计算量大,但没什么技术含量,而且要重复很多很多次。就像你有个工作需要算几亿次一百以内加减乘除一样,最好的办法就是雇上几十个小学生一起算,一人算一部分,反正这些计算也没什么技术含量,纯粹体力活而已。而CPU就像老教授,积分微分都会算,就是工资高,一个老教授资顶二十个小学生,你要是富士康你雇哪个?GPU就是这样,用很多简单的计算单元去完成大量的计算任务,纯粹的人海战术。这种策略基于一个前提,就是小学生A和小学生B的工作没有什么依赖性,是互相独立的。很多涉及到大量计算的问题基本都有这种特性,比如你说的破解密码,挖矿和很多图形学的计算。这些计算可以分解为多个相同的简单小任务,每个任务就可以分给一个小学生去做。但还有一些任务涉及到“流”的问题。比如你去相亲,双方看着顺眼才能继续发展。总不能你这边还没见面呢,那边找人把证都给领了。这种比较复杂的问题都是CPU来做的。&br&&br&总而言之,CPU和GPU因为最初用来处理的任务就不同,所以设计上有不小的区别。而某些任务和GPU最初用来解决的问题比较相似,所以用GPU来算了。GPU的运算速度取决于雇了多少小学生,CPU的运算速度取决于请了多么厉害的教授。教授处理复杂任务的能力是碾压小学生的,但是对于没那么复杂的任务,还是顶不住人多。当然现在的GPU也能做一些稍微复杂的工作了,相当于升级成初中生高中生的水平。但还需要CPU来把数据喂到嘴边才能开始干活,究竟还是靠CPU来管的。&br&&br&至于如何将挖矿和破解密码这种事情分成小学生都能做的简单任务,就是程序员的工作了。所以以后谁再跟你说程序员的工作就是体力活,你可以直接抽他。&br&&br&谢邀
谨以此文纪念我的第一块显卡,nVidia Riva TNT2。 很久以前,大概2000年那时候,显卡还被叫做图形加速卡。一般叫做加速卡的都不是什么核心组件,和现在苹果使用的M7协处理器地位差不多。这种东西就是有了更好,没有也不是不行,只要有个基本的图形输出就可…
&p&近年来,生成对抗网络(Generative Adversarial Networks, GAN)成为了人工智能领域最为炙手可热的研究方向。GAN 的想法最早由 Ian Goodfellow 在 2014 年提出。GAN 用对抗的方法,同时训练了一个「生成模型(G)」与一个「判别模型(D)」,在学习的过程中,生成模型的优化目标是尽可能地去生成伪造的数据,从而获得真实数据的统计分布规律;而判别模型则用于判别给出的一个输入数据到底来源于真实数据还是生成模型。最终,当一个判别模型无法准确分辨生成模型所生成的数据是否为伪造时,此时我们认为判别模型与生成模型都已经提高到了较高的水平,生成模型所生成的数据足以模仿真实世界中的数据。因此,当我们使用 GAN 来「识别」图片时,我们不但识别了图片的内容,还可以生成各种不同内容的图片。费曼曾经说过:“What I cannot create, I do not understand.”生成模型为人工智能的研究提供了一种“create” 的可能性,因而引起了广泛的关注。&/p&
&p&值得注意的是,生成模型所生成的结果并非是凭空来产生,更多的时候,很多图像处理和计算机视觉的问题都可以被看成是一种「图片翻译」的问题,例如一张人脸的照片以及与之对应的一张素描之间的相互转换就可以看成是从一张图片「翻译」为另外一张图片。事实上,更一般的,边界探测,图像分割,图片的风格化和抽象化等等都可以被视为是这样一种「翻译」问题。&/p&
&p&而说到「翻译」,我们很容易会想到其在自然语言处理领域中的一些应用。近年来在机器翻译领域也有许多有意思的新进展。其中一种新的做法是对偶学习(dual learning),这种学习的方式为解决无监督学习中遇到的困难提供了新的思路。简要介绍一下这种学习方法的基本思路:假如现在小明只能讲中文, Alice 只会讲英文,他们两个人虽然都不懂对方的语言,但是他们希望能够可以中英文之间的两个翻译模型(中译英,英译中)。怎样可以实现他们的这个目的呢?首先,对于一个英文的句子,Alice 先用翻译工具将其翻译为中文,由于她并不懂中文,于是她直接把句子发给了小明;但小明又不懂英文,于是小明只能按照中文的语言习惯判断这个句子是否通顺,这可以帮助小明判断这个「英译中」的系统是否做得很好,随后,小明把他修改过的句子再用「中译英」的系统翻译成英文,并把英文句子发给 Alice。Alice 虽然不懂中文,但她能比较经过这一大圈的翻译之后,得到的新句子与最初的版本是否相似。这一信息可以帮助判断是否两个翻译模型都表现良好。随着「对偶学习」过程的持续进行,未标注的数据也得到了充分的利用,利用这些信息,可以帮助提高对偶任务中的两个翻译模型。这种对偶学习的想法为进一步改进现有的翻译模型提出了崭新的思路。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-17f052c61b3d28fbebb5_b.jpg& data-rawwidth=&940& data-rawheight=&359& class=&origin_image zh-lightbox-thumb& width=&940& data-original=&https://pic3.zhimg.com/v2-17f052c61b3d28fbebb5_r.jpg&&&/figure&&p&如果把这种对偶学习的方法也用到基于 GAN 的图片的「翻译」上,会得到怎样的效果呢?这会是一个非常有趣的问题。不久前,我的本科同学易子立(&a href=&https://www.zhihu.com/people/7e3c9abb7335763cdd2e3cf1a5c4cbcc& data-hash=&7e3c9abb7335763cdd2e3cf1a5c4cbcc& class=&member_mention& data-editable=&true& data-title=&@Maoren Liu& data-hovercard=&p$b$7e3c9abb7335763cdd2e3cf1a5c4cbcc&&@Maoren Liu&/a&)和他的合作者们借用了对偶学习的思路,设计了一种名为对偶 GAN(DualGAN)的算法。说来有趣的是,我今年年初在写电子书《&a href=&https://www.zhihu.com/publications/hour/& class=&internal&&人工智能是怎样设计的&/a&》时,当时也与易子立讨论过电子书有关内容的选择和组织,在组织里面的内容时,考虑到这两种算法表现出的无监督特性,我有意地将对偶学习和 GAN 的介绍相邻排列在一起。&/p&&br&&p&如果说原来的 GAN 是将图片的「识别」问题扩展为「生成」和「判别」两个问题,那么 DualGAN 算法就是将基本的 GAN 再进一步扩展为两个相互耦合的的 GAN,其中存在着两个生成器和两个判别器。以素描与照片之间的相互「翻译」为例进行说明,其中第一个生成器 &img src=&https://www.zhihu.com/equation?tex=G_A& alt=&G_A& eeimg=&1&& 可以将素描(U)翻译为照片(V),&img src=&https://www.zhihu.com/equation?tex=G_A& alt=&G_A& eeimg=&1&& 所完成的任务正是我们最终想要完成的目的,与这个生成器对应的有一个判别器 &img src=&https://www.zhihu.com/equation?tex=D_A& alt=&D_A& eeimg=&1&&。与此同时,构建与之对偶的另一个生成器 &img src=&https://www.zhihu.com/equation?tex=G_B& alt=&G_B& eeimg=&1&&,将照片转换为素描,与这个生成器所对应的同样有一个判别器 &img src=&https://www.zhihu.com/equation?tex=D_B& alt=&D_B& eeimg=&1&&。&/p&
&p&在这样的基本框架下,接下来我们来考虑怎样利用对偶学习的思路训练 GAN。首先我们介绍「生成」的思路,通过生成器 &img src=&https://www.zhihu.com/equation?tex=G_A& alt=&G_A& eeimg=&1&& 可以对素描图片 u 进行翻译,最终得到类似照片的图片,其中包含的噪声为 z,翻译的结果即为 &img src=&https://www.zhihu.com/equation?tex=G_A%28u%2Cz%29& alt=&G_A(u,z)& eeimg=&1&& ,把这个翻译的结果扔给另一个专门用于生成素描图片的生成器 &img src=&https://www.zhihu.com/equation?tex=G_B& alt=&G_B& eeimg=&1&&,得到的结果 &img src=&https://www.zhihu.com/equation?tex=G_B%28G_A%28u%2C+z%29%2Cz%27%29& alt=&G_B(G_A(u, z),z')& eeimg=&1&& 即为对原有的素描图片的一次重构,这里的 z' 同样是噪声。接下来考虑与这一过程对偶的一个过程,首先将照片 v 用生成器 &img src=&https://www.zhihu.com/equation?tex=G_B& alt=&G_B& eeimg=&1&&翻译为素描图 &img src=&https://www.zhihu.com/equation?tex=G_B%28v%2Cz%27%29& alt=&G_B(v,z')& eeimg=&1&& ,然后再用生成器 &img src=&https://www.zhihu.com/equation?tex=G_A& alt=&G_A& eeimg=&1&& 对生成的素描图进行翻译,得到 &img src=&https://www.zhihu.com/equation?tex=G_A%28G_B%28v%2Cz%27%29%2Cz%29& alt=&G_A(G_B(v,z'),z)& eeimg=&1&&。&/p&&br&&p&接下来介绍「判别」的思路,与生成器 &img src=&https://www.zhihu.com/equation?tex=G_A& alt=&G_A& eeimg=&1&& 对应的判别器 &img src=&https://www.zhihu.com/equation?tex=D_A& alt=&D_A& eeimg=&1&& 判断一张图片是否像一张照片,而与生成器 &img src=&https://www.zhihu.com/equation?tex=G_B& alt=&G_B& eeimg=&1&& 对应的判别器 &img src=&https://www.zhihu.com/equation?tex=D_B& alt=&D_B& eeimg=&1&& 则判断一张图片是否像一张素描图。对应于上面提到的对偶的生成过程,系统最终希望最小化重构误差,即希望最小化在两次迭代后得到的结果与原始图片之间的误差&img src=&https://www.zhihu.com/equation?tex=%7C%7C+G_A%28G_B%28v%2Cz%27%29%2Cz%29-v+%7C%7C& alt=&|| G_A(G_B(v,z'),z)-v ||& eeimg=&1&& 和&img src=&https://www.zhihu.com/equation?tex=%7C%7C+G_B%28G_A%28u%2Cz%29%2Cz%27%29-u+%7C%7C& alt=&|| G_B(G_A(u,z),z')-u ||& eeimg=&1&& 。&br&&/p&&p&根据这一基本思路,我们就可以真的来对图片做各种处理了。下面了展示这一算法得到的一些结果。这些相关结果分别与真实情况(ground truth)和其它算法得到的结果进行了比较,可以发现这一算法的确有着不错的表现。&/p&&p&&b&(1)日景图片与夜景图片之间的转换&/b&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-8eea66ad761d_b.jpg& data-rawwidth=&1114& data-rawheight=&988& class=&origin_image zh-lightbox-thumb& width=&1114& data-original=&https://pic4.zhimg.com/v2-8eea66ad761d_r.jpg&&&/figure&&p&&b&(2)图片和图片标签之间的相互「翻译」:对图片加标签和通过图片标签重建图片&figure&&img src=&https://pic3.zhimg.com/v2-babd647cf3d54ad73f854c_b.jpg& data-rawwidth=&1120& data-rawheight=&974& class=&origin_image zh-lightbox-thumb& width=&1120& data-original=&https://pic3.zhimg.com/v2-babd647cf3d54ad73f854c_r.jpg&&&/figure&&/b&&figure&&img src=&https://pic3.zhimg.com/v2-16c76833dfc_b.jpg& data-rawwidth=&1078& data-rawheight=&766& class=&origin_image zh-lightbox-thumb& width=&1078& data-original=&https://pic3.zhimg.com/v2-16c76833dfc_r.jpg&&&/figure&&/p&&p&&b&(3)素描与照片之间的相互「翻译」&/b&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-ecc00cddd97a026e665d_b.jpg& data-rawwidth=&1112& data-rawheight=&990& class=&origin_image zh-lightbox-thumb& width=&1112& data-original=&https://pic1.zhimg.com/v2-ecc00cddd97a026e665d_r.jpg&&&/figure&&figure&&img src=&https://pic2.zhimg.com/v2-c81ef0abb_b.jpg& data-rawwidth=&978& data-rawheight=&878& class=&origin_image zh-lightbox-thumb& width=&978& data-original=&https://pic2.zhimg.com/v2-c81ef0abb_r.jpg&&&/figure&&p&&b&(4)地图与卫星图片之间的相互「翻译」&/b&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-bbc1925adff35af2cfd58f55c8669277_b.jpg& data-rawwidth=&1088& data-rawheight=&792& class=&origin_image zh-lightbox-thumb& width=&1088& data-original=&https://pic2.zhimg.com/v2-bbc1925adff35af2cfd58f55c8669277_r.jpg&&&/figure&&figure&&img src=&https://pic2.zhimg.com/v2-fec3cd6a3f2d_b.jpg& data-rawwidth=&1076& data-rawheight=&754& class=&origin_image zh-lightbox-thumb& width=&1076& data-original=&https://pic2.zhimg.com/v2-fec3cd6a3f2d_r.jpg&&&/figure&&p&然而,还有一些情况,我们仅仅只能进行一些「翻译」,而无法找到正确的结果(ground truth)进行比较,例如图片风格的改变就属于这一类问题,然而这些问题本身就是一种没有正确答案的问题。这些问题尤为重要,因为这些问题涉及到真正的无监督学习。尽管「风格」的转换本身无法找到很好的度量方式,然而在某些特殊的问题上,仍然有一些检测的方法,例如用 AMT 材质感知测试,可以对图片中物品的材质进行一些「客观的」检验,这可以作为衡量「翻译」效果的一种度量。在这些应用方面,DualGAN 有着明显比 GAN 更好的无监督学习表现。&/p&&p&&b&(5)中国画—油画之间的翻译&/b&&br&&/p&&p&&figure&&img src=&https://pic4.zhimg.com/v2-60f4bb7f7_b.jpg& data-rawwidth=&962& data-rawheight=&1286& class=&origin_image zh-lightbox-thumb& width=&962& data-original=&https://pic4.zhimg.com/v2-60f4bb7f7_r.jpg&&&/figure&&b&(6)金属、石头、木料、皮革、织物等材质之间的转换&/b&&br&&figure&&img src=&https://pic1.zhimg.com/v2-cdb32ecb76efd03_b.jpg& data-rawwidth=&1812& data-rawheight=&1698& class=&origin_image zh-lightbox-thumb& width=&1812& data-original=&https://pic1.zhimg.com/v2-cdb32ecb76efd03_r.jpg&&&/figure&&/p&&p&这种基于对偶学习的 GAN 为图片与图片之间的「翻译」提供了新的思路,尤为重要的是,通过将 GAN 进一步进行扩充,这种方法把无监督学习的性质利用到了极致,因而在理论上具有很重要的意义。尽管这一算法目前的表现仍然有有待提高,然而与其它 GAN 的变形算法相比,例如与条件 GAN(conditional GAN, cGAN)相比,DualGAN 即使是面对完全没有加标签的数据,也可以产生足以与之相比的表现,这暗示了无监督学习的巨大潜力。考虑到 cGAN 等算法的训练需要引入大量的人工标签,DualGAN 等无监督学习的算法很可能可以大大降低加标签的成本,在进一步提高稳定性之后,值得相信其在未来有着重要的应用前景。&br&&/p&&p&这篇论文的思路与最近很火的工作 &a href=&https://link.zhihu.com/?target=https%3A//junyanz.github.io/CycleGAN/%3Ffrom%3Dsinglemessage%26isappinstalled%3D0& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks&/a& 非常类似,但其实是独立的、来源于不同出发点的工作。在看到那个工作的有关介绍后,我觉得应该特别有必要站出来介绍一下易子立的这个工作。目前,这篇关于 DualGAN 算法的论文已经投稿到 ICCV 会议,原论文的 arXiv 地址为:&a href=&https://link.zhihu.com/?target=https%3A//arxiv.org/abs/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Unsupervised Dual Learning for Image-to-Image Translation&/a& ,这个项目的程序可以到以下 GitHub 链接获取: &a href=&https://link.zhihu.com/?target=https%3A//github.com/duxingren14/DualGAN& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&duxingren14/DualGAN&/a&&/p&
近年来,生成对抗网络(Generative Adversarial Networks, GAN)成为了人工智能领域最为炙手可热的研究方向。GAN 的想法最早由 Ian Goodfellow 在 2014 年提出。GAN 用对抗的方法,同时训练了一个「生成模型(G)」与一个「判别模型(D)」,在学习的过程中…
&p&本文收录在&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&无痛的机器学习第二季目录&/a&。&/p&&p&在上一次的&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&神经网络的局部泛化 - 知乎专栏&/a&中,我们一起计算了全连接层参数和卷积层参数的norm,这个值可以表示所在网络层对模型输入波动的抵抗能力,而在更早的文章&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&寻找CNN的弱点 - 知乎专栏&/a&中,我们也提到了CNN模型的弱点,如何找到一些特殊的case,使得这些从某个训练数据演变出来的图片被错误识别。另外,同样的一篇之前的文章:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&CNN-反卷积(1) - 知乎专栏&/a&,我们分析了反卷积操作,以及梯度的含义。今天提到的一篇文章和上面的几篇文章都有关系,它试图帮助我们找到模型的一些盲点,用简单快捷的方法找到一些“应该可以搞定”但是没有搞定的case。&/p&&p&这篇文章叫做《Explaining and harnessing adversarial examples》,作者团队和上一篇文章的作者是一班人马。Ian Goodfellow同学真的和“adversarial”这个词有缘,先是做Adaversarial training,又是做GAN。&/p&&p&让我们直接进入主题——如何快速找到模型的盲点?所谓的盲点,就是找到一些输入数据,这些数据这样的特点:让人看很容易得出正确答案,而让模型却会识别错误。更要命的是,一般会有一个和它长得差不多的数据,这个数据可以被模型正确识别。一般来说,后面提到的这个数据存在于训练数据或者预测数据中,而前面提到的识别错误的数据是人为生成的。&/p&&p&前面我们提到过一种找到这类数据的方法,这种方法的思想源自遗传算法,需要反复地迭代,也需要模型去判别。而这篇文章中提到的方法则显得更加的直接有效,同时在理论上也更说的通,这个方法被称为Fast gradient sign method,简称FGSM。&/p&&p&它的方法用到了反向梯度的思想。假设我们现在拥有一张图片X,它的label为Y,同时模型的参数以&img src=&https://www.zhihu.com/equation?tex=%5Ctheta& alt=&\theta& eeimg=&1&&代替,那么输入数据对目标函数的偏导数为:&/p&&p&&img src=&https://www.zhihu.com/equation?tex=%5Cnabla_x+J%28%5Ctheta%2Cx%2Cy%29& alt=&\nabla_x J(\theta,x,y)& eeimg=&1&&&/p&&p&利用当今的各种开源工具,我们可以设法求出这个数值来。这个数值有什么意义?它表示了对于输入数据而言,目标函数变化的方向和强度。如果图像的数据沿着这个方向进行变化,那么它的变化,相对于其他方向而言,对目标函数值的影响是最大的。换句话说,这样移动最容易改变最终的识别值。&/p&&p&既然如此,那么可以想象,沿着这个方向移动,肯定存在某个步长&img src=&https://www.zhihu.com/equation?tex=%5Ceta& alt=&\eta& eeimg=&1&&,使得某个新输入数据&/p&&p&&img src=&https://www.zhihu.com/equation?tex=x%27%3Dx%2B%5Ceta+%5Cnabla_x+J%28%5Ctheta%2Cx%2Cy%29& alt=&x'=x+\eta \nabla_x J(\theta,x,y)& eeimg=&1&&&/p&&p&和原始数据的识别结果不同。我们将&img src=&https://www.zhihu.com/equation?tex=%5Ceta& alt=&\eta& eeimg=&1&&设到非常大时,这个情况肯定会出现。那么如果&img src=&https://www.zhihu.com/equation?tex=%5Ceta& alt=&\eta& eeimg=&1&&设置得不那么大时,这个情况还会出现么?这个就是我们要考虑的问题了。&/p&&p&如果模型不做特殊的处理,对于上面这个公式,我们并不需要很大的&img src=&https://www.zhihu.com/equation?tex=%5Ceta& alt=&\eta& eeimg=&1&&就可以找到x'这样的输入。由于&img src=&https://www.zhihu.com/equation?tex=%5Ceta& alt=&\eta& eeimg=&1&&很小,所以对于人眼来说,x'和x的差距并不大,有时人眼甚至无法感知两张图片的明显区别,但是对于CNN模型来说,识别的错误还是发生了。&/p&&p&从前面章节的分析可以看出,&img src=&https://www.zhihu.com/equation?tex=%5Ceta& alt=&\eta& eeimg=&1&&的大小和模型参数的范数(norm)也有关系。范数越大,&img src=&https://www.zhihu.com/equation?tex=%5Ceta& alt=&\eta& eeimg=&1&&的取值就可能越小,模型的盲区就越可能比较多。&/p&&p&&br&&/p&&h2&解决问题&/h2&&p&遇到这样的问题怎么办?显然我们希望模型可以变得更加鲁棒。一个最简单的方法,就是生成这些数据,并且把这些数据加入到训练数据中。这样模型就会正视这些数据,并且尽可能地拟合这些数据,最终完成了模型拟合,这些盲区也就覆盖住了。&/p&&p&那么数据生成的公式是什么样的呢?所谓的FGSM是这样生成数据的:&/p&&p&&img src=&https://www.zhihu.com/equation?tex=x%27%3Dx%2B%5Ceta%2A+sign%28%5Cnabla_x+J%28%5Ctheta%2Cx%2Cy%29%29& alt=&x'=x+\eta* sign(\nabla_x J(\theta,x,y))& eeimg=&1&&&/p&&p&尽管计算梯度时不同的方向维度的梯度幅度不同,在生成数据时,各个方向被统一归一化成相同的数量。这样可以确保在修改图片时,每个像素的修改量尽量相同,修改得更均匀些。&/p&&p&除了这个方法,另外一个方法就是直接将这部分数据的影响整合到目标函数中:&/p&&p&&img src=&https://www.zhihu.com/equation?tex=%5Chat%7BJ%7D%28%5Ctheta%2Cx%2Cy%29%3D%5Calpha+J%28%5Ctheta%2Cx%2Cy%29%2B%281-%5Calpha%29+J%28%5Ctheta%2C+x+%2B+%5Ceta+%2A+sign%28%5Cnabla_x+J%28%5Ctheta%2Cx%2Cy%29%29%29& alt=&\hat{J}(\theta,x,y)=\alpha J(\theta,x,y)+(1-\alpha) J(\theta, x + \eta * sign(\nabla_x J(\theta,x,y)))& eeimg=&1&&&/p&&p&可以看出,这个目标函数中,除了数据本身的loss部分,还有被修改后的输入的loss,保持两部分的loss平衡的参数为&img src=&https://www.zhihu.com/equation?tex=%5Calpha& alt=&\alpha& eeimg=&1&&。&/p&&p&这个方法带来了什么样的好处?如果我们让&img src=&https://www.zhihu.com/equation?tex=%5Ceta& alt=&\eta& eeimg=&1&&在某个范围内随机取值,那么基本上每一个训练数据附近的一个临域内,我们都可以保持它的识别正确。这样模型的鲁棒性也有了一定的提升。&/p&&p&当然,说到这里,大家也会想到另外一种解决问题的方法,那就是数据增强的方法。如果我们对每一张输入数据随机加入高斯噪声,是不是也可以同样地解决这个问题呢?换句话说,我们的目标函数可以变成:&/p&&p&&img src=&https://www.zhihu.com/equation?tex=%5Chat%7BJ%7D%28%5Ctheta%2Cx%2Cy%29%3D%5Calpha+J%28%5Ctheta%2Cx%2Cy%29%2B%281-%5Calpha%29+J%28%5Ctheta%2C+x+%2B+%5CDelta+x%29& alt=&\hat{J}(\theta,x,y)=\alpha J(\theta,x,y)+(1-\alpha) J(\theta, x + \Delta x)& eeimg=&1&&&/p&&p&于是我们陷入了思考,这样是不是就可以解决问题呢?这个公式看上去目标函数更为简洁,为什么要用gradient呢?&/p&&h2&广告时间&/h2&&p&更多精彩尽在&a href=&https://link.zhihu.com/?target=https%3A//item.jd.com/.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&《深度学习轻松学:核心算法与视觉实践》&/a&!&/p&
本文收录在。在上一次的中,我们一起计算了全连接层参数和卷积层参数的norm,这个值可以表示所在网络层对模型输入波动的抵抗能力,而在更早的文章中,我们也提到了CNN模型的…
&figure&&img src=&https://pic2.zhimg.com/v2-4ef657d3b553da762f9ff_b.jpg& data-rawwidth=&600& data-rawheight=&480& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic2.zhimg.com/v2-4ef657d3b553da762f9ff_r.jpg&&&/figure&&p&&i&&u&注:此文在机器学习方面属于入门性的文章,虽是一篇机器学习方向的随记,但其中方法,思路并非仅限于机器学习相关方向。也不要求对于机器学习相关领域有太多的基础和理解。有一定数学基础,涉及系统参数优化方法的,都可以参考之~&/u&&/i&&/p&&br&&p&这两天看Coursera上面&a href=&http://link.zhihu.com/?target=https%3A//www.coursera.org/learn/neural-networks& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Hinton的神经网络课程&/a&,第八周有讲到一个Hessian Free的算法,可以比普通的算法更高效地收敛,鉴于Hinton课程一贯的粗犷风格,决定额外写一篇随记来详细解释这个算法的来龙去脉。&/p&&p&&b&鄙人基础薄弱,智商堪忧,第一次发文,若有不明确不准确不正确之处,欢迎探讨质疑与指点&/b&&/p&&p&本文的主要框架和大量参考来自于&a href=&http://link.zhihu.com/?target=http%3A//andrew.gibiansky.com/blog/machine-learning/hessian-free-optimization/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Andrew Gibiansky的博客&/a&,行文风格和语言组织吸取了&a href=&http://www.zhihu.com/people/3ab3a7b828e940fdb2b2a4e0bac8892a& data-hash=&3ab3a7b828e940fdb2b2a4e0bac8892a& class=&member_mention& data-editable=&true& data-title=&@曹逸君& data-hovercard=&p$b$3ab3a7b828e940fdb2b2a4e0bac8892a&&@曹逸君&/a&的建议。
&/p&&p&转载请通知本人并注明出处。&/p&(吐槽一下Coursera,讲述Hessian Free算法Lecture8a因为被标记成了Optional,直接不出现在视频列表里了,害我对着讲义PPT在Video-free的状态下啃了老半天)&p&-------------------------------------------------并不华丽的分割线----------------------------------------------&/p&&h2&&u&▍0. 序&/u&&/h2&&p&在许多复杂系统的优化过程中,都无法或难以对其参数进行一次性地进行求解,而需要通过迭代逼近的方式来寻找最优或局部最优的参数集。&/p&&p&比如有一类机器学习系统可以粗略地进行如下的解释:&/p&&blockquote&&p&如果存在一系列 “条件 - 结果” 对 &img src=&http://www.zhihu.com/equation?tex=%5Clangle+x%2Cr+%5Crangle& alt=&\langle x,r \rangle& eeimg=&1&&(比如&img src=&http://www.zhihu.com/equation?tex=x& alt=&x& eeimg=&1&&为向量&身高,体重,性别,....&,&img src=&http://www.zhihu.com/equation?tex=r& alt=&r& eeimg=&1&&为这个人的寿命),那么这个机器学习系统要做的是,在审阅了足够多的&img src=&http://www.zhihu.com/equation?tex=%5Clangle+x%2Cr+%5Crangle& alt=&\langle x,r \rangle& eeimg=&1&&后,给定一个新的输入&img src=&http://www.zhihu.com/equation?tex=x_%7Bnew%7D& alt=&x_{new}& eeimg=&1&&,尽可能预测出一个接近于真实&img src=&http://www.zhihu.com/equation?tex=r_%7Bnew%7D& alt=&r_{new}& eeimg=&1&&值的结果&img src=&http://www.zhihu.com/equation?tex=y_%7Bnew%7D& alt=&y_{new}& eeimg=&1&&&br&&/p&&p&此时将系统视作一个函数 &img src=&http://www.zhihu.com/equation?tex=y+%3D+F%28x%29& alt=&y = F(x)& eeimg=&1&&,其中&img src=&http://www.zhihu.com/equation?tex=F& alt=&F& eeimg=&1&&可能包含一系列参数&img src=&http://www.zhihu.com/equation?tex=a%2Cb%2Cc....& alt=&a,b,c....& eeimg=&1&&(比如 &img src=&http://www.zhihu.com/equation?tex=y+%3D+a+x%5E2%2Bbx%2Bc& alt=&y = a x^2+bx+c& eeimg=&1&&),对于每个输入数据&img src=&http://www.zhihu.com/equation?tex=x_%7B0%7D& alt=&x_{0}& eeimg=&1&&,系统给出一个预测值&img src=&http://www.zhihu.com/equation?tex=y_%7B0%7D& alt=&y_{0}& eeimg=&1&&。&br&&/p&&p&其实也可以视作存在&img src=&http://www.zhihu.com/equation?tex=F+%3D+G%28a%2Cb%2Cc%2C...%29& alt=&F = G(a,b,c,...)& eeimg=&1&&使得&img src=&http://www.zhihu.com/equation?tex=y+%3D+G%28a%2Cb%2Cc%2C...%29%28x%29+%3D+F%28x%29& alt=&y = G(a,b,c,...)(x) = F(x)& eeimg=&1&&,或称&img src=&http://www.zhihu.com/equation?tex=y+%3D+G%28p%29%28x%29+%3D+F%28x%29& alt=&y = G(p)(x) = F(x)& eeimg=&1&&,其中p为向量&img src=&http://www.zhihu.com/equation?tex=%5Clangle+a%2Cb%2Cc....%5Crangle& alt=&\langle a,b,c....\rangle& eeimg=&1&&&/p&&br&&p&额外的,对于已知&img src=&http://www.zhihu.com/equation?tex=%5Clangle+x%2Cr+%5Crangle& alt=&\langle x,r \rangle& eeimg=&1&&的,我们根据系统的实际表现&img src=&http://www.zhihu.com/equation?tex=%5Clangle+x%2Cy+%5Crangle& alt=&\langle x,y \rangle& eeimg=&1&&设计一个函数&img src=&http://www.zhihu.com/equation?tex=c+%3D+C%28x%2Cy%2C+r%29& alt=&c = C(x,y, r)& eeimg=&1&&作为代价函数,使得&img src=&http://www.zhihu.com/equation?tex=c& alt=&c& eeimg=&1&&随着&img src=&http://www.zhihu.com/equation?tex=y& alt=&y& eeimg=&1&&和&img src=&http://www.zhihu.com/equation?tex=r& alt=&r& eeimg=&1&&的差距变大而变大。那么如果我们能够找到一组&img src=&http://www.zhihu.com/equation?tex=a%2Cb%2Cc...& alt=&a,b,c...& eeimg=&1&&使得c在各种&img src=&http://www.zhihu.com/equation?tex=x& alt=&x& eeimg=&1&&下尽量小,那么这样的参数就比较合适于这样的系统。&br&&/p&&p&这样我们就把系统的参数优化问题,转换成了寻找函数全局/局部最小值的问题&/p&&/blockquote&&p&寻找这组参数的方法有很多,本文的目的是从最基础的梯度下降法出发,一步步推导到Hessian Free算法。&/p&&h2&&u&▍1. 梯度下降法(Gradient Descent)回顾&/u&&/h2&&p&考虑代价函数&img src=&http://www.zhihu.com/equation?tex=c+%3D+C%28x%2Cy%2C+r%29& alt=&c = C(x,y, r)& eeimg=&1&&,且&img src=&http://www.zhihu.com/equation?tex=y+%3D+F%28x%29+%3D+G%28p%29%28x%29& alt=&y = F(x) = G(p)(x)& eeimg=&1&&,当&img src=&http://www.zhihu.com/equation?tex=x%2Cr& alt=&x,r& eeimg=&1&&已知时(即输入数据与预期输出已知,记得我们要求出的是&img src=&http://www.zhihu.com/equation?tex=p& alt=&p& eeimg=&1&&,使得对于已知的数据对&img src=&http://www.zhihu.com/equation?tex=%5Clangle+x%2Cr+%5Crangle& alt=&\langle x,r \rangle& eeimg=&1&&,&img src=&http://www.zhihu.com/equation?tex=c& alt=&c& eeimg=&1&&取到尽量小的值),可以看做关于&img src=&http://www.zhihu.com/equation?tex=p& alt=&p& eeimg=&1&&的函数&img src=&http://www.zhihu.com/equation?tex=C_%7Bxr%7D%28p%29& alt=&C_{xr}(p)& eeimg=&1&&。&/p&&br&&p&我们知道,对于函数&img src=&http://www.zhihu.com/equation?tex=C_%7Bxr%7D+%28p%29& alt=&C_{xr} (p)& eeimg=&1&&,令&img src=&http://www.zhihu.com/equation?tex=p%5E%7B%28i%29%7D& alt=&p^{(i)}& eeimg=&1&&表示向量&img src=&http://www.zhihu.com/equation?tex=p& alt=&p& eeimg=&1&&的第&img src=&http://www.zhihu.com/equation?tex=i& alt=&i& eeimg=&1&&个分量,我们只要求得其在&img src=&http://www.zhihu.com/equation?tex=p& alt=&p& eeimg=&1&&各个分量上的偏导数 &img src=&http://www.zhihu.com/equation?tex=%5Cfrac%7B%5Cpartial+C_%7Bxr%7D%7D%7B%5Cpartial+p%5E%7B%28i%29%7D%7D+& alt=&\frac{\partial C_{xr}}{\partial p^{(i)}} & eeimg=&1&&,即可得到其梯度:&/p&&img src=&http://www.zhihu.com/equation?tex=%5Cnabla+C_%7Bxr%7D%28p%29+%3D+%5Clangle+%5Cfrac%7B%5Cpartial+C_%7Bxr%7D%7D%7B%5Cpartial+p%5E%7B%280%29%7D%7D%2C+%5Cfrac%7B%5Cpartial+C_%7Bxr%7D%7D%7B%5Cpartial+p%5E%7B%281%29%7D%7D%2C%5Cfrac%7B%5Cpartial+C_%7Bxr%7D%7D%7B%5Cpartial+p%5E%7B%282%29%7D%7D%2C+....+%5Crangle& alt=&\nabla C_{xr}(p) = \langle \frac{\partial C_{xr}}{\partial p^{(0)}}, \frac{\partial C_{xr}}{\partial p^{(1)}},\frac{\partial C_{xr}}{\partial p^{(2)}}, .... \rangle& eeimg=&1&&&br&&p&由于函数的梯度代表了函数值&b&增长率&/b&最高的方向,于是我们可以认为,对于任意&img src=&http://www.zhihu.com/equation?tex=p_%7Bi%7D& alt=&p_{i}& eeimg=&1&&,在&img src=&http://www.zhihu.com/equation?tex=%5Cnabla+C_%7Bxr%7D%28p%29+%5Cne+0& alt=&\nabla C_{xr}(p) \ne 0& eeimg=&1&&的情况下,只要让向量沿着当前梯度&img src=&http://www.zhihu.com/equation?tex=%5Cnabla+C_%7Bxr%7D%28p%29& alt=&\nabla C_{xr}(p)& eeimg=&1&&的反方向移动一小段,就可以找到新的&img src=&http://www.zhihu.com/equation?tex=p_%7Bi%2B1%7D& alt=&p_{i+1}& eeimg=&1&&使得&img src=&http://www.zhihu.com/equation?tex=C_%7Bxr%7D%28p_%7Bi%2B1%7D%29+%3C+C_%7Bxr%7D%28p_%7Bi%7D%29& alt=&C_{xr}(p_{i+1}) & C_{xr}(p_{i})& eeimg=&1&&。&/p&&p&于是我们的梯度下降算法就呼之欲出了:&/p&&ol&&li&通过某种方式(比如随机数或启发式方法)选定一个初始向量&img src=&http://www.zhihu.com/equation?tex=p_%7B0%7D& alt=&p_{0}& eeimg=&1&&&/li&&li&根据已知数据集&img src=&http://www.zhihu.com/equation?tex=%5Clangle+x%2Cr+%5Crangle& alt=&\langle x,r \rangle& eeimg=&1&&求&img src=&http://www.zhihu.com/equation?tex=C_%7Bxr%7D%28p%29& alt=&C_{xr}(p)& eeimg=&1&&在&img src=&http://www.zhihu.com/equation?tex=p_%7B0%7D& alt=&p_{0}& eeimg=&1&&处的梯度&img src=&http://www.zhihu.com/equation?tex=d_%7Bi%7D+%3D+%5Cnabla+C_%7Bxr%7D%28p_%7B0%7D%29& alt=&d_{i} = \nabla C_{xr}(p_{0})& eeimg=&1&&&/li&&li&通过一定方式确定一个步长&img src=&http://www.zhihu.com/equation?tex=%5Calpha& alt=&\alpha& eeimg=&1&&(比如根据经验指定一个常数),计算&img src=&http://www.zhihu.com/equation?tex=p_%7B1%7D+%3D+p_%7B0%7D+-+%5Calpha+p_%7B0%7D& alt=&p_{1} = p_{0} - \alpha p_{0}& eeimg=&1&&&/li&&li&对于任意一步的&img src=&http://www.zhihu.com/equation?tex=p_%7Bi%7D& alt=&p_{i}& eeimg=&1&&,使用2、3的办法计算&img src=&http://www.zhihu.com/equation?tex=p_%7Bi%2B1%7D& alt=&p_{i+1}& eeimg=&1&&,直到达到特定条件(比如&img src=&http://www.zhihu.com/equation?tex=%5Cnabla+C_%7Bxr%7D%28p_%7Bi%7D%29+%3D+0& alt=&\nabla C_{xr}(p_{i}) = 0& eeimg=&1&&或者迭代次数超过一定阈值等)&/li&&/ol&&br&&p&这一方法的优势在于简单明了容易实现,但也存在许多缺点,比如:&br&&/p&&ul&&li&步骤&3&中的&img src=&http://www.zhihu.com/equation?tex=%5Calpha& alt=&\alpha& eeimg=&1&&需要用一定方法确定,如果过大可能导致结果不收敛(越过极值点),过小则导致收敛需要极多的迭代次数&/li&&li&在较为复杂的代价函数&img src=&http://www.zhihu.com/equation?tex=C& alt=&C& eeimg=&1&&或者分步(mini-batch)训练中,&img src=&http://www.zhihu.com/equation?tex=C_%7Bxr%7D%28p_%7Bi%7D%29& alt=&C_{xr}(p_{i})& eeimg=&1&&的梯度方向可能在不同的迭代周期反复迂回,造成大量的迭代次数浪费&/li&&/ul&&p&总之相对于传统的梯度下降方法,我们首当其冲要解决的问题就是:&b&&i&&u&慢&/u&&/i&&/b&。&/p&&h2&&u&▍2. “一步到位”的牛顿法&/u&&/h2&&p&在&img src=&http://www.zhihu.com/equation?tex=p& alt=&p& eeimg=&1&&为实数时,考虑关于&img src=&http://www.zhihu.com/equation?tex=p& alt=&p& eeimg=&1&&的一元二次函数&img src=&http://www.zhihu.com/equation?tex=f%28p%29+%3D+%5Calpha+p%5E2+%2B+%5Cbeta+p+%2B+%5Cgamma+& alt=&f(p) = \alpha p^2 + \beta p + \gamma & eeimg=&1&&的最值,我们知道,当&img src=&http://www.zhihu.com/equation?tex=f%27%28p%29+%3D+2%5Calpha+p+%2B+%5Cbeta+%3D+0& alt=&f'(p) = 2\alpha p + \beta = 0& eeimg=&1&&时&img src=&http://www.zhihu.com/equation?tex=f%28p%29& alt=&f(p)& eeimg=&1&&取到最值。也就是说如果我们的&img src=&http://www.zhihu.com/equation?tex=C_%7Bxr%7D%28p%29& alt=&C_{xr}(p)& eeimg=&1&&能够表示为 于&img src=&http://www.zhihu.com/equation?tex=p& alt=&p& eeimg=&1&&的一元二次函数&img src=&http://www.zhihu.com/equation?tex=f%28p%29+%3D+%5Calpha+p%5E2+%2B+%5Cbeta+p+%2B+%5Cgamma+& alt=&f(p) = \alpha p^2 + \beta p + \gamma & eeimg=&1&&,那么我们可以立刻求出使得&img src=&http://www.zhihu.com/equation?tex=C_%7Bxr%7D%28p%29& alt=&C_{xr}(p)& eeimg=&1&&最小的&img src=&http://www.zhihu.com/equation?tex=p+%3D+-+%5Cfrac%7B%5Cbeta%7D%7B2+%5Calpha%7D& alt=&p = - \frac{\beta}{2 \alpha}& eeimg=&1&&,简直就是一步到位!&/p&&p&但是现实世界并没有那么美好,多数情况下我们的&img src=&http://www.zhihu.com/equation?tex=C_%7Bxr%7D%28p%29& alt=&C_{xr}(p)& eeimg=&1&&会是一个复杂的多的函数,但是上面的方法可以给我们一个提示:&/p&&p&&i&如果我们能够将&img src=&http://www.zhihu.com/equation?tex=C_%7Bxr%7D%28p%29& alt=&C_{xr}(p)& eeimg=&1&&用二次函数的形式表示出来,我们就可以通过上面的办法大踏步的前进了!&/i&&/p&&p&由此我们祭出将任意N阶可导函数化为N次多项式的神器:&b&N阶泰勒展开&/b&&/p&&p&选定一个&img src=&http://www.zhihu.com/equation?tex=p_%7B0%7D& alt=&p_{0}& eeimg=&1&&的情况下,我们可以根据&img src=&http://www.zhihu.com/equation?tex=C_%7Bxr%7D%28p_%7B0%7D%29& alt=&C_{xr}(p_{0})& eeimg=&1&&的二阶泰勒展开式&/p&&img src=&http://www.zhihu.com/equation?tex=C_%7Bxr%7D%28p+%2B+p_%7B0%7D%29+%5Capprox+C_%7Bxr%7D%28p_%7B0%7D%29+%2B+C_%7Bxr%7D%27%28p_%7B0%7D%29p%2BC_%7Bxr%7D%27%27%28p%29%5Cfrac%7Bp%5E2%7D%7B2%7D& alt=&C_{xr}(p + p_{0}) \approx C_{xr}(p_{0}) + C_{xr}'(p_{0})p+C_{xr}''(p)\frac{p^2}{2}& eeimg=&1&&&br&&p&得到&img src=&http://www.zhihu.com/equation?tex=p_%7B0%7D& alt=&p_{0}& eeimg=&1&&的点&img src=&http://www.zhihu.com/equation?tex=%28p+%2B+p_%7B0%7D%29& alt=&(p + p_{0})& eeimg=&1&&上&img src=&http://www.zhihu.com/equation?tex=C_%7Bxr%7D%28p%2Bp_%7B0%7D%29& alt=&C_{xr}(p+p_{0})& eeimg=&1&&的近似值,当&img src=&http://www.zhihu.com/equation?tex=%5Cfrac%7BdC_%7Bxr%7D%28p%2Bp_0%29%7D%7Bdp%7D+%3D+C_%7Bxr%7D%27%28p_0%29+%2B+C_%7Bxr%7D%27%27%28p_0%29p+%3D+0& alt=&\frac{dC_{xr}(p+p_0)}{dp} = C_{xr}'(p_0) + C_{xr}''(p_0)p = 0& eeimg=&1&&,也即&img src=&http://www.zhihu.com/equation?tex=p+%3D+-%5Cfrac%7BC_%7Bxr%7D%27%28p_0%29%7D%7BC_%7Bxr%7D%27%27%28p_0%29%7D& alt=&p = -\frac{C_{xr}'(p_0)}{C_{xr}''(p_0)}& eeimg=&1&&时,&img src=&http://www.zhihu.com/equation?tex=C_%7Bxr%7D%28p%2Bp_%7B0%7D%29& alt=&C_{xr}(p+p_{0})& eeimg=&1&&取得极值。&/p&&br&&p&于是我们的在&img src=&http://www.zhihu.com/equation?tex=p& alt=&p& eeimg=&1&&为实数时可以如此计算&img src=&http://www.zhihu.com/equation?tex=C_%7Bxr%7D%28p%29& alt=&C_{xr}(p)& eeimg=&1&&的极小值:&/p&&ol&&li&选取&img src=&http://www.zhihu.com/equation?tex=p_0& alt=&p_0& eeimg=&1&&开始迭代&/li&&li&对于迭代中的每第 &img src=&http://www.zhihu.com/equation?tex=i& alt=&i& eeimg=&1&& 步,根据&img src=&http://www.zhihu.com/equation?tex=C_%7Bxr%7D%28p_%7Bi%7D+%2B+p%29& alt=&C_{xr}(p_{i} + p)& eeimg=&1&&的泰勒展开,计算&img src=&http://www.zhihu.com/equation?tex=p_%7Bi%2B1%7D+%3D+p_i+-%5Cfrac%7BC_%7Bxr%7D%27%28p_i%29%7D%7BC_%7Bxr%7D%27%27%28p_i%29%7D& alt=&p_{i+1} = p_i -\frac{C_{xr}'(p_i)}{C_{xr}''(p_i)}& eeimg=&1&&得到下一个近似极值点。&br&&/li&&li&重复迭代直到满足终止条件&/li&&/ol&&p&在这种情况下,我们可以用更少的迭代次数大踏步地前进,并且前进的方向也更趋向于函数的全局最优解(即最值而非极值点),同时也能够摆脱上面梯度下降法中确定&img src=&http://www.zhihu.com/equation?tex=%5Calpha& alt=&\alpha& eeimg=&1&&的痛苦。&/p&&p&让我们将上面的算式推广到&img src=&http://www.zhihu.com/equation?tex=p& alt=&p& eeimg=&1&&为n阶向量的情况:&/p&&p&首先我们引入Hessian矩阵的概念:&/p&&blockquote&对于关于向量&img src=&http://www.zhihu.com/equation?tex=x& alt=&x& eeimg=&1&&的函数&img src=&http://www.zhihu.com/equation?tex=f%28x%29& alt=&f(x)& eeimg=&1&&,我们可以根据&img src=&http://www.zhihu.com/equation?tex=x& alt=&x& eeimg=&1&&各分量构建二阶偏导矩阵&img src=&http://www.zhihu.com/equation?tex=H%28f%29& alt=&H(f)& eeimg=&1&&,使得&img src=&http://www.zhihu.com/equation?tex=H%28f%29_%7Bij%7D+%3D+%5Cfrac%7B%5Cpartial%5E2+f%7D%7B%5Cpartial+x%5E%7B%28i%29%7D++%5Cpartial+x%5E%7B%28j%29%7D%7D& alt=&H(f)_{ij} = \frac{\partial^2 f}{\partial x^{(i)}
\partial x^{(j)}}& eeimg=&1&&,即&img src=&http://www.zhihu.com/equation?tex=H%28f%29+%3D+%5Cbegin%7Bbmatrix%7D%0A+++++%5Cfrac%7B%5Cpartial%5E2+f%7D%7B%5Cpartial+x%5E%7B%280%29%7D+%5Cpartial+x%5E%7B%280%29%7D%7D+%26++%5Cfrac%7B%5Cpartial%5E2+f%7D%7B%5Cpartial+x%5E%7B%280%29%7D+%5Cpartial+x%5E%7B%281%29%7D%7D+%26++...+%26%5Cfrac%7B%5Cpartial%5E2+f%7D%7B%5Cpartial+x%5E%7B%280%29%7D+%5Cpartial+x%5E%7B%28n%29%7D%7D++%5C%5C%0A+++++%5Cfrac%7B%5Cpartial%5E2+f%7D%7B%5Cpartial+x%5E%7B%281%29%7D+%5Cpartial+x%5E%7B%280%29%7D%7D+%26++%5Cfrac%7B%5Cpartial%5E2+f%7D%7B%5Cpartial+x%5E%7B%281%29%7D+%5Cpartial+x%5E%7B%281%29%7D%7D+%26++...+%26%5Cfrac%7B%5Cpartial%5E2+f%7D%7B%5Cpartial+x%5E%7B%281%29%7D+%5Cpartial+x%5E%7B%28n%29%7D%7D++%5C%5C%0A...%26+...%26+...%26+...%5C%5C%0A+++++%5Cfrac%7B%5Cpartial%5E2+f%7D%7B%5Cpartial+x%5E%7B%28n%29%7D+%5Cpartial+x%5E%7B%280%29%7D%7D+%26++%5Cfrac%7B%5Cpartial%5E2+f%7D%7B%5Cpartial+x%5E%7B%28n%29%7D+%5Cpartial+x%5E%7B%281%29%7D%7D+%26++...+%26%5Cfrac%7B%5Cpartial%5E2+f%7D%7B%5Cpartial+x%5E%7B%28n%29%7D+%5Cpartial+x%5E%7B%28n%29%7D%7D++%5C%5C%0A%0A%5Cend%7Bbmatrix%7D& alt=&H(f) = \begin{bmatrix}
\frac{\partial^2 f}{\partial x^{(0)} \partial x^{(0)}} &
\frac{\partial^2 f}{\partial x^{(0)} \partial x^{(1)}} &
... &\frac{\partial^2 f}{\partial x^{(0)} \partial x^{(n)}}
\frac{\partial^2 f}{\partial x^{(1)} \partial x^{(0)}} &
\frac{\partial^2 f}{\partial x^{(1)} \partial x^{(1)}} &
... &\frac{\partial^2 f}{\partial x^{(1)} \partial x^{(n)}}
...& ...& ...& ...\\
\frac{\partial^2 f}{\partial x^{(n)} \partial x^{(0)}} &
\frac{\partial^2 f}{\partial x^{(n)} \partial x^{(1)}} &
... &\frac{\partial^2 f}{\partial x^{(n)} \partial x^{(n)}}
\end{bmatrix}& eeimg=&1&&&/blockquote&&p&则对于&img src=&http://www.zhihu.com/equation?tex=p& alt=&p& eeimg=&1&&为向量时,上面算法中的第&b&&2&&/b&步就变为:&/p&&p&计算&img src=&http://www.zhihu.com/equation?tex=p_%7Bi%2B1%7D+%3D+p_i+-+%5Cfrac%7B%5Cnabla+C_%7Bxr%7D%28p_%7Bi%7D%29%7D%7BH%28C_%7Bxr%7D%29%28p_i%29%7D+%3D+pi+-+H%28C_%7Bxr%7D%28p_i%29%29%5E%7B-1%7D%5Cnabla+C_%7Bxr%7D%28p_%7Bi%7D%29& alt=&p_{i+1} = p_i - \frac{\nabla C_{xr}(p_{i})}{H(C_{xr})(p_i)} = pi - H(C_{xr}(p_i))^{-1}\nabla C_{xr}(p_{i})& eeimg=&1&&&br&&/p&&p&那么问题来了,我们发现Hessian矩阵逆矩阵&img src=&http://www.zhihu.com/equation?tex=H%28C_%7Bxr%7D%28p_i%29%29%5E%7B-1%7D& alt=&H(C_{xr}(p_i))^{-1}& eeimg=&1&&不一定是可以求解的,哪怕可以求解,对于&img src=&http://www.zhihu.com/equation?tex=n& alt=&n& eeimg=&1&&维向量&img src=&http://www.zhihu.com/equation?tex=p& alt=&p& eeimg=&1&&,其Hessian矩阵的大小是&img src=&http://www.zhihu.com/equation?tex=n+%5Ctimes++n& alt=&n \times
n& eeimg=&1&&,一个生产环境中的系统动辄成千上万个参数(也就是向量&img src=&http://www.zhihu.com/equation?tex=p& alt=&p& eeimg=&1&&的维度),&b&每一次迭代都要重新计算一次Hessian矩阵并且求逆&/b&。。。你逗我玩呢?&/p&&p&不过别怕,既然难以对Hessian矩阵求逆以在每次迭代中对局部极值的近似一步到位,那么我们就给出一个折衷的算法:Conjugate Gradient - 共轭梯度法。&/p&&h2&&u&▍3. 共轭梯度法(Conjugate Gradient)&/u&&/h2&&p&设某二次函数的极值点在&img src=&http://www.zhihu.com/equation?tex=p_t& alt=&p_t& eeimg=&1&&,对于任意一点&img src=&http://www.zhihu.com/equation?tex=p_i& alt=&p_i& eeimg=&1&&,存在连接&img src=&http://www.zhihu.com/equation?tex=p_i& alt=&p_i& eeimg=&1&&和&img src=&http://www.zhihu.com/equation?tex=p_t& alt=&p_t& eeimg=&1&&的向量&img src=&http://www.zhihu.com/equation?tex=D_i+%3D+%5Coverrightarrow%7Bp_ip_t%7D& alt=&D_i = \overrightarrow{p_ip_t}& eeimg=&1&&,按照之前的牛顿法可知,我们在理论上是可以直接求得向量&img src=&http://www.zhihu.com/equation?tex=D_i& alt=&D_i& eeimg=&1&&的,然而因为该方法在扩展到任意函数时存在上面指出的种种问题,所以难以进行实际应用。&/p&&p&而牛顿法难以实际应用的最根本原因,就是在推广算式里有一个&img src=&http://www.zhihu.com/equation?tex=%28C_%7Bxr%7D%27%27%28p%29%29%5E%7B-1%7D& alt=&(C_{xr}''(p))^{-1}& eeimg=&1&&的存在,这一因子在多参数时变成了对&img src=&http://www.zhihu.com/equation?tex=Hessian& alt=&Hessian& eeimg=&1&&矩阵的求逆运算。那么我们是否可以绕过&img src=&http://www.zhihu.com/equation?tex=%28C_%7Bxr%7D%27%27%28p%29%29%5E%7B-1%7D& alt=&(C_{xr}''(p))^{-1}& eeimg=&1&&,想办法求得&img src=&http://www.zhihu.com/equation?tex=D_i& alt=&D_i& eeimg=&1&&呢?&/p&&p&答案是肯定的,如果我们回顾梯度下降法,我们会发现,在最终收敛到极值的梯度下降中,所有迭代中&img src=&http://www.zhihu.com/equation?tex=p& alt=&p& eeimg=&1&&移动的那一点点向量之和,一定等于&img src=&http://www.zhihu.com/equation?tex=D_i& alt=&D_i& eeimg=&1&&,那么我们只要通过一定办法,在尽量少的移动次数下,使所有移动向量的总和为&img src=&http://www.zhihu.com/equation?tex=D_i& alt=&D_i& eeimg=&1&&&br&&/p&&p&此时我们引用一个定理:&/p&&blockquote&&b&&img src=&http://www.zhihu.com/equation?tex=N& alt=&N& eeimg=&1&&维空间中任意向量,都可以用&img src=&http://www.zhihu.com/equation?tex=N& alt=&N& eeimg=&1&&个线性无关向量之和表示&/b&&/blockquote&&p&所以如果我们能够讲&img src=&http://www.zhihu.com/equation?tex=D_i& alt=&D_i& eeimg=&1&&分解为一组线性无关的向量,就可以在&img src=&http://www.zhihu.com/equation?tex=N& alt=&N& eeimg=&1&&次迭代下,将&img src=&http://www.zhihu.com/equation?tex=N& alt=&N& eeimg=&1&&维向量&img src=&http://www.zhihu.com/equation?tex=p_i& alt=&p_i& eeimg=&1&&移动到函数的极值点。&/p&&p&那么问题是,如何进行分解?&/p&&p&就此我们引出&b&向量共轭&/b&的概念:&/p&&blockquote&对于向量&img src=&http://www.zhihu.com/equation?tex=v& alt=&v& eeimg=&1&&,如果存在矩阵&img src=&http://www.zhihu.com/equation?tex=A& alt=&A& eeimg=&1&&和向量&img src=&http://www.zhihu.com/equation?tex=u& alt=&u& eeimg=&1&&,使得&img src=&http://www.zhihu.com/equation?tex=v%5ETAu+%3D+0& alt=&v^TAu = 0& eeimg=&1&&,那么认为这两个向量是&img src=&http://www.zhihu.com/equation?tex=A& alt=&A& eeimg=&1&&共轭的&/blockquote&&p&向量共轭的意义在于哪里呢?我们知道如果存在两个向量&img src=&http://www.zhihu.com/equation?tex=u%2Cv& alt=&u,v& eeimg=&1&&使得&img src=&http://www.zhihu.com/equation?tex=u%5ET%5Ctimes+v%3D0& alt=&u^T\times v=0& eeimg=&1&&,那么这两个向量互相正交。而向量-矩阵的乘法实际上是向量根据该矩阵进行的线性变换。所以两向量&img src=&http://www.zhihu.com/equation?tex=A& alt=&A& eeimg=&1&&共轭的本质意义是:一个向量与另一个向量经过&img src=&http://www.zhihu.com/equation?tex=A& alt=&A& eeimg=&1&&的线性变换结果向量成正交关系。&br&&/p&&p&不难证明,&b&如果一个&img src=&http://www.zhihu.com/equation?tex=N& alt=&N& eeimg=&1&&维空间下存在&img src=&http://www.zhihu.com/equation?tex=N& alt=&N& eeimg=&1&&个对同一变换矩阵共轭的向量,那么这&img src=&http://www.zhihu.com/equation?tex=N& alt=&N& eeimg=&1&&个向量互相是线性无关的&/b&。&br&&/p&&p&于是我们可以开始尝试设计我们在二次函数下求最值的迭代算法了:&/p&&p&考虑一个关于实数&img src=&http://www.zhihu.com/equation?tex=p& alt=&p& eeimg=&1&&的二次函数&img src=&http://www.zhihu.com/equation?tex=C_%7Bxr%7D%28p%29%3Dap%5E2+%2B+bp+%2B+c& alt=&C_{xr}(p)=ap^2 + bp + c& eeimg=&1&&,现在我们把他推广到&img src=&http://www.zhihu.com/equation?tex=p& alt=&p& eeimg=&1&&为&img src=&http://www.zhihu.com/equation?tex=N& alt=&N& eeimg=&1&&维向量的形式:&br&&/p&&img src=&http://www.zhihu.com/equation?tex=C_%7Bxr%7D%28p%29+%3D+%5Cfrac%7B1%7D%7B2%7D%5Csum_%7Bi%3D1%7D%5E%7Bn%7D+%5Csum_%7Bj%3D1%7D%5E%7Bn%7D%7BA_%7Bij%7Dp%5E%7B%28i%29%7Dp%5E%7B%28j%29%7D%7D+%2B+%5Csum_%7Bi%3D1%7D%5E%7Bn%7DB_%7Bi%7Dp%5E%7B%28i%29%7D%2BC+%3D+%5Cfrac%7B1%7D%7B2%7Dp%5ETAp+%2B+B%5ETp%2BC+& alt=&C_{xr}(p) = \frac{1}{2}\sum_{i=1}^{n} \sum_{j=1}^{n}{A_{ij}p^{(i)}p^{(j)}} + \sum_{i=1}^{n}B_{i}p^{(i)}+C = \frac{1}{2}p^TAp + B^Tp+C & eeimg=&1&&&br&&br&&p&其中&img src=&http://www.zhihu.com/equation?tex=A& alt=&A& eeimg=&1&&是一个&img src=&http://www.zhihu.com/equation?tex=N%5Ctimes+N& alt=&N\times N& eeimg=&1&&的对称矩阵,&img src=&http://www.zhihu.com/equation?tex=A_%7Bij%7D& alt=&A_{ij}& eeimg=&1&&代表展开式中&img src=&http://www.zhihu.com/equation?tex=p%5E%7B%28i%29%7Dp%5E%7B%28j%29%7D& alt=&p^{(i)}p^{(j)}& eeimg=&1&&项所对应的系数。(注意两个&img src=&http://www.zhihu.com/equation?tex=%5CSigma& alt=&\Sigma& eeimg=&1&&前面的&img src=&http://www.zhihu.com/equation?tex=1%2F2& alt=&1/2& eeimg=&1&&,是为了避免&img src=&http://www.zhihu.com/equation?tex=p%5E%7B%28i%29%7Dp%5E%7B%28j%29%7D& alt=&p^{(i)}p^{(j)}& eeimg=&1&&和&img src=&http://www.zhihu.com/equation?tex=p%5E%7B%28j%29%7Dp%5E%7B%28i%29%7D& alt=&p^{(j)}p^{(i)}& eeimg=&1&&被重复计算。&/p&&p&对于任意点&img src=&http://www.zhihu.com/equation?tex=p_i& alt=&p_i& eeimg=&1&&, 我们求解&img src=&http://www.zhihu.com/equation?tex=C_%7Bxr%7D%28p_i%29& alt=&C_{xr}(p_i)& eeimg=&1&&的梯度&img src=&http://www.zhihu.com/equation?tex=g_i+%3D+%5Cnabla+C_%7Bxr%7D%28p_i%29+%3D+Ap_i+%2B+B& alt=&g_i = \nabla C_{xr}(p_i) = Ap_i + B& eeimg=&1&&。&/p&&p&设&img src=&http://www.zhihu.com/equation?tex=d_i+%3D+-g_i%0A& alt=&d_i = -g_i
& eeimg=&1&&&/p&&p&而后我们求解关于&img src=&http://www.zhihu.com/equation?tex=%5Calpha& alt=&\alpha& eeimg=&1&&的方程&img src=&http://www.zhihu.com/equation?tex=%5Cfrac%7BdC_%7Bxr%7D%28p_i%2B%5Calpha+d_i%29%7D%7Bd%5Calpha%7D+%3D+0& alt=&\frac{dC_{xr}(p_i+\alpha d_i)}{d\alpha} = 0& eeimg=&1&&,使得&img src=&http://www.zhihu.com/equation?tex=C_%7Bxr%7D%28p_i+%2B+%5Calpha+d_i%29& alt=&C_{xr}(p_i + \alpha d_i)& eeimg=&1&&取得最小值,该方程的求解过程这里就不赘述了,结果为&img src=&http://www.zhihu.com/equation?tex=%5Calpha+%3D+-+%5Cfrac%7Bd_i%5ET%28Ap_i%2BB%29%7D%7Bd_i%5ETAd_i%7D& alt=&\alpha = - \frac{d_i^T(Ap_i+B)}{d_i^TAd_i}& eeimg=&1&&&br&&/p&&p&接下来我们将&img src=&http://www.zhihu.com/equation?tex=p_i& alt=&p_i& eeimg=&1&&移动&img src=&http://www.zhihu.com/equation?tex=%5Calpha+d_i& alt=&\alpha d_i& eeimg=&1&&得到&img src=&http://www.zhihu.com/equation?tex=p_%7Bi%2B1%7D+%3D+p_i+%2B+%5Calpha+d_i& alt=&p_{i+1} = p_i + \alpha d_i& eeimg=&1&&&/p&&p&此时如果我们能够找到一个新的向量&img src=&http://www.zhihu.com/equation?tex=d_%7Bi%2B1%7D& alt=&d_{i+1}& eeimg=&1&&,使其&img src=&http://www.zhihu.com/equation?tex=A& alt=&A& eeimg=&1&&共轭于&img src=&http://www.zhihu.com/equation?tex=d_i& alt=&d_i& eeimg=&1&&,也即是&b&使得&img src=&http://www.zhihu.com/equation?tex=d_%7Bi%2B1%7D& alt=&d_{i+1}& eeimg=&1&&在&img src=&http://www.zhihu.com/equation?tex=C_%7Bxr%7D%28p%29& alt=&C_{xr}(p)& eeimg=&1&&的梯度函数&img src=&http://www.zhihu.com/equation?tex=Ap%2BB& alt=&Ap+B& eeimg=&1&&中变换&img src=&http://www.zhihu.com/equation?tex=A& alt=&A& eeimg=&1&&所定义的空间中与&img src=&http://www.zhihu.com/equation?tex=d_i& alt=&d_i& eeimg=&1&&正交&/b&,也就意味着此时点&img src=&http://www.zhihu.com/equation?tex=p_%7Bi%2B1%7D& alt=&p_{i+1}& eeimg=&1&&在&img src=&http://www.zhihu.com/equation?tex=d_%7Bi%2B1%7D& alt=&d_{i+1}& eeimg=&1&&方向上的移动不会影响到梯度空间中&img src=&http://www.zhihu.com/equation?tex=d_i& alt=&d_i& eeimg=&1&&分量上的值,所以,在所有互相共轭的方向上移动一番之后,我们就会移动到目标最小值点&img src=&http://www.zhihu.com/equation?tex=p_t& alt=&p_t& eeimg=&1&&。&/p&&p&那么如何找到&img src=&http://www.zhihu.com/equation?tex=d_%7Bi%2B1%7D& alt=&d_{i+1}& eeimg=&1&&呢?&/p&&p&首先我们可以求解&img src=&http://www.zhihu.com/equation?tex=C_%7Bxr%7D%28p_%7Bi%2B1%7D%29& alt=&C_{xr}(p_{i+1})& eeimg=&1&&的梯度&img src=&http://www.zhihu.com/equation?tex=g_%7Bi%2B1%7D+%3D+%5Cnabla+C_%7Bxr%7D%28p_%7Bi%2B1%7D%29+%3D+Ap_%7Bi%2B1%7D+%2B+B& alt=&g_{i+1} = \nabla C_{xr}(p_{i+1}) = Ap_{i+1} + B& eeimg=&1&&,之后我们找到一个&img src=&http://www.zhihu.com/equation?tex=%5Cbeta& alt=&\beta& eeimg=&1&&使得&img src=&http://www.zhihu.com/equation?tex=-%28g_%7Bi%2B1%7D%29+%2B+%5Cbeta+d_i+%3D+d_%7Bi%2B1%7D& alt=&-(g_{i+1}) + \beta d_i = d_{i+1}& eeimg=&1&&,也即是找到&img src=&http://www.zhihu.com/equation?tex=%5Cbeta& alt=&\beta& eeimg=&1&&以去除&img src=&http://www.zhihu.com/equation?tex=d_%7Bi%2B1%7D& alt=&d_{i+1}& eeimg=&1&&中与&img src=&http://www.zhihu.com/equation?tex=d_%7Bi%7D& alt=&d_{i}& eeimg=&1&&相关的那一部分。&br&&/p&&p&由前提&img src=&http://www.zhihu.com/equation?tex=d_%7Bi%2B1%7D& alt=&d_{i+1}& eeimg=&1&&和&img src=&http://www.zhihu.com/equation?tex=d_i& alt=&d_i& eeimg=&1&&关于&img src=&http://www.zhihu.com/equation?tex=A& alt=&A& eeimg=&1&&共轭,我们可以得到&img src=&http://www.zhihu.com/equation?tex=d_%7Bi%2B1%7D%5ETAd_i+%3D+-%5Cnabla+C_%7Bxr%7D%28p_%7Bi%2B1%7D%29%5ETAd_i+%2B+%5Cbeta+d_i%5ETAd_i+%3D+0& alt=&d_{i+1}^TAd_i = -\nabla C_{xr}(p_{i+1})^TAd_i + \beta d_i^TAd_i = 0& eeimg=&1&&,于是得到&img src=&http://www.zhihu.com/equation?tex=%5Cbeta+%3D+-%5Cfrac%7B%5Cnabla+C_%7Bxr%7D%28p_%7Bi%2B1%7D%29%5ETAd_i%7D%7Bd_i%5ETAd_i%7D& alt=&\beta = -\frac{\nabla C_{xr}(p_{i+1})^TAd_i}{d_i^TAd_i}& eeimg=&1&&。&/p&&p&于是我们可以得出结论,使用这种方法,在一个关于&img src=&http://www.zhihu.com/equation?tex=N& alt=&N& eeimg=&1&&维向量的二次函数上,我们可以使用&img src=&http://www.zhihu.com/equation?tex=N& alt=&N& eeimg=&1&&次迭代,从任意一点出发找到最值点,此算法称为&b&共轭梯度法&/b&(Conjugate Gradient),事实上可以认为是梯度下降法和牛顿法的折衷。&/p&&p&由此我们可以得到一个求解任意二阶可导函数&img src=&http://www.zhihu.com/equation?tex=C_%7Bxr%7D%28p%29& alt=&C_{xr}(p)& eeimg=&1&&极值的算法:&/p&&blockquote&&ol&&li&以一定方式(比如随机)选取&img src=&http://www.zhihu.com/equation?tex=p_0& alt=&p_0& eeimg=&1&&作为初始点开始迭代&/li&&li&对于迭代中的每第 &img src=&http://www.zhihu.com/equation?tex=i& alt=&i& eeimg=&1&& 步,根据&img src=&http://www.zhihu.com/equation?tex=C_%7Bxr%7D%28p_%7Bi%7D+%2B+p%29& alt=&C_{xr}(p_{i} + p)& eeimg=&1&&的泰勒展开&img src=&http://www.zhihu.com/equation?tex=c_%7Bxr%7D%28p_i+%2B+p%29+%5Capprox+C_%7Bxr%7D%28p_i%29+%2B+%5Cnabla+C_%7Bxr%7D%28p_i%29%5ETp+%2B+p%5ETH%28C_%7Bxr%7D%29p& alt=&c_{xr}(p_i + p) \approx C_{xr}(p_i) + \nabla C_{xr}(p_i)^Tp + p^TH(C_{xr})p& eeimg=&1&&,&img src=&http://www.zhihu.com/equation?tex=C_%7Bxr%7D%28p%29& alt=&C_{xr}(p)& eeimg=&1&&在&img src=&http://www.zhihu.com/equation?tex=p_i& alt=&p_i& eeimg=&1&&附近的近似。&br&&/li&&li&使用共轭梯度法代替原来的牛顿法进行对泰勒展开式的极值进行迭代求解,&img src=&http://www.zhihu.com/equation?tex=N& alt=&N& eeimg=&1&&次 迭代后,得到最小值点&img src=&http://www.zhihu.com/equation?tex=p_%7Bi%2B1%7D& alt=&p_{i+1}& eeimg=&1&&,此时虽然仍然需要求解&img src=&http://www.zhihu.com/equation?tex=H%28C_%7Bxr%7D%29& alt=&H(C_{xr})& eeimg=&1&&但不再需要对其求逆&/li&&li&重复步骤2-3直到收敛或其他指定条件。 &/li&&/ol&&/blockquote&&p&那么我们就可以通过牛顿法的启发,在不需要额外指定学习率&img src=&http://www.zhihu.com/equation?tex=%5Calpha& alt=&\alpha& eeimg=&1&&的情况下,进行学习了。&/p&&p&。。。那么。。。能再给力点么?&/p&&p&可以。因为我们不需要计算整个&img src=&http://www.zhihu.com/equation?tex=H%28C_%7Bxr%7D%29& alt=&H(C_{xr})& eeimg=&1&&&/p&&h2&&u&▍4. Hessian-F&/u&&u&ree Optimization&/u&&/h2&&p&注意上面共轭梯度法中的两个主要参数的确定公式:&/p&&p&&img src=&http://www.zhihu.com/equation?tex=%5Calpha+%3D+-+%5Cfrac%7Bd_i%5ET%28Ap_i%2BB%29%7D%7Bd_i%5ETAd_i%7D& alt=&\alpha = - \frac{d_i^T(Ap_i+B)}{d_i^TAd_i}& eeimg=&1&& 和 &img src=&http://www.zhihu.com/equation?tex=%5Cbeta+%3D+-%5Cfrac%7B%5Cnabla+C_%7Bxr%7D%28p_%7Bi%2B1%7D%29%5ETAd_i%7D%7Bd_i%5ETAd_i%7D& alt=&\beta = -\frac{\nabla C_{xr}(p_{i+1})^TAd_i}{d_i^TAd_i}& eeimg=&1&&&/p&&p&我们可以看到,此处所有的&img src=&http://www.zhihu.com/equation?tex=A& alt=&A& eeimg=&1&&都并非单独出现,而是以&img src=&http://www.zhihu.com/equation?tex=Ad_i& alt=&Ad_i& eeimg=&1&&的形式出现的,由矩阵乘法的结合律知,我们可以先求出&img src=&http://www.zhihu.com/equation?tex=%5Cgamma_i++%3D+Ad_i& alt=&\gamma_i
= Ad_i& eeimg=&1&&,从而&img src=&http://www.zhihu.com/equation?tex=%5Calpha+%3D+-+%5Cfrac%7Bd_i%5ET%28%5Cgamma_i%2BB%29%7D%7Bd_i%5ET%5Cgamma_i%7D& alt=&\alpha = - \frac{d_i^T(\gamma_i+B)}{d_i^T\gamma_i}& eeimg=&1&& ,&img src=&http://www.zhihu.com/equation?tex=%5Cbeta+%3D+-%5Cfrac%7B%5Cnabla+C_%7Bxr%7D%28p_%7Bi%2B1%7D%29%5ET%5Cgamma_i%7D%7Bd_i%5ET%5Cgamma_i%7D& alt=&\beta = -\frac{\nabla C_{xr}(p_{i+1})^T\gamma_i}{d_i^T\gamma_i}& eeimg=&1&&。&/p&&p&现在我们将&img src=&http://www.zhihu.com/equation?tex=A& alt=&A& eeimg=&1&&代换成实际使用的&img src=&http://www.zhihu.com/equation?tex=Hessian& alt=&Hessian& eeimg=&1&&矩阵,由&img src=&http://www.zhihu.com/equation?tex=Hessian& alt=&Hessian& eeimg=&1&&矩阵的定义&img src=&http://www.zhihu.com/equation?tex=H%28f%29_%7Bij%7D+%3D+%5Cfrac%7B%5Cpartial%5E2+f%7D%7B%5Cpartial+x%5E%7B%28i%29%7D++%5Cpartial+x%5E%7B%28j%29%7D%7D& alt=&H(f)_{ij} = \frac{\partial^2 f}{\partial x^{(i)}
\partial x^{(j)}}& eeimg=&1&&及矩阵乘法的定义,我们可以对于&img src=&http://www.zhihu.com/equation?tex=y_i& alt=&y_i& eeimg=&1&&的第&img src=&http://www.zhihu.com/equation?tex=u& alt=&u& eeimg=&1&&行进行如下求解:&/p&&img src=&http://www.zhihu.com/equation?tex=%5Cgamma_i%5E%7B%28u%29%7D+%3D+%28H%28C_%7Bxr%7D%29d_i%29%5E%7B%28u%29%7D+%3D+%5Csum%5EN_%7Bv%3D1%7D%7B%5Cfrac%7B%5Cpartial%5E2+C_%7Bxr%7D%7D%7B%5Cpartial+p_i%5E%7B%28u%29%7D+%5Cpartial+p_i%5E%7B%28v%29%7D%7D%7D%28p_i%29+%3D+%5Cnabla+%5Cfrac%7B%5Cpartial+C_%7Bxr%7D%7D%7B%5Cpartial+p_i%5E%7B%28u%29%7D%7D%28p_i%29d_i& alt=&\gamma_i^{(u)} = (H(C_{xr})d_i)^{(u)} = \sum^N_{v=1}{\frac{\partial^2 C_{xr}}{\partial p_i^{(u)} \partial p_i^{(v)}}}(p_i) = \nabla \frac{\partial C_{xr}}{\partial p_i^{(u)}}(p_i)d_i& eeimg=&1&&&br&&p&即&img src=&http://www.zhihu.com/equation?tex=C_%7Bxr%7D%28p%29& alt=&C_{xr}(p)& eeimg=&1&&关于&img src=&http://www.zhihu.com/equation?tex=p%5E%7B%28u%29%7D& alt=&p^{(u)}& eeimg=&1&&偏导数对向量&img src=&http://www.zhihu.com/equation?tex=d_i& alt=&d_i& eeimg=&1&&的&b&方向导数&/b&。&/p&&p&根据方向导数的定义&/p&&blockquote&对函数&img src=&http://www.zhihu.com/equation?tex=f%28x%29& alt=&f(x)& eeimg=&1&&,有&img src=&http://www.zhihu.com/equation?tex=%5Cnabla_vf+%5Capprox+%5Cfrac%7Bf%28x+%2B+%5Cvarepsilon+v%29+-+f%28x%29%7D%7B%5Cvarepsilon%7D& alt=&\nabla_vf \approx \frac{f(x + \varepsilon v) - f(x)}{\varepsilon}& eeimg=&1&& (&img src=&http://www.zhihu.com/equation?tex=%5Cvarepsilon+& alt=&\varepsilon & eeimg=&1&&足够小)&/blockquote&&p&我们可以选取一个小小的&img src=&http://www.zhihu.com/equation?tex=%5Cvarepsilon+& alt=&\varepsilon & eeimg=&1&&,得到新的近似算法:&/p&&img src=&http://www.zhihu.com/equation?tex=%5Cgamma_i%5E%7B%28u%29%7D+%3D+%5Cnabla+%5Cfrac%7B%5Cpartial+C_%7Bxr%7D%7D%7B%5Cpartial+p_i%5E%7B%28u%29%7D%7D%28p_i%29d_i+%5Capprox++%5Cfrac%7B%5Cfrac%7B%5Cpartial+C_%7Bxr%7D%7D%7B%5Cpartial+p_i%5E%7B%28u%29%7D%7D%28p_i+%2B+%5Cvarepsilon+d_i%29+-+%5Cfrac%7B%5Cpartial+C_%7Bxr%7D%7D%7B%5Cpartial+p_i%5E%7B%28u%29%7D%7D%28p_i%29%7D%7B%5Cvarepsilon%7D& alt=&\gamma_i^{(u)} = \nabla \frac{\partial C_{xr}}{\partial p_i^{(u)}}(p_i)d_i \approx
\frac{\frac{\partial C_{xr}}{\partial p_i^{(u)}}(p_i + \varepsilon d_i) - \frac{\partial C_{xr}}{\partial p_i^{(u)}}(p_i)}{\varepsilon}& eeimg=&1&&&br&&p&又,因为&img src=&http://www.zhihu.com/equation?tex=%5Cgamma_i+%3D+H%28C_%7Bxr%7D%29d_i& alt=&\gamma_i = H(C_{xr})d_i& eeimg=&1&&可以视作由所有行向量&img src=&http://www.zhihu.com/equation?tex=%5C%7B%5Cgamma_i%5E%7B%28u%29%7D%7C+u+%5Cin+%5Cmathbb%7BN%7D%2C+u+%5Cin+%5B1%2CN%5D%5C%7D& alt=&\{\gamma_i^{(u)}| u \in \mathbb{N}, u \in [1,N]\}& eeimg=&1&&组成的列向量,所以我们有:&/p&&img src=&http://www.zhihu.com/equation?tex=%5Cgamma_i+%3D+H%28C_%7Bxr%7D%29d_i+%5Capprox+%5Cfrac%7B%5Cnabla+C_%7Bxr%7D%28p_i+%2B+%5Cvarepsilon+d_i%29+-+%5Cnabla+C_%7Bxr%7D%28p_i%29%7D%7B%5Cvarepsilon%7D& alt=&\gamma_i = H(C_{xr})d_i \approx \frac{\nabla C_{xr}(p_i + \varepsilon d_i) - \nabla C_{xr}(p_i)}{\varepsilon}& eeimg=&1&&&br&&p&Duang!我们无需真正求解&img src=&http://www.zhihu.com/equation?tex=Hessian& alt=&Hessian& eeimg=&1&&矩阵,只需要确定一个&img src=&http://www.zhihu.com/equation?tex=%5Cvarepsilon+& alt=&\varepsilon & eeimg=&1&&,在&b&每一步计算两次梯度&/b&即可~&/p&&h2&&u&▍5. 一点提醒&/u&&/h2&&p&注意本文第三部分中最后总结出算法的第三步:&/p&&blockquote&3. 使用共轭梯度法代替原来的牛顿法进行对泰勒展开式的极值进行迭代求解,&img src=&http://www.zhihu.com/equation?tex=N& alt=&N& eeimg=&1&&次 迭代后,得到最小值点&img src=&http://www.zhihu.com/equation?tex=p_%7Bi%2B1%7D& alt=&p_{i+1}& eeimg=&1&&,此时虽然仍然需要求解&img src=&http://www.zhihu.com/equation?tex=H%28C_%7Bxr%7D%29& alt=&H(C_{xr})& eeimg=&1&&但不再需要对其求逆&/blockquote&&p&我们需要注意的一件事是,这“&img src=&http://www.zhihu.com/equation?tex=N& alt=&N& eeimg=&1&&次迭代”会在整个算法进行&b&全局迭代的每一步&/b&进行,意味着:&/p&&p&&i&&u&如果我们的参数数量非常非常多,那么我们的每一步都会因此耗时非常非常久!&/u&&/i&&/p&&p&这也就意味着:&/p&&p&&i&&u&在&b&参数数量足够多&/b&的情况下,Hessian-Free Optimize算法的效率可能&b&低于梯度下降&/b&法!&/u&&/i&&/p&&p&如何解决这一问题呢?&/p&&p&一般来说,&b&如果我们从一个点出发,寻找附近的极值点,该点到目标极值点的距离越远,Hessian-Free方法相对传统梯度下降法的收益越高&/b&。&/p&&p&所以一种更实用的优化是,指定一些策略,使得系统在一开始采用Hessian-Free方法进行几次迭代后,转而使用梯度下降法进行后续的迭代。&/p&&br&&p&最后,鉴于鄙人基础薄弱,智商堪忧,又加上此文又臭又长的特性,难免有不明确不准确不正确之处,欢迎探讨质疑与指点。&/p&
注:此文在机器学习方面属于入门性的文章,虽是一篇机器学习方向的随记,但其中方法,思路并非仅限于机器学习相关方向。也不要求对于机器学习相关领域有太多的基础和理解。有一定数学基础,涉及系统参数优化方法的,都可以参考之~ 这两天看Coursera上面
&figure&&img src=&https://pic2.zhimg.com/v2-1d7d274c0a3fa2beddda7b94_b.jpg& data-rawwidth=&1024& data-rawheight=&768& class=&origin_image zh-lightbox-thumb& width=&1024& data-original=&https://pic2.zhimg.com/v2-1d7d274c0a3fa2beddda7b94_r.jpg&&&/figure&&p&前段时间我受极视角邀请,在斗鱼上直播分享有关GAN的话题。考虑到现在网上关于GAN的文章、视频都已经非常多了,所以我就故意选择了一个之前没有什么人讲过的主题:LSTM之父Schmidhuber与GAN之间的恩怨纠葛。其实这件事在英文网上传播得还挺广,而且除了八卦之外也有一些严肃的学术讨论,可惜相关的中文信息寥寥,不过这样倒正好给我一个机会来给大家介绍一些新内容。&/p&
&p&其实相比视频直播我还是更喜欢写成文章的形式,因为后者更适合深入理解和收藏回顾。所以为了方便错过直播或者不习惯看视频的朋友,我对当晚直播内容进行了文字整理,全文分为以下四个部分:&/p&
&ul&&li&八卦Schmidhuber与GAN之间的恩怨&/li&
&li&讲解Schmidhuber在92年提出的PM模型&/li&
&li&简单介绍GAN、InfoGAN、对抗自编码器三个模型&/li&
&li&对比以上四个模型之间的异同&/li&
&/ul&&p&如果选择看直播回放,可以到百度云下载。&br&链接:&a href=&https://link.zhihu.com/?target=http%3A//pan.baidu.com/s/1skUZidn& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&pan.baidu.com/s/1skUZid&/span&&span class=&invisible&&n&/span&&span class=&ellipsis&&&/span&&/a&&br&密码:200j&/p&
&h2&一、双雄捉对&/h2&
&p&2016年12月,NIPS大会,Ian Goodfellow的GAN Tutorial上,发生了尴尬的一幕。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-dbea_b.jpg& data-rawwidth=&2048& data-rawheight=&768& class=&origin_image zh-lightbox-thumb& width=&2048& data-original=&https://pic3.zhimg.com/v2-dbea_r.jpg&&&/figure&&p&正当Goodfellow讲到GAN与其他模型的比较时,台下一位神秘人物站起来打断了演讲,自顾自地说了一大通话(&a href=&https://link.zhihu.com/?target=http%3A//www.bilibili.com/video/av/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&视频片段在此&/a&)&br&&/p&
&p&&figure&&img src=&https://pic2.zhimg.com/v2-36650aae4e36c6c61d06c957cc32e181_b.jpg& data-rawwidth=&1024& data-rawheight=&768& class=&origin_image zh-lightbox-thumb& width=&1024& data-original=&https://pic2.zhimg.com/v2-36650aae4e36c6c61d06c957cc32e181_r.jpg&&&/figure&这个观众不是别人,却是大名鼎鼎的Jürgen Schmidhuber,一位来自德国的AI科学家。虽然名声不如三巨头响亮,但Schmidhuber其实也是深度学习的先驱人物,在上个世纪就做出了许多重要贡献,其中最有名的就是他在1997年提出的LSTM,而他本人也被尊称为”LSTM之父”。&/p&
&p&&figure&&img src=&https://pic1.zhimg.com/v2-357b5ab19eeee7c9ee0cbb1f_b.jpg& data-rawwidth=&640& data-rawheight=&894& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic1.zhimg.com/v2-357b5ab19eeee7c9ee0cbb1f_r.jpg&&&/figure&本文八卦的正是这位大佬跟Goodfellow在GAN上的争论,但其实这早就不是Schmidhuber第一次开炮怼人了。再往前2015年的时候,我们熟知的三巨头Hinton、Lecun、Bengio在Nature上发表了一篇《Deep Learning》综述之后,Schmidhuber就站出来&a href=&https://link.zhihu.com/?target=http%3A//people.idsia.ch/%7Ejuergen/deep-learning-conspiracy.html%3Futm_campaign%3DArtificial%2BIntelligence%2BWeekly%26utm_medium%3Demail%26utm_source%3DArtificial_Intelligence_Weekly_8& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&指责他们行文偏颇&/a&,认为他们没有重视自己做出的很多贡献,觉得自己没有得到应有的荣誉,而Lecun之后也发文&a href=&https://link.zhihu.com/?target=https%3A//www.facebook.com/ylecun/posts/834& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&霸气反驳&/a&,场面十分激烈。当然这不是本文的重点,感兴趣的朋友可以进一步挖掘,下面还是继续回到NIPS演讲现场,看看Schmidhuber这回究竟又是为何开炮。&/p&
&p&只见他站起来之后,先讲自己在1992年提出了一个叫做Predictability Minimization的模型,它如何如何,一个网络干嘛另一个网络干嘛,花了好几分钟,接着话锋一转,直问台上的Goodfellow:“你觉得我这个PM模型跟你的GAN有没有什么相似之处啊?”&/p&
&p&&figure&&img src=&https://pic4.zhimg.com/v2-ad73d9e0d30a5aa7364bd_b.jpg& data-rawwidth=&1024& data-rawheight=&768& class=&origin_image zh-lightbox-thumb& width=&1024& data-original=&https://pic4.zhimg.com/v2-ad73d9e0d30a5aa7364bd_r.jpg&&&/figure&似乎只是一个很正常的问题,可是Goodfellow听完后反应却很激烈。Goodfellow表示,Schmidhuber已经不是第一次问我这个问题了,之前呢我和他就已经通过邮件私下交锋了几回,所以现在的情况纯粹就是要来跟我公开当面对质,顺便浪费现场几百号人听tutorial的时间。然后你问我PM模型和GAN模型有什么相似之处,我早就公开回应过你了,不在别的地方,就在我当年的论文中,而且后来的邮件也已经把我的意思说得很清楚了,还有什么可问的呢?&/p&
&p&&figure&&img src=&https://pic4.zhimg.com/v2-9a9d4028bbaa4eae2e7843_b.jpg& data-rawwidth=&1024& data-rawheight=&768& class=&origin_image zh-lightbox-thumb& width=&1024& data-original=&https://pic4.zhimg.com/v2-9a9d4028bbaa4eae2e7843_r.jpg&&&/figure&确实正如Goodfellow所言,早在2014年的第一篇GAN论文中,PM已经被拿出来跟GAN进行了比较,举了三点不同之处。不过那只是论文的最终版本,而在一开始投递NIPS的初稿中并没有下面这段文字,也就是说很可能Goodfellow一开始是不知道有PM这么一个东西的。&/p&
&p&&figure&&img src=&https://pic3.zhimg.com/v2-f4cccd324c_b.jpg& data-rawwidth=&1365& data-rawheight=&399& class=&origin_image zh-lightbox-thumb& width=&1365& data-original=&https://pic3.zhimg.com/v2-f4cccd324c_r.jpg&&&/figure&那为什么在最终版本里又出现了PM的内容呢?原来,当年Schmidhuber就是NIPS的审稿人,而且刚好就审到了Goodfellow的论文。我们现在知道这篇论文挖了一个巨大无比的坑,引得大批人马前仆后继都来做GAN的研究,以后也应该是能写进教科书的经典工作。但就是这样牛逼的一篇论文,当年Schmidhuber居然给出了拒稿意见!当然另外两位审稿人识货,所以论文最后还是被收了。&/p&
&p&回到正题,当时Schmidhuber在&a href=&https://link.zhihu.com/?target=http%3A//media.nips.cc/nipsbooks/nipspapers/paper_files/nips27/reviews/1384.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&评审意见&/a&中认为,他92年提出的PM模型才是“第一个对抗网络”,而GAN跟PM的主要差别仅仅在于方向反过来了,可以把GAN名字改成“inverse PM”,即反过来的PM。按他的意思,GAN简直就是个PM的变种模型罢了。&/p&
&p&&figure&&img src=&https://pic1.zhimg.com/v2-cb018a4bfe9df2fd34ad9b3_b.jpg& data-rawwidth=&966& data-rawheight=&590& class=&origin_image zh-lightbox-thumb& width=&966& data-original=&https://pic1.zhimg.com/v2-cb018a4bfe9df2fd34ad9b3_r.jpg&&&/figure&Goodfellow当然不同意,所以就有了14年最终版本里的三点不同之处,具体细节放在最后模型比较的部分再讲。然而Schmidhuber并不接受这些说法,私下里又通过邮件跟Goodfellow进行了一番争论,还到16年的NIPS大会上打断演讲,公开较劲,就是想让对方承认PM模型的地位和贡献,可谓不依不饶。&/p&
&p&Goodfellow也不客气,干脆在&a href=&https://link.zhihu.com/?target=https%3A//arxiv.org/abs/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&2016年的GAN Tutorial&/a&中完全移除了对PM的比较和引用。他&a href=&https://link.zhihu.com/?target=https%3A//www.quora.com/Was-J%25C3%25BCrgen-Schmidhuber-right-when-he-claimed-credit-for-GANs-at-NIPS-2016& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&在Quora上公开表示&/a&,“我从没有否认GAN跟另外一些模型有联系,比如NCE,但是GAN跟PM之间我真的认为没太大联系。”更有意思的是,Goodfellow还透露说,“Jürgen和我准备合写一篇paper来比较PM和GAN——如果我们能够取得一致意见的话。”想必真要写出来,背后又要经过一番激烈的争论了。&/p

我要回帖

更多关于 access数据库管理系统 的文章

 

随机推荐