如果,AI可以帮你生成一些猫,很萌的那种,但是不能吸,你会做何感想?
Facebook聊天框里出道的灰色短毛猫Pusheen,是柔软的微胖界宠儿,中文名字叫胖吉。
一个来自谷歌大脑的程序猿说,他和他妹子都很喜欢这只胖子。于是,他有了用AI帮妹子生出很多很多小吉 (的图片) 的想法。
△ “其实就是有了眼睛和耳朵的水滴”
当然,并不只是想想而已。
生成对抗网络 (GAN) 是精分的AI,由两个神经网络组成,一是生成模型 (Generator) ,即画师,二是判别模型 (Discriminator) ,即鉴赏家。缩略为G和D。
人类要用大量的图像来喂养GAN,培养两个神经网络的艺术细菌。
然后,G可以在熏陶之下,模仿着画出自己的作品,让D以为那就是人类投喂的画;而D渐渐了解自己吃过的画是什么味道,就能辨别哪些图是G画的。
相爱相杀的日子里,两者技能都会得到有效提升。G的画功越来越像人类,D也越来越难骗。
不过,技术宅支配的不是普通的GAN,而是名为BEGAN的新朋友。
它的判别模型是自编码器 (AutoEncoder) 结构,即D的输入是图像,输出是编码解码后的图像;生成模型则借鉴了WGAN的损失函数。
不过,GAN的一生阅片无数,通常需要喂食几万乃至几百万张图像,才能茁壮成长。
可惜的是,虽然贵为表情包,胖吉也没有很多照片的。
于是,机智的少年加了一个 (并不厉害的) 小特技,一幅图翻过来掉过去,或放大或缩小,或背景变白,就变出了很多训练素材。不过,毕竟原始图库几百张,扩充之后可能还是有些干瘪。
既然胖吉的姿势不多,场景也不多,技术宅当时就没有太大的幻想。他抱着养死也没事的一颗宽广的心,开始训练BEGAN。
训练过程中,D的目标是让判别错误越少越好;G的目标,是让D错得越多越好。具体来说——
一张图片相当于一个数据x,D对它编码解码后得到图像D(x)。
z是一串随机数组成的向量 (Latent Vector) ,G根据它来生成的图可表示为g(z),D对它编码解码后得到图像D(g(z))。
随着训练的进行,G的模仿能力越来越强,D(g(z))会越来越接近D(x)的分布。
不过,BEGAN在对比D(g(z))和D(x)之间差异的时候,用的损失函数 (Loss Function) 有些不一样。
让G作品的重构误差 (Reconstruction Error) 分布,去逼近人类作品的重构误差分布——BEGAN的损失函数使用的是这两者之间的差异。Wasserstein距离,可以把这个差异转换为真实的差异。
技术宅用3个数字组成的向量,来表示图片。他还给吃瓜党提供了自己调整向量的play——
每个角上的图像都可以自行设定,作为起点。从四角出发,生成的其他图,便是灰猫的渐变修养。
这个过程里,多多少少会有可爱的新胖吉出现。当然,生成效果并没有那么完美,畸形猫和看不出喵型的图像也理直气壮地存在。
程序猿友情提示,如果想少看一些畸形猫,就尽量把数字调小一些。数大了之后,容易有斑斓的色彩倾泻出来,让你忘了画猫的初衷。
不过那样的话,猫的样子也很难有丰富的变化,可能会比较单调。
△ 有种听天由命的感觉
不想费力调向量的话,就点下一键生成按钮 (如上图) ,看到比渐变过程更随机的猫阵。
为了能让浏览器对面的大家感受到猫阵的厉害,程序猿还特意用TensorFlow.js重写了程序 (怕不是想增加撒狗粮的力度吧) 。
在少年提供的三个模型里,我喜欢Model 2的效果,笔触比较圆润,配色似乎也可爱一些。
从WGAN那里借来的损失函数,帮BEGAN保证了两个模型的势均力敌,D和G想要赢对方都不那么容易。
程序猿说,不久以后就会公布自己生成胖吉用的代码,但在那之前他想先给大家划个重点。此次实验过程中发挥最好的结构和超参数如下——
· 激活函数用了带泄露整流函数 (leaky ReLU) ,alpha=2
· 批量归一化
· G,步长为1的卷积层之后,近邻 (Nearest Neighbor) 算法缩放图像两次
· D,步长为1的卷积层之后,2 x 2窗口的平均池化 (Average Pooling)
· D,每层32或64个过滤器
· G,开始每层32或64个过滤器,后面依次翻倍 (e.g, 32,32,32,64,64,64,128,128,128…)
· 100维的潜在空间
· 学习率e-4或5e-4或e-3
视频是训练过程,可以看到AI一开始画的图很简单,灰疙瘩而已。后面元素就慢慢多起来了,耳朵、尾巴、五官,甚至还有吃的和玩的。
不过,少年也说了,有些模型mode collapse的迹象比较明显,作品没什么新意。他觉得一部分原因可能是,用略显稚嫩的方法扩充的数据集,掩饰不住匮乏的本质。BEGAN从小就没吃饱吧。
再有,在模型取舍上,是选单调但能生产完整胖吉的模型,还是选天马行空多姿多彩但日常画出畸形猫的模型?当事人还是倾向于后者。
少年果然有双发现美的眼睛,给自家AI的作品 (强行) 划归了多个不同的系列。
比如,戏水吉。
比如,玩火吉。
比如,绿林吉。
比如,飞天吉。
比如,连体吉。
另外,程序猿还做了加减play,他说虽然效果不太明显,但结果还是合理的。你看——
友好解读是,吃taco的左歪猫 - 左歪猫 + 被绳牵着的右歪猫 = 吃小taco且被绳牵着的右歪猫。
好吧,我信了。
比起BEGAN论文里生成人脸的整容技能,胖吉的举一反三可能只是小打小闹。
但不管怎么看,这也是表情包和TensorFlow.js的正确打开方式了,至少可以让妹子开心啊。
回头想想那个要举着手机、在办公室里到处寻觅表情包本体的游戏,不被当成绅 (hen) 士 (tai) 也很难啊。
没有对比就没有伤害。所以,传送门也要放在一起。
这是胖吉变变变试玩地址:
http://zna.do/pusheen
这是寻找表情包试玩地址:
https://emojiscavengerhunt.withgoogle.com/
P.S. 程序猿的名字叫Zachary Nado,进入谷歌大脑之前,他还在发射成瘾的SpaceX工作过。那么,为什么要在结尾多介绍一次呢?因为小卷毛还是有点可爱。
— 完 —
加入社群
量子位AI社群17群开始招募啦,欢迎对AI感兴趣的同学,加小助手微信qbitbot7入群;
此外,量子位专业细分群(自动驾驶、CV、NLP、机器学习等)正在招募,面向正在从事相关领域的工程师及研究人员。
进群请加小助手微信号qbitbot7,并务必备注相应群的关键词~通过审核后我们将邀请进群。(专业群审核较严,敬请谅解)
诚挚招聘
量子位正在招募编辑/记者,工作地点在北京中关村。期待有才气、有热情的同学加入我们!相关细节,请在量子位公众号(QbitAI)对话界面,回复“招聘”两个字。
量子位 QbitAI · 头条号签约作者
վ'ᴗ' ի 追踪AI技术和产品新动态