精华内容
下载资源
问答
  • 关于形势政策论文经典参考范文 形势政策论文经典参考范文如下文 大学毕业生是社会人力资源中最宝贵的一部分,其就业问题已引起了社会的极大关注,激烈的职场竞争所形成的就业难已成为大学毕业生的共识。...
  • 同时欢迎对推荐系统研究的同学与我讨论相关问题,的联系方式如下: 电子邮件: 领英: 知乎私信: 其他相关资源 目录 深度学习推荐系统 嵌入 著名的机器学习论文 经典推荐系统 评价 Reco中的强化学习 ...
  • 由于作者的英文水平和学术能力不高,需要不断提升,所以还请大家批评指正,非常欢迎大家给留言评论,学术路上期待您前行,加油。前一篇文章分享了Pvop老师的分享,题目为《高手是怎样学习NLP》。这篇文章将详细...

    《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座,并分享给大家,希望您喜欢。由于作者的英文水平和学术能力不高,需要不断提升,所以还请大家批评指正,非常欢迎大家给我留言评论,学术路上期待与您前行,加油。

    前一篇文章分享了Pvop老师的分享,题目为《高手是怎样学习NLP》。这篇文章将详细介绍生成对抗网络GAN的基础知识,包括什么是GAN、常用算法(CGAN、DCGAN、infoGAN、WGAN)、发展历程、预备知识,并通过Keras搭建最简答的手写数字图片生成案例。本文主要学习小象学院老师的视频,并结合论文介绍,希望对您有所帮助!不服GAN,让我们开始吧~

    在这里插入图片描述

    注意,本文代码采用GPU+Pycharm实现,如果你的电脑是CPU实现,将相关GPU操作注释即可。这里仅做简单的对比实验,不进行参数优化、实验原因分析及详细的效果提升,后面文章会介绍优化、参数选择、实验评估等。

    前文赏析:


    一.GAN简介

    1.GAN背景知识

    Ian Goodfellow 因提出了生成对抗网络(GANs,Generative Adversarial Networks)而闻名, GAN最早由Ian Goodfellow于2014年提出,以其优越的性能,在不到两年时间里,迅速成为一大研究热点。他也被誉为“GANs之父”,甚至被推举为人工智能领域的顶级专家。

    在这里插入图片描述

    实验运行结果如下图所示,生成了对应的图像。

    在这里插入图片描述

    或许,你对这个名字还有些陌生,但如果你对深度学习有过了解,你就会知道他。最畅销的这本《深度学习》作者正是Ian Goodfellow大佬。

    在这里插入图片描述

    在2016年,Ian Goodfellow大佬又通过50多页的论文详细介绍了GAN,这篇文章也推荐大家去学习。

    在这里插入图片描述

    Yann LeCun称GAN为“过去十年机器学习界最有趣的idea”。GAN在github上的火热程度如下图所示,呈指数增涨,出现各种变形。当然,其中也存在很多比较水的文章,推荐大家尽量学习比较经典的模型。

    在这里插入图片描述


    2.GAN原理解析

    首先,什么是GAN?
    GANs(Generativeadversarial networks,对抗式生成网络)可以把这三个单词拆分理解。

    • Generative:生成式模型
    • Adversarial:采取对抗的策略
    • Networks:网络(不一定是深度学习)

    正如shunliz大佬总结:
    GANs是一类生成模型,从字面意思不难猜到它会涉及两个“对手”,一个称为Generator(生成者),一个称为Discriminator(判别者)。Goodfellow最初arxiv上挂出的GAN tutorial文章中将它们分别比喻为伪造者(Generator)和警察(Discriminator)。伪造者总想着制造出能够以假乱真的钞票,而警察则试图用更先进的技术甄别真假。两者在博弈过程中不断升级自己的技术。

    从博弈论的角度来看,如果是零和博弈(zero-sum game),两者最终会达到纳什均衡(Nash equilibrium),即存在一组策略(g, d),如果Generator不选择策略g,那么对于Discriminator来说,总存在一种策略使得Generator输得更惨;同样地,将Generator换成Discriminator也成立。

    如果GANs定义的lossfunction满足零和博弈,并且有足够多的样本,双方都有充足的学习能力情况,在这种情况下,Generator和Discriminator的最优策略即为纳什均衡点,也即:Generator产生的都是“真钞”(材料、工艺技术与真钞一样,只是没有得到授权),Discriminator会把任何一张钞票以1/2的概率判定为真钞。

    那么,GAN究竟能做什么呢?
    如下图所示,这是一张非常有意思的图,最左边是真实的图,我们希望去预测视频后几帧的模样,中间这张图是用MSE做的,最右边的图是生成对抗网络做的。通过细节分析,我们可以看到中间这张图的耳朵和眼睛都是模糊的,而GAN生成的效果明显更好。

    在这里插入图片描述

    接着我们在看一个超分辨率的实例。首先给出一张超分辨率的图,最左边的图像是原始高分辨率图像(original),然后要对其进行下采样,得到低分辨率图像,接着采用不同的方法对低分辨率图像进行恢复,具体工作如下:

    • bicubic:第二张图是bicubic方法恢复的图像。经过压缩再拉伸还原图像,通过插值运算实现,但其图像会变得模糊。
    • SRResNet:第三张图像是通过SRResNet实现的恢复,比如先压缩图像再用MSE和神经网络学习和真实值的差别,再进行恢复。(SRResNet is a neural network trained with mean squared error)
    • SRGAN:第四张图是通过SRGAN实现的,其恢复效果更优。SRGAN是在GAN基础上的改进,它能够理解有多个正确的答案,而不是在许多答案中给出一个最佳输出。

    在这里插入图片描述

    我们注意观察图像头部雕饰的细节,发现GAN恢复的轮廓更清晰。该实验显示了使用经过训练的生成模型从多模态分布生成真实样本的优势。

    在这里插入图片描述

    在这里,我们也科普下超分辨率——SRCNN。
    它最早是在论文《Learning a Deep Convolutional Network for Image Super-Resolution》中提出,这篇文章的四位作者分别为董超,Chen Change Loy,何凯明,汤晓欧,也都是妥妥的大神。从CV角度来看,这篇论文是真的厉害。

    现假设要解决一个问题:能不能解决超分辨率,从一个低分辨率的图像恢复成一个高分辨率的图像,那怎么做呢? 他们通过增加两个卷积层的网络就解决了一个实际问题,并且这篇文章发了一个顶会。

    在这里插入图片描述

    更详细的介绍参考知乎oneTaken大佬的分享。

    这是第一篇将端到端的深度学习训练来进行超分的论文,整篇论文的的过程现在看起来还是比较简单的,先将低分辨率图片双三次插值上采样到高分辨率图片,然后再使用两层卷积来进行特征映射,最后使用MSE来作为重建损失函数进行训练。从现在来看很多东西还是比较粗糙的,但这篇论文也成为很多超分论文的baseline。

    整篇论文的创新点有:
    (1) 使用了一个卷积神经网络来进行超分,端到端的学习低分辨率与超分辨率之间的映射。
    (2) 将提出的神经网络模型与传统的稀疏编码方法之间建立联系,这种联系还指导用来设计神经网络模型。
    (3) 实验结果表明深度学习方法可以用于超分中,可以获得较好的质量和较快的速度。

    整个的模型架构非常的简单,先是对于输入图片进行双三次插值采样到高分辨空间,然后使用一层卷积进行特征提取,再用ReLU进行非线性映射,最后使用一个卷积来进行重建,使用MSE来作为重建损失。中间一个插曲是将传统用于超分的稀疏编码算法进行了延伸,可以看作是一种具有不同非线性映射的卷积神经网络模型。


    3.GAN经典案例

    GNN究竟能做什么呢?
    下面来看看一些比较有趣的GAN案例。

    首先是一个视频,这篇文章中介绍了Zhu等人开发了交互式(interactive)生成对抗网络(iGAN),用户可以绘制图像的粗略草图,就使用GAN生成相似的真实图像。在这个例子中,用户潦草地画了几条绿线,就把它变成一块草地,用户再花了一条黑色的三角形,就创建了一个山包。

    在这里插入图片描述

    另一个比较经典的案例是左侧输入的皮包简图最终生成接近真实包的图像,或者将卫星照片转换成地图,将阈值车辆图像转换为现实中逼真的图像。

    在这里插入图片描述

    再比如通过GAN去预测视频中下一帧动画会发生什么,比如右下角给了一张火车的静态图片,会生成一段火车跑动的动态视频。

    在这里插入图片描述

    Wu等在NIPS 2016中通过GAN实现了用噪声去生成一张3D椅子模型。

    在这里插入图片描述

    下图是starGAN。左侧输入的是一张人脸,然后GAN会生成对应的喜怒哀乐表情,这篇文章的创新不是说GAN能做这件事,而是提出一个方案,所有的核心功能都在一起,只训练一个生成器,即不是生成多对多的生成器,而只训练一个生成器就能实现这些功能。

    starGAN转移从RaFD数据集中学到的知识,在CelebA数据集上的多域图像转换结果。第一和第六列显示输入图像,其余列是由starGAN生成的图像。请注意,这些图像是由一个单一的生成器网络生成的,而愤怒、快乐和恐惧等面部表情标签都来自RaFD,而不是CelebA。

    在这里插入图片描述


    二.GAN预备知识

    为什么要讲预备知识呢?
    通过学习神经网络的基础知识,能进一步加深我们对GAN的理解。当然,看到这篇文章的读者可能很多已经对深度学习有过了解或者是大佬级别,这里也照顾下初学者,普及下GAN相关基础知识。这里推荐初学者去阅读作者该系列文章,介绍了很多基础原理。

    1.什么是神经网络

    首先,深度学习就是模拟人的脑神经(生物神经网络),比如下图左上方①中的神经元,可以认为是神经网络的接收端,它有很多的树突接收信号,对应Neuron的公式如下:

    z=a1w1+...+akwk+...+aKwK+b z=a_1w_1+...+a_kw_k+...+a_Kw_K+b

    其中,a表示信号(树突接收),w表示对应的权重,它们会进行加权求和组合且包含一个偏置b。通过激活函数判断能否给下一个神经元传递信号。

    在这里插入图片描述

    有了这个神经元之后,我们需要构建网络,如右下方②所示。经过一层、两层、三层神经网络,我们最后会有一个判断,如右上方③所示,经过Softmax函数判断,决策这幅图像是什么,比如猫或狗。

    其次,深度学习有哪些知识点呢?
    深度学习的网络设计如下图所示:

    • 神经网络常见层
      全连接层、激活层、BN层、Dropout层、卷积层、池化层、循环层、Embedding层、Merege层等
    • 网络配置
      损失函数、优化器、激活函数、性能评估、初始化方法、正则项等
    • 网络训练流程
      预训练模型、训练流程、数据预处理(归一化、Embedding)、数据增强(图片翻转旋转曝光生成海量样本)等

    在这里插入图片描述

    补充:
    深度学习的可解释性非常差,很多时候不知道它为什么正确。NLP会议上也经常讨论这个可解释性到底重不重要。个人认为,如果用传统的方法效果能达到80%,而深度学习如果提升非常大,比如10%,个人感觉工业界还是会用的,因为能提升性能并解决问题。除非比如风控任务,美团检测异常刷单情况,此时需要准确的确认是否刷单。


    2.全连接层

    隐藏层的输入和输出都有关联,即全连接层的每一个结点都与上一层的所有结点相连,用来把前边提取到的特征综合起来。由于其全相连的特性,一般全连接层的参数也是最多的。

    在这里插入图片描述

    全连接层包括神经元的计算公式、维度(神经元个数)、激活函数、权值初始化方法(w、b)、正则项。

    在这里插入图片描述


    3.激活函数

    激活函数(activation function)会让某一部分神经元先激活,然后把激活的信息传递给后面一层的神经系统中。比如,某些神经元看到猫的图片,它会对猫的眼睛特别感兴趣,那当神经元看到猫的眼睛时,它就被激励了,它的数值就会被提高。

    激活函数相当于一个过滤器或激励器,它把特有的信息或特征激活,常见的激活函数包括softplus、sigmoid、relu、softmax、elu、tanh等。

    • 对于隐藏层,我们可以使用relu、tanh、softplus等非线性关系;
    • 对于分类问题,我们可以使用sigmoid(值越小越接近于0,值越大越接近于1)、softmax函数,对每个类求概率,最后以最大的概率作为结果;
    • 对于回归问题,可以使用线性函数(linear function)来实验。

    激活函数可以参考作者前面的第三篇文章。

    在这里插入图片描述

    常用的激活函数Sigmoid、tanh、ReLU、Leaky ReLU曲线如下图所示:

    在这里插入图片描述


    4.反向传播

    BP神经网络是非常经典的网络,这里通过知乎EdisonGzq大佬的两张图来解释神经网络的反向传播。对于一个神经元而言,就是计算最后的误差传回来对每个权重的影响,即计算每层反向传递的梯度变化。

    在这里插入图片描述

    对于多个神经元而言,它是两条线的输出反向传递,如下图所示Eo1和Eo2。

    在这里插入图片描述


    5.优化器选择

    存在梯度变化后,会有一个迭代的方案,这种方案会有很多选择。优化器有很多种,但大体分两类:

    • 一种优化器是跟着梯度走,每次只观察自己的梯度,它不带重量
    • 一种优化器是带重量的

    在这里插入图片描述

    class tf.train.Optimizer是优化器(optimizers)类的基类。优化器有很多不同的种类,最基本的一种是GradientsDescentOptimizer,它也是机器学习中最重要或最基础的线性优化。七种常见的优化器包括:

    • class tf.train.GradientDescentOptimizer
    • class tf.train.AdagradOptimizer
    • class tf.train.AdadeltaOptimizer
    • class tf.train.MomentumOptimizer
    • class tf.train.AdamOptimizer
    • class tf.train.FtrlOptimizer
    • class tf.train.RMSPropOptimizer

    下面简单介绍其中四个常用的优化器:(推荐 优化器总结

    • GradientDescentOptimizer
      梯度下降GD取决于传进数据的size,比如只传进去全部数据的十分之一,Gradient Descent Optimizer就变成了SGD,它只考虑一部分的数据,一部分一部分的学习,其优势是能更快地学习到去往全局最小量(Global minimum)的路径。

    • MomentumOptimizer
      它是基于学习效率的改变,它不仅仅考虑这一步的学习效率,还加载了上一步的学习效率趋势,然后上一步加这一步的learning_rate,它会比GradientDescentOptimizer更快到达全局最小量。

    • AdamOptimizer
      Adam名字来源于自适应矩估计(Adaptive Moment Estimation),也是梯度下降算法的一种变形,但是每次迭代参数的学习率都有一定的范围,不会因为梯度很大而导致学习率(步长)也变得很大,参数的值相对比较稳定。Adam算法利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。

    • RMSPropOptimizer
      Google用它来优化阿尔法狗的学习效率。RMSProp算法修改了AdaGrad的梯度积累为指数加权的移动平均,使得其在非凸设定下效果更好。

    各种优化器用的是不同的优化算法(如Mmentum、SGD、Adam等),本质上都是梯度下降算法的拓展。下图通过可视化对各种优化器进行了对比分析,机器学习从目标学习到最优的过程,有不同的学习路径,由于Momentum考虑了上一步的学习(learning_rate),走的路径会很长;GradientDescent的学习时间会非常慢。建议如下:

    • 如果您是初学者,建议使用GradientDescentOptimizer即可,如果您有一定的基础,可以考虑下MomentumOptimizer、AdamOptimizer两个常用的优化器,高阶的话,可以尝试学习RMSPropOptimizer优化器。总之,您最好结合具体的研究问题,选择适当的优化器。

    在这里插入图片描述


    6.卷积层

    为什么会提出卷积层呢?因为全连接层存在一个核心痛点

    • 图片参数太多,比如1000*1000的图片,加一个隐藏层,隐藏层节点同输入维数,全连接的参数是10^12,根本训练不过来这么多参数。

    利器一:局部感知野
    提出了一个卷积核的概念,局部感知信息。

    在这里插入图片描述

    利器二:参数共享
    从图像的左上角按照3x3扫描至右下角,获得如右图所示的结果,通过卷积共享减少了参数个数。注意,这里的卷积核是如下:

    [101010101] \left[ \begin{matrix} 1 & 0 & 1 \\ 0 & 1 & 0 \\ 1 & 0 & 1 \end{matrix} \right]

    当前扫描的区域为如下,最终计算结果为2。

    [011001001] \left[ \begin{matrix} 0 & 1 & 1 \\ 0 & 0 & 1 \\ 0 & 0 & 1 \end{matrix} \right]

    在这里插入图片描述

    卷积层的核心知识点如下:

    • 卷积核数目
    • 卷积核大小:如上面3x3卷积核
    • 卷积核数目
    • 卷积核步长:上面的步长是1,同样可以调格
    • 激活函数
    • Padding:比如上图需要输出5x5的结果图,我们需要对其外圆补零
    • 是否使用偏置
    • 学习率
    • 初始化

    在这里插入图片描述

    下图展示了五层卷积层,每层输出的内容。它从最初简单的图形学习到后续的复杂图形。

    在这里插入图片描述


    7.池化层

    池化层主要解决的问题是:

    • 使特征图变小,简化网络;特征压缩,提取主要特征

    常用池化层包括:

    • 最大池化:比如从左上角红色区域中选择最大的6,接着是8、3、4
    • 平均池化:选择平均值

    在这里插入图片描述

    基本知识点如下图所示:

    在这里插入图片描述


    8.图像问题基本思路

    此时,我们通过介绍的全连接层、卷积层、池化层,就能解决实际的问题。如下图所示:

    • 输入层
      如NLP句子、句对,图像的像素矩阵,语音的音频信息
    • 表示成
      DNN:全连接+非线性(特征非线性融合)
      CNN:Conv1d、Conv2d、Pooling
      RNN:LSTM、GRU(选择记忆性)
    • 应用层
      分类、回归、序列预测、匹配

    在这里插入图片描述

    可以将图像问题基本思路简化为下图的模型。

    在这里插入图片描述

    至此,预备知识介绍完毕!接下来我们进入GAN网络实战分析。


    三.GAN网络实战分析

    GANs(Generativeadversarial networks)对抗式生成网络

    • Generative:生成式模型
    • Adversarial:采取对抗的策略
    • Networks:网络

    1.GAN模型解析

    首先,我们先说说GAN要做什么呢?

    • 最开始在图(a)中我们生成绿线,即生成样本的概率分布,黑色的散点是真实样本的概率分布,这条蓝线是一个判决器,判断什么时候应该是真的或假的。
    • 我们第一件要做的事是把判决器判断准,如图(b)中蓝线,假设在0.5的位置下降,之前的认为是真实样本,之后的认为是假的样本。
    • 当它固定完成后,在图©中,生成器想办法去和真实数据作拟合,想办法去误导判决器。
    • 最终输出图(d),如果你真实的样本和生成的样本完全一致,分布完全一致,判决器就傻了,无法继续判断。

    在这里插入图片描述

    可能大家还比较蒙,下面我们再详细介绍一个思路。

    • 生成器:学习真实样本以假乱真
    • 判别器:小孩通过学习成验钞机的水平

    在这里插入图片描述

    GAN的整体思路是一个生成器,一个判别器,并且GoodFellow论文证明了GAN全局最小点的充分必要条件是:生成器的概率分布和真实值的概率分布是一致的时候。

    GlobalOptimalityofpg=pdata Global Optimality of p_g=p_{data}

    在这里插入图片描述

    其次,GAN还需要分析哪些问题呢?

    • 目标函数如何设定?
    • 如何生成图片?
    • G生成器和D判决器应该如何设置?
    • 如何进行训练?

    在这里插入图片描述


    (1) 目标函数

    该目标函数如下所示,其中:

    • max()式子是第一步,表示把生成器G固定,让判别器尽量区分真实样本和假样本,即希望生成器不动的情况下,判别器能将真实的样本和生成的样本区分开。
    • min()式子是第二步,即整个式子。判别器D固定,通过调整生成器,希望判别器出现失误,尽可能不要让它区分开。

    这也是一个博弈的过程。

    在这里插入图片描述

    整个公式的具体含义如下:

    • 式子由两项构成,x表示真实图片,z表示输入G网络的噪声,而G(z)表示G网络生成的图片。
    • D(x)表示D网络判断真实图片是否真实的概率(因为x就是真实的,所以对于D来说,这个值越接近1越好)。
    • D(G(z))是D网络判断G生成的图片是否真实的概率。
    • G的目的:G应该希望自己生成的的图片越接近真实越好。
    • D的目的:D的能力越强,D(x)应该越大,D(G(x))应该越小,这时V(D,G)会变大,因此式子对于D来说是求最大(max_D)。
    • trick:为了前期加快训练,生成器的训练可以把log(1-D(G(z)))换成-log(D(G(z)))损失函数。

    接着我们回到大神的原论文,看看其算法(Algorithm 1)流程。

    • 最外层是一个for循环,接着是k次for循环,中间迭代的是判决器。
    • k次for循环结束之后,再迭代生成器。
    • 最后结束循环。

    在这里插入图片描述


    (2) GAN图片生成

    接着我们介绍训练方案,通过GAN生成图片。

    • 第一步(左图):希望判决器尽可能地分开真实数据和我生成的数据。那么,怎么实现呢?我的真实数据就是input1(Real World images),我生成的数据是input2(Generator)。input1的正常输出是1,input2的正常输出是0,对于一个判决器(Discriminator)而言,我希望它判决好,首先把生成器固定住(虚线T),然后生成一批样本和真实数据混合给判决器去判断。此时,经过训练的判决器变强,即固定生成器且训练判决器

    • 第二步(右图):固定住判决器(虚线T),我想办法去混淆它,刚才经过训练的判决器很厉害,此时我们想办法调整生成器,从而混淆判别器,即通过固定判决器并调整生成器,使得最后的输出output让生成的数据也输出1(第一步为0)。

    在这里插入图片描述

    GAN的核心就是这些,再简单总结下,即:

    • 步骤1是在生成器固定的时候,我让它产生一批样本,然后让判决器正确区分真实样本和生成样本。(生成器标签0、真实样本标签1)
    • 步骤2是固定判决器,通过调整生成器去尽可能的瞒混判决器,所以实际上此时训练的是生成器。(生成器的标签需要让判决器识别为1,即真实样本)

    其伪代码如下:

    for 迭代 in range(迭代总数):
        for batch in range(batch_size):
            新batch = input1的batch + input2的batch (batch加倍)
            for 轮数 in range(判别器中轮数):
               步骤一 训练D
            步骤二 训练G
    

    2.生成手写数字demo分析

    接下来我们通过手写数字图像生成代码来加深读者的印象。这是一个比较经典的共有数据集,包括图像分类各种案例较多,这里我们主要是生成手写数字图像。

    在这里插入图片描述

    首先,我们看看生成器是如何生成一个图像(从噪音生成)?
    核心代码如下,它首先要随机生成一个噪音(noise),所有生成的图片都是靠噪音实现的。Keras参考代码:

    (1) 生成器G
    生成器总共包括:

    • 全连接层:输入100维,输出1024维
    • 全连接层:128x7x7表示图片128通道,大小7x7
    • BatchNormalization:如果不加它DCGAN程序会奔溃
    • UpSampling2D:对卷积结果进行上采样从而将特征图放大 14x14
    • Conv2D:卷积操作像素尺度不变(same)
    • UpSampling2D:生成28x28
    • Conv2D:卷积操作
    • Activation:激活函数tanh

    在这里插入图片描述

    (2) 判别器D
    判别器就是做一个二分类的问题,要么真要么假。

    • Conv2D:卷积层
    • MaxPooling2D:池化层
    • Conv2D:卷积层
    • MaxPooling2D:池化层
    • Flatten:拉直一维
    • Dense:全连接层
    • Activation:sigmoid二分类

    在这里插入图片描述

    (3) 辅助函数
    如何把D固定去调整G的函数generator_containing_discriminator。

    • model.add(g):加载生成器G
    • d.trainable=False:判决器D固定

    combine_images函数实现合并图像的操作。

    在这里插入图片描述

    (4) GAN图片生成训练
    GAN核心流程包括:

    • load_data:载入图片
    • d = discriminator_model:定义判别器D
    • g = generator_model:定义生成器G
    • generator_containing_discriminator:固定D调整G
    • SGD、compile:定义参数、学习率
    • for epoch in range、for index in rangeBATCH
    • X = np.concatenate:图像数据和生成数据混合
    • y = [1] x BATCH_SIZE + [0] x BTCH_SIZE:输出label
    • d_loss = d.train_on_batch(X,y):训练D判别器(步骤一)
    • d.trainable = False:固定D
    • g_loss = d_on_g.train_on_batch(noise, [1]xBATCH_SIZE):训练G生成器(步骤二),混淆
    • d.trainable = True:打开D重复操作
    • 保存参数和模型

    在这里插入图片描述

    (5) 生成
    模型训练好之后,我们想办法用GAN生成图片。

    • g = generator_model:定义生成器模型
    • g.load_weights:载入训练好的生成器(generator)
    • noise:随机产生噪声
    • 然后用G生成一幅图像,该图像就能欺骗判别器D

    在这里插入图片描述

    完整代码如下:
    这段代码更像一个简单的GAN生成图片。

    # -*- coding: utf-8 -*-
    """
    Created on 2021-03-19
    @author: xiuzhang Eastmount CSDN
    参考:https://github.com/jacobgil/keras-dcgan
    """
    from keras.models import Sequential
    from keras.layers import Dense
    from keras.layers import Reshape
    from keras.layers.core import Activation
    from keras.layers.normalization import BatchNormalization
    from keras.layers.convolutional import UpSampling2D
    from keras.layers.convolutional import Conv2D, MaxPooling2D
    from keras.layers.core import Flatten
    from keras.optimizers import SGD
    from keras.datasets import mnist
    import tensorflow as tf
    import numpy as np
    from PIL import Image
    import argparse
    import math
    import os
    
    ## GPU处理 读者如果是CPU注释该部分代码即可
    ## 指定每个GPU进程中使用显存的上限 0.9表示可以使用GPU 90%的资源进行训练
    os.environ["CUDA_DEVICES_ORDER"] = "PCI_BUS_IS"
    os.environ["CUDA_VISIBLE_DEVICES"] = "0"
    gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.8)
    sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))
    
    #----------------------------------------------------------------
    #生成器
    def generator_model():
        model = Sequential()
        model.add(Dense(input_dim=100, output_dim=1024))
        model.add(Activation('tanh'))
        model.add(Dense(128*7*7))        #7x7 128通道
        model.add(BatchNormalization())
        model.add(Activation('tanh'))
        model.add(Reshape((7, 7, 128), input_shape=(128*7*7,)))
        model.add(UpSampling2D(size=(2, 2)))
        model.add(Conv2D(64, (5, 5), padding='same'))
        model.add(Activation('tanh'))
        model.add(UpSampling2D(size=(2, 2)))
        model.add(Conv2D(1, (5, 5), padding='same'))
        model.add(Activation('tanh'))
        return model
    
    #----------------------------------------------------------------
    #判别器
    def discriminator_model():
        model = Sequential()
        model.add(
                Conv2D(64, (5, 5),
                padding='same',
                input_shape=(28, 28, 1))
                )
        model.add(Activation('tanh'))
        model.add(MaxPooling2D(pool_size=(2, 2)))
        model.add(Conv2D(128, (5, 5)))
        model.add(Activation('tanh'))
        model.add(MaxPooling2D(pool_size=(2, 2)))
        model.add(Flatten())
        model.add(Dense(1024))
        model.add(Activation('tanh'))
        model.add(Dense(1))
        model.add(Activation('sigmoid'))
        return model
    
    #----------------------------------------------------------------
    #辅助函数 固定D调整G
    def generator_containing_discriminator(g, d):
        model = Sequential()
        model.add(g)
        d.trainable = False
        model.add(d)
        return model
    
    #辅助函数 合并图像
    def combine_images(generated_images):
        num = generated_images.shape[0]
        width = int(math.sqrt(num))
        height = int(math.ceil(float(num)/width))
        shape = generated_images.shape[1:3]
        image = np.zeros((height*shape[0], width*shape[1]),
                         dtype=generated_images.dtype)
        for index, img in enumerate(generated_images):
            i = int(index/width)
            j = index % width
            image[i*shape[0]:(i+1)*shape[0], j*shape[1]:(j+1)*shape[1]] = \
                img[:, :, 0]
        return image
    
    #----------------------------------------------------------------
    #训练
    def train(BATCH_SIZE):
        (X_train, y_train), (X_test, y_test) = mnist.load_data()
        X_train = (X_train.astype(np.float32) - 127.5)/127.5
        X_train = X_train[:, :, :, None]
        X_test = X_test[:, :, :, None]
        #X_train = X_train.reshape((X_train.shape, 1) + X_train.shape[1:])
        d = discriminator_model()
        g = generator_model()
        d_on_g = generator_containing_discriminator(g, d)
        d_optim = SGD(lr=0.0005, momentum=0.9, nesterov=True)
        g_optim = SGD(lr=0.0005, momentum=0.9, nesterov=True)
        g.compile(loss='binary_crossentropy', optimizer="SGD")
        d_on_g.compile(loss='binary_crossentropy', optimizer=g_optim)
        d.trainable = True
        d.compile(loss='binary_crossentropy', optimizer=d_optim)
        for epoch in range(100):
            print("Epoch is", epoch)
            print("Number of batches", int(X_train.shape[0]/BATCH_SIZE))
            for index in range(int(X_train.shape[0]/BATCH_SIZE)):
                noise = np.random.uniform(-1, 1, size=(BATCH_SIZE, 100))
                image_batch = X_train[index*BATCH_SIZE:(index+1)*BATCH_SIZE]
                generated_images = g.predict(noise, verbose=0)
                if index % 20 == 0:
                    image = combine_images(generated_images)
                    image = image*127.5+127.5
                    Image.fromarray(image.astype(np.uint8)).save(
                        str(epoch)+"_"+str(index)+".png")
                X = np.concatenate((image_batch, generated_images))
                y = [1] * BATCH_SIZE + [0] * BATCH_SIZE
                d_loss = d.train_on_batch(X, y)
                print("batch %d d_loss : %f" % (index, d_loss))
                noise = np.random.uniform(-1, 1, (BATCH_SIZE, 100))
                d.trainable = False
                g_loss = d_on_g.train_on_batch(noise, [1] * BATCH_SIZE)
                d.trainable = True
                print("batch %d g_loss : %f" % (index, g_loss))
                if index % 10 == 9:
                    g.save_weights('generator', True)
                    d.save_weights('discriminator', True)
    
    #----------------------------------------------------------------
    #GAN图片生成
    def generate(BATCH_SIZE, nice=False):
        g = generator_model()
        g.compile(loss='binary_crossentropy', optimizer="SGD")
        g.load_weights('generator')
        if nice:
            d = discriminator_model()
            d.compile(loss='binary_crossentropy', optimizer="SGD")
            d.load_weights('discriminator')
            noise = np.random.uniform(-1, 1, (BATCH_SIZE*20, 100))
            generated_images = g.predict(noise, verbose=1)
            d_pret = d.predict(generated_images, verbose=1)
            index = np.arange(0, BATCH_SIZE*20)
            index.resize((BATCH_SIZE*20, 1))
            pre_with_index = list(np.append(d_pret, index, axis=1))
            pre_with_index.sort(key=lambda x: x[0], reverse=True)
            nice_images = np.zeros((BATCH_SIZE,) + generated_images.shape[1:3], dtype=np.float32)
            nice_images = nice_images[:, :, :, None]
            for i in range(BATCH_SIZE):
                idx = int(pre_with_index[i][1])
                nice_images[i, :, :, 0] = generated_images[idx, :, :, 0]
            image = combine_images(nice_images)
        else:
            noise = np.random.uniform(-1, 1, (BATCH_SIZE, 100))
            generated_images = g.predict(noise, verbose=1)
            image = combine_images(generated_images)
        image = image*127.5+127.5
        Image.fromarray(image.astype(np.uint8)).save(
            "generated_image.png")
    
    #参数设置
    def get_args():
        parser = argparse.ArgumentParser()
        parser.add_argument("--mode", type=str)
        parser.add_argument("--batch_size", type=int, default=128)
        parser.add_argument("--nice", dest="nice", action="store_true")
        parser.set_defaults(nice=False)
        args = parser.parse_args()
        return args
    
    if __name__ == "__main__":
        """
        args = get_args()
        if args.mode == "train":
            train(BATCH_SIZE=args.batch_size)
        elif args.mode == "generate":
            generate(BATCH_SIZE=args.batch_size, nice=args.nice)
        """
        mode = "train"
        if mode == "train":
            train(BATCH_SIZE=128)
        elif mode == "generate":
            generate(BATCH_SIZE=128)
    

    代码执行参数:

    Training:
    python dcgan.py --mode train --batch_size <batch_size>
    python dcgan.py --mode train --path ~/images --batch_size 128
    
    Image generation:
    python dcgan.py --mode generate --batch_size <batch_size>
    python dcgan.py --mode generate --batch_size <batch_size> --nice : top 5% images according to discriminator
    python dcgan.py --mode generate --batch_size 128
    

    训练过程,首先手写数字MNIST图片数据集可以下载存储至该位置,也可以运行代码在线下载。

    在这里插入图片描述

    Epoch is 0
    Number of batches 468
    batch 0 d_loss : 0.648902
    batch 0 g_loss : 0.672132
    batch 1 d_loss : 0.649307
    ....
    batch 466 g_loss : 1.305099
    batch 467 d_loss : 0.375284
    batch 467 g_loss : 1.298173
    
    Epoch is 1
    Number of batches 468
    batch 0 d_loss : 0.461435
    batch 0 g_loss : 1.231795
    batch 1 d_loss : 0.412679
    ....
    

    请添加图片描述

    运行过程中会生成很多图像,随着训练次数增加图像会越来越清晰。

    在这里插入图片描述

    然后参数设置为“generate”,利用GAN最终生成图像,如下图所示。

    请添加图片描述


    3.其他常见GAN网络

    (1) CGAN

    首先,GAN如何输出指定类的图像呢?
    CGAN出场。这里简单介绍下GAN和CGAN的区别:GAN只能判断生成的东西是真的或假的,如果想指定生成图像如1、2、3呢?GAN会先生成100张图像,然后从中去挑选出1、2、3,这确实不方便。

    在2014年提出GAN时,CGAN也被提出来了。CGAN除了生成以外,还要把条件带出去,即带着我们要生成一个什么样的图条件去混淆,如下右图:噪声z向量+条件c向量去生成

    在这里插入图片描述

    所以整套流程大体不变,接着我们看看公式,它在D(x|y)和G(z|y)中增加了y。其中,y不一定是指定类的输出,可以是一些条件。

    在这里插入图片描述


    (2) DCGAN

    DCGAN(Deep Convolutional Generative Adversarial Networks)
    卷积神经网络和对抗神经网络结合起来的一篇经典论文,核心要素是:在不改变GAN原理的情况下提出一些有助于增强稳定性的tricks。注意,这一点很重要。因为GAN训练时并没有想象的稳定,生成器最后经常产生无意义的输出或奔溃,但是DCGAN按照tricks能生成较好的图像。

    在这里插入图片描述

    DCGAN论文使用的tricks包括:

    • 所有pooling都用strided convolutions代替,pooling的下采样是损失信息的,strided convolutions可以让模型自己学习损失的信息
    • 生成器G和判别器D都要用BN层(解决过拟合)
    • 把全连接层去掉,用全卷积层代替
    • 生成器除了输出层,激活函数统一使用ReLU,输出层用Tanh
    • 判别器所有层的激活函数统一都是LeakyReLU

    在这里插入图片描述


    (3) ACGAN

    ACGAN(既能生成图像又能进行分类)
    Conditional Image Synthesis with Auxiliary Classifier GANs,该判别器不仅要判断是真(real)或假(fake),还要判断其属于哪一类。

    在这里插入图片描述

    在这里插入图片描述


    (4) infoGAN

    InfoGAN:Interpretable Representation Learning by Information Maximizing Generative Adversarial Networks。这个号称是OpenAI在2016年的五大突破之一。

    • D网络的输入只有x,不加c
    • Q网络和D网络共享同一个网络,只是到最后一层独立输出
    • G(z)的输出和条件c区别大

    原文地址:https://arxiv.org/abs/1606.03657

    在这里插入图片描述

    其理论如下:

    在这里插入图片描述

    整个网络的训练在原目标函数的基础上,增加互信息下界L(G,Q),因此InfoGAN的目标函数最终表示为:

    在这里插入图片描述

    实验结果如下图所示:

    在这里插入图片描述


    (5) LAPGAN

    下面介绍一个比较有趣的网络拉普拉斯GAN。我们的目标是如何通过噪音生成一张图片,噪声本身生成图片比较困难,不可控量太多,所以我们逐层生成(生成从右往左看)。

    • 首先用噪声去生成一个小的图片,分辨率极低,我们对其拉伸。
    • 拉伸之后,想办法通过之前训练好的GAN网络生成一个它的残差。
    • 残差和拉伸图相加就生成一张更大的图片,以此类推,拉普拉斯生成一张大图。

    那么,如何训练呢?对原来这个大图的鸟进行压缩,再生成一张图去判别,依次逐层训练即可。

    在这里插入图片描述


    (6) EBGAN

    再来看一个EBGAN(Energy-based GAN),它抛弃了之前说的对和错的概念。它增加了一个叫能量的东西,经过自动编码器Enc(中间提取特征)和Dec解码器(输出),它希望生成一个跟真实图片的能量尽可能小,跟假的图片能量更大。

    • 《Energy-based Generative Adversarial Network》Junbo Zhao, arXiv:1609.03126v2

    在这里插入图片描述

    其生成器和判别器的损失函数计算公式如下(分段函数):

    在这里插入图片描述

    下图展示了GAN、EBGAN、EBGAN-PT模型生成的图像。

    在这里插入图片描述


    4.GAN改进策略

    你以为解决了所有问题了吗?too young.
    如下图所示误差,我们无法判断GAN训练的好坏。

    在这里插入图片描述

    GAN需要重视:稳定(训练不奔)、多样性(各种样本)、清晰度(质量好),现在很多工作也是解决这三个问题。

    • G、D迭代的方式能达到全局最优解吗?大部分情况是局部最优解。
    • 不一定收敛,学习率不能高,G、D要共同成长,不能其中一个成长的过快
      – 判别器训练得太好,生成器梯度消失,生成器loss降不下去
      – 判别器训练得不好,生成器梯度不准,四处乱跑
    • 奔溃的问题,通俗说G找到D的漏洞,每次都生成一样的骗D
    • 无需预先建模,模型过于自由,不可控

    为什么GAN存在这些问题,这是因为GAN原论文将GAN目标转换成了KL散度的问题,KL散度就是存在这些坑。

    在这里插入图片描述

    最终导致偏向于生成“稳妥”的样本,如下图所示,目标target是均匀分布的,但最终生成偏稳妥的样本。

    • “生成器没能生成真实的样本” 惩罚小
    • “生成器生成不真实的样本” 惩罚大

    在这里插入图片描述

    那么,有没有解决方法呢?
    WGAN(Wasserstein GAN)在2017年被提出,也算是GAN中里程碑式的论文,它从原理上解决了GAN的问题。具体思路为:

    • 判别器最后一层去掉sigmoid
    • 生成器和判别器的loss不取log
    • 每次更新判别器的参数之后把它们的绝对值截断到不超过一个固定的常数c
    • 不要用基于动量的优化算法(包括Momentum和Adam),推荐使用RMSProp、SGD
    • 用Wasserstein距离代替KL散度,训练网络稳定性大大增强,不用拘泥DCGAN的那些策略(tricks)

    在这里插入图片描述

    后续接着改进,提出了WGAN-GP(WGAN with gradient penalty),不截断,只对梯度增加惩罚项生成质量更高的图像。它一度被称为“state of the art”。

    在这里插入图片描述

    接下来,做GAN的就会出来反驳“谁说GAN就不如WGAN,我们加上Gradient Penalty,大家效果都差不多”。

    在这里插入图片描述

    效果如下图所示:

    在这里插入图片描述

    《Google Brain: Are GANs Created Equal? A Large-Scale Study》 这篇论文详细对比了各GAN模型点心LOSS优化变种。

    在这里插入图片描述

    这篇文章比较的结论为:特定的数据集说特定的事情,没有哪一种碾压其他。好的算法还得看成本,时间短的效果某家强,但训练时间长了,反倒会变差。根据评价标准的不同,场景的不同,效果差的算法也可以逆袭。工业界更看重稳定性,比如WGAN。

    参考知乎苏剑林老师的回答
    首先,从理论完备的角度来看,原始的GAN(SGAN)就是一个完整的GAN框架,只不过它可能存在梯度消失的风险。而论文比较的是 “大家都能稳定训练到收敛的情况下,谁的效果更好” 的问题,这答案是显然易见的:不管是SGAN还是WGAN,大家都是理论完备的,只是从不同角度看待概率分布的问题而已,所以效果差不多是正常的。

    甚至可以说,SGAN的理论更完备一些(因为WGAN需要L约束,而目前L约束的各种加法都有各自的缺点),所以通常来说SGAN的效果还比WGAN效果好一些。那么WGAN它们的贡献是什么呢?WGAN的特点就是基本上都能 “稳定训练到收敛”,而SGAN相对而言崩溃的概率更大。所以,如果在“大家都能稳定训练到收敛”的前提下比较效果,那对于WGAN这些模型本来就很不公平的,因为它们都是致力于怎么才能“稳定训练到收敛”,而这篇论文直接将它作为大前提,直接抹杀了WGAN所作的贡献了。

    在这里插入图片描述

    在这里插入图片描述


    四.总结

    写到这里,这篇文章就介绍结束了,希望对您有所帮助。首先非常感谢小象学院美图老师的介绍,文章虽然很冗余,但还是能学到知识,尤其是想学GAN的同学,这算一个非常不错的普及。当然,后续随着作者深入,会分享更简洁的介绍和案例,继续加油~

    个人感觉GAN有一部分很大的应用是在做强化学习,同时在推荐领域、对抗样本、安全领域均有应用,希望随着作者深入能分享更多的实战性GAN论文。比如如果图片被修改,GAN能不能第一次时间反馈出来或优化判决器。最后给出各类GAN模型对比图。

    在这里插入图片描述

    • 一.GAN简介
      1.GAN背景知识、2.GAN原理解析、3.GAN经典案例
    • 二.GAN预备知识
      1.什么是神经网络、2.全连接层、3.激活函数、4.反向传播
      5.优化器选择、6.卷积层、7.池化层、8.图像问题基本思路
    • 三.GAN网络实战分析
      1.GAN模型解析
      2.生成手写数字demo分析
      3.CGAN、DCGAN、ACGAN、infoGAN、LAPGAN、EBGAN
      4.GAN改进策略

    希望您喜欢这篇文章,从看视频到撰写代码,我真的写了一周时间,再次感谢参考文献的老师们。真心希望这篇文章对您有所帮助,加油~

    2020年8月18新开的“娜璋AI安全之家”,主要围绕Python大数据分析、网络空间安全、人工智能、Web渗透及攻防技术进行讲解,同时分享CCF、SCI、南核北核论文的算法实现。娜璋之家会更加系统,并重构作者的所有文章,从零讲解Python和安全,写了近十年文章,真心想把自己所学所感所做分享出来,还请各位多多指教,真诚邀请您的关注!谢谢。

    (By:Eastmount 2021-03-30 周二夜于武汉 http://blog.csdn.net/eastmount/ )


    参考文献:

    • https://www.bilibili.com/video/BV1ht411c79k
    • https://arxiv.org/abs/1406.2661
    • https://www.cntofu.com/book/85/dl/gan/gan.md
    • https://github.com/hindupuravinash/the-gan-zoo
    • https://arxiv.org/pdf/1701.00160.pdf
    • https://link.springer.com/chapter/10.1007/978-3-319-10593-2_13
    • https://zhuanlan.zhihu.com/p/76520991
    • http://cn.arxiv.org/pdf/1711.09020.pdf
    • https://www.sohu.com/a/121189842_465975
    • https://www.jianshu.com/p/88bb976ccbd9
    • https://zhuanlan.zhihu.com/p/23270674
    • ttps://blog.csdn.net/weixin_40170902/article/details/80092628
    • https://www.jiqizhixin.com/articles/2016-11-21-4
    • https://github.com/jacobgil/keras-dcgan/blob/master/dcgan.py
    • https://arxiv.org/abs/1511.06434
    • https://arxiv.org/pdf/1511.06434.pdf
    • https://blog.csdn.net/weixin_41697507/article/details/87900133
    • https://zhuanlan.zhihu.com/p/91592775
    • https://liuxiaofei.com.cn/blog/acgan与cgan的区别/
    • https://arxiv.org/abs/1606.03657
    • https://blog.csdn.net/sdnuwjw/article/details/83614977
    • 《Energy-based Generative Adversarial Network》Junbo Zhao, arXiv:1609.03126v2
    • https://www.jiqizhixin.com/articles/2017-03-27-4
    • https://zhuanlan.zhihu.com/p/25071913
    • https://arxiv.org/pdf/1705.07215.pdf
    • https://arxiv.org/pdf/1706.08500.pdf
    • https://arxiv.org/pdf/1711.10337.pdf
    • https://www.zhihu.com/question/263383926
    展开全文
  • 推荐系统经典论文文献及业界应用

    千次阅读 2018-03-01 21:30:54
    推荐系统经典论文文献及业界应用列了一些之前设计开发百度关键词搜索推荐引擎时, 参考过的论文, 书籍, 以及调研过的推荐系统相关的工具;同时给出参加过及未参加过的业界推荐引擎应用交流资料(有网盘的链接)...

    推荐系统经典论文文献及业界应用

    列了一些之前设计开发百度关键词搜索推荐引擎时, 参考过的论文, 书籍, 以及调研过的推荐系统相关的工具;同时给出参加过及未参加过的业界推荐引擎应用交流资料(有我网盘的链接), 材料组织方式参考了厂里部分同学的整理。

    因为推荐引擎不能算是一个独立学科,它与机器学习,数据挖掘有天然不可分的关系,所以同时列了一些这方面有用的工具及书籍,希望能对大家有所帮助。

    Survey方面的文章及资料

    1. Adomavicius G, Tuzhilin A. Toward the next generation of recommender systems: A survey of the state-of-the-art and possible extensions[J]. Knowledge and Data Engineering, IEEE Transactions on, 2005, 17(6): 734-749. 2005年的state-of-the-art的推荐综述,按照content-based, CF, Hybrid的分类方法进行组织,并介绍了推荐引擎设计时需要关注的特性指标,内容非常全。
    2. Marlin B. Collaborative filtering: A machine learning perspective[D]. University of Toronto, 2004. 从传统机器学习的分类角度来介绍推荐算法,有一定机器学习背景的人来看该文章的话, 会觉得写得通俗易懂
    3. Koren Y, Bell R. Advances in collaborative filtering[M]//Recommender Systems Handbook. Springer US, 2011: 145-186.  RSs Handbook中专门讲述协同过滤的一章,其中对近年协同过滤的一些重要突破进行了介绍,包括因式分解,时间相关推荐,基于近邻的推荐以及多种方法的融合,内部不多,但其中引用的论文值得细看
    4. Su X, Khoshgoftaar T M. A survey of collaborative filtering techniques[J]. Advances in artificial intelligence, 2009, 2009: 4. 协同过滤的篇survey, 按照memory-base, model-based, hybrid分类方法介绍各种协同过滤方法及评价标准,并在其中给出基于netflix数据进行评估的效果对比
    5. Koren Y, Bell R, Volinsky C. Matrix factorization techniques for recommender systems[J]. Computer, 2009, 42(8): 30-37.  主要集中在因式分解实现协同过滤方法,如果看完Advances in collaborative filtering[M]//Recommender Systems Handbook的话,这篇文章就没有必要再看了
    6. Pazzani M J, Billsus D. Content-based recommendation systems[M]//The adaptive web. Springer Berlin Heidelberg, 2007: 325-341.从宏观上介绍content-based的策略架构
    7. Burke R. Hybrid recommender systems: Survey and experiments[J]. User modeling and user-adapted interaction, 2002, 12(4): 331-370.

    Content-based方法

    content-based方法非常依赖于特定领域item的特征提取及处理,例如音乐推荐或是关键词推荐中很多细节内容信息处理过程都是不一样的,故这里仅列了content-based综述类的几篇文章。

    1. Pazzani M J, Billsus D. Content-based recommendation systems[M]//The adaptive web. Springer Berlin Heidelberg, 2007: 325-341.从宏观上介绍content-based的策略架构
    2. Lops P, de Gemmis M, Semeraro G. Content-based recommender systems: State of the art and trends[M]//Recommender Systems Handbook. Springer US, 2011: 73-105. RS Handbook中专门介绍content-based 算法的章节
    3. Jannach D, Zanker M, Felfernig A, et al. Content-based recommendation   [M] Charpter 3 Recommender systems: an introduction[M]. Cambridge University Press, 2010.

    Collaborative Filtering方法

    Neighbourhood Based Methods

    1. Sarwar B, Karypis G, Konstan J, et al. Item-based collaborative filtering recommendation algorithms[C]//Proceedings of the 10th international conference on World Wide Web. ACM, 2001: 285-295. KNN进行item-based推荐的经典文章,其中也介绍了多种相似度度量标准
    2. Linden G, Smith B, York J. Amazon. com recommendations: Item-to-item collaborative filtering[J]. Internet Computing, IEEE, 2003, 7(1): 76-80. 经典的亚马逊item-based算法的文章
    3. Gionis A, Indyk P, Motwani R. Similarity search in high dimensions via hashing[C]//VLDB. 1999, 99: 518-529.  LSH
    4. Bell R M, Koren Y. Scalable collaborative filtering with jointly derived neighborhood interpolation weights[C]//Data Mining, 2007. ICDM 2007. Seventh IEEE International Conference on. IEEE, 2007: 43-52.
    5. Indyk P, Motwani R. Approximate nearest neighbors: towards removing the curse of dimensionality[C]//Proceedings of the thirtieth annual ACM symposium on Theory of computing. ACM, 1998: 604-613. LSH
    6. Buhler J. Efficient large-scale sequence comparison by locality-sensitive hashing[J]. Bioinformatics, 2001, 17(5): 419-428. LSH应用
    7. Chen T, Zheng Z, Lu Q, et al. Feature-based matrix factorization[J]. arXiv preprint arXiv:1109.2271, 2011.上交Apex实验室开发的svdfeature工具背后的原理。 优点是可以对照着代码学习
    8. Zhuang Y, Chin W S, Juan Y C, et al. A fast parallel SGD for matrix factorization in shared memory systems[C]//Proceedings of the 7th ACM Conference on Recommender Systems. ACM, 2013: 249-256.  recsys 2013 最佳论文,并行矩阵分解

    Model Based Methods

    1.  Koren Y, Bell R, Volinsky C. Matrix factorization techniques for recommender systems[J]. Computer, 2009, 42(8): 30-37.主要集中在因式分解实现协同过滤方法,如果看完Advances in collaborative filtering[M]//Recommender Systems Handbook的话,这篇文章就没有必要再看了
    2. Singh A P, Gordon G J. A unified view of matrix factorization models[M]//Machine Learning and Knowledge Discovery in Databases. Springer Berlin Heidelberg, 2008: 358-373.

    Hybrid Methods

    1. Koren Y. Factorization meets the neighborhood: a multifaceted collaborative filtering model[C]//Proceedings of the 14th ACM SIGKDD international conference on Knowledge discovery and data mining. ACM, 2008: 426-434. 因式分解与Neighbour-based方法融合
    2. Burke R. Hybrid recommender systems: Survey and experiments[J]. User modeling and user-adapted interaction, 2002, 12(4): 331-370. 介绍了多种推荐算法进行融合的框架
    3. Adomavicius G, Tuzhilin A. Context-aware recommender systems[M]//Recommender systems handbook. Springer US, 2011: 217-253. context aware  RS介绍,可以对照RS Handbook中相关章节阅读

    LBS推荐算法

    1. Zheng V W, Zheng Y, Xie X, et al. Collaborative location and activity recommendations with gps history data[C]//Proceedings of the 19th international conference on World wide web. ACM, 2010: 1029-1038     介绍了对GPS数据根据时间,地域维度进行网格化聚类,根据网页评论构建location-activity矩阵(这个感觉不靠谱),根据搜索引擎构建activity-activity矩阵,根据poi信息构建location-feature矩阵,之后填充稀疏的location-activity矩阵达到推荐目的
    2. Husain W, Dih L Y. A framework of a personalized location-based traveler recommendation system in mobile application[J]. International journal of multimedia and ubiquitous engineering, 2012, 7(3): 11-18.  第一轮使用content-based进行初步过滤(相当于触发); 第二轮使用CF进行细化推荐
    3. Leung K W T, Lee D L, Lee W C. CLR: a collaborative location recommendation framework based on co-clustering[C]//Proceedings of the 34th international ACM SIGIR conference on Research and development in Information Retrieval. ACM, 2011: 305-314.  将LBS推荐过程中涉及的entity由user-location推广至user. activity. location三者的关系使用agolomative方法进行挖掘推荐
    4. Ye M, Yin P, Lee W C, et al. Exploiting geographical influence for collaborative point-of-interest recommendation[C]//Proceedings of the 34th international ACM SIGIR conference on Research and development in Information Retrieval. ACM, 2011: 325-334.
    5. Zheng Y, Zhang L, Xie X, et al. Mining interesting locations and travel sequences from GPS trajectories[C]//Proceedings of the 18th international conference on World wide web. ACM, 2009: 791-800.

    推荐系统工业界应用

    1. Netflix:Netflix视频推荐的背后:算法知道你想看什么
    2. Netflix:Netflix Recommendations Beyond the 5 Stars: 大名鼎鼎的Netflix推荐系统交互,算法,架构的介绍;非常详尽的PPT,太多干货,强烈推荐
    3. Netflix:Recommender Systems MLSS’14 Collaborative and other Approaches,非常详细的推荐系统介绍, 知识架构相对完整,并且与Netflix系统结合较为紧密即学术又实践
    4. Hulu:Recommender System Algorithm and Architecture-项亮
    5. Hulu:  Personaliztion in Hulu, Hulu的个性化实践。 其中对Hulu推荐场景的分析非常细致,相当于先Debug数据,之后再做推荐,思路非常值得学习
    6. Youtube:Davidson J, Liebald B, Liu J, et al. The YouTube video recommendation system[C]//Proceedings of the fourth ACM conference on Recommender systems. ACM, 2010: 293-296.  Youtube推荐系统中的主要算法。 百度关键词搜索推荐系统对其进行了优化, 实现了任意类型的级联二部图推荐。 具体内容可参见博文: google youtube 电影推荐算法, 以及百度关键词搜索推荐级联二部图实现
    7. 豆瓣: 个性化推荐系统的几个问题_豆瓣网王守崑
    8. 豆瓣:阿稳_寻路推荐_豆瓣
    9. 豆瓣:豆瓣在推荐领域的实践与思考
    10. 百分点:量化美-时尚服饰搭配引擎
    11. weibo及考拉FM:停不下来的推荐实践_陈开江
    12. 阿里:天猫双11推荐技术应用
    13. 阿里:淘宝推荐系统
    14. 淘宝:一淘大规模推荐系统,一淘网Item-based CF推荐系统介绍,其中很多淘宝行为数据比较有意思,值得参考;另外为了可扩展行,使用Item-based CF在各种应用场景下一招走天下的思路, 也非常值得借鉴
    15. 淘宝: 搜索个性化: 淘宝搜索引入个性化的技术, 包括架构和策略
    16. 淘宝: 电商推荐-袁泉
    17. 当当:当当网搜索和推荐_庄洪波
    18. 土豆:个性化视频推荐系统土豆_明洪涛
    19. 360:360推荐系统实践-杨浩
    20. 盛大:推荐系统实战与效果提升之道-陈运文
    21. 盛大:智能推荐系统的开发与应用-陈运文
    22.  University of Szeged, Hungary推荐系统演讲
    23. Google News Personalization: Scalable Online Colleborative Filtering
    24. 世纪佳缘:婚恋交友中的用户推荐系统:其中将推荐问题按照效果漏斗进行分析的思路比较有意思
    25. 美丽说: 美丽说个性化推荐: 重点介绍美丽说推荐排序方法,百度之前老大的分享
    26. 美团: 美团生活服务推荐: 结合美团O2O业务的推荐系统
    27. 高德:推荐系统在业界及高德应用,部分内容涉密,进行了删减
    28. 百度:百度商业关键词搜索推荐,介绍了学术界推荐系统算法,并结合百度,Netflix,高德LBS对工业界推荐系统进行介绍,PPT非常完整,可以作为推荐系统知识体系及业界实现的教材

    推荐系统书籍

    1. Segaran T. Programming collective intelligence: building smart web 2.0 applications[M]. O’Reilly Media, 2007.寓教于乐的一本入门教材,附有可以直接动手实践的toy级别代码
    2. Shapira B. Recommender systems handbook[M]. Springer, 2011.  推荐系统可做枕头,也应该放在枕边的书籍,看了半本多。如果将该书及其中的参考文献都看完并理解,那恭喜你,你已经对这个领域有深入理解了
    3. Jannach D, Zanker M, Felfernig A, et al. Recommender systems: an introduction[M]. Cambridge University Press, 2010.  可以认为是2010年前推荐系统论文的综述集合
    4. Celma O. Music recommendation and discovery[M]. Springer, 2010. 主要内容集中在音乐推荐,领域非常专注于音乐推荐,包括选取的特征,评测时如何考虑音乐因素
    5. Word sense disambiguation: Algorithms and applications[M]. Springer Science+ Business Media, 2006. 如果涉及到关键词推荐,或是文本推荐, 则可以查阅该书

    P.S. 想对某个领域或是工具有深入了解,可以找一本该行业的XX HandBook满怀勇气与无畏细心看完,然后就会对这个领域有一定(较深)了解,当然如果手头有相关项目同步进行,治疗效果更好^_^

    推荐系统工具

    1. Mahout:基于hadoop的机器学习,数据挖掘,推荐系统开源工具。我厂的超低版本haodop集群居然不支持Mahout,想跑个Mahout还要进行移植,郁闷。。。该死!!
    2. scikit-learn:基于python的机器学习,数据挖掘库, 方便好用,适合数据量较小的调研任务,不过,一切不支持大数据的机器学习算法,(一定程度上)都是耍流氓。。。。
    3. weka:经典得不能再经典的数据挖掘工具, java版本
    4. R:R语言
    5. Cluto:聚类工具,集成了较多聚类算法及相似度度量方法;单机,数据量受限
    6. RapidMiner:没用过,但据说使用量非常大
    7. svdfeature: 上交Apex开发的svd工具集,代码质量不错,而且附带(MovieLen数据集)示例,直接下载各MovieLens数据集就能实验效果
    8. LibFM:Rendle S. Factorization machines with libFM[J]. ACM Transactions on Intelligent Systems and Technology (TIST), 2012, 3(3): 57. 实现了SGD,ALS等多种矩阵分解算法;作者使用该工具获过。其中ALS一般在大数据情况下使用(Mahout中使用该矩阵分解变种)
    9. GraphLib: 集成了协同过滤, Random Walk,Clustering, Topic Model等多种图关系挖掘算法

    经典推荐算法大赛数据

    1. netflix大赛数据:netflix大赛数据,想尝试各种算法效果,可以用该数据做实验;netflix已经不再发布数据,如有需要可从该链接下载
    2. Movielen数据集
    3. RecSys Chanllenge 2015: RecSys 2015 大赛,电商session 购买行为预测, 感兴趣的可以用该数据进行实验

    国内外推荐系统站点

    1. http://xavier.amatriain.net/   Xavier Amatriain 的博客,作者是Netflix的研发经历,理论工程并重,非常接近实战。强烈推荐 http://technocalifornia.blogspot.com/
    2. http://www.csie.ntu.edu.tw/~cjlin/  林智仁的主页,主要是svm开源工具,同时提供LIBMF应用于推荐
    3. http://www.resyschina.com/
    4. http://www.recommenderbook.net/teaching-material 各种推荐系统的教学资料

    因为我一直认为推荐系统不是一个独立的学科,它很多技术都是直接来自于机器学习,数据挖掘和信息检索(特别是文本相关的搜索推荐),所以以下也整理了一些之前工作及工作之余看过,了解过,或者准备看的这方面的资料

    数据挖掘资料

    1. Han J, Kamber M, Pei J. Data mining: concepts and techniques[M]. Morgan kaufmann, 2006. 数据挖掘方面的handbook,教科书类型,虽然厚,却通俗易懂(再次提醒,要了解某一领域,找本该领域的啥啥handbook耐心认真读完,那你基本对该领域有一定认识了)
    2. Chakrabarti S. Mining the Web: Discovering knowledge from hypertext data[M]. Morgan Kaufmann, 2003.介绍了一个搜索引擎中的大部分技术,包括spider,索引建立,内部的机器学习算法,信息检索,而且非常具有实用性,我在百度商务搜索部开发的spider,就是按照其中的架构设计开发的
    3. Liu B. Web data mining: exploring hyperlinks, contents, and usage data[M]. Springer, 2007. 如果说 Mining the Web: Discovering knowledge from hypertext data更偏web mining更偏整体,工程的话,这本书就更偏策略,两本都读过的话,你对搜索引擎中的数据挖掘算法的了解,就比较全面了
    4. Wu X, Kumar V, Quinlan J R, et al. Top 10 algorithms in data mining[J]. Knowledge and Information Systems, 2008, 14(1): 1-37. 专门将2006年评选出来的10大数据挖掘算法拎了出来讲讲
    5. Rajaraman A, Ullman J D. Mining of massive datasets[M]. Cambridge University Press, 2012.介绍如何使用hadoop进行数据挖掘,如果有hadoop环境则非常实用
    6. Feldman R, Sanger J. The text mining handbook: advanced approaches in analyzing unstructured data[M]. Cambridge University Press, 2007.文本挖掘的handbook
    7. Witten I H, Frank E. Data Mining: Practical machine learning tools and techniques[M]. Morgan Kaufmann, 2005. 结合weka介绍数据挖掘,最大的优点是weka open source

    机器学习资料

    1. Tom M Mitchell,Machine Learning, McGraw-Hill Science/Engineering/Mat, 1997,非常早起的机器学习书籍,非常适合入门, 浅显易懂, 但对于工业界应用, 只能说是Toy级别的算法。
    2. Bishop C M, Nasrabadi N M. Pattern recognition and machine learning[M]. New York: springer, 2006. 进阶型的书籍,对每种算法都有较为具体的理论介绍
    3. 课程: 机器学习(Stanford->Andrew Ng)http://v.163.com/special/opencourse/machinelearning.html,大名鼎鼎的Andrew Ng的机器学习公开课,网易上字幕版本;配合课程stanford cs229对应的handout及习题一起学习效果更好
    4. Liu T Y. Learning to rank for information retrieval[J]. Foundations and Trends in Information Retrieval, 2009, 3(3): 225-331. LTR技术比较全的介绍, 包括概念,技术; 同时还包含该领域中具体的开放数据集合, 选择特征的标准等; 在学习基本概念的同时, 可以使用这些数据做一做实验。
    5. Quinlan J R. C4. 5: programs for machine learning[M]. Morgan kaufmann, 1993. 超经典的c4.5介绍,学习树模型的同学一定要读下,非常具体,其中包含对离散,连续值,缺失值的处理任何细节。 同时有c4.5代码对照,代码参见: C4.5代码
    6. http://archive.ics.uci.edu/ml/datasets.html  包含了很多机器学习的数据集,是非常好的学习上手数据

    信息检索

    1. Agirre, Eneko, and Philip Glenny Edmonds, eds. Word sense disambiguation: Algorithms and applications. Vol. 33. Springer Science+ Business Media, 2006.
    2. Manning C D, Raghavan P, Schütze H. Introduction to information retrieval[M]. Cambridge: Cambridge University Press, 2008.
    3. MOFFAT A A, Bell T C. Managing gigabytes: compressing and indexing documents and images[M]. Morgan Kaufmann, 1999.一本很老的介绍搜索引擎的书了,不过09年的时候看还是被震撼到了,书中各种变着戏法使用几十M内存处理上G数据,感觉非常牛叉。
    4. Liu T Y. Learning to rank for information retrieval[J]. Foundations and Trends in Information Retrieval, 2009, 3(3): 225-331.
    5. Cao Z, Qin T, Liu T Y, et al. Learning to rank: from pairwise approach to listwise approach[C]//Proceedings of the 24th international conference on Machine learning. ACM, 2007: 129-136. 另外附上《tutorial-lTR by Hang Li》《tutorial-LTR by TY Liu

    百度关键词工具介绍参见:http://support.baidu.com/product/fc/4.html?castk=24b18bi7062c720d0d596

    也可关注我的微博:  weibo.com/dustinsea

    或是直接访问: http://semocean.com

    展开全文
  • 长期跟踪经典之作2--- LCT 算法论文阅读代码运行

    千次阅读 热门讨论 2018-05-09 16:54:38
    好了 TLD很费劲地弄完了,现在开始进阶的SHJT大神的LCT,就是长期追踪,相信未来这个方向会火起来的。   这两天琢磨完了论文,这里罗列一下读论文主要需要参阅的: 1 STC (用到了时空上下文分析定位) 2 ...

    好了  TLD很费劲地弄完了,现在开始进阶的SHJT大神的LCT,就是长期追踪,我相信未来这个方向会火起来的。

     

    这两天琢磨完了论文,这里罗列一下读论文主要需要参阅的:

    1 STC (用到了时空上下文分析定位)

    2 DSST fDSST (用到了位置与尺度相关滤波器与一系列特征维度)

    3 TLD (long term经典之作,LCT用到了RF的fern分类检测)

    4 STRUCK

    5 KCF CSK 不再论述

    6 https://blog.csdn.net/v_july_v/article/details/7624837 支持向量机通俗导论(理解SVM的三层境界)------这个是纯粹补坑用的。。大佬修改了代码把随机阙改成了SVM,而且是运行时才发现的,有点方。。看到Github上一群人在向chaoma哭喊help me pls...我就知道要凉了,只能自力更生了,怪不得找不着后续的一些解析....这样反而激起了我的好奇心,那么就由小白我一探究竟吧

    代码运行:

    1. Unzip code or clone it from https://github.com/chaoma99/lct-tracker.git
    2. Add the vl_feat toolbox in your current path 
       http://www.vlfeat.org/
    3. If you don't have the object tracking benchmark (OTB) dataset yet, run 'download_videos.m' (it will automatically download the OTB-100 sequences)
    4. Run utility/compile.m to comile calcIIF.cpp and im2colstep.c. These files are tested with opencv3.0. Notice the compatibility issue if your opencv version is earlier than 3.0
    5. The source files "assignToBins1.c", "gradientMex.cpp", 'imResample.cpp' are from Pitor Dollar's toolbox. If the compiled files do not work on your system, get it from http://vision.ucsd.edu/~pdollar/toolbox/doc/index.html

    Introduction The script 'run_tracker' without parameters is to choose a video and test the proposed tracker. The start interface is 'run_tracker'.We also provide the interface 'run_lct2' to reproduce our results on OBT tracking benchmark 这个是复现评测算法性能时用的;

    run_tracker Without any parameters, will ask you to choose a video, and track the objects, and show the results in an interactive figure. 可以用交互式的数字显示结果;Press 'Esc' to stop the tracker early. You can navigate the video using the scrollbar at the bottom.可以拖动底部的滚动条导航查看视频;

    run_tracker VIDEO Allows you to select a VIDEO by its name. 'all' will run all videos and show average statistics. 'choose' will select one interactively.

    For the actual tracking code, check out the 'tracker_lct' function. 想看跟踪详细代码,去tracker_lct文件查看;

    Though it's not required, the code will make use of the MATLAB Parallel Computing Toolbox automatically if available.

    。。。不说了,没什么说的

    代码运行需要 vl_feat toolbox & Pitor Dollar's toolbox,有下载链接, vl_feat toolbox可以自己做一个starup.m的运行文件放工程里方便运行,Pitor Dollar's toolbox之前装过了直接用

    需要注意的是utility里面的用到一些功能是C里的需要混编compile成mexa64文件,这里mex会出错,我看了下compile运行的代码,发现把opencv_ts300.lib  opencv_world300.lib还有带d后缀的lib文件共4个拷到工程文件下就好了,compile完生成动态链接文件,把数据集文件路径添加到run_tracker pathway里OK运行

    LCT的精度很高,得益于上下文算法以及添加了检测环节加上后来改的SVM分类器,相比TLD进步很大,主要是精度提的很棒,速度还是30FPS,足够满足实时跟踪,接下来继续剖析代码找问题吧。

     

    ——————————————————————————————————

     

    分割线:复现完修改了LCT 的代码,发现用尺度降维的思路比原作者岭回归的思路既好又快。。果断把原版抛弃了,现在在调参中。。。。真的是无论速度还是精确度都大幅提升,尤其是速度普遍提升了2~3倍。

     

     

    有一些人问mex老出问题,我记得是网上有教程,mex空格-setup好像是,剩下的按教程来,必须选择步骤里对应的编辑器,这样才能调用openCV,mex完会有一些mexa64文件,有这些run tracker时才不会报错,还要在system32和wow64里拷进去一些动态链接文件,我记得是这样。

    展开全文
  • 在本文中,展示了在创建,an灭算符之间最普通的Bogoliubov变换类别的简单规范变换集下,时空对称性相关的那些电荷被打破。 为此,查看了弯曲时空中实标量场理论的应力能张量(作为示例),并展示了它在简单的...
  • 以基于 seq2seq 模型的机器翻译为例,如果 decoder 只用 encoder 最后一个时刻输出的 hidden state,可能会有两个问题(个人的理解)。   encoder 最后一个 hidden state,句子末端词汇的关联较大,难以...

    先简单谈一谈 attention 模型的引入。以基于 seq2seq 模型的机器翻译为例,如果 decoder 只用 encoder 最后一个时刻输出的 hidden state,可能会有两个问题(我个人的理解)。

     

    • encoder 最后一个 hidden state,与句子末端词汇的关联较大,难以保留句子起始部分的信息;

    • encoder 按顺序依次接受输入,可以认为 encoder 产出的 hidden state 包含有词序信息。所以一定程度上 decoder 的翻译也基本上沿着原始句子的顺序依次进行,但实际中翻译却未必如此,以下是一个翻译的例子:

     

    英文原句:

    space and oceans are the new world which scientists are trying to explore.

    翻译结果:

    空间和海洋是科学家试图探索的新世界。 

     

    词汇对照如下:

     

    640?

     

    可以看到,翻译的过程并不总是沿着原句从左至右依次进行翻译,例如上面例子的定语从句。 

     

    为了一定程度上解决以上的问题,14 年的一篇文章 Sequence to Sequence Learning with Neural Networks 提出了一个有意思的 trick,即在模型训练的过程中将原始句子进行反转,取得了一定的效果。 

     

    为了更好地解决问题,attention 模型开始得到广泛重视和应用。 

     

    下面进入正题,进行对 attention 的介绍。

     

    Show, Attend and Tell

     

    640?

     

    论文:

    Show, Attend and Tell: Neural Image Caption Generation with Visual Attention

    链接:

    https://www.paperweekly.site/papers/812

    源码:

    https://github.com/kelvinxu/arctic-captions

     

    文章讨论的场景是图像描述生成(Image Caption Generation),对于这种场景,先放一张图,感受一下 attention 的框架。

     

    640?

     

    文章提出了两种 attention 模式,即 hard attention 和 soft attention,来感受一下这两种 attention。

     

    640?

     

    可以看到,hard attention 会专注于很小的区域,而 soft attention 的注意力相对发散。模型的 encoder 利用 CNN (VGG net),提取出图像的 L 个 D 维的向量640?,每个向量表示图像的一部分信息。

     

    decoder 是一个 LSTM,每个 timestep t 的输入包含三个部分,即 context vector Zt 、前一个 timestep 的 hidden state640?、前一个 timestep 的 output640?。 Zt 由 {ai} 和权重 {αti} 通过加权得到。这里的权重 αti 通过attention模型 fatt 来计算得到,而本文中的 fatt 是一个多层感知机(multilayer perceptron)。

     

    640?

     

    从而可以计算640?。接下来文章重点讨论 hard(也叫 stochastic attention)和 soft(也叫 deterministic)两种 attention 模式。

     

    Stochastic “Hard” Attention 

     

    记 St 为 decoder 第 t 个时刻的 attention 所关注的位置编号, Sti 表示第 t 时刻 attention 是否关注位置 i , Sti 服从多元伯努利分布(multinoulli distribution), 对于任意的 t ,Sti,i=1,2,...,L 中有且只有取 1,其余全部为 0,所以 [St1,St2,...,stL] 是 one-hot 形式。这种 attention 每次只 focus 一个位置的做法,就是“hard”称谓的来源。 Zt 也就被视为一个变量,计算如下:

     

    640?

     

    问题是 αti 怎么算呢?把 αti 视为隐变量,研究模型的目标函数,进而研究目标函数对参数的梯度。直观理解,模型要根据 a=(a1,...,aL) 来生成序列 y=(y1,...,yC) ,所以目标可以是最大化 log p(y|a) ,但这里没有显式的包含 s ,所以作者利用著名的 Jensen 不等式(Jensen's inequality)对目标函数做了转化,得到了目标函数的一个 lower bound,如下:

     

    640?

     

    这里的 s ={ s1,...,sC },是时间轴上的重点 focus 的序列,理论上这种序列共有640?个。 然后就用 log p(y|a) 代替原始的目标函数,对模型的参数 W 算 gradient。

     

    640?

     

    然后利用蒙特卡洛方法对 s 进行抽样,我们做 N 次这样的抽样实验,记每次取到的序列是640?,易知640?的概率为640?,所以上面的求 gradient 的结果即为:

     

    640?

     

    接下来的一些细节涉及reinforcement learning,感兴趣的同学可以去看这篇 paper。

     

    Deterministic “Soft” Attention 

     

    说完“硬”的 attention,再来说说“软”的 attention。 相对来说 soft attention 很好理解,在 hard attention 里面,每个时刻 t 模型的序列 [ St1,...,StL ] 只有一个取 1,其余全部为 0,也就是说每次只 focus 一个位置,而 soft attention 每次会照顾到全部的位置,只是不同位置的权重不同罢了。这时 Zt 即为 ai 的加权求和:

     

    640?

     

    这样 soft attention 是光滑的且可微的(即目标函数,也就是 LSTM 的目标函数对权重 αti 是可微的,原因很简单,因为目标函数对 Zt 可微,而 Zt 对 αti 可微,根据 chain rule 可得目标函数对 αti 可微)。

     

    文章还对这种 soft attention 做了微调:

     

    640?

     

    其中640?,用来调节 context vector 在 LSTM 中的比重(相对于640?、 640?的比重)。

     

    btw,模型的 loss function 加入了 αti 的正则项。

     

    640?

     

    Attention-based NMT

     

    640?

     

    论文:

    Effective Approaches to Attention-based Neural Machine Translation

    链接:

    https://www.paperweekly.site/papers/806

    源码:

    https://github.com/lmthang/nmt.matlab

     

    文章提出了两种 attention 的改进版本,即 global attention 和 local attention。先感受一下 global attention 和 local attention 长什么样子。

     

    640?Global Attention

    640?Local Attention

     

    文章指出,local attention 可以视为 hard attention 和 soft attention 的混合体(优势上的混合),因为它的计算复杂度要低于 global attention、soft attention,而且与 hard attention 不同的是,local attention 几乎处处可微,易与训练。 文章以机器翻译为场景, x1,...,xn 为 source sentence, y1,...,ym 为 target sentence, c1,...,cm 为 encoder 产生的 context vector,objective function 为:

     

    640?

     

    Ct 来源于 encoder 中多个 source position 所产生的 hidden states,global attention 和 local attention 的主要区别在于 attention 所 forcus 的 source positions 数目的不同:如果 attention forcus 全部的 position,则是 global attention,反之,若只 focus 一部分 position,则为 local attention。 

     

    由此可见,这里的 global attention、local attention 和 soft attention 并无本质上的区别,两篇 paper 模型的差别只是在 LSTM 结构上有微小的差别。 

     

    在decoder的时刻t,在利用 global attention 或 local attention 得到 context vector Ct之后,结合 ht ,对二者做 concatenate 操作,得到 attention hidden state。

     

    640?

     

    最后利用 softmax 产出该时刻的输出:

     

    640?

     

    下面重点介绍 global attention、local attention。

     

    global attention 

     

    global attention 在计算 context vector ct 的时候会考虑 encoder 所产生的全部hidden state。记 decoder 时刻 t 的 target hidden为 ht,encoder 的全部 hidden state 为640?,对于其中任意640?,其权重 αts 为:

     

    640?

     

    而其中的640?,文章给出了四种种计算方法(文章称为 alignment function):

     

    640?

    640?

     

    四种方法都比较直观、简单。在得到这些权重后, ct 的计算是很自然的,即为640?的 weighted summation。

     

    local attention 

     

    global attention 可能的缺点在于每次都要扫描全部的 source hidden state,计算开销较大,对于长句翻译不利,为了提升效率,提出 local attention,每次只 focus 一小部分的 source position。 

     

    这里,context vector ct 的计算只 focus 窗口 [pt-D,pt+D] 内的 2D+1 个source hidden states(若发生越界,则忽略界外的 source hidden states)。

     

    其中 pt 是一个 source position index,可以理解为 attention 的“焦点”,作为模型的参数, D 根据经验来选择(文章选用 10)。 关于 pt 的计算,文章给出了两种计算方案:

     

    • Monotonic alignment (local-m)

    640?

     

    • Predictive alignment (local-p)

    640?

     

    其中 Wp 和 vp 是模型的参数, S 是 source sentence 的长度,易知 pt∈[0,S] 。 权重 αt(s) 的计算如下:

     

    640?

     

    可以看出,距离中心 pt 越远的位置,其位置上的 source hidden state 对应的权重就会被压缩地越厉害。

     

    Jointly Learning

     

    640?

     

    论文:

    Neural Machine Translation by Jointly Learning to Align and Translate

    链接:

    https://www.paperweekly.site/papers/434

    源码:

    https://github.com/spro/torch-seq2seq-attention

     

    这篇文章没有使用新的 attention 结构,其 attention 就是 soft attention 的形式。文章给出了一些 attention 的可视化效果图。

     

    640?

     

    上面 4 幅图中,x 轴代表原始英文句子,y 轴代表翻译为法文的结果。每个像素代表的是纵轴的相应位置的 target hidden state 与横轴相应位置的 source hidden state 计算得到的权重 αij,权重越大,对应的像素点越亮。可以看到,亮斑基本处在对角线上,符合预期,毕竟翻译的过程基本是沿着原始句子从左至右依次进行翻译。

     

    Attention Is All You Need

     

    640?

     

    论文:

    Attention Is All You Need

    链接:

    https://www.paperweekly.site/papers/224

    源码:

    https://github.com/Kyubyong/transformer

     

    640?

     

    论文:

    Weighted Transformer Network for Machine Translation

    链接:

    https://www.paperweekly.site/papers/2013

    源码:

    https://github.com/JayParks/transformer

     

    作者首先指出,结合了 RNN(及其变体)和注意力机制的模型在序列建模领域取得了不错的成绩,但由于 RNN 的循环特性导致其不利于并行计算,所以模型的训练时间往往较长,在 GPU 上一个大一点的 seq2seq 模型通常要跑上几天,所以作者对 RNN 深恶痛绝,遂决定舍弃 RNN,只用注意力模型来进行序列的建模。 

     

    作者提出一种新型的网络结构,并起了个名字 Transformer,里面所包含的注意力机制称之为 self-attention。作者骄傲地宣称他这套 Transformer 是能够计算 input 和 output 的 representation 而不借助 RNN 的唯一的 model,所以作者说有 attention 就够了。

     

    模型同样包含 encoder 和 decoder 两个 stage,encoder 和 decoder 都是抛弃 RNN,而是用堆叠起来的 self-attention,和 fully-connected layer 来完成,模型的架构如下:

     

    640?

    从图中可以看出,模型共包含三个 attention 成分,分别是 encoder 的 self-attention,decoder 的 self-attention,以及连接 encoder 和 decoder 的 attention。  

     

    这三个 attention block 都是 multi-head attention 的形式,输入都是 query Q 、key K 、value V 三个元素,只是 Q 、 K 、 V 的取值不同罢了。接下来重点讨论最核心的模块 multi-head attention(多头注意力)。 

     

    multi-head attention 由多个 scaled dot-product attention 这样的基础单元经过 stack 而成。

     

    640?

     

    那重点就变成 scaled dot-product attention 是什么鬼了。按字面意思理解,scaled dot-product attention 即缩放了的点乘注意力,我们来对它进行研究。 

     

    在这之前,我们先回顾一下上文提到的传统的 attention 方法(例如 global attention,score 采用 dot 形式)。

     

    记 decoder 时刻 t 的 target hidden state 为 ht,encoder 得到的全部 source hidden state为640?,则 decoder 的 context vector ct 的计算过程如下:

     

    640?

     

    作者先抛出三个名词 query Q、key K、value V,然后计算这三个元素的 attention。

     

    640?

     

    我的写法与论文有细微差别,但为了接下来说明的简便,我姑且简化成这样。这个 Attention 的计算跟上面的 (*) 式有几分相似。

     

    那么 Q、K、V 到底是什么?论文里讲的比较晦涩,说说我的理解。encoder 里的 attention 叫 self-attention,顾名思义,就是自己和自己做 attention。

     

    抛开这篇论文的做法,让我们激活自己的创造力,在传统的 seq2seq 中的 encoder 阶段,我们得到 n 个时刻的 hidden states 之后,可以用每一时刻的 hidden state hi,去分别和任意的 hidden state hj,j=1,2,...,n 计算 attention,这就有点 self-attention 的意思。

     

    回到当前的模型,由于抛弃了 RNN,encoder 过程就没了 hidden states,那拿什么做 self-attention 来自嗨呢?

     

    可以想到,假如作为 input 的 sequence 共有 n 个 word,那么我可以先对每一个 word 做 embedding 吧?就得到 n 个 embedding,然后我就可以用 embedding 代替 hidden state 来做 self-attention 了。所以 Q 这个矩阵里面装的就是全部的 word embedding,K、V 也是一样。

     

    所以为什么管 Q 叫query?就是你每次拿一个 word embedding,去“查询”其和任意的 word embedding 的 match 程度(也就是 attention 的大小),你一共要做 n 轮这样的操作。 

     

    我们记 word embedding 的 dimension 为 dmodel ,所以 Q 的 shape 就是 n*dmodel, K、V 也是一样,第 i 个 word 的 embedding 为 vi,所以该 word 的 attention 应为:

     

    640?

     

    那同时做全部 word 的 attention,则是:

     

    640?

     

    scaled dot-product attention 基本就是这样了。基于 RNN 的传统 encoder 在每个时刻会有输入和输出,而现在 encoder 由于抛弃了 RNN 序列模型,所以可以一下子把序列的全部内容输进去,来一次 self-attention 的自嗨。

     

    理解了 scaled dot-product attention 之后,multi-head attention 就好理解了,因为就是 scaled dot-product attention 的 stacking。

     

    先把 Q、K、V 做 linear transformation,然后对新生成的 Q'、K'、V' 算 attention,重复这样的操作 h 次,然后把 h 次的结果做 concat,最后再做一次 linear transformation,就是 multi-head attention 这个小 block 的输出了。 

     

    640?

     

    以上介绍了 encoder 的 self-attention。decoder 中的 encoder-decoder attention 道理类似,可以理解为用 decoder 中的每个 vi 对 encoder 中的 vj 做一种交叉 attention。

     

    decoder 中的 self-attention 也一样的道理,只是要注意一点,decoder 中你在用 vi 对 vj 做 attention 时,有一些 pair 是不合法的。原因在于,虽然 encoder 阶段你可以把序列的全部 word 一次全输入进去,但是 decoder 阶段却并不总是可以,想象一下你在做 inference,decoder 的产出还是按从左至右的顺序,所以你的 vi 是没机会和 vj ( j>i ) 做 attention 的。

     

    那怎么将这一点体现在 attention 的计算中呢?文中说只需要令 score(vi,vj)=-∞ 即可。为何?因为这样的话:

     

    640?

     

    所以在计算 vi 的 self-attention 的时候,就能够把 vj 屏蔽掉。所以这个问题也就解决了。

     

    模型的其他模块,诸如 position-wise feed-forward networks、position encoding、layer normalization、residual connection 等,相对容易理解,感兴趣的同学可以去看 paper,此处不再赘述。

     

    总结

     

    本文对 attention 的五种结构,即 hard attention、soft attention、global attention、local attention、self-attention 进行了具体分析。五种 attention 在计算复杂度、部署难度、模型效果上会有一定差异,实际中还需根据业务实际合理选择模型。

     

    640?

    展开全文
  • 这是1942年外国专家对PID参数整定的研究性论文。学自动化的人在教科书中或一些论文经常能看到Ziegler-Nichols整定法,也叫响应曲线...今晚,怀着对前辈无限崇敬的心情把这篇论传上来大家共享。 $ y' T. R) y/ a/ r
  • 以基于 seq2seq 模型的机器翻译为例,如果 decoder 只用 encoder 最后一个时刻输出的 hidden state,可能会有两个问题(个人的理解)。 1. encoder 最后一个 hidden state,句子末端词汇的关联较大,难以保留...
  • 列了一些之前设计开发百度关键词搜索推荐引擎时, 参考过的论文, 书籍, 以及调研过的推荐系统相关的工具;同时给出参加过及未参加过的业界推荐引擎应用交流资料(有网盘的链接), 材料组织方式参考了厂里部分...
  • 于此同时,在讲解这篇论文时,不会把论文全篇翻译出来,毕竟这样做毫无意义,会把个人觉得比较重要的部分摘出来,再结合自己的认识,大家分享 文章的一开头就给出了反向传播算法的原理: The procedure ...
  • 经典寓言哲理:毕业论文

    千次阅读 2006-05-12 12:54:00
    在一个充满阳光的午后,一只兔子从她的洞里出来享受大好天气。天气好得让她失去警觉,一只狐狸危随其后,抓住了她。...""正在写"兔子比狐狸狼强的优越性"。""你疯了吗?应该现在就把你吃了!大家都知道狐狸
  • 读研已有大半年的时间,在这段时间里,一直进行图像处理相关内容的学习,平时除了完成作业、准备项目之外,的日常工作就是找经典论文、翻译、阅读、分析源代码、尝试自己写代码、其它经典算法进行比较、尝试...
  • 点击下面卡片,关注呀,每天给你送来AI技术干货!整理:深度学习NLP 事件抽取技术是从非结构化信息中抽取出用户感兴趣的事件,并以结构化呈现给用户。事件抽取任务可分解为4个子任务:...
  • 花money购买的资料,感觉不错,拿出来分享,资料内容包括软件项目管理师经典案例;九大知识领域范文欣赏;项目管理师经验分享;项目管理师大纲和格式。详细大纲如下: 项目管理师论文写作指南 6 1.大纲中的要求 6 2....
  • 的古诗词网站使用动态服务器页面(JSP,即 Java Server Pages)动态网页技术并结合Mysql数据库,以Dreamweaver作为开发平台[1]。基础编程语言以Java和JavaScript脚本为主。IIS(Internet Information Services)+JSP+...
  • 转自:图像处理和计算机视觉中的经典论文(部分) 图像处理计算机视觉中的经典文章 自己视野狭小,不敢说全部,只是把自己熟悉的方向中的部分经典文章列出来了。经典的论文,读得怎么透都不过分。有人说...
  • 毕业论文已经答辩完了,还有一个多月就毕业离校,收集下宿舍里的经典语录 粉红色超短裤 -- 一个邻家女生,广经常去她那里帮忙补习 骚货 -- 四班的一个女生,我们三个都不知道她的名字,所以就给她起了个...
  • p值的经典频率证据不一致。 在这一点上,已经从频繁主义者和贝叶斯主义者的角度研究了许多统计学家。 在本文中,将重点介绍贝叶斯模型选择的方法,从贝叶斯因子开始,并在Lindley Paradox中进行,后者还简要讨论...
  • 尽管受到西蒙(Simon)在1960年发表的论文的启发,但还是将其他许多方面编织到了挂毯中,从关于分工的经典讨论到当今的进化心理学。 基本结论是,随着市场规模的增长,我们应该看到人类“挤入”了任务,这些任务...
  • 论文 1:论文必须出炉:wg+la两条线路 工作 2:根据大公司的面试题,查漏补缺自己的专业知识! 要做到面对不懂的地方,态度为“要学!”,而不是“不会!”,不做菜鸟就算是菜鸟也要能飞得高。  apache的http压力...
  • 量子引力问题可以避免,因为没有真正的“瞬间”,所以表示量子态的概念(表示某个时刻的时空结构)和状态演化的概念不会受到牵引,因为具有嵌入在较大的非线性“先导模型”(半经典)嵌入结构中的初始八面体几何形状...

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 267
精华内容 106
关键字:

我与经典论文