速通一些常见的神经网络
intro
本文章是笔者学习各种神经网络模型时候的一些记录,希望能用最简洁的文字来描述各种神经网络的架构和特点!如果还不了解全链接神经网络或者简单的卷积神经网络,可以看看笔者之前写的这篇:关于学习神经网络的一些感悟。
由于笔者并不是做人工智能方向的,学习深度学习也只是为了科研交叉学科的需要,所以有不正确的地方恳请各位大神不吝赐教!万分感激!
VGG神经网络
如果了解过alexnet会发现alexnet的前几层滤波器或者说卷积核大小是很大的(这里解释一下一维的我们叫卷积核,一次性用好几个卷积核叠加,形成的类似一个三维的立体卷积核,我们就叫滤波器),这样的话提取到的特征是很粗糙的。所以我们就考虑采用小滤波器!下图就能看到,我们用的滤波器的大小都是3,并且每次池化之后(图像变小)都会增加卷积核的个数(变为原来二倍)来维持信息总数!这就是VGG的改进思想!
感受野
不了解感受野的可以自行百度!这里只说明其作用:卷积核越大感受野越大但是在相同感受野下大卷积核需要的参数更多!(如果用小卷积核代替的话,比如用三个3✖️3代替7✖️7),并且激活函数层数也会减少,这再一次说明了vgg的小卷积核的作用!
Resnet网络
在我们设计网络的时候发现一个问题,就是网络层数越深有时候反倒效果变差了?这是为什么呢?这是一个让人沮丧的事实!一味增加网络层数并不能优化,深度学习不存在了🐶!?这说明在我们的网络中有一些层影响到了最终的结果。那么我们思考一种办法,就是能够让我们的网络学习到哪些层不好,我们主动去绕过不就可以了?所以就有了残差网络!
其实就是把进入某个子网络之前的输入和之后的输出加起来!然后之后如果我们这个子网络有点垃圾,那么下面的网络就回把F(X)的参数调小,或者变为0,这样就实现的绕过!那么我们不断的增加层数至少也不会比原来的效果差!反正不行就绕过呗!
RNN网络
在一些常规的机器学习或者深度学习任务中,我们提到,每个样本应该是独立同分布的,但是思考一下,所有样本都满足这个条件吗?如果样本在时间轴上变化怎么办?举个简单的栗子:比如你要预测股票走势,股票的每一步走势都是和之前密切相关的不能打乱的,如果这时候再像之前那样shuffle样本,或者随机取batch取训练数据是肯定不行的!那么怎么让我们的网络框架在训练的时候也能考虑到之前的中间结果呢?这就要用到RNN网络,用递归或者循环!
在A这个子网络中,A的输出又返回给他自己,和下一步输入一起作为新的输入!那么再考虑下一个样本的时候就会连带有上一个样本的信息!反复来看,第n个样本就会带有0.....n-1的信息!
这样就实现了让我们的框架学习到样本之间的前后关系!
LSTM网络
在研究RNN网络的时候,会发现一个问题!我们知道在朴素RNN中第n个样本带有0.....n-1的信息,如果这个n非常之大,也就是我们的数据样本数量足够多,就有可能会导致模型太过复杂,信息界限就不够清晰了,并且会有过拟合的风险。再试想,在股票预测中,我们目前的股票走势一定和很久之前的走势有关吗?在之前的股票走势中会不会有一些比较特殊的样本点不具有参考价值还是被加了进来?
为了解决这个问题就有了LSTM,这种网络架构实质上是RNN的一个改进,在这种架构里会有选择性的舍弃掉一些之前的中间结果信息,就是相当于我们预测股票走势的时候舍弃之前一个阶段的某些样本点,这样就能很大程度上减轻的网络的参数负担,并且可以使我们的预测变得更加精准!
GNN
GNN也就是图神经网络。注意这里的图指的不是充满像素点的图像,而是由点和边构成的抽象的图!
为什么要使用GNN?回忆一下,我们用全连接神经网络和卷积神经网络的时候,接触到的文本数据或者图像数据的数据格式都非常固定,比如一组图像输入我们最后都会resize一下变成相同的格式。但是对于一些比如化学分子结构,道路交通预测这样的应用场景,这样固定的数据格式是不能很好的解决问题的!
GNN可以处理三种级别的任务,Graph级别,点级别,以及边级别,分别对应了做预测时候的对象范围。
GNN中每一层都干什么呢?首先我们分析一下,既然我们利用了图这种数据结构,说明我们的模型在处理数据的时候要能够利用到点与点,边与边之间的相关性,所以我们需要让每一个点去整合它周围的点的特征。比如下图中这种方式,我们最每个点的特征向量进行矩阵参数加权然后相加,最后加一个非线性的激活函数,这就完成了更新。
当然,在获取其他点的信息的时候也可以采用其他的方法:
这么看,实际上GNN本质上就非常类似于全连接了,即让每一个点与其他点进行整合变化。这个更新方法对于上面三种不同级别的任务都是有效的,这只在于我们怎么使用这些得到的特征。比如,最后我们得到了各个点的特征我们可以整合一下然后接一个全连接层做分类,比如我们可以对每个点也可以进行分类,诸如此类,只是使用特征的方式发生了改变。
其实在GNN中也有类似于感受野的概念,就是一次更新,这个点只能收取到它邻接点的信息,那么下一次就会从他的邻接点收到它邻接点的邻接点的信息,它的感受野会慢慢变大,这就非常类似于CNN中感受野的慢慢变大的过程。
GCN
GCN也就是图卷积神经网络,虽然叫做图卷积,其实实质上和卷积操作没有什么关系。在GCN的每一层,其实做的操作和GNN中类似。就是每个点要汇聚周围邻接点的信息,而这个汇聚操作最后就可以映射到矩阵的的操作上。每个点汇聚完信息之后也可以进行激活或者接一个全连接模块进行空间向量的转换。如下图所示,通过邻接矩阵与特征矩阵的相乘,就可以实现简单的SUM聚合。
如果想要实现平均值聚合怎么办呢?可以使用,这里D就是度矩阵的开方,比如像这样:,当然这里因为既左乘又右乘所以其实是对行和列都进行平均,为了避免冗余所以要开根号。
GAN &CycleGAN
GAN 也就是对抗神经网络,有两个部分组成。一个是一个生成器,一个是一个判别器。比如我们想要GAN给我们生成一个伪造的图片。生成器生成的结果会送给判别器去进行判断,它想要骗过判别器,然后生成器和判别器会为了降低自己的损失函数而对抗,最后整个网络就会慢慢进化。(就是这俩玩意内卷使得都变得越来越牛逼了)。
但是在构造数据集的时候我们会发现一件事,比如我们想要训练判别器,我们想要训练这个网络给我们的照片美颜,就必须要有美颜之前与美颜之后的图片,这样的话训练集里边的图片都必须得是一一对应的!这其实是很难做到的。我们想用一堆不是分别对应的没美颜过的照片和美颜过的照片直接充当训练集,那要怎么做呢?CycleGan就能完成这么一个事:
可以看到,我呢想要把马的图片转换为斑马。我们让判别器去判读我们生成的图片是否符合要求。但是,如果我们的生成器就是随便生成了一个马,判别器也可能会判断为真,哪怕与原图像不对应。(就是美颜软件给你美颜,直接给你变成彭于晏了,虽然很帅,但是不是你本人啊)。所以我们还要来一个反向操作给转换回去,和原图片进行对比,这样就又会产生一个损失函数,就可以对这个目的进行优化。
总之我们就会有四种损失:生成器损失,判别器损失,Cycle损失(转换回去对比得到的损失),,identity损失(就是如果我们想要把马转换为斑马,如果给的是一个斑马的图片,生成的图片需要和原来一样)。
为了加强反向生成器,和判别器,可以设计一种循环的结构如下(也就是正着做一次,反着着做一次,这样就对称了):
PatchGAN
PatchGAN就是判别器的一种实现!它是基于感受野的。我们在以往的逻辑回归任务中,最后的网络输出是一个概率值,但是在PatchGAN中,最后的输出仍然是一个矩阵。矩阵的每一个部分对应了感受野在原图像对应的一部分。最后的标签值也会是一个矩阵,比如一个全一矩阵。
Transformer
Transformer实在是三言两语无法说明白,希望大家能去看看详细的解析,反正就是很牛逼。相比与CNN,其信息收敛速度非常之快。它是一个Encode与Decode的结构。比如在机器翻译任务礼拜呢Encode就是编码,Decode就是解码,他的核心是注意力机制,注意力机制使用的是QKV三种矩阵。Q是查询矩阵,用于查询器上下文向量的K,而V就是这个token对应的向量的原始映射,Q从K里边获取了信息,找到了上下文之间的对应关系,去修正V,最终得到映射。(为什么要修正,同一个Token在不同的上下文可能有不同的含义)。在整个网络架构中,会有很多Tansformer层,他们的连接模式有点类似于残差网络的感觉,Decode中的注意力机制和Encode中有所不同,它是交叉注意力机制,就是会参考Encode中产生的信息而不仅仅是自己的上下文。