『壹』 利用神经网络进行文本分类算法综述(持续更新中)
传统的文本分类一般都是使用词袋模型/Tf-idf作为特征+机器学习分类器来进行分类的。随着深度学习的发展,越来越多的神经网络模型被用来进行文本分类。本文将对这些神薯漏虚经网络模型做一个简单的介绍。
本文介绍了一种词向量模型,虽然算不得文本分类模型,但由于其可以说是fasttext的基础。因此也简单提一下。
作者认为cbow和skipgram及大部分词向量模型都没有考虑到单词的多态性,而简单的将一个单词的多种形态视为独立的单词。例如like的不同形式有likes,liking,liked,likes,这些单词的意思其实是相同的,但cbow/skipgram模型却认为这些单词是各自独立的,没有考虑到其形态多样性。
因此作者提出了一个可以有效利用单词字符级别信息的n-gram词向量模型,该模型是以skipgram模式实现的。例如单词 where,其n-gram表示为<wh, whe, her, ere, re>, where。其中<>分别表示前后缀。在原始的skipgram模型中,输入仅仅只是where的onehot向量,而在此模型中输入则变成了<wh, whe, her, ere, re>, where的onehot编码的加和,有效的利用了字符级别的信息,因此效果更加好。
而在loss方面,文中采用了负采样+binary LogisticRegression的策略。即对每一个目标单词都预测为正负中的一种。
在本文中作者提供了一数燃个基于神经网络的文本分类模型,这个模型是基于cbow的,与cbow非常类似。
和CBOW一样,fastText模型也只有三层:输入层、隐含层、输出层(Hierarchical Softmax),输入都是多个经向量表示的单词,输出都是一个特定的target,隐含层都是对多个词向量的叠加平均。不同的是,CBOW的输入是目标单词的上下文,fastText的输入是多个单词及其n-gram特征的embeding表示方式,这些特征用来表示单个文档;CBOW的输入单词被onehot编码过,fastText的输入特征是被embedding过;CBOW的输出是目标词汇,fastText的输出是文档对应的类标。输出层的实现同样使用了层次softmax,当然如果自己实现的话,对于类别数不是很多的任务,个人认为是可以直接使用softmax的。
最后,贴一个Keras的模型fasttext简化版。
基于词向量表示,本文提出利用卷积神经网络来进行文本分类。其算法如上图所示:
在本文中,作者尝试了多种不同的词向量模式:
在上一篇文章中CNN网络的输入一般是预训练好的词向量,而在本文中作者提出一种直接将embedding训练与分类任务结合在一起,且能有效提取/保留词序信息,也即有效训练出n-gram的模型方法,其实也可以理解为一种利用CNN来进行embedding的搜碰方法。
此外,另一个问题是输入序列长度变化问题(在上一篇文章textCNN中通过padding解决的?),在本文作者提出使用一个动态可变的pooling层来解决这个问题,使得卷积层输出的大小是相同的。关于可变pooling其实与图像识别中的 空间金字塔池化 (Spatial Pyramid Pooling) 是类似的。
这篇文章有点将fastText与TextCNN结合在一起的感觉,将n-gram embedding与分类任务结合在了一起进行训练,通过CNN来进行Embedding。
Text Categorization via Region Embedding》
在本篇文章中作者提出了一个tv-embedding(即two-view embedding),它也属于region embedding(也可以理解为ngram embedding)。这种方法与上面的bow-CNN表示相似,使用bow(bag of words)的方式来表示一个区域的词句,然后通过某个区域(region,左右邻域的单词或词句)来预测其前后的区域(单词或词句),即输入区域是view1,target区域是view2。tv-embedding是单独训练的,在使用的时候与CNN中的embedding组合在一起(形成多个channel?)。作者认为,word2vec方法预训练得到的embedding向量是普适性的,而通过特定任务的数据集的训练得到tv-embedding具有任务相关的一些信息,更有利于提升我们的模型效果。
吐槽一下,这篇文章没太看懂,也可能是英语太差,作者文章中没有那种一眼就能让人理解的网络图,像textCNN的图就非常一目了然,看图就知道是怎么做的了。
本文提出了一个使用监督学习加半监督预训练的基于LSTM的文本分类模型。文章作者与上面相同,所以用到的很多技术可以说与上面也是同出一辙。因此简单说下本文的一些思路。
作者认为已有的直接使用LSTM作为文本分类模型并直接将LSTM的最后一个输出作为后续全连接分类器的方法面临两个问题:(1)这种方式一般都是与word embedding整合在一起(即输入onehot经过一个embedding层再进入LSTM),但是embedding训练不稳定,不好训练;(2)直接使用LSTM最后一个输出来表示整个文档不准确,一般来说LSTM输入中后面的单词会在最后输出中占有较重的权重,但是这对于文章表示来说并不总是对的。因此作者对这两点进行了改进:
本文其实可以看作是作者将自己前面的tv-embedding半监督训练与RCNN的一个融合吧,大有一种一顿操作猛如虎,一看人头0-5的感觉(因为作者的实验结果跟一般的CNN相比其实也抢不了多少)。
本文的作者也是前面两篇使用CNN来进行文本分类处理的文章的作者。因此在本文中,结合了前面两篇文章提出的一些方法,并使用了一个深层的卷积神经网络。具体的细节包括:
更多详细的关于DPCNN的细节可以查看 从DPCNN出发,撩一下深层word-level文本分类模型 。
本文提出了一种基于CNN+Attention的文本分类模型。作者认为已有的基于CNN的文本分类模型大都使用的是固定大小的卷积核,因此其学习到的表示也是固定的n-gram表示,这个n与CNN filter大小相关。但是在进行句子的语义表示时,不同句子发挥重要作用的ngram词语常常是不同的,也即是变化的。因此,模型能根据句子来自适应的选择每个句子最佳的n-gram对于提升模型的语义表示能力是非常关键的。本文便是由此思路提出了一种自适应的来选择不同n-gram表示的模型。
本文模型在主题结构上参照了CV中的DenseNet,借由DenseNet中的稠密连接来提取到丰富的n-gram特征表示。举例来说,在layer3的特征不仅能学习到f(x1, x2, x3),还能学习到f(x1(x2,x3))这种更多层次,更加丰富的特征。网络的结构主要包括三部分:DenseCNN主网络,Attention mole和最后的全连接层分类网络。下面对这三部分进行简单的说明:
本文通过Dense connection + Attention来自动获取对于文本语义最重要的n-gram特征,结果很好。但是缺点是,这个网络比较适合较短的文本,文中对输入文本进行了padding补齐,对于不同数据集最大长度分别为50,100等,但这对于较长的文本明显是不足的。因此对于较长的文本或许HAN这种借用RNN来不限制输入长短的网络会更好。
本文提出了一种结合循环神经网络(RNN)和卷积神经网络来进行文本分类的方法,其结构如上图所示,该网络可以分为三部分:
虽然说是RNN与CNN的结合,但是其实只用到了CNN中的pooling,多少有一点噱头的意思。文中还提到了RCNN为什么比CNN效果好的原因,即为什么RCNN能比CNN更好的捕捉到上下文信息:CNN使用了固定大小window(也即kernel size)来提取上下文信息,其实就是一个n-gram。因此CNN的表现很大程度上受window大小的影响,太小了会丢失一些长距离信息,太大了又会导致稀疏性问题,而且会增加计算量。
在众多自然语言处理任务中,一个非常突出的问题就是训练数据不足,且标注难度大。因此文本提出了一种多任务共享的RNN模型框架,其使用多个不同任务数据集来训练同一个模型共享参数,已达到扩充数据集的作用。
文中作者提出了三个模型,如上图所示:
三个模型的训练方式相同:
本文提出了一个层次LSTM+Attention模型。作者认为,虽然一篇文章有多个句子组成但真正其关键作用的可能是其中的某几个,因此对各个句子施加了注意力机制,以使得对文章语义贡献较多的句子占有更多的权重。同样的,组成一个句子的单词有多个,但是发挥重要作用的可能就那么几个,因此使用注意力机制以使得重要单词发挥更大的作用,这些便是本文的核心思想。整个网络可分为三层,两个LSTM层分别用来进行word encode和sentence encode,最顶上为一个全连接分类层。若加上两层注意力层,则可认为网络为5层。下面简单聊聊这五层网络的结构:
总体来说,本文看起来还是比较有意思的,符合人阅读文章的习惯,我们写文章的时候也是有中心词和中心句的。但是由于这个层级结构是否会导致训练慢或者不好训练还不得而知。最后,文中还提出对文章按长短先进行排序,长度相似的进入一个batch,这将训练速度加快了3倍。
本文提出了一个基于图神经网络的文本分类方法。该方法的主要思想是将所有文章及其包含的词汇都放到一个图网络里面去,图网络中的节点分为两种类型:单词节点和文章节点。其中连接单词节点和文章节点的边的权重使用TF-IDF来表示,而单词与单词之间边的权重则是使用点互信息(PMI)来表示。点互信息与传统语言模型中的条件概率计算方式非常相似。只不过PMI采用的是滑窗方式而条件概率是直接在所有语料中进行统计,可以认为是将所有语料当做一个大窗口,这时就又与PMI相同了。
A表示图网络的邻接矩阵,表示如下:
GCN同样也是可以含有多层隐藏层的,其各个层的计算方式如下:
其中A'为归一化对称邻接矩阵, W0 ∈ R^(m×k) 为权重矩阵,ρ是激活函数,例如 ReLU ρ(x) = max(0,x) 如前所述,可以通过叠加多个GCN层来合并更高阶的邻域信息:
其中j表示层数。
损失函数定义为所有已标记文档的交叉熵误差:
文中提到Text GCN运行良好的原因有两个方面:
但是其也有一些缺:
总的来说,文章的idea还是挺有意思的,效果也还不错。初识GCN可能还是有一点难以理解,可以参考如下资料进行进一步学习:
基于图卷积网络的文本分类算法
如何理解 Graph Convolutional Network(GCN)?
『贰』 神经网络模型-27种神经网络模型们的简介
【1】Perceptron(P) 感知机
【1】感知机
感知机是我们知道的最简单和最古老的神经元模型,它接收一些输入,然后把它们加总,通过激活函数并传递到输出层。
【2】Feed Forward(FF)前馈神经网络
【2】前馈神经网络
前馈神经网络(FF),这也是一个很古老的方法——这种方法起源于50年代。它的工作原理通常遵循以下规则:
1.所有节点都完全连接
2.激活从输入层流向输出,无回环
3.输入和输出之间有一层(隐含层)
在大多数情况下,这种类型的网络使用反向传播方法进行训练。
【3】Radial Basis Network(RBF) RBF神经网络
【3】RBF神经网络
RBF 神经网络实际上是 激活函数是径向基函数 而非逻辑函数的FF前馈神经网络(FF)。两者之间有什么区别呢?
逻辑函数--- 将某个任意值映射到[0 ,... 1]范围内来,回答“是或否”问题。适用于分类决策系统,但不适用于连续变量。
相反, 径向基函数--- 能显示“我们距离目标有多远”。 这完美适用于函数逼近和机器控制(例如作为PID控制器的替代)。
简而言之,RBF神经网络其实就是, 具有不同激活函数和应用方向的前馈网络 。
【4】Deep Feed Forword(DFF)深度前馈神经网络
【4】DFF深度前馈神经网络
DFF深度前馈神经网络在90年代初期开启了深度学习的潘多拉盒子。 这些依然是前馈神经网络,但有不止一个隐含层 。那么,它到底有什么特殊性?
在训练传统的前馈神经网络时,我们只向上一层传递了少量的误差信息。由于堆叠更多的层次导致训练时间的指数增长,使得深度前馈神经网络非常不实用。 直到00年代初,我们开发了一系列有效的训练深度前馈神经网络的方法; 现在它们构成了现代机器学习系统的核心 ,能实现前馈神经网络的功能,但效果远高于此。
【5】Recurrent Neural Network(RNN) 递归神经网络
【5】RNN递归神经网络
RNN递归神经网络引入不同类型的神经元——递归神经元。这种类型的第一个网络被称为约旦网络(Jordan Network),在网络中每个隐含神经元会收到它自己的在固定延迟(一次或多次迭代)后的输出。除此之外,它与普通的模糊神经网络非常相似。
当然,它有许多变化 — 如传递状态到输入节点,可变延迟等,但主要思想保持不变。这种类型的神经网络主要被使用在上下文很重要的时候——即过去的迭代结果和样本产生的决策会对当前产生影响。最常见的上下文的例子是文本——一个单词只能在前面的单词或句子的上下文中进行分析。
【6】Long/Short Term Memory (LSTM) 长短时记忆网络
【6】LSTM长短时记忆网络
LSTM长短时记忆网络引入了一个存储单元,一个特殊的单元,当数据有时间间隔(或滞后)时可以处理数据。递归神经网络可以通过“记住”前十个词来处理文本,LSTM长短时记忆网络可以通过“记住”许多帧之前发生的事情处理视频帧。 LSTM网络也广泛用于写作和语音识别。
存储单元实际上由一些元素组成,称为门,它们是递归性的,并控制信息如何被记住和遗忘。
【7】Gated Recurrent Unit (GRU)
【7】GRU是具有不同门的LSTM
GRU是具有不同门的LSTM。
听起来很简单,但缺少输出门可以更容易基于具体输入重复多次相同的输出,目前此模型在声音(音乐)和语音合成中使用得最多。
实际上的组合虽然有点不同:但是所有的LSTM门都被组合成所谓的更新门(Update Gate),并且复位门(Reset Gate)与输入密切相关。
它们比LSTM消耗资源少,但几乎有相同的效果。
【8】Auto Encoder (AE) 自动编码器
【8】AE自动编码器
Autoencoders自动编码器用于分类,聚类和特征压缩。
当您训练前馈(FF)神经网络进行分类时,您主要必须在Y类别中提供X个示例,并且期望Y个输出单元格中的一个被激活。 这被称为“监督学习”。
另一方面,自动编码器可以在没有监督的情况下进行训练。它们的结构 - 当隐藏单元数量小于输入单元数量(并且输出单元数量等于输入单元数)时,并且当自动编码器被训练时输出尽可能接近输入的方式,强制自动编码器泛化数据并搜索常见模式。
【9】Variational AE (VAE) 变分自编码器
【9】VAE变分自编码器
变分自编码器,与一般自编码器相比,它压缩的是概率,而不是特征。
尽管如此简单的改变,但是一般自编码器只能回答当“我们如何归纳数据?”的问题时,变分自编码器回答了“两件事情之间的联系有多强大?我们应该在两件事情之间分配误差还是它们完全独立的?”的问题。
【10】Denoising AE (DAE) 降噪自动编码器
【10】DAE降噪自动编码器
虽然自动编码器很酷,但它们有时找不到最鲁棒的特征,而只是适应输入数据(实际上是过拟合的一个例子)。
降噪自动编码器(DAE)在输入单元上增加了一些噪声 - 通过随机位来改变数据,随机切换输入中的位,等等。通过这样做,一个强制降噪自动编码器从一个有点嘈杂的输入重构输出,使其更加通用,强制选择更常见的特征。
【11】Sparse AE (SAE) 稀疏自编码器
【11】SAE稀疏自编码器
稀疏自编码器(SAE)是另外一个有时候可以抽离出数据中一些隐藏分组样试的自动编码的形式。结构和AE是一样的,但隐藏单元的数量大于输入或输出单元的数量。
【12】Markov Chain (MC) 马尔科夫链
【12】Markov Chain (MC) 马尔科夫链
马尔可夫链(Markov Chain, MC)是一个比较老的图表概念了,它的每一个端点都存在一种可能性。过去,我们用它来搭建像“在单词hello之后有0.0053%的概率会出现dear,有0.03551%的概率出现you”这样的文本结构。
这些马尔科夫链并不是典型的神经网络,它可以被用作基于概率的分类(像贝叶斯过滤),用于聚类(对某些类别而言),也被用作有限状态机。
【13】Hopfield Network (HN) 霍普菲尔网络
【13】HN霍普菲尔网络
霍普菲尔网络(HN)对一套有限的样本进行训练,所以它们用相同的样本对已知样本作出反应。
在训练前,每一个样本都作为输入样本,在训练之中作为隐藏样本,使用过之后被用作输出样本。
在HN试着重构受训样本的时候,他们可以用于给输入值降噪和修复输入。如果给出一半图片或数列用来学习,它们可以反馈全部样本。
【14】Boltzmann Machine (BM) 波尔滋曼机
【14】 BM 波尔滋曼机
波尔滋曼机(BM)和HN非常相像,有些单元被标记为输入同时也是隐藏单元。在隐藏单元更新其状态时,输入单元就变成了输出单元。(在训练时,BM和HN一个一个的更新单元,而非并行)。
这是第一个成功保留模拟退火方法的网络拓扑。
多层叠的波尔滋曼机可以用于所谓的深度信念网络,深度信念网络可以用作特征检测和抽取。
【15】Restricted BM (RBM) 限制型波尔滋曼机
【15】 RBM 限制型波尔滋曼机
在结构上,限制型波尔滋曼机(RBM)和BM很相似,但由于受限RBM被允许像FF一样用反向传播来训练(唯一的不同的是在反向传播经过数据之前RBM会经过一次输入层)。
【16】Deep Belief Network (DBN) 深度信念网络
【16】DBN 深度信念网络
像之前提到的那样,深度信念网络(DBN)实际上是许多波尔滋曼机(被VAE包围)。他们能被连在一起(在一个神经网络训练另一个的时候),并且可以用已经学习过的样式来生成数据。
【17】Deep Convolutional Network (DCN) 深度卷积网络
【17】 DCN 深度卷积网络
当今,深度卷积网络(DCN)是人工神经网络之星。它具有卷积单元(或者池化层)和内核,每一种都用以不同目的。
卷积核事实上用来处理输入的数据,池化层是用来简化它们(大多数情况是用非线性方程,比如max),来减少不必要的特征。
他们通常被用来做图像识别,它们在图片的一小部分上运行(大约20x20像素)。输入窗口一个像素一个像素的沿着图像滑动。然后数据流向卷积层,卷积层形成一个漏斗(压缩被识别的特征)。从图像识别来讲,第一层识别梯度,第二层识别线,第三层识别形状,以此类推,直到特定的物体那一级。DFF通常被接在卷积层的末端方便未来的数据处理。
【18】Deconvolutional Network (DN) 去卷积网络
【18】 DN 去卷积网络
去卷积网络(DN)是将DCN颠倒过来。DN能在获取猫的图片之后生成像(狗:0,蜥蜴:0,马:0,猫:1)一样的向量。DNC能在得到这个向量之后,能画出一只猫。
【19】Deep Convolutional Inverse Graphics Network (DCIGN) 深度卷积反转图像网络
【19】 DCIGN 深度卷积反转图像网络
深度卷积反转图像网络(DCIGN),长得像DCN和DN粘在一起,但也不完全是这样。
事实上,它是一个自动编码器,DCN和DN并不是作为两个分开的网络,而是承载网路输入和输出的间隔区。大多数这种神经网络可以被用作图像处理,并且可以处理他们以前没有被训练过的图像。由于其抽象化的水平很高,这些网络可以用于将某个事物从一张图片中移除,重画,或者像大名鼎鼎的CycleGAN一样将一匹马换成一个斑马。
【20】Generative Adversarial Network (GAN) 生成对抗网络
【20】 GAN 生成对抗网络
生成对抗网络(GAN)代表了有生成器和分辨器组成的双网络大家族。它们一直在相互伤害——生成器试着生成一些数据,而分辨器接收样本数据后试着分辨出哪些是样本,哪些是生成的。只要你能够保持两种神经网络训练之间的平衡,在不断的进化中,这种神经网络可以生成实际图像。
【21】Liquid State Machine (LSM) 液体状态机
【21】 LSM 液体状态机
液体状态机(LSM)是一种稀疏的,激活函数被阈值代替了的(并不是全部相连的)神经网络。只有达到阈值的时候,单元格从连续的样本和释放出来的输出中积累价值信息,并再次将内部的副本设为零。
这种想法来自于人脑,这些神经网络被广泛的应用于计算机视觉,语音识别系统,但目前还没有重大突破。
【22】Extreme Learning Machine (ELM) 极端学习机
【22】ELM 极端学习机
极端学习机(ELM)是通过产生稀疏的随机连接的隐藏层来减少FF网络背后的复杂性。它们需要用到更少计算机的能量,实际的效率很大程度上取决于任务和数据。
【23】Echo State Network (ESN) 回声状态网络
【23】 ESN 回声状态网络
回声状态网络(ESN)是重复网络的细分种类。数据会经过输入端,如果被监测到进行了多次迭代(请允许重复网路的特征乱入一下),只有在隐藏层之间的权重会在此之后更新。
据我所知,除了多个理论基准之外,我不知道这种类型的有什么实际应用。。。。。。。
【24】Deep Resial Network (DRN) 深度残差网络
【24】 DRN 深度残差网络
深度残差网络(DRN)是有些输入值的部分会传递到下一层。这一特点可以让它可以做到很深的层级(达到300层),但事实上它们是一种没有明确延时的RNN。
【25】Kohonen Network (KN) Kohonen神经网络
【25】 Kohonen神经网络
Kohonen神经网络(KN)引入了“单元格距离”的特征。大多数情况下用于分类,这种网络试着调整它们的单元格使其对某种特定的输入作出最可能的反应。当一些单元格更新了, 离他们最近的单元格也会更新。
像SVM一样,这些网络总被认为不是“真正”的神经网络。
【26】Support Vector Machine (SVM)
【26】 SVM 支持向量机
支持向量机(SVM)用于二元分类工作,无论这个网络处理多少维度或输入,结果都会是“是”或“否”。
SVM不是所有情况下都被叫做神经网络。
【27】Neural Turing Machine (NTM) 神经图灵机
【27】NTM 神经图灵机
神经网络像是黑箱——我们可以训练它们,得到结果,增强它们,但实际的决定路径大多数我们都是不可见的。
神经图灵机(NTM)就是在尝试解决这个问题——它是一个提取出记忆单元之后的FF。一些作者也说它是一个抽象版的LSTM。
记忆是被内容编址的,这个网络可以基于现状读取记忆,编写记忆,也代表了图灵完备神经网络。
『叁』 神经网络、流形和拓扑
译者:树石
最近,由于在诸如计算机视觉领域取得了突破性成果,深层神经网络引起了广泛的关注和兴趣。
然而,该领域仍然存在一些顾虑。比如, 要了解神经网络能够做什么相当具有挑战性 。如果一个网路被训练得很好,输出高品质的结果,但了解它是如何做到的具有挑战性。如果网络出现故障,也很难理解什么地方出了错。
虽然通常理解深层神经网络的行为比较困难, 探索低维度深层神经网络相对容易的多 ——在每一层只有几个神经元的网络。事实上,我们可以通过创建可视化效果来理解网络的行为和对网络的培训。这种方法将让我们 获取对神经网络行为的深层直觉,并观察到神经网络和拓扑学之间的联系 。
另外,还探讨了一些有趣的事情,包括对某些数据集进行分类的神经网络的最低复杂性。
让我们从一个非常简单的数据集开始:在一个平面上的两条曲线。该网络将学习如何将线上的点归类为这一个还是另外一个。
将神经网络(或任何分类算法)的行为可视化,显而易见的方法是简单地看它是如何对每一个可能的数据点进行分类。
我们将先从最简单的神经网络开始,只有一个输入层和一个输出层的网络。这样的网络只是试图通过画一条线将两个类数据的分离。
诸如此类的网络不是很有趣。现代神经网络一般在输入和输出之间,具有称为“隐藏”层的多个层次。至少包含一个隐藏层。
与以前一样,我们可以通过查看它对其领域不同点进行的处理来观察这个网络的行为。数据分割通过一条曲线来完成,而不是直线。
通过神经网络的每一层,数据被转换,创建了一个新的 表示 (represention)。我们可以看一下在这些表示中的数据以及网络是如何划分他们的。当我们到达最后一层的表示时,网络只需要绘制一条线(或者,在更高维度里绘制一个超平面)。
在前面的可视化中,我们看到其“原始”表示的数据,你可以将其视为输入层。现在我们将看看经过第一层转化后,你可以认为这是我们看到了隐藏层。
每个维度对应于该层中神经元的兴奋。
在上一节中所概述的方法,我们知道通过查看每层的表示来了解网络。这给了我们一个离散的表示列表。
最棘手的部分是了解我们是如何从一个表示到另一个的。值得庆幸的是,神经网络层具有很好的性能,使这一点变得很容易。
神经网络由多种不同类型的层构成。我们将谈论一个具体的例子:双曲正切层(tanh)。一个双曲正切层tanh(Wx+b)由以下组成:
我们可以观察到这是一个连续变换,具体如下:
这个故事和其它标准层大体相同,由一个映射变换之后单调激活函数的逐点应用。
我们可以用这种技术来了解更复杂的网络。例如,下面的网络划分两个被略微缠结的螺旋,使用四个隐藏层。随着时间的推移,我们可以看到它的“原始”表示转移到更高层次为了对数据进行分类。而螺旋最初是纠结的,最终他们是线性可分的。
另一方面,以下的网络,也是使用多个层,分类两个螺旋没有成功,反而更加缠结。
这里值得明确指出,这些任务将变得有些困难,如果我们使用的是低维神经网络。如果我们使用更广泛的网络,这一切都将是相当容易的。
( Andrei Karpathy有 很好的演示 基于ConvnetJS,让您可以交互式地浏览网络,就像上面的这种可视化培训! )
每一层都会拉伸和挤压空间,但它永远不会切割、断裂和褶皱它。直观地说,我们可以看到它保留了拓扑性质。例如,一组数据将在转化后保持连接,如果它之前是连接的(反之亦然)。
这样的转换,不影响拓扑结构,被称为同胚。在形式上,他们是连续函数的双向映射。
定理 :具有N个输入和N个输出的层是同胚,如果权重矩阵W是非奇异的。(虽然需要小心它的值域和范围。)
证明 :让我们一步步考虑:
因此,如果W所有因子都是非零的,我们的层就是同胚的。∎
这一结果始终正确,如果我们将任意多个这些层组合在一起。
考虑包含两个类的二维数据集
![][01]
[01]: http://latex.codecogs.com/svg.latex?,A,B subsetmathbb{R}^2
A = {x | d(x,0) < 1/3}
B = {x | 2/3 < d(x,0) < 1}
如前面提到的,用一个S形函数或SOFTMAX层分类相当于试图找到一个超平面(或在这种情况下是一条线)在最终表示中分隔A与B。只有两个隐藏层的网络对于分离这组数据在拓扑上是无能的,并注定要失败。
在下面的可视化图中,我们观察到网络训练隐藏的表示,通过试图使用一条直线来分类。我们可以看到,它在努力学习某种方式来做到这一点是不断挣扎而且困难重重。
最后,它被拉到一个相当低效的拟合。虽然它实际上能够实现〜80%分类精度。
这个例子只有一个隐藏层,但无论如何它都会失败。
证明 :要么每层是一个同胚,要么该层的权重矩阵具有0因子。如果该层是同胚的,A被B所环绕,一个直线不能将它们分开。但是,假设它具有一个0因子:那么数据集将在某些轴上崩塌。因为我们正在处理的东西同胚于原始数据集,A被B所包围,在任一轴崩塌于意味着我们将有一些A中的点和B中的点混合,从而无法完成A与B的区分。∎
如果我们增加第三个隐藏层,问题就变得微不足道。神经网络学习以下表示:
用这个表示,我们可以用一个超平面分开数据集。
为了更好的理解这是怎么做到的,让我们考虑一个更简单的一维数据集:
![][02]
[02]: http://latex.codecogs.com/svg.latex?,A=[- frac{1}{3},,frac{1}{3}]
![][03]
[03]: http://latex.codecogs.com/svg.latex?,B=[-1,- frac{2}{3}]cup[frac{2}{3},1]
如果不使用两个或多个隐藏单元层,我们不能将此数据集进行分类。但是,如果我们使用一个带有两层的网络,我们就学会将数据转化成一个很好的曲线,让我们能用一条线将数据分开:
发生了什么?一个隐藏单元学习当x>-1/2时兴奋,另一个单元学习当x>1/2时兴奋。当第一个兴奋,而不是第二个时,我们知道数据属于A。
这个假说和现实世界的数据集相关吗,比如图像数据?如果你认真对待流形假说,我觉得他值得思考。
流形假说是指自然数据在它的嵌入空间构成了较低维度的数据流形。同时具有理论和实验的理由相信这一假说是真的。如果你相信这一点,那么分类算法的任务是从根本上分离一堆纠结的流形。
在前面的例子中,一个类完全被另一个类包围。然而,这似乎并不可能,比如狗的图像流形完全被猫的图像流形包围。因为我们将在下一节中看到其他更合理的拓扑情况。
另一个有趣的数据集要考虑的是两个链接的tori,A和B。
就像之前的数据集,这个数据不能被分离,如果不使用n+1维,即4个维度。
链接在结点理论(knot theory)中被讨论,拓扑学的一个领域。有时,当我们看到一个链接,并不能一眼看出它是否真正相连(一堆被缠结在一起的事情,但可以通过连续变形分开)。
如果仅仅使用3个层次的神经网络就能够对其进行分类,那么它就是一个未链接(unlink)。(问:理论上是否能将所有未链接都通过只有3个层次的网络进行分类?)
从这个结的角度看,我们通过神经网络产生的连续可视化不仅仅是一个漂亮的动画,它是解开链接的程序。在拓扑学中,我们把它称为原始链接和分离环之间一个环境同痕(an ambient isotopy)。
形式上,流形A和B之间的一个环境同痕是一个连续函数F:[0,1]× X→Y,使得每个Ft是一个从X到它自己范围的同胚,F0是一个标识函数,并F1是从A到B的一个映射。也就是,Ft是从A到自身的映射到从A到B的映射的连续转换。
定理 :在输入和网络层之间具有环境同痕,如果:
证明 :同样,我们分别考虑网络的每个阶段:
我想这也许是十分有趣的,通过程序自动发现这样的环境同痕并自动证明某些链接的等价性,或者某些环节是可分离的。这将很有趣知道,如果神经网络是否可以各种情况。
(显然,确定结点是否重要是一个NP,这不太适用于神经网络。)
我们已经谈到的这类链接,到目前为止似乎不太可能是现实世界的数据,但他们是更高维的生成。这似乎是合理的。
链接和结点是1维流形,但我们需要4个维度才能够解开他们。类似地,可能需要更高维度的空间,以便能够解开n维流形。所有n维流形可在2n+2维度上解开。
(我对于结点理了解不多,确实需要更多地了解维度和链接。如果我们知道一个流形可以被嵌入到n维空间,而不是流形的维度,我们有什么限制? )
很自然的想法,一个神经网络试图直接将流形从纠结尽可能薄的部分拉出。虽然这不会在任何情况下都是一个好的解决方案,但是大多情况它可以实现较高的分类准确率,到达一个诱人的最低点(local miminum)。
它试图拉伸具有高延展性的空间,并锐化靠近中断处。我们知道这些事情发生。压缩的处罚,在对数据点衍生层的处罚,都是很自然的做法。
由于这些局部最小点对于解决这种拓扑问题完全无用,拓扑问题值得很好的探索。
在另一方面,如果我们只关心取得了良好的分类结果,好像我们可能并不关心。如果很小的一个数据流形的点陷入另一个流形,会是一个问题吗?看起来我们应该能够得到很好的分类结果,尽管有这个问题。
(我的直觉是,像这样欺骗自己是一个坏主意:这是很难想象它不会是死路一条。特别是,针对一个局部最小很重要的优化问题,选择这种方式不能真正解决问题,这似乎是糟糕的表现。)
我越思考标准的神经网络层 - 即用映射变换后逐点激活功能 - 我就越不抱幻想。很难想象,他们能够很好地操纵流形。
也许这可能是有意义的,我们采用一个非常不同的层,而不是传统的神经网络层?
非常自然的感觉是,通过一个矢量场的学习,我们希望流形移动方向:
然后再对他变形空间:
人们可以学会在固定点的矢量场(只是需要从训练集合选取一些固定点作为锚),并以某种方式介入。上面的矢量场的形式是:
![][04]
[04]: http://latex.codecogs.com/svg.latex?,F(x)= frac{v_0f_0(x)+v_1f_1(x)}{1+f_0(x)+f_1(x)}
其中,v0和v1是矢量,F0(X)和F1(X)是n维高斯函数。这一点来自于径向基函数(radial basis functions)的灵感。
我也开始觉得线性可分可能是一个巨大的,也可能不合理的,神经网络的需求。在某些方面,非常自然的会想到使用K-近邻(K-NN)。然而,K-NN的成功在很大程度上取决于它所分类的数据表示(represention),因此,人们在K-NN之前,需要一种良好的表示。
作为第一个实验中,我训练了一些MNIST网络(两层卷积网,没有下降现象)到达〜1%测试误差。然后我放弃了最后的SOFTMAX层而使用K-NN算法,我能够始终如一地降低0.1-0.2%的测试误差。
不过,这并不完全觉得是正确的事情。该网络还在试图做线性分类,但由于我们使用K-NN测试,它能够从它所犯的错误中恢复一些。
K-NN有区别于相对于它的网络层次,因为会用到(1 /距离值)加权。因此,我们可以直接训练网络K-NN分类。这可以被认为是一种“k-NN”层替SOFTMAX。
我们不希望为每个小批量数据遍历整个训练集,因为这将非常消耗计算资源。我认为一个很好的办法是根据小批次的其它元素对每个小批次的元素进行分类,赋予每一个元素(1 /从分类目标的距离)的权重。
可悲的是,即使有完善的体系结构,采用K-NN只下到5-4%检测错误 - 使用简单的架构会得到更坏的结果。不过,我已经很少把努力放在高维参数上了。
不过,我真的很喜欢这个方法,因为它好像就是我们“要求”网络运行的更加合理。我们希望在同一流形的点比其它的点更加接近,相对于由一个超平面被分离的其他流形。这相对需要拉伸不同类别流形之间的空间,同时收缩每一个流形。这感觉就像是在简化问题。
具有拓扑性质的数据,例如链接,可能导致无法使用低维网络进行线性分类,无论深度有多大。即使在技术上是可能的情况下,例如螺旋,也是非常具有挑战性的。
为了使神经网络准确的分类数据,多个层次有时是必要的 。此外,传统的神经网络层似乎并不能很好的处理流形数据;即使我们巧妙的手工设置权重,想要紧凑的表达我们想要的转换也是非常困难的。新建层次,特别使用流形相关的机器学习,可能是有用的补充。
(这是一个发展中的研究项目。相关研究信息会在网上公布。我会很高兴听听您对这些想法的反馈:您可以发表评论。对于错别字,技术错误,或任何澄清,我们鼓励你发一个请求在GitHub上。)
致谢
谢谢Yoshua Bengio,迈克尔·尼尔森,达里奥 Amodei,埃利安娜洛奇,雅各布斯坦哈特和Tamsyn Waterhouse的意见和鼓励。
『肆』 BP神经网络的梳理
BP神经网络被称为“深度学习之旅的开端”,是神经网络的入门算法。
各种高大上的神经网络都是基于BP网络出发的,最基础的原理都是由BP网络而来 [1] ,另外由于BP神经网络结构简单,算法经典, 是神经网络中应用最广泛的一种。
BP神经网络(back propagation neural network)全称是反向传播神经网络。
神经网络发展部分背景如下 [2] :
为解决非线性问题,BP神经网络应运而生。
那么什么是BP神经网络?稍微专业点的解释要怎么说呢?
很喜欢 最简单的神经网络--Bp神经网络 一文对算法原理的解释,语言活泼,案例简单,由浅入深。
文中提到所谓的 AI 技术,本质上是一种数据处理处理技术,它的强大来自于两方面:1.互联网的发展带来的海量数据信息;2.计算机深度学习算法的快速发展。AI 其实并没有什么神秘,只是在算法上更为复杂 [3] 。
我们从上面的定义出发来解释BP神经网络的原理。
BP神经网络整个网络结构包含了:一层输入层,一到多层隐藏层,一层输出层。
一般说L层神经网络,指的是有L个隐层,输入层和输出层都不计算在内的 [6] 。
BP神经网络模型训练的学习过程由信号的 正向传播 和误差的 反向传播 两个过程组成。
什么是信号的正向传播?顾名思义,就是结构图从左到右的运算过程。
我们来看看结构图中每个小圆圈是怎么运作的。我们把小圈圈叫做神经元,是组成神经网络的基本单元。
正向传播就是输入数据经过一层一层的神经元运算、输出的过程,最后一层输出值作为算法预测值y'。
前面正向传播的时候我们提到权重w、偏置b,但我们并不知道权重w、偏置b的值应该是什么。关于最优参数的求解,我们在 线性回归 、 逻辑回归 两章中有了详细说明。大致来讲就是:
BP神经网络全称 back propagation neural network,back propagation反向传播是什么?
反向传播的建设本质上就是寻找最优的参数组合,和上面的流程差不多,根据算法预测值和实际值之间的损失函数L(y',y),来反方向地计算每一层的z、a、w、b的偏导数,从而更新参数。
对反向传播而言,输入的内容是预测值和实际值的误差,输出的内容是对参数的更新,方向是从右往左,一层一层的更新每一层的参数。
BP神经网络通过先正向传播,构建参数和输入值的关系,通过预测值和实际值的误差,反向传播修复权重;读入新数据再正向传播预测,再反向传播修正,...,通过多次循环达到最小损失值,此时构造的模型拥有最优的参数组合。
以一个简单的BP神经网络为例,由3个输入层,2层隐藏层,每层2个神经元,1个输出层组成。
【输入层】传入
【第一层隐藏层】
对于 神经元而言,传入 ,加权求和加偏置激活函数处理后,输出 ;
对于 神经元而言,传入 ,加权求和加偏置函数处理后,输出 ;
输出:
【第二层隐藏层】
对于 神经元而言,传入 ,加权求和加偏置激活函数处理后,输出 ;
对于 神经元而言,传入 ,加权求和加偏置激活函数处理后,输出 ;
输出:
【输出层】
对于输出层神经元而言,输入 ,加权求和加偏置激活函数处理后,输出 ,输出的是一个值
第一次运行正向传播这个流程时随用随机参数就好,通过反向传播不断优化。因此需要在一开始对 设置一个随机的初始值。
首先计算正向传播输出值 与实际值的损失 ,是一个数值。所谓反向是从右到左一步步来的,先回到 ,修正参数 。
以此类推,通过对损失函数求偏导跟新参数 ,再跟新参数 。这时又回到了起点,新的数据传入又可以开始正向传播了。
keras可以快速搭建神经网络,例如以下为输入层包含7129个结点,一层隐藏层,包含128个结点,一个输出层,是二分类模型。
神经网络反向传播的优化目标为loss,可以观察到loss的值在不断的优化。
可以通过model.get_layer().get_weights()获得每一层训练后的参数结果。通过model.predict()预测新数据。
至此,BP神经网络的整个运算流程已经过了一遍。之前提到BP神经网络是为解决非线性问题应运而生的,那么为什么BP神经网络可以解决非线性问题呢?
还记得神经元里有一个激活函数的操作吗?神经网络通过激活函数的使用加入非线性因素。
通过使用非线性的激活函数可以使神经网络随意逼近复杂函数,从而使BP神经网络既可以处理线性问题,也可以处理非线性问题。
为什么激活函数的使用可以加入非线性因素 [7] ?
其实逻辑回归算法可以看作只有一个神经元的单层神经网络,只对线性可分的数据进行分类。
输入参数,加权求和,sigmoid作为激活函数计算后输出结果,模型预测值和实际值计算损失Loss,反向传播梯度下降求编导,获得最优参数。
BP神经网络是比 Logistic Regression 复杂得多的模型,它的拟合能力很强,可以处理很多 Logistic Regression处理不了的数据,但是也更容易过拟合。
具体用什么算法还是要看训练数据的情况,没有一种算法是使用所有情况的。
常见的前馈神经网络有BP网络,RBF网络等。
BP神经网络的一个主要问题是:结构不好设计。
网络隐含层的层数和单元数的选择尚无理论上的指导,一般是根据经验或者通过反复实验确定。
但是BP神经网络简单、易行、计算量小、并行性强,目前仍是多层前向网络的首选算法。
[1] 深度学习开端---BP神经网络: https://blog.csdn.net/Chile_Wang/article/details/100557010
[2] BP神经网络发展历史: https://zhuanlan.hu.com/p/47998728
[3] 最简单的神经网络--Bp神经网络: https://blog.csdn.net/weixin_40432828/article/details/82192709
[4] 神经网络的基本概念: https://blog.csdn.net/jinyuan7708/article/details/82466653
[5] 神经网络中的 “隐藏层” 理解: https://blog.csdn.net/nanhuaibeian/article/details/100183000
[6] AI学习笔记:神经元与神经网络: https://www.jianshu.com/p/65eb2fce0e9e
[7] 线性模型和非线性模型的区别: https://www.cnblogs.com/toone/p/8574294.html
[8] BP神经网络是否优于logistic回归: https://www.hu.com/question/27823925/answer/38460833