当前位置:   article > 正文

自然语言处理(nlp)前馈网络

自然语言处理(nlp)前馈网络

一、实验背景

       神经网络是机器学习中的一种重要模型,广泛应用于图像识别、自然语言处理等领域。感知器是最简单的神经网络,尽管它在某些任务上表现良好,但在面对复杂模式时存在局限性。为了解决这些问题,多层感知器(MLP)和卷积神经网络(CNN)应运而生。本实验旨在通过感知器、多层感知器和卷积神经网络的实现和对比,帮助大家理解神经网络的基础原理及其应用。

二.实验原理

1. 感知器与线性不可分问题

        感知器是最简单的神经网络,由输入层、权重和激活函数组成。它将输入向量与权重相乘并通过激活函数输出结果。感知器只能解决线性可分的问题,对于XOR等非线性可分问题无能为力。

感知器

XOR

       在本次研究中,我们将探索传统上称为前馈网络的神经网络模型,以及两种前馈神经网络:多层感知器(MLP)和卷积神经网络(CNN)。多层感知器在结构上扩展了我们以及学习过的的简单感知器,将多个感知器分组在一个单层,并将多个层叠加在一起。

2.The Multilayer Perceptron(多层感知器)

多层感知器(MLP)被认为是最基本的神经网络构建模块之一。最简单的MLP是对第3章感知器的扩展。感知器将数据向量作为输入,计算出一个输出值。在MLP中,许多感知器被分组,以便单个层的输出是一个新的向量,而不是单个输出值。在PyTorch中,正如您稍后将看到的,这只需设置线性层中的输出特性的数量即可完成。MLP的另一个方面是,它将多个层与每个层之间的非线性结合在一起。

最简单的MLP,如图4-2所示,由三个表示阶段和两个线性层组成。第一阶段是输入向量。这是给定给模型的向量。在“示例:对餐馆评论的情绪进行分类”中,输入向量是Yelp评论的一个收缩的one-hot表示。给定输入向量,第一个线性层计算一个隐藏向量——表示的第二阶段。隐藏向量之所以这样被调用,是因为它是位于输入和输出之间的层的输出。我们所说的“层的输出”是什么意思?理解这个的一种方法是隐藏向量中的值是组成该层的不同感知器的输出。使用这个隐藏的向量,第二个线性层计算一个输出向量。在像Yelp评论分类这样的二进制任务中,输出向量仍然可以是1。在多类设置中,将在本实验后面的“示例:带有多层感知器的姓氏分类”一节中看到,输出向量是类数量的大小。虽然在这个例子中,我们只展示了一个隐藏的向量,但是有可能有多个中间阶段,每个阶段产生自己的隐藏向量。最终的隐藏向量总是通过线性层和非线性的组合映射到输出向量

2.1 A Simple Example: XOR

让我们看一下前面描述的XOR示例,看看感知器与MLP之间会发生什么。在这个例子中,我们在一个二元分类任务中训练感知器和MLP:星和圆。每个数据点是一个二维坐标。在不深入研究实现细节的情况下,最终的模型预测如图4-3所示。在这个图中,错误分类的数据点用黑色填充,而正确分类的数据点没有填充。在左边的面板中,从填充的形状可以看出,感知器在学习一个可以将星星和圆分开的决策边界方面有困难。然而,MLP(右面板)学习了一个更精确地对恒星和圆进行分类的决策边界。

图4-3 从感知器(左)和MLP(右)学习的XOR问题的解决方案显示

图4-3中,每个数据点的真正类是该点的形状:星形或圆形。错误的分类用块填充,正确的分类没有填充。这些线是每个模型的决策边界。在边的面板中,感知器学习—个不能正确地将圆与星分开的决策边界。事实上,没有一条线可以。在右动的面板中,MLP学会了从圆中分离星。

虽然在图中显示MLP有两个决策边界,这是它的优点,但它实际上只是一个决策边界!决策边界就是这样出现的,因为中间表示法改变了空间,使一个超平面同时出现在这两个位置上。在图4-4中,我们可以看到MLP计算的中间值。这些点的形状表示类(星形或圆形)。我们所看到的是,神经网络(本例中为MLP)已经学会了“扭曲”数据所处的空间,以便在数据通过最后一层时,用一线来分割它们。

图MLP的输入和中间表示是可视化的。从左到右:(1)网络的输入;(2)第一个线性模块的输出;(3)第一个非线性模块的输出;(4)第二个线性模块的输出。第一个线性模块的输出将圆和星分组,而第二个线性模块的输出将数据点重新组织为线性可分的。

相反,如图4-5所示,感知器没有额外的一层来处理数据的形状,直到数据变成线性可分的。

图4-5 感知器的输入和输出表示。因为它没有像MLP那样的中间表示来分组和重新组织,所以它不能将圆和星分开。

2.2 Implementing MLPs in PyTorch

在上一节中,我们概述了MLP的核心思想。在本节中,我们将介绍PyTorch中的一个实现。如前所述,MLP除了实验3中简单的感知器之外,还有一个额外的计算层。在我们在例4-1中给出的实现中,我们用PyTorch的两个线性模块实例化了这个想法。线性对象被命名为fc1和fc2,它们遵循一个通用约定,即将线性模块称为“完全连接层”,简称为“fc层”。除了这两个线性层外,还有一个修正的线性单元(ReLU)非线性(在实验3“激活函数”一节中介绍),它在被输入到第二个线性层之前应用于第一个线性层的输出。由于层的顺序性,必须确保层中的输出数量等于下一层的输入数量。使用两个线性层之间的非线性是必要的,因为没有它,两个线性层在数学上等价于一个线性层4,因此不能建模复杂的模式。MLP的实现只实现反向传播的前向传递。这是因为PyTorch根据模型的定义和向前传递的实现,自动计算出如何进行向后传递和梯度更新。

三.实验部分代码

import torch.nn as nn

import torch.nn.functional as F

class MultilayerPerceptron(nn.Module):

    def __init__(self, input_dim, hidden_dim, output_dim):

        """

        Args:

            input_dim (int): the size of the input vectors

            hidden_dim (int): the output size of the first Linear layer

            output_dim (int): the output size of the second Linear layer

        """

        super(MultilayerPerceptron, self).__init__()

        self.fc1 = nn.Linear(input_dim, hidden_dim)

        self.fc2 = nn.Linear(hidden_dim, output_dim)

    def forward(self, x_in, apply_softmax=False):

        """The forward pass of the MLP

        Args:

            x_in (torch.Tensor): an input data tensor.

                x_in.shape should be (batch, input_dim)

            apply_softmax (bool): a flag for the softmax activation

                should be false if used with the Cross Entropy losses

        Returns:

            the resulting tensor. tensor.shape should be (batch, output_dim)

        """

        intermediate = F.relu(self.fc1(x_in))

        output = self.fc2(intermediate)

        if apply_softmax:

            output = F.softmax(output, dim=1)

        return output

batch_size = 2 # number of samples input at once

input_dim = 3

hidden_dim = 100

output_dim = 4

# Initialize model

mlp = MultilayerPerceptron(input_dim, hidden_dim, output_dim)

print(mlp)

import torch

def describe(x):

    print("Type: {}".format(x.type()))

    print("Shape/size: {}".format(x.shape))

    print("Values: \n{}".format(x))

x_input = torch.rand(batch_size, input_dim)

describe(x_input)

  • 知识梗概

前馈网络在自然语言处理中的应用

自然语言处理(NLP)是人工智能和计算机科学的一个重要领域,旨在使计算机能够理解、解释和生成人类语言。前馈神经网络(Feedforward Neural Networks, FFNN)是NLP中常用的一种基础模型,在很多任务中都得到了广泛应用。本文将介绍前馈网络的基本概念及其在自然语言处理中的一些典型应用。

什么是前馈神经网络?

前馈神经网络是一种最简单的人工神经网络结构,由输入层、隐藏层和输出层组成。信息在网络中单向传播,从输入层经过一个或多个隐藏层,然后到达输出层。每一层的节点(神经元)与下一层的节点全连接,并通过一些激活函数进行非线性变换。

前馈网络在NLP中的应用

文本分类

前馈网络可以用于文本分类任务,如垃圾邮件检测、情感分析和主题分类。典型的实现方式是将文本表示为向量(如词袋模型或TF-IDF向量),然后输入前馈网络进行分类。网络通过学习训练数据中的模式来预测新文本的类别。

词嵌入(Word Embeddings)

词嵌入技术,如Word2Vec和GloVe,常用于将词语转化为实数向量。这些向量捕捉了词语之间的语义关系。前馈网络可以用来训练这些嵌入,通过优化目标函数(如共现概率)来调整词向量,使得相似词在向量空间中的距离更近。

语言建模

语言模型预测给定上下文下一个词出现的概率。前馈网络可以构建简单的语言模型,通过输入固定长度的上下文窗口,输出下一个词的概率分布。这种模型虽然简单,但能提供一定的上下文信息,有助于后续更复杂模型的训练。

序列标注

序列标注任务包括命名实体识别(NER)、词性标注和分词等。前馈网络可以作为特征提取器,将输入序列的每个元素(如词或字符)映射到一个高维向量,然后通过后续层进行标注预测。

前馈网络的优势与局限

优势:

简单易实现:前馈网络结构简单,容易实现和训练。

速度快:由于没有循环或复杂的记忆机制,前馈网络的计算速度相对较快,适合实时应用。

局限:

缺乏上下文信息:前馈网络无法有效利用长距离依赖的信息,在处理涉及上下文依赖的任务时表现不佳。

参数量大:对于高维输入数据,前馈网络需要大量的参数,容易导致过拟合。

未来发展方向

尽管前馈网络有一定的局限性,但它作为深度学习模型的基础组件,仍然在很多复杂模型中起着重要作用。结合卷积神经网络(CNN)和循环神经网络(RNN)等模型,可以更好地捕捉文本中的局部和全局特征。此外,Transformer模型的兴起,也为自然语言处理带来了新的思路和方法。

总之,前馈神经网络在自然语言处理中的应用展示了其强大的建模能力和灵活性。随着技术的进步和数据规模的扩大,前馈网络及其变种将在更多的NLP任务中发挥重要作用。

  • 小结

     通过实现和对比感知器、多层感知器(MLP)和卷积神经网络(CNN),旨在帮助理解神经网络的基础原理及其应用。实验背景介绍了神经网络在机器学习中的重要性,指出感知器虽然简单,但在处理复杂模式时存在局限性,因此需要引入MLP和CNN等更复杂的模型。

     实验原理部分首先介绍了感知器及其局限性,感知器只能解决线性可分问题,对于非线性可分问题如XOR无能为力。接着,介绍了MLP,通过增加隐藏层和非线性激活函数,MLP能够处理非线性可分问题。MLP的关键在于前向传播和反向传播,通过计算损失函数的梯度来更新模型参数。最后,介绍了CNN,CNN专门用于处理具有网格结构的数据(如图像),通过卷积层提取局部特征,通过池化层降维,并通过全连接层进行分类或回归。

     实验步骤包括感知器、MLP和CNN的实现。首先,感知器的实现包括数据集的加载与预处理、向量化器和DataLoader的定义、模型的构建和训练循环的实现。在训练过程中,通过前向传播计算输出、计算损失、反向传播计算梯度并更新模型参数。接着,MLP的实现通过增加隐藏层和非线性激活函数,解决了感知器的局限性,并且在训练过程中引入了Dropout技术防止过拟合。最后,CNN的实现通过定义卷积层、池化层和全连接层,展示了CNN在处理图像和序列数据时的优势。

     实验结果表明,感知器只能处理线性可分问题,具有局限性,而MLP通过增加隐藏层和非线性激活函数,能够处理更复杂的非线性可分问题,分类准确率显著提高。CNN在处理图像和序列数据时表现出色,能够提取局部特征并进行有效分类,实验结果显示CNN在姓氏分类任务中表现良好,准确率较高。

     通过本实验,进一步理解了感知器、MLP和CNN的原理及其在实际任务中的应用。感知器适用于简单的线性可分问题,但在处理复杂数据时存在局限性。MLP通过增加隐藏层和非线性激活函数,能够处理非线性可分问题,适用于更复杂的任务。CNN在处理图像和序列数据时表现出色,能够提取局部特征并进行有效分类,适用于图像识别、语音识别和自然语言处理等领域。激活函数在MLP和CNN中引入非线性,使得模型能够学习复杂的模式,常见的激活函数包括Sigmoid、ReLU和Tanh等。Dropout是一种防止过拟合的正则化技术,通过随机“丢弃”一部分神经元,提高模型的泛化能力。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/784093
推荐阅读
相关标签
  

闽ICP备14008679号