no.3-10/31/2018

一 引言

上一周,学习的范围比较散,因为觉得只看论文和基础知识会很干,想要提高一下编程的能力。主要有这几件事情:

二 目前进度

Task 1. 学习神经网络基本知识:

  • 找了一些bp神经网络的资料(比较简单),然后去matlab做了仿真,工程是一本matlab书籍的例题。
image.png
  • 在github找了deep learning的matlab源码来看(该源码比较知名)。目前看了一下CNN方面的,主要是因为也学习了CNN的实现逻辑,然后想要对比看看其源码和BP有什么不同。CNN的内容很多,现在看比较多别人发到网上的总结,也找到了不少不错的学习资源,这方面花费了比较多时间。这部分的内容我放在另一个附件中。

  • 下载了MNIST数据集准备做手写数字识别的训练。

  • 了解了opencv的dnn库上调用神经网络,模型都是别人训练好的,看了几份工程,知道怎么用之后就没继续看了。

  • 继续学习tensorflow,主要是看一些教程的代码,然后自己重新手写一遍,加深印象。这部分感觉比较重要,之后继续练习。

看完这部份感觉就是,源码还是要看的,这对理解网络模型和编程有很帮助,但是细枝末节也不要穷究。现在对怎么程序实现一个网络有了一些了解。

Task 2. 对GAN进一步学习

1. Basic theory of GAN - 2014 paper

图像可以认为是一个高维的Vector,在高维空间中,只有部分区域的图像是“真实”的(可以是样本集 P_data(x)),其他区域形成的图像都不那么“真实”。

image.png

Generator G就是把一个Vector经过G后转化后的向量空间和样本集的向量空间 P_data(x) 越接近越好。

image.png

关键在于怎么计算 Div(P_G, P_Data)

image.png

训练一个Discriminator,其Objective Function是V(G, D)。在训练时,固定G,只调整D的参数,maximize V(G, D) 。

image.png

2. 推导 (对V变形) :

Objective Function:

image.png

对V积分

image.png

由于D(x)可以是任何函数,所以积分的定义相当于对积分项分别取最大。(比如D(x)是一个不连续的函数,然后恰好满足每一项都最大)

image.png

对式子用一定符号表示:

image.png

对上式微分,取极值。且可知这个极值是极大点,不是最小,也不是saddle point鞍点(不稳定极点)。

image.png

代入 D*(x)

image.png

所以最佳D就是 D*(x)

[图片上传中...(image.png-fc3b9d-1593945288472-0)]

当我们在train一个discriminator时,就是在evaluate P_G 和 P_data 的JSD.

V(G, D)就是 P_G 和 P_data 的divergence

image.png

Eg:对于下面三个G来说,G3就是符合条件的 G* 。(G和D应该在更高维,这只是一个便于理解案例)

image.png

下面的演算法就是在解

image.png
image.png

3. 算法:

image.png

求解L(G)求gradient descent。对于L(G)中的包含max,其实就是对L(G)的分段函数分别求导即可。

image.png

即对于给定 G_0 ,用gradient ascent找到max V(G, D) ,然后对整体 L(G) 用gradient descent 找到min L(G)

image.png

但是对 G_0 已经找到的 L(G)中 D 取 D_0* 时,V(G_0, D_0* )最大 ,但是当固定 D_0* ,调整G时,V(G_0, D_0* ) 随着G的变化,整个函数也变化了,此时的取值 D_0* 不再是 V(G, D) 的最大值。面对这样的情况,我们认为G的变化时很小的,两个 V(G, D) 变化很小,不会出现下图中G变化后,V(G, D) 的最大值变化很大的问题。就是在train D时应该跑到底,但是对于G就跑比较少(interaction),免得这个假设不成立。

image.png

In practice:

image.png

实际上,GAN中train D的过程就是 max V(G, D) ,就是在量出JSD。Train G的过程就是较少JSD,G不能train太多次,不然D就不能evaluate JSD。

image.png

此外,原作论文中指出,由于G产生的时“不真实“的图片,所以D(x)很小,所以把V进行如下修正。但是实际上两个V都是可以做出来的,并且在此后被命名为MMGAN和NSGAN。

image.png

原作作者有一个猜想是:因为G会产生越来越近似于真实的图像,那么G生成的图像 和真实图像x之间的距离会越来越近,D会越来越难分别,最后D会变得无法区分真实图像,整个坏掉(变成一条直线,所有输入都是真实的图像)。这个理论看起来是合理的,但是实际上在实验中是没有办法train出完全坏掉的D(变成直线)。(这个问题还没有解决)

image.png

二:总结和计划

总结:

  • 从基础的源码到封装好的库练习神经网络的具体编程。这方面还有一些未完成的部分(一些想要练习的经典项目),之后有没有时间补完。

  • 对GAN的原作进行学习。

  • 比较遗憾的是还是没有看完文献。在起初我看BIG GAN的文献时经常卡住,感觉还是对数学推导比较复杂,基础的深度学习知识也较欠缺。

黄俊嘉

2018年10月31日

你可能感兴趣的:(no.3-10/31/2018)