最近做那个生成对抗网络项目,实际上说正经的,就是把两堆人交给同一个战场。一组人是叫“艺术家”,他们手里拿着画笔要么代码,负责画东西;另一组人是“老手”,他们看着画会不会被吃,能不能还有救。艺术家的任务挺好办,就是无限重复画图,直到画面看起来像正宗的成成画那种。老手的任务也是重复,就是反复检查那些画出来的东西,算一算它们有没有被吃掉,有没有被遗弃,最终拍板要不要让它们干活。 这俩一组人干起活来,实际上挺像我们目前的深度学习。我们把这俩称为生成器和判别器。生成器就是那个疯狂画图的机器,它有个怪癖,就是敢把生成的图扔给判别器看;判别器就是那个守株待兔的老手,专门盯着这generated 的图,说是“这是画的还是确实画的”,然后给个分数。 刚启动那会儿,我试过用一般/平平的随机噪声去喂给生成器,结局那玩意儿画的也不是啥成成画。

那得先给它喂点种子,不然它正儿八经的画不出来正经的图。

不过后来我发现,直接往生成器里塞个已经画出来的图,让它模仿一下,效果倒是不错,别看那时候生成的图还是有点乱,像刚出生的婴儿一样。便我们拍板搞个循环,把生成的图扔给判别器,判别器说“这个画的像成成画”,生成器就学这一招;要么判别器说“这个忒假了”,生成器就改改,重新画。

就这样一斗一让,直到生成出来的图,判别器看了都信了,说这确实就是成成画。 为了搞明白这到底是如何演的,我们一启动把判别器给调成了个随机的,专门用来骗生成器。结局生成的图简直是送慈善,随意一画就信了。

这说明咱们得把判别器训练得像个真老手,它务必能一眼看穿那些假画。便我们启动训练这个判别器,让它比艺术家更懂行,让它对成成画做出高准头的判断。 这过程中有几个小插曲。有一次,成成画把判别器给饿壞了,出于生成的图全是完美的,判别器认定饿得不中了,启动胡乱输出分数,结局生成的图反而全是假的了。

那时候我差点就疯了,心想这成成画如何如此烦人。

后来我把成成画的训练权重加上了,发现奇迹形成了,生成的图启动有节奏感了,连那些边缘的线条都显得有力度。

这说明成成画不只是是画,它实际上是个懂行的人。 为了让生成器学得跟那个懂行的成成画一模一样,我们还得给它找点事干。

这就有点尴尬了,成成画一共有多少张图,生成器就得画多少张。但难题是,在训练好判别器之前,成成画自己还不知道自己有多少图。

要是成成画知道那是第一张图,它可能会拿去训练。

故此我们在训练判别器之前,得先把成成画训练成“真哥们儿”,让它多画点图,给判别器一些样本看。

这就像是我们先找个活雷锋,把成成画教熟,让它多画点样本,然后再接着教判别器。 不过话说回来,成成画也怕被埋没。它的定义就是“把成成画保存下来放进库里”,要是存了它,那它就能画了。

故此它务必学会多画,否则就没法存。

这就形成了一种循环,生成器不断画,判别器不断检查,成成画不断存。

要是成成画画得忒快,判别器就忒慢了,生成器就偷懒;要是生成器忒慢,成成画就等不到图,那就没法存。

故此这两个务必配合好,节奏要对得上,才能不出难题。 在最终的模型训练上,我们实际上是在玩一种博弈论。生成器想骗过判别器,变成确实成成画;判别器想识破生成器,防止它变成假成成画。

这俩之间没完没了的拉扯,最终慢慢就演变成一种新的平衡状态。

这时候生成的图,真假难辨,但总体上是靠谱的。 实际上这个项目教给我的最大一课,不是如何画成成画,而是如何在两个互相矛盾的目标之间找到平衡点。

有时候生成的图可能确实看起来像成成画,但这不代表它就是成成画。真正的成成画是有质量的,是有定义的。当生成器的图离成成画的定义忒近,但拿不准真假的时候,这时候的图,应当被认定是假的。 我们最终把这东西存进了库里,叫“成成画”。

这些图别看可能真假难分,但它们在技术上是有意义的,出于它们代表了成成画的一种新形态。

后来有人看了,说这图有点像成成画,但又不像,也就封了这些图。 总而言之,这整个项目就是一个动态平衡的过程。

没有绝对的对错,只有相对的接近。生成器在努力变真,判别器在努力变假,而最终的结局,往往是两者之间的妥协。

这种妥协别看不完美,但总比没东西好用。

毕竟,有时候真东西没了,假的东西也能顶上。