1. 自注意力机制

    1. 注意力机制

      1. 上回说到了RNN,并提到了RNN的缺陷,训练和生成的串行问题,效率太慢了,因此引入了自注意力+掩码机制,下面会先谈谈注意力机制再引申到自注意力+掩码,一步步来;
    2. 先从RNN用作序列到序列的转换开始,比如翻译

      1. 编码器Encoder:从序列中提取特征c然后输入到解码器Decoder中;
      2. 解码器Decoder:从编码器获取特征然后翻译成其他语言;
      3. 这里存在一个问题,紫色方框中c的大小时固定的,那么编码器传到解码器的信息量是固定的,但是输入序列的长度不是固定的,随着输入序列的增长,无法将所有特征都压入c,存在特征丢失;
    3. 因此优化出了注意力机制即c应该只关心对当前输出相关部分,不需要整个序列的特征

      1. 将h和解码器的当前状态相关,比如用点积,两个向量越相关结果会越大,然后h乘以它们对应的权重a再传输给解码器c,那么c里面就是越和当前状态相关的内容权重越大,越不相关的权重越小,这就是注意力机制。
    4. 交叉注意力

      1. 需要先将参数重新定义一下,这里我们先将s用Q表示,h用X表示;
        1. 定义V:X里提取出来的一部分,直接与a运算;
        2. 定义K:X里提取出来的一部分,输出到e;
        3. 定义Wv:X通过该权重矩阵提取的V即V = XWv;
        4. 定位Wk:X通过该权重矩阵提取的K即K = XWk;
        5. 最后这个序列到序列的RNN框架变成了下图:
          1. 其中 E=QK^{T}/\sqrt[2]{D},除以根号D的原因是Q和K的点积会随着维度D的增加而增加,你可以理解需要对E进行一个归一化,因此除了根号D;
          2. X来自编码器,Q来自解码器;
          3. 因为Q与X生成的K做了点击,Softmax 后,就是 Q 对 X 的关注分布,这个架构就叫交叉注意力;
    5. 自注意力

      1. 定义一个矩阵Wq,使得Q = XWq,框架变成了 
        1. 这就是自注意力的框架。
    6. 掩码自注意力

      1. 在E模块加负无穷的掩码,是想在训练时不让模型偷窥未来,应该依据过去的数据,图里负无穷标记的位置可能有问题,Q1应该无法看到K2和K3,Q2无法看到K3,Q3是都能看到K1和K2才对,E模块处设置了负无穷后对应到A模块就是0;
      2. 这样后面的X3只依赖前面的输入X1和X2,但并不依赖前面X1和X2的计算结果,因此可以实现训练时的并行,但是生成时还是串行的;
  2. PixelCNN

    1. 课程中没有完整给出模型框架,只提取了掩码卷积那一块东西,博主在这里扩展一下;
    2. 模型结构
      1. 从网上摘取的图,上图链接
      2. 右下角标A的模块是A型卷积即,这主要就是体现论文中基于条件概率建模的;
      3. 右下角标B的模块是B型卷积即,这也是体现论文中基于条件概率建模的;
      4. 左上角标R的是激活函数用ReLU;
      5. residual是残差模块;
      6. 第一层卷积升维,用64个卷积核,将通道数扩到64;
      7. 残差模块里的第一个1×1卷积进行降维通道数降到32,方便中间的3×3卷积计算
      8. 残差模块里的后一个1×1卷积进行升维通道数升到64再进入下一个残差模块,最后经过两个1×1卷积将通道扩到256;
      9. 为什么要输出256,因为像素取值范围时0-255,并且输出的每个像素概率,通道0里面存储的是这个像素取0的概率依次类推。
      10. 最后一层应该还有个softmax将分数转概率,上图作者可能是忽略了没画。
    3. 输入后的第一层卷积用模型A,因为不能看自己,后面层用模型B允许看自己的原因是本身已经不是输入的原始值了,至少经过了一层卷积,因此只屏蔽了未来;
    4. pixelCNN也存在问题,存在盲区,为了让模型看不到后面的信息,卷积核下方设置了0掩码,但是多层卷积后,最底层的当前像素虽然感受野很大,但是会缺失前面累计下来的掩掉的信息;
  3. 自回归模型的训练

    1. 前面具体介绍了自注意力和PixelCNN这两个自回归模型,这部分将进行抽象总结;
    2. KL散度
      1. 自回归模型使用KL散度D衡量两个分布之间的距离;
        1. 当概率分布p等于q时,说明距离最短,即D=0;
        2. 其中p作为真实数据的分布;
        3. 然后我们的目标就是要最小化D,让模型学习的分布q接近真实数据的分布,这样使用q生成的图像才能和真实图像一样;
      2. 怎么最小化D
        1. 因为\sum p(x) = 1,所以能转化为期望形式,p(x)P_{data}(x)真实数据分布替换,q(x)P_{\theta }(x)模型的分布替换;
        2. 最小化D,等价于最大化E_{x\sim P_{data}}[logP_{\theta }(x)];
        3. 但是因为我们没办法算真实数据概率,因此我们并不知道模型的分布离真实数据的分布到底有多近。
        4. 我们再将E_{x\sim P_{data}}[logP_{\theta }(x)]形式转换一下如下
          1. 最终就是要最大化联合概率密度P_{\theta }(x^{(1)},...,x^{(m)}) = \prod _{x\in D}P_{\theta }(x)
          2. 使用链式法则P_{\theta }(x) = P(x_{1})\cdot P(x_{2}|\ x_{1})\cdot \cdots P(x_{n}|x_{1},x_{2},\cdots ,x_{n-1}) = \prod p_{neural}(x_{i}|x<i;\theta _{i})
          3. 上面两个公式结合可推出最大似然估计L(\theta ,D) = P_{\theta }(x^{(1)},...,x^{(m)}) = \prod_{j=1}^{m}\prod_{i=1}^{n}p_{neural}(x_{i}^{(j)}|x^{(j)}<i;\theta _{i})
          4. 再取对数似然
            1. 其中梯度使用反向传输。
          5. 当维度D太大时
            1. 转成期望后,就可以用蒙特卡洛近似了。
        5. 蒙特卡洛估计
          1. 就是可以用样本的均值来近似期望,样本越多近似度越高;
        6. 过拟合和欠拟合的处理

          1. 后面几个PPT都是讲述对过拟合和欠拟合的出来,这里总结一下,过拟合会导致高方差,欠拟合则导致高偏差,建议使用交叉验证的方式,如果训练集变现很好,但是验证集上表现太差就是过拟合,如果训练集和验证集上表现都不好就是欠拟合;
          2. 过拟合可以通过减小参数、参数共享或者简化模型等处理;
          3. 相反欠拟合就可以通过添加参数,深化模型来弥补;
    Logo

    AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

    更多推荐