一 引言
上一周,学习的范围比较散,因为觉得只看论文和基础知识会很干,想要提高一下编程的能力。主要有这几件事情:
二 目前进度
Task 1. 学习神经网络基本知识:
- 找了一些bp神经网络的资料(比较简单),然后去matlab做了仿真,工程是一本matlab书籍的例题。
-
在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.pngGenerator 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.png2. 推导 (对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.pngEg:对于下面三个G来说,G3就是符合条件的 G* 。(G和D应该在更高维,这只是一个便于理解案例)
image.png下面的演算法就是在解
image.png image.png3. 算法:
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.pngIn 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日
网友评论