Convolutional Neural Network (CNN)

  • CNN,即卷积神经网络,主要适用于图片处理

图片分类

  • 假设我们现在有一张彩色的图片,在电脑中它有红绿蓝三个通道,每个通道是一个100*100的矩阵

  • 但是对于图片来说,如果我们使用全连接层的模型,参数会变得特别多

感受野

  • 我们观察到对于图像分类来说,要抓住的是图像中物体的特征,需要去捕捉图片的局部信息
    • 如图中鸟的特征:鸟喙、眼睛、鸟爪

  • 所以我们设置一个感受野(Receptive field)区域,来提取这一区域覆盖的图片信息(局部信息),并将信息给予一个神经元
    • kernel size(感受野或者叫卷积核的大小):\(n \times n\),一般为\(3\times3\)
    • 区域可以重叠
    • stride:移动感受野到图片的下一个区域的跨步
    • padding:当感受野来到图片边界,剩下区域不够大时的填充
    • 常规设置:每一个感受野有一组神经元(例如64个神经元)

相同特征在不同区域
  • 给我们两张鸟的图片,它们都有鸟喙,但是它们的鸟喙在图片上的不同区域上,那对于每一个感受野来说,都需要配置一个专门的鸟喙检测的神经元吗?

  • 可以让所有感受野中相应的神经元来共享参数

好处
  • 可以很好地处理图片
    • 在图片中,一些重要的pattern比整张图片要小得多
    • 在不同的图片中,相同的pattern会出现在图片的不同区域

卷积层

  • 彩色:3个通道
  • 黑白/灰:1个通道

假设我们的通道为1,现在我们拥有一张6*6图片,在给定的filter中,它们的值是不确定的,需要训练得到

进行卷积操作后得到的数据的结构

  • 列数: \[ (c - c_f + 1 + padding*2)\ / \ stride \]

  • 行数: \[ (r - r_f + 1 + padding * 2)\ / \ stride \]

  • 其中,

    • \(c\): 当前输入矩阵的列数

    • \(c_f\): filter的列数

    • \(r\): 当前输入矩阵的行数

    • \(r_f\): filter的行数

    • padding: 指在输入矩阵外圈填充的圈数

    • stride: 指filter在移动时跨越的步数

当所有的filter都对输入进行处理后,我们便获得了Feature Map,每一个filter都是对图片的不同解读,即拓展了查看图片的角度

  • 我们可以将Feature Map投入到下一个卷积层中

感受野和滤波器的比较

  • 拥有不同感受野的神经元会共享相同的参数
  • 每个滤波器会在整张输入图片上进行卷积操作

Pooling

对像素进行子采样不会更改对象

  • 子采样是一种选取原始数据的子集的方法,用来减小数据的大小
  • 子采样会改变数据集的拓扑,当某些部分没有被选取时,会留下拓扑上的洞

Max Pooling

选取Filter中最大的值作为感受野的取值

小结

  • CNN能够捕捉局部信息,当使用CNN时,我们应该考虑我们的数据集和目标,是否适用CNN
    • 例如Alpha Go中,在围棋中,我们需要去考虑局部的信息,而且在这种具体的情况中,pooling并不适用,子采样会损失围棋分布的信息
  • CNN在图像的放缩和旋转后,不能够正常的识别,需要我们进行数据增强(data augmentation)

Recurent Neural Network(RNN)

Slot Filling

  • 输入一段语句,给出填空的答案

  • 可不可以使用前向网络(Feedforward network)来实现
    • 输入单词(使用单词编码),每一个单词用一个向量来表示
    • 输出单词属于某一个空的概率

  • 问题:网络无法结合上下单词,理解词汇的意义,如到达和离开的区别,只能捕捉到目的地单词
    • 我们需要网络具有记忆的功能,能够记住前后的单词

单词编码

1-of-N encoding
  • 向量长度为整个词库的词语数量
  • 一个维度标记词库中的一个单词
  • 对于某一个单词,它所在维度为1,其他维度为0

改进
Others
  • 将其他不存在词库中的单词设置为“other”

Word hashing
  • 维度用来标记字母组合

RNN

存储前一个输入的信息

  • 将隐藏层的信息存储起来,将该信息作为输入,让网络可以学习

例子
  • 假设所有的权重为1,没有bias,激活函数都是线性的

  • 输入序列: \[ \begin{equation} \begin{bmatrix} 1 \\ 1 \end{bmatrix} \begin{bmatrix} 1 \\ 1 \end{bmatrix} \begin{bmatrix} 2 \\ 2 \end{bmatrix} \end{equation} \]

  • 初始的存储值为0

第一次输入: \[ \begin{bmatrix} 1 \\ 1 \end{bmatrix} \]

  • 两个存储值都会变为2

  • 输出为 \[ \begin{bmatrix} 4 \\ 4 \end{bmatrix} \]

第二次输入: \[ \begin{bmatrix} 1 \\ 1 \end{bmatrix} \]

  • 两个存储值会变为6
  • 输出为

\[ \begin{bmatrix} 12 \\ 12 \end{bmatrix} \]

小结
  • 改变输入序列的顺序,会改变输出
  • 反复使用这样的结构

如上图所示,当前输入,可以获得前一个输入的信息,可以简单区分出一些不同

  • 可以将网络做深

类别
  • Elman Network:传递前一个输入的隐藏层信息
  • Jordan Network:传递前一个输出的信息

双向RNN

将前向输入和逆向输入相同位置上的隐藏信息拼合到一个,存储当前单词前后的信息

LSTM

结构

  • 由4个部分组成

    • Input Gate:由信号控制是否接收输入
    • Memory Cell:存储记忆的信息
    • Forget Gate:由信号控制是否清除现在存储的信息
    • Output Gate:由信号控制是否输出
  • 一共有4个输入,1个输出

    • 输入:3个signal,1个正常输入
计算过程

  • 激活函数f输出为0到1,可以用来控制是否接收信息
  • 输入\(z\)\(z_i\),经过激活函数得到\(g(z)\)\(f(z_i)\),将两者相乘,即为\(g(z)f(z_i)\)
    • 这一步用来控制输入
  • 输入\(z_f\),经过激活函数得到\(f(z_f)\),与Memory Cell中存储的信息c进行相乘,即为\(cf(z_f)\)
    • 这一步用来控制是否要清楚当前信息c
  • 将前两步获得的数据相加获得新的存储信息\(c^\prime\)

\[ c^\prime = g(z)f(z_i) + cf(z_f) \]

  • 输入\(c^\prime\)\(z_o\),经过激活函数得到\(h(c^\prime)\)\(f(z_o)\),将两者相乘,得到输出a,即 \[ a = h(c^\prime)f(z_0) \]

    • 这一步用来控制输出

在RNN网络架构中,一般用LSTM代替神经元

缺点
  • 参数过多

    • 每一个LSTM都需要4个输入,需要4倍的参数*LSTM数目

    • 解决方案:利用当前输入,生成4个向量,所有的LSTM使用对应位置上的同一向量

    • 可以将上一个LSTM网络中的c拼合输入中

多层LSTM

学习目标

  • BPTT(Backpropagation through time)

RNN训练较为困难

  • RNN参数的损失曲面十分陡峭
  • 可以采用clip,剪切掉超过某一范围的参数,强制在一定范围内

  • 损失曲面会抖动严重的原因

参数的细微改变,会导致后面的输出发生巨大变化(梯度爆炸),或者一直为0(梯度消失),学习率无法调节

LSTM的优势

  • 可以解决梯度消失的问题(不是梯度爆炸)
    • fotget gate关闭可以消除前面记录信息的影响,摆脱梯度消失
  • 记录的信息和输入可以拼合

RNN的应用场景

Many to one
Sentiment Analysis
  • 语句分析,将其分类
  • 输入:向量序列
  • 输出:向量标签

Key Term Extraction
  • 关键词的提取
  • 输入:向量序列
  • 输出:一个向量

Many to Many(输出序列较短)

输入和输出都是序列,输出序列较短

Speech Recognition

好棒棒这种叠词,可能无法识别

Connectionist Temporal Classification (CTC)

  • 加入了额外的符号\(\phi\)来代表空

  • CTC是识别每一个字母的

Many to Many (没有限制)

输入和输出都是序列,且长度没有限制,可以不一样 -> Sequence to sequence learning

Machine Translation

Beyond Sequence
Syntactic parsing

Sequence-to-sequence Auto-encoder Text

要理解一个句子的意思,单词的顺序不可以忽略

Sequence-to-sequence Auto-encoder Speech
  • 不定长度的序列的降维
  • 发音相近的词语转换为向量后,会聚集在一定区域

音频归档分为可变长度的音频段,然后可以对语音进行检索

将语音片段转换为向量后,我们希望向量能够表示这个语音片段

Encoder和Decoder是联合训练的

Attention-based Model

  • DNN/RNN可以通过Reading Head Controller在Memory中找到自己想要的相关信息
  • 就像人类的大脑一样,可以去记忆中去搜索相关的知识

  • DNN/RNN同时也可以写入Memory

应用
Reading Comprehension
  • 对文本进行语义分析,每一个句子转换为一个向量
  • DNN/RNN读取向量信息

Visual Question Answering
  • 输入一张图片和一个问题,输出问题的答案

  • 利用CNN将图片的每一个区域转换为一个向量

Speech Question Answering

听力考试

RNN和Structured Learning的比较

RNN,LSTM

  • 非双向的RNN不能够考虑整个序列
  • Cost和eroor总是相关的
  • deep

HMM,CRF,Structured Perceptron/SVM

  • 使用了Viterbi,考虑了整个序列
    • 但双向的RNN也可考虑
  • 可以明确考虑标签依赖关系
  • Cost是error的下界

一起使用
Speech Recognition: CNN/LSTM/DNN + HMM

Semantic Tagging: Bi-directional LSTM + CRF/Structured SVM

Self-Attention

输入

  • 输入是一个向量,经过模型后输出一个数字或者类别
  • 输入时一组向量,经过模型后输出一组数字或者类别

输入时是一组向量

  • 语句
  • 语音
  • 图(如关系图)

语句

如一句话“this is a cat”,我们需要对数据集进行编码处理,以便识别各个单词

  • One-hot Encoding 一键编码
    • 有多少个单词,就构建一个多长的向量
    • 这样做的后果是模型不知道单词之间的关系,它们是割裂的
  • Word Embedding 词嵌入
    • 对词语进行编码处理,相似意义的词会聚集

语音

进行加窗处理

将每一个节点都视为一个向量

输出

  • 每一个向量都有一个标签

例子

  • 整个序列有一个标签

例子

  • 模型自己决定有多少个标签(seq2seq)

思考

  • 对于一段文本,我们需要考虑前后文,如判断"I saw a saw"中各个单词的词性
    • 对于前后文问题,我们可以将一个窗口内的单词都输入一个全连接层中,但是这样较前面的和较后面的很难一起考虑
    • 考虑整个句子,可以将整个句子丢入一个全连接层中,但是这样模型会变得很复杂

  • 可以使用自注意力机制

自注意力

实现

考虑当前向量和序列中其他向量的关系

可以对两个要关联的向量进行某种运算
  • Dot-product
  • Additive

对于当前向量,计算出一个query向量,对于其他的向量,各有一个key向量,可以分别计算得出注意力分数(attention score)

可以对注意力分数(attention score)进行softmax运算

然后基于注意力分数(attention score),利用value向量,提取出信息

对于所有的向量,平行地进行运算

对于这样相同的运算,我们可以将这些向量拼合成矩阵,进行矩阵运算,加快运算
  • q,k,v的获取
    • query:\(Q = W^q I\)
    • key:\(K = W^k I\)
    • value:\(V = W^vI\)

  • 注意力分数的获取

\[ A = K^T Q \\ A \mathop\rightarrow^{softmax} A^` \]

  • 信息的获取

\[ O = V A^` \]

  • 小结

Multi-head Self-attention

  • 多头注意力机制
  • 可以探索不同类型之间的联系

Positional Encoding

  • 在注意力机制中,序列输入后,模型没有对于位置的信息,不同距离的两个向量对于模型来说是一样的
  • 我们可以在向量中加入位置信息,每一个位置有一个独一无二的向量\(e^i\)
    • 手工制作
    • 从数据中学习

自注意力的应用

  • NLP 自然语言处理

  • 语音处理:Truncated Self-attention

  • 图像

  • Self-attention GAN

  • DEtection Transformer(DETR)

Self-attention和CNN的比较

  • CNN是简化版的self-attention
    • CNN是可以只关注一个感受野的self-attention
  • self-attention是复杂版的CNN
    • Self-attention是具有可学习感受野的CNN

  • Self-attention适合更多的数据,而CNN适合比较少的数据

Self-attention和RNN的比较

RNN不可以平行处理,而自注意力可以

Self-attention for Graph

Transformer

Seq2seq

  • 对于序列到序列的模型,我们输入一段序列,模型会输出一段序列,且输出序列的长度取决于模型
    • 语音识别(Speech Recognition)
    • 机器翻译(Machine Translation)
    • 语音翻译(Speech Translation)
    • 文本转语音合成器(Text-to-Speech(TTS) Synthesis)
    • Seq2seq for Chatbot

  • 其他的一些应用

    • Seq2seq for Syntactic Parsing

    • Seq2seq for Multi-label Classification

    • Seq2seq for Object Detection

Transformer

Encoder-Decoder架构

结构

Encoder

Layer Norm的调整

Decoder

Transformer的Decoder是一个自回归的Decoder(Autoregressive Decoder)

Masked Self-attention
  • 在解码器中,第一个注意力机制是一个掩码的自注意力
  • 这是因为解码器需要输出一个序列,它需要在不知道后面的信息的情况下,根据前面的信息,来预测当前的输出
  • 所以我们在训练时,需要将后面的序列盖住

  • 在训练时,我们给解码器的输入都是正确答案,帮助其完成训练

停止符号

为了让输出停止,我们需要定义一个停止符号,提示解码器停止输出

NAT 非自回归
  • AT需要前面的输出信息,才能给出当前的输出
  • NAT可以并行地给出输出,速度比AT要快,生成更加稳定

NAT解码器如何决定输出的长度

  • 预测输出序列的长度(predictor)
  • 输出一个固定长度的长序列,忽略终止符END后面的Token
Cross attention

Cross attention部分会将Encoder的最后一个输出转换为Decoder部分的\(k\)\(v\)矩阵

不同的连接方式

训练Transformer

  • Encoder和Decoder联合训练
  • 使用softmax和cross entropy进行训练

Teacher Forcing模式

将输出数据作为Decoder的输入,使其向正确输出靠近

Tips

Copy Machanism 复制机制

将一些不太需要翻译的人名、地名等直接复制

Guided Attention
  • Monotonic Attention

  • Location-aware attention

  • 在一些任务中,输入和输出是单调排列的,顺序关系不可改变

  • 例如下面的序列中,在输出时,第一个输出中,Attention关注的是后面的序列

  • 在Attention Score中,模型会选择当前分数最高的,但是多次选择后,综合起来,不一定是最好的选择
  • Beam Search会综合考虑全局的分数,选择最好的结果

但是最好的选择不一定会产生很好的结果

Sampling

在一些任务中,生成序列时,Decoder需要一些噪声(Randomness),sample是指从某些分布中sample中出来的噪声

Scheduled Sampling

采样由Decoder决定

Optimizing Evaluation Metrics

优化方案的选择

  • Cross Entropy
  • BLEU score
  • Reinforcement learning

各种各样的Attention

自注意力机制的运作

  • 利用Query和Key构造一个Attention Matrix

  • 自注意力只是一个大型网络的一个模块
  • 当序列的长度N足够大的时候,自注意力在计算占主导
  • 通常用于图像处理

人工干预来跳过一些Attention Matrix的计算

Local Attention/Truncated Attention

  • 只计算标记的部位,其他位置设置为0
  • 跟CNN有些相似
Stride Attention

  • 选中从自身向左右两边跨越规定的步数的部位,进行计算
Global Attention
  • 在原来的序列中添加special token
    • 关注(attend)每一个token,可以收集全局信息
    • 被每一个token关注(attend),知道全局信息

图中前两个是special token

小结
  • 可以在一个模型中同时使用不同的Attention
    • 不同的head可以使用不同的模式

关注一些Matrix中关键的部分(Critical Parts)

  • 小数值直接设置为0

  • 如何快速估计注意力权重较小的部分
Clustering
  • Reformer
  • Routing Transformer
步骤1

基于相似度对query和key进行聚类标注

步骤2
  • 相同类别的才计算attention weight
  • 不同类别的设置为0

Learnable Patterns

通过学习来获取需要计算的部位

不需要完整的Attention matrix

  • 可以减少key和value的长度
  • query的长度不变,因为输出长度需要不变

使用卷积

使用参数矩阵相乘

注意力机制计算

  • 利用输入I获取Q、K、V进行运算,得到输出O
  • 为加快运算,采用矩阵计算的形式
计算方式的不同
  • \(K^TQ\)先计算

  • \(VK^T\)先计算

三个矩阵计算顺序不同,进行乘法次数不同,结果相同

而Q、K、V三个矩阵的运算中,

正常进行计算,会进行\((d+d^\prime)N^2\)次乘法运算

先计算\(V K^T\)的话,会计算\(2d^\prime dN\)次乘法运算,小于正常运算次数,序列长度N是大于维度d的

注意力计算的变换

我们利用当前向量的\(q\)矩阵,来与自身和其他向量的\(k\)矩阵进行运算,再经过\(softmax\)运算,得到\(\alpha^{\prime}\),即 \[ \alpha^{\prime}_{1,i} = \sum_{i=1}^{N}\frac{exp(q^1\cdot k^i)}{\sum^N_{j=1}exp(q^1\cdot k^j)} \] 这里以\(a^1\)向量(\(q^1\)矩阵)为当前向量。

再将得到的\(\alpha^{\prime}\)与对应的\(v\)矩阵进行运算,合成起来得到\(b^1\),即 \[ b^1 = \sum_{i=1}^{N}\alpha^{\prime}_{1,i}v^i = \sum_{i=1}^{N}\frac{exp(q^1\cdot k^i)}{\sum^N_{j=1}exp(q^1\cdot k^j)}v^i \]

在这里,我们可以对\(softmax\)的计算进行改变 \[ exp(q\cdot k) \approx \phi(q) \cdot \phi(k) \] 这里的\(\phi\)是一个变换,那么\(b\)的计算可以变换为 \[ \begin{equation} \begin{aligned} b^1 = \sum_{i=1}^{N}\alpha^{\prime}_{1,i}v^i &=\sum_{i=1}^{N}\frac{exp(q^1\cdot k^i)}{\sum^N_{j=1}exp(q^1\cdot k^j)}v^i \\ \\ &= \sum^N_{i=1}\frac{\phi(q^1)\cdot\phi(k^i)}{\sum^N_{j=1}\phi(q^1)\cdot\phi(k^j)}v^i \\ \\ &= \frac{\sum^N_{i=1}\phi(q^1)\cdot\phi(k^i)v^i}{\sum^N_{j=1}\phi(q^1)\cdot\phi(k^j)} \end{aligned} \end{equation} \] 而分母项可以进一步进行调整 \[ \begin{equation} \sum^N_{j=1}\phi(q^1)\cdot\phi(k^j) = \phi(q^1) \cdot\sum^{N}_{j=1}\phi(k^j) \end{equation} \]

那么\(b^1\)的计算进一步调整

我们可以利用\(k\)\(v\)提前计算好部分值,需要时直接调用即可

这样子,有一部分不用重复进行计算

这样利用\(\phi(k)\)\(v\)计算出来的M组向量相当于有M组模板,\(\phi(q)\)与之相乘是在进行选择。

通过学习来构造Attention Matrix

注意力机制通过\(q\)\(k\)来计算Attention Matrix,但是我们可以将整个矩阵是为网络的参数

小结