程序员想搞机器学习?看看Nodejs之父这一年摸爬滚打的心路历程 来源:CSDN 原标题:程序员想搞机器学习?看看Nodejs之父这一年摸爬滚打的心路历程 导读:本文是Nodejs之父Ryan Dahl在Google Brain做了一年深度学习后的心得体会,他在那里的目标是用机器学习来卓别林的老电影自动修改到4K画质。他的新项目成果几何?Nodejs之父的机器学习心得又是什么?下面让我们直接来看文章: 去年,在研究TensorFlow做出一番成果后,我开始申请Google Brain的首届见习项目,最后竟然成功了。受邀参加该项目的共有24人,每人都有着不同的机器学习背景,我们需要在Google位于山景城的深度学习研究实验室工作一年,跟Google的科学家和工程师们共同来推进该技术上的前沿研究。 如今,这个为期一年的项目刚刚结束,我就在这里总结一下自己的心得体会。 我最初的目标是改进老电影或电视剧的画面:想象一下,画面粗糙的90年代电视剧,或是60年代黑白电影,要是能被修正为色彩华丽的4K画面,那样的观影体验该有多棒! 而这事看上去完全可行:我们很轻松就能把4K视频转换成满是颗粒感的、低分辨率的、甚至是只有黑白两色的视频,那只要训练出某个监督模型来反转这个过程就可以了。而且,可用的训练数据无穷无尽。咳咳,这个想法简直太彪悍了! 但也别高兴太早——现在的技术还没到这步……但是快了! 带着这样的目标,我再一次从纽约布鲁克林搬到旧金山湾区(上一次是为Node.js项目),以更好地实现这里的深度学习技术。几天后,我生活的日常,j2直播,就变成了跟Google的深度学习专家进行讨论、在Google庞大的软件库内浏览代码…… 如果你不想看接下来的技术细节,可以直接跳到总结部分。 超分辨率的像素递归 众所周知,FBI在《犯罪现场调查》(CSI)中所用的缩放技术是不可能实现的。没人能任意放大照片。然而,在你放大照片图像时把相关像素所构成的合理图形呈现出来,这还是有可能做到的。能够平滑地提升图像分辨率,将是我实现目标的第一步。 该问题在本文中用 超分辨率 一词来描述,很久以前人们就在尝试解决它了。 据此,我们认识到简单使用ConvNet无法彻底解决该问题:它只是把你输入的低分辨率图像的像素间距(L2)最小化来输出高分辨率图像。这类损失函数所学到的,是输出所有可能结果的平均值——所输出的图像看上去就比较模糊了。我们想要的模型是这样的:对于给定的低分辨率图像,它能从所有可能的强化结果中选出那张特定的、效果最好的高分辨率图像。如果是“强化”一张关于树的模糊照片,我们会希望它能给出枝、叶在位置上的一些细节,即便它们的位置并非是枝、叶在树上的实际位置。 某种条件型的GAN(生成式对抗网络)看上去很有希望,但构建起来较难,经过几次失败的尝试后,我们换成了另一种新型的生产式模型:PixelCNN,它也比较有戏。(等我们启动之后,用GAN解决来超分辨率问题的SRGAN就发布了,它生成的结果非常好。) PixelCNN是一种奇怪的反直觉模型。它将图像生成问题重写成每次选择一个像素序列。像LSTM(长短时记忆网络)这样的门控制递归网络在序列生成方面是非常成功的,它通常会用在单词或字符上。PixelCNN巧妙地构建出一个卷积神经网络(CNN),它能基于先前的像素的概率分布来精确生成像素。这是RNN和CNN的混合功能。
示意图由 van den Oord 等人所绘 意外的是,PixelCNN所生成的图像看起来非常自然。不像艰难平衡两种目标的对抗网络,该模型的目标只有一个,因而面对超参数的变化,它有更好的稳健性。也就是说,它更易于优化。 解决超分辨率问题的首次尝试,我野心过大,选用了ImageNet来训练PixelCNN。(跟CIFAR-10、CelebA或LSUN相比,ImageNet是个较难的数据集,很多生成式模型研究都在用它。)但很显然,按像素来序列生成图像的过程极其缓慢。输出图像的尺寸大于64x64时,耗时将超过数小时!然而,在我把图像的尺寸限制到小尺寸,并使用脸部或卧室类的小型数据集后,得出的结果就开始令人激动了。 (责任编辑:本港台直播) |