学习笔记,借鉴众多优秀文章,如有侵权,请联系我,立即删除!

个人学习笔记,错误之处欢迎大家批评指正

一、卷积神经网络CNN

卷积神经网络在最基本的形式上可以看作是一种使用许多相同神经元副本的神经网络。这使得网络可以拥有大量神经元并表达计算上庞大的模型,同时保持需要学习的实际参数(描述神经元行为的值)的数量相对较小。

卷积神经网络最著名的成功之一就是将 2D 卷积神经网络应用于图像识别。(图像、视频领域)

一个简单的卷积神经网络:

# 简单的卷积神经网络构建 conv1+ReLU,Maxpool,conv2+ReLU,Maxpool,FC
class CNN(nn.Module):
    def __init__(self):
        super(CNN, self).__init__()
        self.conv1 = nn.Sequential(             # 输入图像尺寸(1, 28, 28)
            nn.Conv2d(                          
                in_channels=1,                  # 灰度图
                out_channels=16,                # 要得到多少个特征图
                kernel_size=5,                  # 卷积核尺寸
                stride=1,                       # 步长
                padding=2,                      # 填充,如果希望卷积后的尺寸和原来一样,padding=(kernel_size-1)/2 if stride=1
            ),                                  # 输出特征图的尺寸(16, 28, 28)
            nn.ReLU(),
            nn.MaxPool2d(kernel_size=2),        # 最大池化,输出结果:(16, 14, 14)
        )
        self.conv2 = nn.Sequential(
            nn.Conv2d(16, 32, 5, 1, 2),         # 输出特征图尺寸(32, 14, 14)
            nn.ReLU(),
            nn.MaxPool2d(2),                    # 输出结果:(32, 7, 7)
        )
        self.out = nn.Linear(32 * 7 * 7, 10)    # 全连接层输出结果

    def forward(self, x):
        x = self.conv1(x)
        x = self.conv2(x)
        x = x.view(x.size(0), -1)
        output = self.out(x)
        return output

二、循环神经网络RNN和长短期记忆网络LSTM

循环神经网络RNN结构被广泛应用于自然语言处理、机器翻译、语音识别、文字识别等方向。

经典的循环神经网络结构:

看到一篇文章讲述十分详细,不仅介绍了RNN还有Seq2Seq,Attention注意力机制:完全解析RNN, Seq2Seq, Attention注意力机制 - 知乎

循环神经网络

人类并非每次思考都是从零开始。当你阅读这篇文章时,你会根据对前面词语的理解来理解每个单词。你不会把所有东西都抛掉,然后重新从头开始思考。你的思考具有持续性。

传统神经网络无法做到这一点,这似乎是一个重大缺陷。例如,想象一下你想要对电影中的每一个时刻发生的事件进行分类。传统神经网络如何利用其对电影中先前事件的推理来影响后续事件并不明确。

循环神经网络解决了这个问题。它们是具有循环的网络,允许信息持续存在。

循环神经网络有循环。

在上面的图中,一个神经网络块 AA 查看一些输入 xtxt 并输出一个值 htht 。一个循环允许信息从网络的一步传递到下一步。

这些循环使得循环神经网络看起来有些神秘。然而,如果你再深入思考一下,你会发现它们与普通神经网络并没有那么大的区别。可以将循环神经网络看作是多个相同网络的副本,每个副本将信息传递给下一个。考虑如果我们展开这个循环会发生什么:

An unrolled recurrent neural network.

展开的循环神经网络。

这种链式特性表明,循环神经网络与序列和列表密切相关。它们是神经网络处理此类数据的自然架构。

他们当然被使用了!在过去的几年里,RNNs 在解决各种问题上取得了惊人的成功:语音识别、语言建模、翻译、图像描述……等等。这个列表还在继续。我将把关于 RNNs 所能实现的惊人成就的讨论留给 Andrej Karpathy 的出色博客文章《循环神经网络的不合理有效性》。但它们确实非常惊人。

这些成功的关键在于使用“LSTM”,这是一种非常特殊的循环神经网络,在许多任务上比标准版本表现得要好得多。几乎所有基于循环神经网络的有趣结果都是通过它们实现的。本文将探讨的就是这些 LSTM。

长期依赖问题

RNNs 的吸引力之一在于它们可能能够将先前信息与当前任务联系起来,例如使用先前的视频帧来帮助理解当前帧。如果 RNN 能够做到这一点,它们将非常有用。但它们能吗?这取决于。

有时,我们只需要查看最近的信息来执行当前任务。例如,考虑一个试图根据前面的单词预测下一个单词的语言模型。如果我们试图预测“the clouds are in the sky”中的最后一个单词,我们不需要任何更多的上下文——很明显下一个单词将是 sky。在这种情况下,当相关信息与所需位置之间的差距较小时,RNN 可以学会使用过去的信息。

但是也存在需要更多上下文的情况。考虑尝试预测文本“I grew up in France… I speak fluent French.”中的最后一个单词。最近的信息表明下一个词可能是某种语言的名字,但如果我们想缩小范围,需要更早的法国上下文。相关信息与所需点之间的差距可能会变得非常大。

很遗憾,随着这个差距的扩大,循环神经网络(RNNs)无法学会连接信息。

Neural networks struggle with long term dependencies.

理论上,RNNs 完全能够处理这种“长期依赖”。人类可以仔细挑选参数来解决这种形式的玩具问题。遗憾的是,在实践中,RNNs 似乎无法学习这些依赖。这个问题被 Hochreiter(1991)[德语]和 Bengio 等人(1994)深入探讨,他们发现了一些可能难以解决的根本原因。

感谢上帝,LSTMs 没有这个问题!

长短期记忆网络

长短期记忆网络——通常简称为“LSTM”——是一种特殊的循环神经网络,能够学习长期依赖关系。它们由 Hochreiter 和 Schmidhuber(1997 年)提出,并在后续工作中被许多人改进和推广。 1 在各种问题上它们都表现出色,现在被广泛使用。

LSTMs 被明确设计来避免长期依赖问题。长时间记住信息几乎是它们的默认行为,而不是它们努力学习的!

所有循环神经网络都具有由重复模块组成的链的形式。在标准 RNN 中,这个重复模块将具有非常简单的结构,例如单个 tanh 层。

标准 RNN 中的重复模块包含单层。

LSTMs 也具有这种链式结构,但重复模块的结构不同。它不是只有一个神经网络层,而是有四个,以非常特殊的方式相互作用。

A LSTM neural network.

LSTM 中的重复模块包含四个相互作用的层。

不用担心具体发生的事情细节。我们稍后会一步一步地讲解 LSTM 图。现在,让我们先尝试熟悉我们将要使用的符号。

在上面的图中,每条线携带一个整个向量,从某个节点的输出到其他节点的输入。粉色圆圈代表逐点操作,如向量加法,而黄色方框是学习到的神经网络层。合并的线条表示拼接,而分叉的线条表示其内容被复制,副本被发送到不同的位置。

LSTMs 背后的核心思想

LSTMs 的关键是细胞状态,即贯穿图顶部的水平线。

细胞状态有点像传送带。它沿着整个链条直线运行,只有一些微小的线性交互。信息沿着它流动时几乎不会改变。

LSTM 确实具有通过称为门的结构仔细调节的删除或添加信息到细胞状态的能力。

门是一种可选地让信息通过的方式。它们由一个 Sigmoid 神经网络层和一个逐点乘法操作组成。

sigmoid 层输出介于零和一之间的数字,描述了应该让每个组件通过多少。零值表示“不让任何东西通过”,而一值表示“让所有东西通过!”

一个 LSTM 有三个这样的门,用于保护和控制细胞状态。

逐步 LSTM 教程

第一步,在我们的 LSTM 中,我们需要决定从单元状态中丢弃哪些信息。这个决定由一个称为“遗忘门层”的 sigmoid 层来完成。它查看h_{t-1}和 x_{t} ,并为单元状态中的每个数字C_{t-1}输出一个介于 0 和 1 之间的数字。 1 代表“完全保留这个”,而 0 代表“完全丢弃这个”。

让我们回到我们的例子,一个语言模型试图根据所有前面的单词来预测下一个单词。在这种情况下,单元状态可能包括当前主语的性别,以便可以使用正确的代词。当我们看到一个新的主语时,我们希望忘记旧主语的性别。

下一步是决定我们将要存储在单元状态中的新信息。这分为两部分。首先,一个名为“输入门层”的 sigmoid 层决定我们将更新哪些值。接下来,一个 tanh 层创建一个新候选值向量 \tilde{C_{t}},这些值可以添加到状态中。在下一步中,我们将结合这两个部分来创建对状态的更新。

在语言模型的例子中,我们希望将新主题的性别添加到单元状态中,以替换我们正在遗忘的旧状态。

现在是将旧单元状态  C_{t-1}更新为新细胞状态C_{t}的时候。前几步已经决定了要做什么,我们只需要实际去做。

我们乘以旧状态 f_{t},忘记之前决定忘记的事情。然后我们加上 i_{t}*\tilde{C_{t}}。这是新的候选值,按我们决定更新每个状态值的程度进行缩放。

在语言模型的情况下,这就是我们实际上会丢弃关于旧主题性别的信息并添加新信息的地方,正如我们在前面的步骤中决定的。

最后,我们需要决定要输出什么。这个输出将基于我们的细胞状态,但将是一个过滤后的版本。首先,我们运行一个 sigmoid 层,它决定我们要输出细胞状态的哪些部分。然后,我们将细胞状态通过 tanh (将值推到 −1 和 1 之间)并乘以 sigmoid 门的输出,这样我们只输出我们决定的部分。

对于语言模型示例,因为它刚刚看到了一个主语,它可能想要输出与动词相关的信息,以防接下来是动词。例如,它可能输出主语是单数还是复数,这样我们就可以知道如果接下来是动词,应该将其变形为何种形式。

翻译自:理解 LSTM 网络 -- colah 的博客 --- Understanding LSTM Networks -- colah's blog

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐