点击上方“算法猿的成长“,关注公众号,选择加“星标“或“置顶”
总第 124 篇文章,本文大约 3731 字,阅读大约需要 10 分钟
原文:https://theaisummer.com/Deep-Learning-Algorithms/
作者:Sergios Karagiannakos
因为文章有些长,所以会分成上下两篇文章,分开发。
上一篇文章的链接:
深度学习算法简要综述(上)
本文目录如下:
- 深度学习是什么?
- 神经网络(Neural Networks)
- 前向神经网络(Feedforward Neural Networks, FNN)
- 卷积神经网络(Convolutional Neural Networks, CNN)
- 循环神经网络(Recurrent Neural Networks ,RNN)
- 递归神经网络(Recursive Neural Network )
- 自动编码器(AutoEncoders)
- 深度信念网络(Deep Belief Networks)和受限制玻尔兹曼机(Restricted Boltzmann Machines)
- 生成对抗网络(Generative Adversarial Networks)
- Transformers
- 图神经网络(Graph Neural Networks)
- 基于深度学习的自然语言处理
- 词嵌入(Word Embedding)
- 序列模型(Sequence Modeling)
- 基于深度学习的计算机视觉
- 定位和目标检测(Localization and Object Detection)
- Single shot detectors(SSD)
- 语义分割(Semantic Segmentation)
- 姿势估计(Pose Estimation)
上一篇文章介绍了前面 6 小节,从深度学习的定义到介绍了神经网络、前向神经网络、卷积神经网络、循环神经网络以及递归神经网络,接下来会介绍剩余的几个算法以及两大应用方向。
7. 自动编码器(AutoEncoders)
自动编码器[11] 通常是作为一个非监督算法使用,并且主要应用在降维和压缩。它们的技巧就是尝试让输出等于输入,另外,在其他工作中,也有尝试重构数据的做法。
自动编码器包括一个编码器和一个解码器。编码器接收一个输入,然后将其编码成一个低维的隐空间中的向量,然后解码器负责将该向量进行解码得到原始的输入。结构如下图所示:
从上图中我们可以知道,能从网络中间的输出(图中 code 部分)得到一个更少维度的输入的特征表示,这就是实现了降维和压缩的工作。
另外,也可以根据这个思路来重新得到略微有些不同的输入数据,甚至是更好的数据,这可以用于训练数据的增强,数据的去噪等
8. 深度信念网络(Deep Belief Networks)和受限制玻尔兹曼机(Restricted Boltzmann Machines)
受限制玻尔兹曼机[12] 是带有生成能力的随机神经网络,也就是它可以通过输入来学习到一个概率分布。相比其他网络,它的最大特点就是只有输入和隐藏层,不包含输出。
在训练的前向部分,传入一个输入并产生一个对应的特征表示,然后在反向传播中,则从这个特征表示重构原始的输入(这个过程非常类似自动编码器,但是它在单个网络中实现的)。具体网络结构如下图所示:
用于协同过滤的受限制玻尔兹曼机
多个受限制玻尔兹曼机(RBMs)叠加在一起就可以组成一个深度信念网络[13]。它们看起来和全连接层非常相似,但不同点在于训练的方式。深度信念网络的训练是根据 RBMs 的训练过程来以成对的方式训练其网络层。
然而最近深度信念网络和受限制玻尔兹曼机的使用者越来越少,因为出现了生成对抗网络(GANs)以及变异的自动编码器。
9. 生成对抗网络(Generative Adversarial Networks)
生成对抗网络[14]是在 2016 年由 Ian Goodfellow 提出的一个算法,它基于这样一个简单但优雅的想法:如果你想生成图片数据,你会怎么做呢?
做法可能是先创建两个模型,首先训练第一个模型来生成假的数据(生成器),然后训练第二个模型来辨别真假数据(判别器),然后将它们放在一起训练,从而相互竞争。
随着训练,生成器会越来越擅长生成图片数据,它的终极目标就是成功欺骗判别器。判别器则具有越来越强的辨别真假数据的能力,它的终极目标就是不会被欺骗。结果就是判别器会得到非常真实的假数据,网络结构如下图所示:
生成对抗网络的应用包括视频游戏、天文学图片,时尚等。基本上,只要是图片数据,都可能会用到生成对抗网络,比如非常有名的 Deep Fakes,才有的就是生成对抗网络。
10. Transformers
Transformers
[15] 也是一个非常新的算法,主要应用在语言类的应用,并且逐渐替代了循环神经网络。它主要基于注意力(attention)机制,即强制让网络关注一个特定的数据点。
相比于拥有复杂的 LSTM 单元,注意力机制是根据输入数据不同部分的重要性来赋予权重。注意力机制[16]也是一种权重层,它的目的是通过调整权重来优先关注输入的特定部分,而暂时不关注不重要的其他部分区域。
Transformers
实际上包含了一些堆叠的编码器(组成了编码层),一些堆叠的解码器(解码层)以及很多注意力网络层(self-attentions 和 encoder-decoder attentions),如下图所示:
http://jalammar.github.io/illustrated-transformer/
Transformers
主要是用于解决有序序列数据,比如自然语言处理的一些任务,包括机器翻译和文本摘要。目前 BERT
和 GPT-2
是两个性能最好的预训练自然语言系统,应用在很多的自然语言处理任务,它们也都是基于 Transformers
的。
11. 图神经网络(Graph Neural Networks)
一般来说非结构化的数据并不是非常适合使用深度学习的算法。实际上现实生活中确实有很多应用的数据都是非结构化的,然后以图的格式组织起来的。比如社交网络、化学混合物、知识图谱、空间数据等。
图神经网络[17]的目标就是建模图数据,也就是可以识别到一个图里结点之间的关系并生成一个数值型的表征数据,类似于一个嵌入向量(embedding)。因此,它们可以应用到其他的机器学习模型中,用于所有类型的任务,比如聚类、分类等。
12. 基于深度学习的自然语言处理
词嵌入(Word Embedding)
词嵌入是通过将单词转成数值向量表示来获取单词之间的语义和语法的相似性。这个做法是很有必要的,因为神经网络只能接受数值类型的数据,所以必须将单词和文本编码为数值。
- Word2Vec [18] 是最常用的一种方法,它尝试学习嵌入向量(embedding)并且可以通过上下文预测当前的单词(CBOW)或者是基于单词来预测上下文的单词(Skip-Gram)。实际上
Word2Vec
也是一个两层的神经网络,并且输入和输出都是单词。单词将通过独热编码(one-hot encoding)的方式输入到神经网络中。在CBOW
的例子中,输入是相邻的单词,输出是期望的单词,而在Skip-Gram
的例子中,输入和输出正好相反,输入是单词,输出是上下文单词。 - Glove[19] 是另一种模型,它在
Word2Vec
的基础上结合了矩阵分解的方法,比如隐藏语义分析(Latent Semantic Analysis),这是一个被证明在全局文本分析上效果很好,但不能捕捉到局部的上下文信息。通过结合Word2Vec
和矩阵分解,可以很好利用它们各自的优势。 - FastText[20] 是 Facebook 提出的算法,它采用字符级别的表示,而不是单词。
- 上下文单词嵌入(Contextual Word Embeddings)通过采用循环神经网络来替代
Word2Vec
,用于预测一个序列中某个单词的下一个单词。这个方法可以捕捉到单词之间的长期独立性,并且每个向量都包含着当前单词和历史单词的信息。最有名的一个版本是 ELMo[21],它是一个两层双向 LSTM 网络。 - 注意力机制[22] 和
Transformers
正如之前介绍Transformers
所说,逐渐替代了RNN
的作用,它们可以实现赋予最相关的单词的权重,并遗忘掉不重要的单词
序列模型(Sequence Modeling)
序列模型是自然语言处理中不可分割的一部分,因为它在大量常见的应用中都会出现,比如机器翻译[23],语音识别,自动完成以及情感分类。序列模型可以处理序列输入,比如一篇文档的所有单词。
举例说明一下,假设你想将一句话从英文翻译为法文。
为了实现这个翻译,你需要一个序列模型(seq2seq)[24]。Seq2seq
模型包括一个编码器和一个解码器,编码器将序列(本例子中的英语句子)作为输入,然后将输入在隐空间的表示作为输出,这个表示会输入到解码器中,并输出一个新的序列(也就是法语句子)。
最常见的编码器和解码器结构是循环神经网络(大部分是 LSTMs
),因为它们非常擅长捕捉到长期独立性,而 Transformers
模型会更快并且更容易实现并行化。有时候,还会结合卷积神经网络来提升准确率。
BERT
[25] 和 GPT-2
[26] 被认为是目前最好的两个语言模型,它们实际上都是基于序列模型的 Transformers
13. 基于深度学习的计算机视觉
定位和目标检测(Localization and Object Detection)
图片定位[27] 是指在一张图片中定位到一个物体,并且用一个边界框将其进行标记的任务,而在目标检测中还包括了对物体的分类工作。
这几个相关联的工作都是通过一个基础的模型(以及其升级版本)来进行处理,这个模型就是 RCNN
。R-CNN
以及它的升级版本 Fast RCNN
,Faster RCNN
采用了候补区域(region proposals)和卷积神经网络。
以 Faster RCNN
为例,网络的一个外部系统会给出一些以固定大小的边界框形式展现的候补区域,这些区域可能包含目标物体。这些边界框会通过一个 CNN
(比如 AlexNet
)进行分类和纠正,从而判断该区域是否包含物体,物体是什么类别,并且修正边界框的大小。
Single shot detectors(SSD)
https://github.com/karolmajek/darknet-pjreddie
Single-shot detectors
以及其最著名的代表成员-- YOLO(You Only Look Once)
[28] 并没有采用候补区域的想法,它们采用的是一组预定义好的边界框。
这些边界框会传给 CNN
并分别预测得到一个置信度分数,同时检测每个框居中的物体,并进行分类,最终会仅保留分数最高的一个边界框。
这些年,YOLO
也有了好几个升级版本--YOLOv2
,YOLOv3
,YOLO900
分别在速度和准确率上都得到了提升。
语义分割(Semantic Segmentation)
计算机视觉中一个基础的工作就是基于上下文来将一张图片中每个像素都进行分类,也就是语义分割[29]。在这个领域里,最常用的两个模型就是全卷积网络(Fully Convolutional Networks, FCN)和 U-Nets
。
- **Fully Convolutional Networks(FCN)**是一个编码器-解码器的网络结构,也就是包含了卷积和反卷积的网络。编码器先将输入图片进行下采样来捕捉语义和上下文信息,而解码器是进行上采样操作来恢复空间信息。通过这种方法可以使用更小的时间和空间复杂度来实现恢复图片的上下文。
- U-Nets 是基于一个独特的想法--跨层连接(skip-connections)。它的编码器和解码器有相同的大小,
skip-connections
可以将信息从第一层传递到最后一层,从而增加了最终输出的维度大小。
姿势估计(Pose Estimation)
姿势估计[30] 是指定位图片或者视频中人物的关节点,它可以是 2D 或者是 3D 的。在 2D 中,我们估计的就是每个关节点的坐标 (x, y),而 3D 中,坐标就是 (x, y, z)。
PoseNet
[31] 是该领域[31]中最常用的模型,它使用的也是卷积神经网络。将图片输入到 CNN
中,然后采用单姿势或者多姿势算法来检测姿势,每个姿势都会得到一个置信度分数和一些关键点坐标,最终是仅保留一个分数最高的。
总结
上述就是本文的所有内容,非常简单的介绍了深度学习中几个常用的算法模型,包括了卷积神经网络、循环神经网络、自动编码器,也有最近几年才提出的生成对抗网络、Tranformers
,另外也分别介绍了深度学习的两大应用,自然语言处理和计算机视觉中常见的方向。
当然,本文也仅仅是非常简单的科普了这些算法和应用方向的情况,后续如果想继续深入了解,可以查看参考的链接,会更详细介绍每个具体的算法模型。
参考
- https://en.wikipedia.org/wiki/Deep_learning
- http://karpathy.github.io/neuralnets/
- https://brilliant.org/wiki/backpropagation/
- https://ruder.io/optimizing-gradient-descent/
- https://theaisummer.com/Neural_Network_from_scratch/
- https://theaisummer.com/Neural_Network_from_scratch_part2/
- https://theaisummer.com/Self_driving_cars/
- https://theaisummer.com/Sign-Language-Recognition-with-PyTorch/
- https://www.coursera.org/lecture/nlp-sequence-models/gated-recurrent-unit-gru-agZiL
- https://theaisummer.com/Bitcon_prediction_LSTM/
- https://theaisummer.com/Autoencoder/
- https://towardsdatascience.com/restricted-boltzmann-machines-simplified-eab1e5878976
- http://deeplearning.net/tutorial/DBN.html
- https://theaisummer.com/Generative_Artificial_Intelligence/
- https://ai.googleblog.com/2017/08/transformer-novel-neural-network.html
- https://lilianweng.github.io/lil-log/2018/06/24/attention-attention.html
- https://theaisummer.com/Graph_Neural_Networks/
- https://pathmind.com/wiki/word2vec
- https://medium.com/@jonathan_hui/nlp-word-embedding-glove-5e7f523999f6
- https://research.fb.com/blog/2016/08/fasttext/
- https://allennlp.org/elmo
- https://blog.floydhub.com/attention-mechanism/
- https://www.tensorflow.org/tutorials/text/nmt_with_attention
- https://blog.keras.io/a-ten-minute-introduction-to-sequence-to-sequence-learning-in-keras.html
- https://github.com/google-research/bert
- https://openai.com/blog/better-language-models/
- https://theaisummer.com/Localization_and_Object_Detection/
- https://theaisummer.com/YOLO/
- https://theaisummer.com/Semantic_Segmentation/
- https://theaisummer.com/Human-Pose-Estimation/
- https://github.com/tensorflow/tfjs-models/tree/master/posenet
- https://www.fritz.ai/pose-estimation/