ProGAN
ProGAN的结构ProGAN也是用于图像生成的一种生成对抗网络。在原始GAN 以及一些GAN变体中,都是对搭建好的整个网络(包括生成器和判别器)直接进行训练。而ProGAN的独特之处在于采用了逐步增长的方式,如下图所示:
具体来说,生成器最开始只有一层,用于生成分辨较低的图像,比如图中的44;此时判别器也只有一层,将生成的44的图片和真实的4*4的图片一起输入到判别器进行,得到输出结果。训练若干轮次。
接下来,给生成器加一层,使得其生成的图像分辨率可以高一些,比如图中的88;此时也给判别器加一层,将生成的88的图片和真实的8*8的图片一起输入到判别器,得到输出结果。训练若干轮次。
一直重复上述过程,直到生成器生成的图像分辨率达到指定大小。
从上述描述可以看出,对于每一个特定层数的网络来说,其训练过程和原始GAN以及一些GAN变体的训练过程是一样的。ProGAN的精髓就在于它的网络(生成器和判别器)是逐步增长的。
下面这张动态图演示了上述文字描述的过程:
ProGAN的细节描述淡入我们已经说过,生成器和判别器的训练不是一蹴而就的,而是逐步增长的。而且,对于训练好的网络层,当新的层来临时 ...
Transformer
Transformer的结构Transformer的结构如上图所示,我们将其拆解为x个小部分,逐个部分用代码实现,然后再将各个部分联结起来,形成最终的Transformer。
关于Transformer的原理,网上已经有很多优质的文章了,这里我们关心其代码实现。对于其每一个子模块(以类的形式定义),我们都会实例化一个对象,用具体的数值代入其中,把中间过程中产生的变量维度及相关信息打印出来,这些都体现在代码注释中,请留意。
Muti-Head AttentionMuti-Head Attention接收输入q,k,v,维度在这里都是$[4,3,512]$,输出维度也是$[4,3,512]$。
q和k的维度是一致的,而v可以和它们不一致,这里只是为了方便才将三者维度保持一致。
SelfAttention实现代码如下 (注意注释)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707 ...
CycleGAN
上图中,最左边一列是原图,右侧的4列是将原图转换成其他风格后的图像。这种转换被称为图像风格迁移。
实现图像风格迁移的方法有很多,这里我们介绍CycleGAN并用它来实现图像风格迁移。
CycleGAN的网络结构CycleGAN的网络结构如上图所示。它的训练数据集需要来自两个不同的域(就是两种不同风格的图像):$A,B$;
CycleGAN包含两个生成器:$G_{AB},G_{BA}$,分别用于将A风格图像转换为B风格图像,以及将B风格图像转换为A风格图像;
同样,它也包含两个判别器:$D_{A},D_{B}$。
CycleGAN的损失函数在原始GAN损失函数的基础上,CycleGAN为了防止生成器偷懒(解释见下一段),增加了循环一致性损失,这个东西其实就是重构损失,以保证转换后的图像和原图像的内容一致性。
李宏毅老师的PPT中一幅图很形象的展示了循环一致性损失
现在举个例子解释偷懒 的含义:比如由A风格转换为B风格时,需要把转换后的图像(记作$B_{fake}$)与真实的B风格图像(记作$B_{real}$)一起喂入判别器$D_B$,而$D_B$只是希望$B_{real}$与真实B风 ...
从GAN到WGAN再到WGAN-GP
之前介绍了GAN的原理,并使用celeba数据集训练了一个基于DCGAN的”假”人脸生成器(传送门戳我),这里我把它的生成效果图搬运过来了在GAN问世后,其出色的表现使得对于GAN的研究一时风生水起(至今还在持续),越来越多关于GAN的研究成果被发表,GAN本身存在的缺陷也逐步被挖掘出来。
本文不会陷入繁杂的数学推导中,而是指出WGAN相比于原始GAN的改进之处,以及进一步提出的WGAN-GP,并动手用PyTorch进行实现。
WGANWGAN便是对于原始GAN的一种改进方案,它的作者用了大量篇幅指出了原始GAN的不足之处,并最终给出了自己的解决方案。虽然其中蕴含了大量的数学推导,但推导的结论却出乎意料的简单,或许这就是数学的魅力。
说完一堆废话后,来看看改进得到的WGAN相比于原始GAN有哪些改动,这里直接把WGAN作者给出的训练算法贴出来,然后做简要分析。
5和10分别给出了判别器和生成器的损失函数,相比于原始GAN 的损失函数,仅仅是去掉了log。如果不能一下子看出来,可以把原始GAN的目标函数搬过来对比下。
原始GAN的优化目标:
其中的E代表期望,由大数定律,我们可以用均值近 ...
火爆全球的GAN究竟是何方神圣?
故事时间从前有一个人,他希望通过制造假币来发家致富。
于是,他开始学习制造假币。
一开始,他的技术太菜,制作的假币刚流入市场就被警察发现了。
他不甘心,于是继续学习来提升造假币技术,这一次,假币并没有被发现,他很开心的数着钱。
可是,过了一段时间,敏锐的警察使用刚刚学习到的新知识,破获了他的假币。
但他还是不甘示弱,继续提升造假币的技术
警察也继续学习新的假币鉴别技术
就这样,他的造假币技术一直在提升,警察鉴别假币的技术也在不断提升
在互相抗衡很久以后,他的造假币技术到了炉火纯青的地步,以至于警察都难以鉴别。
GAN是什么?
生成对抗网络(Generative adversarial network, GAN)由生成器(一般用$G$表示)和判别器(一般用$D$表示)组成,常用于生成”假”的东西,比如假的文本,假的人脸图像等等,本文以图像生成为例进行叙述。
生成器负责将从某分布中随机采样的噪声$z$通过神经网络映射为”生成图像”$G(z)$;判别器负责鉴定给定的图像是真实图像$X$还是生成器生成的图像$G(z)$。
在上面的故事中,警察充当着判别器$D$的角色,而造假币的人充当着生成器$ ...
变分自编码器
Vae他有一些烦恼反正现在的年轻人都有许多烦恼那么多要思考那么多要寻找诱惑太多 不坚定就犯错了
哦哦,不对,不是这个Vae,也不是uae~
是接下来出场的VAE~
对比AE,引出VAE之前介绍了自编码器(AE)的原理(传送门),当时讲到自编码器并不具有真正的生成能力,以图像为例来说,它只能将输入的图像$X$编码成隐向量$z$,然后将$z$作为解码器的输入,得到输出图像$X’$。如果我们尝试将与$z$的shape一致的”随机特征表示”输入解码器,那么得到的将是毫无意义的噪声图像。
变分自编码器(VAE)突破了这一限制!
先给出结论:在VAE中,只要随机特征表示(这里也将这些特征表示记作$z$)是从某些分布,如标准正态分布中采样得到的,那么将$z$输入解码器之后可以得到与训练集图像类似但不同于训练集中任何一张图像的新图像。
比如,训练集是手写数字图像,那么在训练完成后,将从标准正态分布中采样得到的$z$输入解码器,可以得到一些新的手写数字图像。
以上所说的特征表示$z$,被称为隐向量(latent vector)。
VAE究竟是如何做到这一点的呢?且往下看。
VAE的结构
变分自编码 ...
自编码器
自编码器的结构自编码器(Auto Encoder)是一种神经网络模型。它由两部分组成:编码器(Ecoder)和解码器(Decoder)。
编码器用于将输入数据(Input Data)进行编码,从而将输入数据映射到维度较低的隐空间(Latent Space),得到被编码的数据(Encoded Data)。
解码器用于将隐空间中被编码的数据还原(解码)成”输入数据”。这里之所以打引号,是因为还原得到的”输入数据”相比于一开始的输入数据来说会有一些损失,所以并不是真正意义上的输入数据。
下图展示了自编码器的结构
自编码器的应用数据降维/特征提取从自编码器的结构很容易想到它的这一用途。在训练阶段,$X$经过编码器映射得到低维的$z$,$z$通过解码器还原出与$X$维度一致,内容相似的$X’$,通过反向传播来更新网络权重,以最小化输入$X$与输出$X’$之间的损失。
其中的$z$便是降维后的数据,因为如果可以通过$z$还原出输入$X$,那么可以说$z$已经学习到了$X$的大部分特征。
同时,$z$是一个被高度压缩(降维)的输入数据的表示,所以也可以将自编码器看作一个特征提取器,提取到的特征表示就 ...
回归树
开篇在之前的决策树讲解(传送门)中,我们使用ID3算法生成了一棵决策树,并且在文章最后指出除了ID3算法,常用的决策树生成算法还有C4.5。
但是,无论是基于信息增益的ID3算法,还是基于信息增益比的C4.5算法,它们都只能处理分类问题,而对于回归问题就束手无策了。
现在,我们要介绍一种既可用于分类任务又可用于回归任务的决策树的生成算法:CART算法。
CART的全称是 classification and regression tree,译为分类与回归树,该算法由两步组成:(1)决策树生成;(2)决策树剪枝。
本文重点关心如何用决策树做回归任务,因此本文的主题是讲解回归树的生成原理及其Python实现。下面正文开始。
回归树的生成对于使用ID3算法或者C4.5算法生成的决策树,这棵树可能是多岔的,因为某个被选定用于划分数据集的特征的不同取值可能多于两个。而这里基于CART算法的决策树,无论是回归树还是分类树,它们都是二叉树。
以回归树为例,为什么是二叉树呢?这还得从回归树的生成原理讲起。
对于给定的训练集$(X,Y)$,其中$Y$是连续型变量,首先*按照某种方法选择某一个特征(这里记 ...
AdaBoost
开篇AdaBoost是一种提升(boosting)方法。
你可能听过“众人拾柴火焰高”这句话,提升方法的思想与这句话的思想颇有相似之处。
一个人拾到的柴火,只能维持小的火苗;但一群人一起拾柴,供给同一火堆,那么这个火堆终将燃起熊熊大火。
对于给定的训练集,单个分类器的分类能力可能并不算好;但如果同时训练一堆分类器,让分类器们一起做判断,那么分类结果将会比任何一个单独的分类器做分类都要好。
上面的单个分类器被称为“弱分类器”,若干个“弱分类器”联合起来,就得到了“强分类器”。
AdaBoost作为最具代表性的提升方法,自然也蕴含着这种集体智慧的思想。至于其具体细节,且往下看。
AdaBoost 算法AdaBoost为训练集中每个样本设置一个可调整的权值,并且在每一轮训练结束后将被误分类的样本的权值加大,将被正确分类的样本的权值减小。这样被误分类的样本在下一轮分类时会更加受到关注。
假设经过了$M$轮训练,则会得到$M$个弱分类器。将这$M$个弱分类器通过加权求和(弱分类器分类能力相对越强,权值就越大)的方式联结起来,便得到了一个强分类器。
以上是AdBoost核心思想的文字描述,现在用数 ...
朴素贝叶斯
开篇正如其名,”朴素贝叶斯”原理”朴素”,实现简单,是一种常用的机器学习算法。
为何“朴素”?如何“学习”?如何分类?别急,咱们慢慢道来~
概率统计回忆录朴素贝叶斯也是贝叶斯方法的一种,提起贝叶斯,学过概率统计的你一定听说过条件概率公式,全概率公式和贝叶斯公式吧,忘记了也没关系,我们先来快速过一遍。
条件概率公式:
$$P(A|B)=\frac{P(A,B)}{P(B)}$$
全概率公式:
$$P(B)=\sum_{i=1}^{n}P(A_i)P(B|A_i)$$
贝叶斯公式:
$$P(A|B)=\frac{P(A,B)}{P(B)}=\frac{P(B|A)P(A)}{ \sum_{i=1}^{n}P(A_i)P(B|A_i)}$$
可以发现,贝叶斯公式其实就是由条件概率公式和全概率公式推导的,贝叶斯公式的分母是一个全概率公式,分子是一个条件概率公式。
后续的推导将会用到上面的公式。
朴素贝叶斯的训练(学习)方法朴素贝叶斯在使用训练数据进行“学习”时,其实是在学习数据的生成机制,具体点,是在学习特征$X$与标签$Y$的联合概率分布$P(X,Y)$ 。
再进一步解释:根据条件概率公式, ...