本篇文章整理自FJODOR VAN VEEN的论文:The Neural Network Zoo。本文介绍了神经网络大家族,但不是所有的神经网络都能涵盖,毕竟新的网络结构在不断被发展出来。以下是神经网络的图谱。
介绍神经网络之前,先介绍神经元的分类,这部分内容来自博友的文章。
这种简单的类型可以在常规的前馈人工神经网络架构里面找到。这种神经元与其它神经元之间的连接具有权重,也就是说,它可以和前一层神经网络层中的所有神经元有连接。每一个连接都有各自的权重,通常情况下是一些随机值(关于如何对人工神经网络的权重进行初始化是一个非常重要的话题,这将会直接影响到之后的训练过程,以及最终整个模型的性能)。这个权重可以是负值,正值,非常小,或者非常大,也可以是零。和这个神经元连接的所有神经元的值都会乘以各自对应的权重。然后,把这些值都求和。在这个基础上,会额外加上一个bias,它可以用来避免输出为零的情况,并且能够加速某些操作,这让解决某个问题所需要的神经元数量也有所减少。这个bias也是一个数字,有些时候是一个常量(经常是-1或者1),有些时候会有所变化。这个总和最终被输入到一个激活函数,这个激活函数的输出最终就成为这个神经元的输出。
和前馈神经元非常相似,除了它们只跟前一神经细胞层的部分神经元有连接。因为它们不是和某些神经元随机连接的,而是与特定范围内的神经元相连接,通常用来保存空间信息。这让它们对于那些拥有大量局部信息,比如图像数据、语音数据(但多数情况下是图像数据),会非常实用。
恰好相反,它们是通过跟下一神经细胞层的连接来解码空间信息。这两种神经元都有很多副本,它们都是独立训练的;每个副本都有自己的权重,但连接方式却完全相同。可以认为,这些副本是被放在了具备相同结构的不同的神经网络中。这两种神经元本质上都是一般意义上的神经元,但是,它们的使用方式却不同。
经常和卷积神经元结合起来使用。它们不是真正意义上的神经元,只能进行一些简单的操作。
池化神经元接受到来自其它神经元的输出过后,决定哪些值可以通过,哪些值不能通过。在图像领域,可以理解成是把一个图像缩小了(在查看图片的时候,一般软件都有一个放大、缩小的功能;这里的图像缩小,就相当于软件上的缩小图像;也就是说我们能看到图像的内容更加少了;在这个池化的过程当中,图像的大小也会相应地减少)。这样,你就再也不能看到所有的像素了,池化函数会知道什么像素该保留,什么像素该舍弃。
插值神经元恰好是相反的操作:它们获取一些信息,然后映射出更多的信息。额外的信息都是按照某种方式制造出来的,这就好像在一张小分辨率的图片上面进行放大。插值神经元不仅仅是池化神经元的反向操作,而且,它们也是很常见,因为它们运行非常快,同时,实现起来也很简单。池化神经元和插值神经元之间的关系,就像卷积神经元和解卷积神经元之间的关系。
作为概率神经元它们总是成对地出现)是一类用来描述数据概率分布的神经元。均值就是所有值的平均值,而标准方差描述的是这些数据偏离(两个方向)均值有多远。比如:一个用于图像处理的概率神经元可以包含一些信息,比如:在某个特定的像素里面有多少红色。举个例来说,均值可能是0.5,同时标准方差是0.2。当要从这些概率神经元取样的时候,你可以把这些值输入到一个高斯随机数生成器,这样就会生成一些分布在0.4和0.6之间的值;值离0.5越远,对应生成的概率也就越小。它们一般和前一神经元层或者下一神经元层是全连接,而且,它们没有偏差(bias)。
不仅仅在神经细胞层之间有连接,而且在时间轴上也有相应的连接。每一个神经元内部都会保存它先前的值。它们跟一般的神经元一样更新,但是,具有额外的权重:与当前神经元之前值之间的权重,还有大多数情况下,与同一神经细胞层各个神经元之间的权重。 当前值和存储的先前值之间权重的工作机制,与非永久性存储器(比如RAM)的工作机制很相似,继承了两个性质: 第一,维持一个特定的状态;第二:如果不对其持续进行更新(输入),这个状态就会消失。由于先前的值是通过激活函数得到的,而在每一次的更新时,都会把这个值和其它权重一起输入到激活函数,因此,信息会不断地流失。实际上,信息的保存率非常的低,以至于仅仅四次或者五次迭代更新过后,几乎之前所有的信息都会流失掉。
用于克服循环神经元中信息快速流失的问题。LSTM是一个逻辑回路,其设计受到了计算机内存单元设计的启发。与只存储两个状态的循环神经元相比,LSTM可以存储四个状态:输出值的当前和先前值,记忆神经元状态的当前值和先前值 。它们都有三个门:输入门,输出门,遗忘门,同时,它们也还有常规的输入。这些门它们都有各自的权重,也就是说,与这种类型的神经元细胞连接需要设置四个权重(而不是一个)。这些门的工作机制与流门(flow gates)很相似,而不是栅栏门(fence gates):它们可以让所有的信息都通过,或者只是通过部分,也可以什么都不让通过,或者通过某个区间的信息。这种运行机制的实现是通过把输入信息和一个在0到1之间的系数相乘,这个系数存储在当前门中。这样,输入门决定输入的信息有多少可以被叠加到当前门值。输出门决定有多少输出信息是可以传递到后面的神经网络中。遗忘门并不是和输出神经元的先前值相连接,而是,和前一记忆神经元相连接。它决定了保留多少记忆神经元最新的状态信息。因为没有和输出相连接,以及没有激活函数在这个循环中,因此只会有更少的信息流失。
是LSTM的变体。它们同样使用门来抑制信息的流失, 但是只用两个门:更新门和重置门。这使得构建它们付出的代价没有那么高,而且运行速度更加快了,因为它们在所有的地方使用了更少的连接。
从本质上来说LSTM和GRU有两个不同的地方:第一:GRU神经元没有被输出门保护的隐神经元;第二:GRU把输出门和遗忘门整合在了一起,形成了更新门。核心的思想就是如果你想要一些新的信息,那么你就可以遗忘掉一些陈旧的信息(反过来也可以)。
形成一个神经网络,最简单的连接神经元方式是——把所有的神经元与其它所有的神经元相连接。这就好像Hopfield神经网络和玻尔兹曼机(Boltzmann machines)的连接方式。当然,这也就意味着连接数量会随着神经元个数的增加呈指数级地增加,但是,对应的函数表达力也会越来越强。这就是所谓的全连接(completely (or fully) connected)。经历了一段时间的发展,发现把神经网络分解成不同的神经细胞层会非常有效。神经细胞层的定义是一群彼此之间互不连接的神经元,它们仅跟其它神经细胞层有连接。这一概念在受限玻尔兹曼机(Restricted Boltzmann Machines)中有所体现。现在,使用神经网络就意味着使用神经细胞层,并且是任意数量的神经细胞层。其中一个比较令人困惑的概念是全连接(fully connected or completely connected),也就是某一层的每个神经元跟另一层的所有神经元都有连接,但真正的全连接神经网络相当罕见。
相对于全连接层要有更多的限制:在卷积连接层中的每一个神经元只与相邻的神经元层连接。图像和声音蕴含了大量的信息,如果一对一地输入到神经网络(比如,一个神经元对应一个像素)。卷积连接的形成,受益于保留空间信息更为重要的观察。实践证明这是一个非常好的猜测,因为现在大多数基于人工神经网络的图像和语音应用都使用了这种连接方式。然而,这种连接方式所需的代价远远低于全连接层的形式。从本质上来讲,卷积连接方式起到重要性过滤的作用,决定哪些紧紧联系在一起的信息包是重要的;卷积连接对于数据降维非常有用。
这种形式的连接主要有两种变体:第一,允许部分神经元进行全连接。第二,神经元层之间只有部分连接。
随机连接方式有助于线性地降低人工神经网络的性能;当全连接层遇到性能问题的时候,在大规模人工神经网络中,使用随机连接方式非常有益。拥有更多神经元且更加稀疏的神经元层在某些情况下运行效果更好,特别是很多的信息需要被存储起来,但是,需要交换的信息并不多(这与卷积连接层的运行机制很相似,但是,它们是随机的)。非常稀疏的连接网络(1%或2%)也有被使用,比如ELMs, ESNs 和LSMs。这特别适用于脉冲网络(spiking networks),因为一个神经元拥有更多的连接,它对应的权重具有的能量也就更少,这也就意味着将会有更少的扩展和重复模式。
是指相连的神经元(通常是在同一个神经元层,甚至于一个神经元自己跟自己连接),它们不从前面的神经元层获取信息,而是从神经元层先前的状态获取信息。这使得暂时(时间上或者序列上)联系在一起的信息可以被存储起来。这些形式的连接经常被手工重新进行设置,从而可以清除神经网络的状态。和常规连接的主要区别是,这种连接会持续不断地改变,即便这个神经网络当前没有处于训练状态。
接下来就开始逐个介绍神经网络的结构。
它们非常直接,它们从前到后提供信息(分别是输入和输出)。神经网络通常被描述为具有层的结构,其中每个层由并行的输入,隐藏或输出单元组成。单独一层不具有连接,并且通常两个相邻层完全连接(一层的每个神经元和另一层的每一个神经元相连)。最简单实用的网络有两个输入单元和一个输出单元,可用于建模逻辑门。人们通常通过反向传播来训练FFNN,为网络配对数据集“输入数据集”和“期望额输出数据集”。这被称为有监督学习,而非无监督学习,我们只给它输入并让网络填补空白。反向传播的误差通常是输入和输出之间差异的一些变化(如MSE或仅线性差异)。鉴于网络具有足够的隐藏神经元,理论上它总是能够模拟输入和输出之间的关系。实际上它们的使用受到更多限制,但它们通常与其他网络结合以形成新的网络。
FFNN 很重要的一个概念就是加权平均过程,即将前一层给神经元的激励值和对应的权重矩阵相乘而得出后一个神经元的输入值,我们可以说前一层神经元的加权和就是后一层神经元的输入。FFNN 另外一个十分重要的元素,因为激活函数的非线性属性,所以它允许预测任意的输出数据。在实践中,g通常采取sigmoid、tanh、ReLU等非线性函数作为激活函数。
该神经网络是具有径向基函数作为激活函数的FFNN。输入层到隐藏层之间不是通过权值和阈值进行连接的,而是通过输入样本与隐藏层点之间的距离(与中心点的距离)连接的。得到距离之后,将距离代入径向基函数,得到一个数值。数值再与后边的权值相乘再求总和,就得到了相应输入的输出。在训练网络之前,需要确定中心点的个数,和中心点的位置,以及求出隐藏层各径向基函数的方差(宽窄程度)。和隐藏层和输出层之间的权值。
这是一种每一个神经元都跟其它神经元相互连接的网络。这就像一盘完全搅在一起的意大利面,因为每个神经元都在充当所有角色:训练前的每一个节点都是输入神经元,训练阶段是隐神经元,输出阶段则是输出神经元。该神经网络的训练,是先把神经元的值设置到期望模式,然后计算相应的权重。在这以后,权重将不会再改变了。一旦网络被训练包含一种或者多种模式,这个神经网络总是会收敛于其中的某一种学习到的模式,因为它只会在某一个状态才会稳定。值得注意的是,它并不一定遵从那个期望的状态(很遗憾,它并不是那个具有魔法的黑盒子)。它之所以会稳定下来,部分要归功于在训练期间整个网络的“能量(Energy)”或“温度(Temperature)”会逐渐地减少。 每一个神经元的激活函数阈值都会被设置成这个温度的值,一旦神经元输入的总和超过了这个阈值,那么就会让当前神经元选择状态(通常是-1或1,有时也是0或1)。可以多个神经元同步,也可以一个神经元一个神经元地对网络进行更新。一旦所有的神经元都已经被更新,并且它们再也没有改变,整个网络就算稳定(退火)了,那你就可以说这个网络已经收敛了。这种类型的网络被称为“联想记忆(associative memory)”,因为它们会收敛到和输入最相似的状态;比如,人类看到桌子的一半就可以想象出另外一半;与之相似,如果输入一半噪音+一半桌子,这个网络就能收敛到整张桌子。
这是BM和HN的前身。他们可以理解如下:从我现在的这个节点,我去任何相邻节点的几率是多少?它们是无记忆的(即Markov Property),这意味着你最终的每一个状态都完全取决于之前的状态。对于一个随机过程,如果其未来所处的状态仅与其当前状态有关,而与过去的状态无关,则该随机过程被称为马尔科夫过程,其具有马尔可夫性。虽然它们不是真正的神经网络,但它们确实类似于神经网络,并构成了BM和HN的理论基础。对于BM,RBM和HN,MC并不总是被认为是神经网络。马尔可夫链也不总是完全连接。
玻尔兹曼机是第一个受统计力学启发的多层学习机,它是一类典型的随机神经网络属于反馈神经网络类型 。其命名来源于玻尔兹曼在统计热力学中的早期工作和网络本身的动态分布行为 。它在神经元状态变化中引入了统计概率,网络的平衡状态服从Boltzmann分布,网络运行机制基于模拟退火算法。Boltzmann机结合多层前馈神经网络和离散Hopfield网络在网络结构、学习算法和动态运行机制方面的优点,是建立在离散Hopfield网基础上的,具有学习能力,能够通过一个模拟退火过程寻求最优解。不过,其训练时间比BP网络要长。
离散Hopfield神经网络+模拟退火+隐单元=Boltzman机
BM和霍普菲尔网络很接近,差别只是:一些神经元作为输入神经元,剩余的则是作为隐神经元。在整个神经网络更新过后,输入神经元成为输出神经元。刚开始神经元的权重都是随机的,通过反向传播(back-propagation)算法进行学习,或是最近常用的对比散度(contrastive divergence)算法(马尔可夫链用于计算两个信息增益之间的梯度)。相比HN,大多数BM的神经元激活模式都是二元的。BM由MC训练获得,因而是一个随机网络。BM的训练和运行过程,跟HN大同小异:为输入神经元设好钳位值,而后让神经网络自行学习。因为这些神经元可能会得到任意的值,我们反复地在输入和输出神经元之间来回地进行计算。激活函数的激活受全局温度的控制,如果全局温度降低了,那么神经元的能量也会相应地降低。这个能量上的降低导致了它们激活模式的稳定。在正确的温度下,这个网络会抵达一个平衡状态。
受限玻尔兹曼机是玻尔兹曼机(Boltzman machine,BM)的一种特殊拓扑结构。BM的原理起源于统计物理学,是一种基于能量函数的建模方法,能够描述变量之间的高阶相互作用,BM的学习算法较复杂,但所建模型和学习算法有比较完备的物理解释和严格的数理统计理论作基础。BM是一种对称耦合的随机反馈型二值单元神经网络,由可见层和多个隐层组成,网络节点分为可见单元(visible unit)和隐单元(hidden unit),用可见单元和隐单元来表达随机网络与随机环境的学习模型,通过权值表达单元之间的相关性。受限玻兹曼机是一种玻兹曼机的变体,但限定模型必须为二分图。模型中包含对应输入参数的输入(可见)单元和对应训练结果的隐单元,图中的每条边必须连接一个可见单元和一个隐单元。(与此相对,“无限制”玻兹曼机包含隐单元间的边,使之成为递归神经网络。)这一限定使得相比一般玻兹曼机更高效的训练算法成为可能,特别是基于梯度的对比分歧(contrastive divergence)算法。
与BM出奇地相似,因而也同HN相似。它们的最大区别在于:RBM更具实用价值,因为它们受到了更多的限制。它们不会随意在所有神经元间建立连接,而只在不同神经元群之间建立连接,因此任何输入神经元都不会同其他输入神经元相连,任何隐神经元也不会同其他隐神经元相连。RBM的训练方式就像稍微修改过的FFNN:前向通过数据之后再将这些数据反向传回(回到第一层),而非前向通过数据然后反向传播误差。之后,再使用前向和反向传播进行训练。
和FFNN有些相近,因为它更像是FFNN的另一种用法,而非本质上完全不同的另一种架构。自编码机的基本思想是自动对信息进行编码(像压缩一样,而非加密),它也因此而得名。自动编码机是一个神经网络,它的意义在于让网络能够学习到一些数据当中有效的表示。或者叫数据的编码方式。整个网络的形状酷似一个沙漏计时器,中间的隐含层较小,两边的输入层、输出层较大。自编码机总是对称的,以中间层(一层还是两层取决于神经网络层数的奇偶)为轴。最小的层(一层或者多层)总是在中间,在这里信息压缩程度最大(整个网络的关隘口)。在中间层之前为编码部分,中间层之后为解码部分,中间层则是编码部分。自编码机可用反向传播算法进行训练,给定输入,将误差设为输入和输出之差。自编码机的权重也是对称的,因此编码部分权重与解码部分权重完全一样。整个映射如下所示:
inputdata ----(encoder)------>内部表示--- ------(解码器)---->输出数据
通过这么编码和解码器这么一弄之后,使得输出数据和输入数据的差异性尽可能的小,那么就说我们通过编码器得到的内部的数据,是输入数据的数据的一种有效表现形式。
某种程度上同自编码机相反。 稀疏自编码机不是用更小的空间表征大量信息,而是把原本的信息编码到更大的空间内。因此,中间层不是收敛,而是扩张,然后再还原到输入大小。它可以用于提取数据集内的小特征。如果用训练自编码机的方式来训练稀疏自编码机,几乎所有的情况,都是得到毫无用处的恒等网络(输入=输出,没有任何形式的变换或分解)。为避免这种情况,需要在反馈输入中加上稀疏驱动数据。稀疏驱动的形式可以是阈值过滤,这样就只有特定的误差才会反向传播用于训练,而其它的误差则被忽略为0,不会用于反向传播。这很像脉冲神经网络(并不是所有的神经元一直都会输出)。
和AE有着相同的架构,却被教会了不同的事情:输入样本的一个近似概率分布,这让它跟BM、RBM更相近。不过,VAE却依赖于贝叶斯理论来处理概率推断和独立(probabilistic inference and independence),以及重新参数化(re-parametrisation)来进行不同的表征。推断和独立非常直观,但却依赖于复杂的数学理论。基本原理是:把影响纳入考虑。如果在一个地方发生了一件事情,另外一件事情在其它地方发生了,它们不一定就是关联在一起的。如果它们不相关,那么误差传播应该考虑这个因素。这是一个有用的方法,因为神经网络是一个非常大的图表,如果你能在某些节点排除一些来自于其它节点的影响,随着网络深度地增加,这将会非常有用。
变分自动编码机的目的是想知道观测数据x背后的潜在变量z分布,即p(z|x),举个简单的例子,比如天气是我们的观测数据x,但我们想知道影响天气变化背后的一些无法观测的因素z,这个z就像自然法则一样能够左右最后观测到的天气,这样我们以后描述某个天气,就可以完全量化为对应的潜在变量z。对于这个例子,VAE/AE都能完成这个事情,但如果现在我们想生成一些新的天气样本来作为研究,这个时候只有VAE可以很容易做这个事情:拟合现有样本分布的一个潜在变量的先验分布,通过采样这个先验分布来获得新的样本;而对于AE这个事情就比较难了:由于每个样本x被固定编码为对应的z,我们无法知道潜在样本的分布(若此时我们知道了z的分布,就等于知道了真实数据x的分布,这显然是不可能的,相比VAE的解决方案是把真实数据x对应的潜在分布映射到一个先验分布上),若AE硬要获得新样本怎么做呢,此时只能随机采样z了,很显然我们无法验证:根据这个z是否能正确地还原出一个符合真实样本x的新样本。
除了单纯“生成“新的样本用途,生成模型还可以用来去噪声,比如现在的图片里有雾霾,我们想把图片里的雾霾去掉,还原没有雾霾的样子,就可以用VAE/AE做:把有雾霾的图片当作输入x,对应的无雾霾的图片(假设我们能够在天气好的时候获得)作为最后要还原的x’训练VAE模型,如果训练的足够好的话,以后再任意拿一张有雾霾的图片,VAE能够还原出这个图片没有雾霾的样子,这就是生成模型的优势。当然,判别模型也能做这个事情:在给定原图像的情况下,尽量拟合原图像的变换图像,但是若测试时出现了之前训练过程中没有出现的图像,效果会不好,因为判别模型是基于条件概率p(x′|x),若新的条件x模型都没见过,效果肯定不好,所以判别模型更注重泛化能力。而生成模型会去拟合x和x’联合概率分布p(x,x′),因此p(x′|x)的计算只需要除以边缘概率分布p(x)即可,而对于VAE来说,它拟合的其实是x和潜在变量z的联合概率分布p(x,z),获得p(z|x)从而间接生成x’。
是一种自编码机,它的训练过程,不仅要输入数据,还有再加上噪音数据(就好像让图像变得更加模糊一样)。但在计算误差的时候跟自动编码机一样,降噪自动编码机的输出也是和原始的输入数据进行对比。这种形式的训练旨在鼓励降噪自编码机不要去学习细节,而是一些更加宏观的特征,因为细微特征受到噪音的影响,学习细微特征得到的模型最终表现出来的性能总是很差。
之所以取这个名字,是由于它本身几乎是由多个受限玻尔兹曼机或者变分自编码机堆砌而成。
深度信念网络是一个概率生成模型,与传统的判别模型的神经网络相对,生成模型是建立一个观察数据和标签之间的联合分布,对P(Observation|Label)和 P(Label|Observation)都做了评估,而判别模型仅仅而已评估了后者,也就是P(Label|Observation)。DBNs由多个限制玻尔兹曼机(Restricted Boltzmann Machines)层组成。这些网络被“限制”为一个可视层和一个隐层,层间存在连接,但层内的单元间不存在连接。隐层单元被训练去捕捉在可视层表现出来的高阶数据的相关性。
实践表明一层一层地对这种类型的神经网络进行训练非常有效,这样每一个自编码机或者受限玻尔兹曼机只需要学习如何编码前一神经元层的输出。这种训练技术也被称为贪婪训练,这里贪婪的意思是通过不断地获取局部最优解,最终得到一个相当不错解(但可能不是全局最优的)。可以通过对比散度算法或者反向传播算法进行训练,它会慢慢学着以一种概率模型来表征数据,就好像常规的自编码机或者受限玻尔兹曼机。 一旦经过非监督式学习方式,训练或者收敛到了一个稳定的状态,那么这个模型就可以用来产生新的数据。如果以对比散度算法进行训练,那么它甚至可以用于区分现有的数据,因为那些神经元已经被引导来获取数据的不同特定。
跟其它类型的神经网络大有不同。 它们主要用于处理图像数据,但可用于其它形式数据的处理,如语音数据。对于卷积神经网络来说,一个典型的应用就是给它输入一个图像,而后它会给出一个分类结果。也就是说,如果你给它一张猫的图像,它就输出“猫”;如果你给一张狗的图像,它就输出“狗”。
卷积神经网络是从一个数据扫描层开始,这种形式的处理并没有尝试在一开始就解析整个训练数据。比如:对于一个大小为200X200像素的图像,你不会想构建一个40000个节点的神经元层。而是,构建一个20X20像素的输入扫描层,然后,把原始图像第一部分的20X20像素图像(通常是从图像的左上方开始)输入到这个扫描层。 当这部分图像(可能是用于进行卷积神经网络的训练)处理完,你会接着处理下一部分的20X20像素图像:逐渐(通常情况下是移动一个像素,但是,移动的步长是可以设置的)移动扫描层,来处理原始数据。
注意,你不是一次性移动扫描层20个像素(或其它任何扫描层大小的尺度),也不是把原始图像切分成20X20像素的图像块,而是用扫描层在原始图像上滑过。这个输入数据(20X20像素的图像块)紧接着被输入到卷积层,而非常规的神经细胞层——卷积层的节点不是全连接。每一个输入节点只会和最近的那个神经元节点连接(至于多近要取决于具体的实现,但通常不会超过几个)。
这些卷积层会随着深度的增加而逐渐变小:大多数情况下,会按照输入层数量的某个因子缩小(比如:20个神经元的卷积层,后面是10个神经元的卷积层,再后面就是5个神经元的卷积层)。2的n次方(32, 16, 8, 4, 2, 1)也是一个非常常用的因子,因为它们在定义上可以简洁且完整地除尽。除了卷积层,池化层(pooling layers)也非常重要。
池化是一种过滤掉细节的方式:一种常用的池化方式是最大池化,比如用2X2的像素,然后取四个像素中值最大的那个传递。为了让卷积神经网络处理语音数据,需要把语音数据切分,一段一段输入。在实际应用中,通常会在卷积神经网络后面加一个前馈神经网络,以进一步处理数据,从而对数据进行更高水平的非线性抽象。
又称为逆图形网络(IGNs:inverse graphics networks),是逆向的卷积神经网络。
想象一下,给一个神经网络输入一个“猫”的词,就可以生成一个像猫一样的图像,通过比对它和真实的猫的图片来进行训练。跟常规CNN一样,DN也可以结合FFNN使用,但没必要为这个新的缩写重新做图解释。它们可被称为深度解卷积网络,但把FFNN放到DNN前面和后面是不同的,那是两种架构(也就需要两个名字),对于是否需要两个不同的名字你们可能会有争论。需要注意的是,绝大多数应用都不会把文本数据直接输入到神经网络,而是用二元输入向量。比如<0,1>代表猫,<1,0>代表狗,<1,1>代表猫和狗。 CNN的池化层往往也是被对应的逆向操作替换了,主要是插值和外推(基于一个基本的假设:如果一个池化层使用了最大池化,你可以在逆操作的时候生成一些相对于最大值更小的数据)。
这个名字具有误导性,因为它们实际上是VAE,但分别用CNN、DNN来作编码和解码的部分。这些网络尝试在编码过程中对“特征“进行概率建模,这样一来,你只要用猫和狗的独照,就能让它们生成一张猫和狗的合照。同理,你可以输入一张猫的照片,如果猫旁边有一只恼人的邻家狗,你可以让它们把狗去掉。很多演示表明,这种类型的网络能学会基于图像的复杂变换,比如灯光强弱的变化、3D物体的旋转。一般也是用反向传播算法来训练此类网络。
深度学习对抗样本(Adversarial Examples)的概念最早是Christian Szegedy 等人在ICLR2014发表的论文中提出来的,即在数据集中通过故意添加细微的干扰所形成输入样本,受干扰之后的输入导致模型以高置信度给出了一个错误的输出。在他们的论文中,他们发现包括卷积神经网络(Convolutional Neural Network, CNN)在内的深度学习模型对于对抗样本都具有极高的脆弱性。他们的研究提到,很多情况下,在训练集的不同子集上训练得到的具有不同结构的模型都会对相同的对抗样本实现误分,这意味着对抗样本成为了训练算法的一个盲点。Anh Nguyen等人在CVPR2015上发表的论文中,他们发现面对一些人类完全无法识别的样本(论文中称为Fooling Examples),可是深度学习模型会以高置信度将它们进行分类。这些研究的提出,迅速抓住了公众的注意力,有人将其当做是深度学习的深度缺陷,可是kdnuggets上的一篇文章(Deep Learning’s Deep Flaws)’s Deep Flaws指出,事实上深度学习对于对抗样本的脆弱性并不是深度学习所独有的,在很多的机器学习模型中普遍存在,因此进一步研究有利于抵抗对抗样本的算法实际上有利于整个机器学习领域的进步。
对抗网络有两部分组成,一个是生成器(generator),一个是辨别器(discriminator),生成器好比一个小偷,而辨别器好比一个警察,小偷的目的是想方设法的欺骗欺骗警察(生成对抗样本),而警察的目的就是想方设法的去不受欺骗,小偷和警察都在不断的优化自己去达到目的,同时彼此都在对方的“监督”下而提升。
这种对抗训练过程与传统神经网络存在一个重要区别。一个神经网络需要有一个成本函数,评估网络性能如何。这个函数构成了神经网络学习内容以及学习情况的基础。传统神经网络需要一个人类科学家精心打造的成本函数。但是,对于生成式模型这样复杂的过程来说,构建一个好的成本函数绝非易事。这就是对抗性网络的闪光之处。对抗网络可以学习自己的成本函数——自己那套复杂的对错规则——无须精心设计和建构一个成本函数。
是具有时间联结的前馈神经网络:它们有了状态,通道与通道之间有了时间上的联系。 神经元的输入信息,不仅包括前一神经细胞层的输出,还包括它自身在先前通道的状态。这就意味着:你的输入顺序将会影响神经网络的训练结果:相比先输入“曲奇饼”再输入“牛奶”,先输入“牛奶”再输入“曲奇饼”后,或许会产生不同的结果。RNN存在一大问题:梯度消失(或梯度爆炸,这取决于所用的激活函数),信息会随时间迅速消失,正如FFNN会随着深度的增加而失去信息一样。直觉上,这不算什么大问题,因为这些都只是权重,而非神经元的状态,但随时间变化的权重正是来自过去信息的存储;如果权重是0或1000000,那之前的状态就不再有信息价值。原则上,RNN可以在很多领域使用,因为大部分数据在形式上不存在时间线的变化,(不像语音或视频),它们能以某种序列的形式呈现出来。一张图片或一段文字可以一个像素或者一个文字地进行输入,因此,与时间相关的权重描述了该序列前一步发生了什么,而不是多少秒之前发生了什么。一般来说,循环神经网络是推测或补全信息很好的选择,比如自动补全。
长短期记忆模型(long-short term memory)是一种特殊的RNN模型,是为了解决RNN模型梯度弥散的问题而提出的;在传统的RNN中,训练算法使用的是BPTT,当时间比较长时,需要回传的残差会指数下降,导致网络权重更新缓慢,无法体现出RNN的长期记忆的效果,因此需要一个存储单元来存储记忆,因此LSTM模型被提出。
网络试图通过引入门结构与明确定义的记忆单元来解决梯度消失/爆炸的问题。这更多的是受电路图设计的启发,而非生物学上某种和记忆相关机制。每个神经元都有一个记忆单元和三个门:输入门、输出门、遗忘门。 这三个门的功能就是通过禁止或允许信息流动来保护信息。输入门决定了有多少前一神经细胞层的信息可留在当前记忆单元,输出层在另一端决定下一神经细胞层能从当前神经元获取多少信息。遗忘门乍看很奇怪,但有时候遗忘部分信息是很有用的:比如说它在学习一本书,并开始学一个新的章节,那遗忘前面章节的部分角色就很有必要了。实践证明,LSTM可用来学习复杂的序列,比如像莎士比亚一样写作,或创作全新的音乐。值得注意的是,每一个门都对前一神经元的记忆单元赋有一个权重,因此会需要更多的计算资源。
是LSTM的一种轻量级变体。它们少了一个门,同时连接方式也稍有不同:它们采用了一个更新门(update gate),而非LSTM所用的输入门、输出门、遗忘门。更新门决定了保留多少上一个状态的信息,还决定了收取多少来自前一神经细胞层的信息。重置门(reset gate)跟LSTM遗忘门的功能很相似,但它存在的位置却稍有不同。它们总是输出完整的状态,没有输出门。多数情况下,它们跟LSTM类似,但最大的不同是:GRU速度更快、运行更容易(但函数表达力稍弱)。在实践中,这里的优势和劣势会相互抵消:当你你需要更大的网络来获取函数表达力时,这样反过来,性能优势就被抵消了。在不需要额外的函数表达力时,GRU的综合性能要好于LSTM。
NTM在一个很高的层面上构建神经计算模型,作为图灵机的实现。核心思想是在RNNs的基础上augment记忆模块。张量是神经网络的语言,因此记忆模块就是一组张量,具体地,原文使用一组向量来表示。实际上,只要可以保持一致性,使用一个高斯分布表示一个记忆单元也是可以的。
可以理解为对LSTM的抽象,它试图把神经网络去黑箱化(以窥探其内部发生的细节)。NTM不是把记忆单元设计在神经元内,而是分离出来。NTM试图结合常规数字信息存储的高效性、永久性与神经网络的效率及函数表达能力。它的想法是设计一个可作内容寻址的记忆库,并让神经网络对其进行读写操作。NTM名字中的“图灵(Turing)”是表明,它是图灵完备(Turing complete)的,即具备基于它所读取的内容来读取、写入、修改状态的能力,也就是能表达一个通用图灵机所能表达的一切。
在图表中并未呈现出来,因为它们看起来与其对应的单向神经网络结构一样。所不同的是,这些网络不仅与过去的状态有连接,而且与未来的状态也有连接。比如,通过一个一个地输入字母,训练单向的LSTM预测“鱼(fish)”(在时间轴上的循环连接记住了过去的状态值)。在BiLSTM的反馈通路输入序列中的下一个字母,这使得它可以了解未来的信息是什么。这种形式的训练使得该网络可以填充信息之间的空白,而不是预测信息。因此,它在处理图像时不是扩展图像的边界,而是填补一张图片中的缺失。
是非常深的FFNN网络,它有一种特殊的连接,可以把信息从某一神经细胞层传至后面几层(通常是2到5层)。该网络的目的不是要找输入数据与输出数据之间的映射,而是致力于构建输入数据与输出数据+输入数据之间的映射函数。本质上,它在结果中增加一个恒等函数,并跟前面的输入一起作为后一层的新输入。结果表明,当层数超过150后,这一网络将非常擅于学习模式,这比常规的2到5层要多得多。然而,有证据表明这些网络本质上只是没有时间结构的RNN,它们总是与没有门结构的LSTM相提并论。
深度残差网络是2015年提出的深度卷积网络,一经出世,便在ImageNet中斩获图像分类、检测、定位三项的冠军。
我们都知道增加网络的宽度和深度可以很好的提高网络的性能,深的网络一般都比浅的的网络效果好,比如说一个深的网络A和一个浅的网络B,那A的性能至少都能跟B一样,为什么呢?因为就算我们把A的网络参数全部迁移到B的前面几层,而B后面的层只是做一个等价的映射,就达到了A网络的一样的效果。一个比较好的例子就是VGG,该网络就是在AlexNex的基础上通过增加网络深度大幅度提高了网络性能。但事实真的是这样的吗?不然,通过实验我们发现,当网络层数达到一定的数目以后,网络的性能就会饱和,再增加网络的性能就会开始退化,但是这种退化并不是由过拟合引起的,因为我们发现训练精度和测试精度都在下降,这说明当网络变得很深以后,深度网络就变得难以训练了。 ResNet的出现其实就是为了解决网络深度变深以后的性能退化问题。
ResNet就是用这种跳跃结构来作为网络的基本结构。为什么要使用这种结构呢?本来我们要优化的目标是H(x)=F(x)+x(x就是该结构的输入)但是通过这种结构以后就把优化的目标由H(x)转化为H(x)-x。那么问题又来了,优化目标转化后又有什么用呢,为什么可以通过这种方式来解决退化问题呢?我们之前说到,深网络在浅网络的基础上只要上面几层做一个等价映射就可以达到浅网络同样的效果,但是为什么不行呢,就是因为我们的算法很难将其训练到那个程度,也就是说没办法将上面几层训练到一个等价映射,以至于深网络最后达到了一个更差的效果。那么这时,我们把训练目标转变,由原来的H(x)转为H(x)-x,因为这时候就不是把上面几层训练到一个等价映射了,而是将其逼近与0,这样训练的难度比训练到一个等价映射应该下降了很多。也就是说,在一个网络中(假设有5层),如果前面四层已经达到一个最优的函数,那第五层就是没有必要的了,这时我们通过这种跳跃结构,我们的优化目标就从一个等价映射变为逼近0了,逼近其他任何函数都会造成网络退化。通过这种方式就可以解决网络太深难训练的问题。
是另一种不同类型的(循环)网络。它的不同之处在于:神经元之间的连接是随机的(没有整齐划一的神经细胞层),其训练过程也有所不同。不同于输入数据后反向传播误差,ESN先输入数据、前馈、而后更新神经元状态,最后来观察结果。它的输入层和输出层在这里扮演的角色不太常规,输入层用来主导网络,输出层作为激活模式的观测器随时间展开。在训练过程中,只有观测和隐藏单元之间连接会被改变。
回声状态网络作为一种新型的递归神经网络,也由输入层、隐藏层(即储备池)、输出层组成。其将隐藏层设计成一个具有很多神经元组成的稀疏网络,通过调整网络内部权值的特性达到记忆数据的功能,其内部的动态储备池(DR)包含了大量稀疏连接的神经元,蕴含系统的运行状态,并具有短期训记忆功能。ESN训练的过程,就是训练隐藏层到输出层的连接权值(Wout)的过程。有如下三个特点:(1)核心结构是一个随机生成且保持不变的储备池(Reservoir)。(2)其输出权值是唯一需要调整的部分。(3)简单的线性回归就可完成网络的训练。
本质上是拥有随机连接的FFNN。它们与LSM、ESN极为相似,除了循环特征和脉冲性质,它们还不使用反向传播。相反,它们先给权重设定随机值,然后根据最小二乘法拟合来一次性训练权重(在所有函数中误差最小)。这使ELM的函数拟合能力较弱,但其运行速度比反向传播快多了。
跟ESN同样相近。区别在于,LSM是一种脉冲神经网络(spiking neural networks),用阈值激活函数(threshold functions)取代了sigmoid激活函数,每个神经元同时也是具有累加性质的记忆单元。因此,当神经元状态更新时,其值不是相邻神经元的累加值,而是它自身状态值的累加。一旦累加到阈值,它就释放能量至其它神经元。这就形成了一种类似于脉冲的模式:神经元不会进行任何操作,直至到达阈值的那一刻。
能为分类问题找出最优方案。传统意义上,它们只能处理线性可分的数据;比如找出哪张图片是加菲猫、哪张是史努比,此外就无法做其它输出了。
训练过程中,SVM可以理解为:先在平面图表上标绘所有数据(加菲猫、史努比),然后找出到那条能够最好区分这两类数据点的线。这条线能把数据分为两部分,线的这边全是史努比,线的那边全是加菲猫。而后移动并优化该直线,令两边数据点到直线的距离最大化。分类新的数据,则将该数据点画在这个图表上,然后察看这个数据点在分隔线的哪一边(史努比一侧,还是加菲猫一侧)。
通过使用核方法,SVM便可用来分类n维空间的数据。这就引出了在3维空间中标绘数据点,从而让SVM可以区分史努比、加菲猫与西蒙,甚至在更高的维度对更多卡通人物进行分类。SVM并不总被视为神经网络。
KN利用竞争学习来对数据进行分类,不需要监督。先给神经网络一个输入,而后它会评估哪个神经元最匹配该输入。然后这个神经元会继续调整以更好地匹配输入数据,同时带动相邻的神经元。相邻神经元移动的距离,取决于它们与最佳匹配单元之间的距离。
Kohonen网络能够识别环境特征并自动聚类。该神经网络是芬兰赫尔辛基大学教授Teuvo Kohonen提出的,该网络通过自组织特征映射调整网络权值,使神经网络收敛于一种表示形态,在这一形态中一个神经元只对某种输入模式特别匹配或特别敏感。Kohonen网络的学习是无监督的自组织学习过程,神经元通过无监督竞争学习使不同的神经元对不同的输入模式敏感,从而特定的神经元在模式识别中可以充当某一输入模式的检测器。网络训练后神经元被划分为不同区域,各区域对输入模型具有不同的响应特征。
Kohonen神经网络算法工作机理为:网络学习过程中,当样本输入网络时,竞争层上的神经元计算输入样本与竞争层神经元权值之间的欧几里德距离,距离最小的神经元为获胜神经元。调整获胜神经元和相邻神经元权值,使获得神经元及周边权值靠近该输入样本。通过反复训练,最终各神经元的连接权值具有一定的分布,该分布把数据之间的相似性组织到代表各类的神经元上,使同类神经元具有相近的权系数,不同类的神经元权系数差别明显。需要注意的是,在学习的过程中,权值修改学习速率和神经元领域均在不断较少,从而使同类神经元逐渐集中。
KN有时也不被认为是神经网络。