循环神经网络(四)

一、循环神经网络和自然语言处理介绍

目标

  • 知token和tokenization
  • 知道N-gram的概念和作用
  • 知道文本向量化表示的方法

1.1 文本的tokenization

1.1.1 概念和工具的介绍

tokenization 就是通常所说的分词,分出的每一个词话我们把它称为token。
常见的分词工具很多,比如:

1.1.2 中英文分词的方法

在这里插入图片描述

1.2 N-garm表示方法

前面我们说,句子可以用但个字,词来表示,但是有的时候,我们可以用2个、3个或者多个词来表
N-gram一组一组的词语,其中的N表示能够被一起使用的词的数量
例如:
在这里插入图片描述
在这里插入图片描述

1.3 向量化

在这里插入图片描述

1.3.1 one-hot编码

在这里插入图片描述

1.3.2 word embedding

word embedding是深度学习中表示文本常用的一种方法。和one-hot偏码不同,word embedding使用了浮点型的稠密矩阵来表示token。根据词典的大小,我们的向量通常使用不同的维度,例如100,256,300等。其中向呈中的每一个值是一个超参数,其初始值是随机生成的,之后会在训练的过程中进行学习而获得。
如果我们文本中有20000个词语,如果使用one-hot编码,那么我们会有2000020000的矩阵,其中大多数的位置都为0,但是如果我们使用word embedding来表示的话,只需要20000 维度,比如20000*300
形象的表示就是:
在这里插入图片描述
在这里插入图片描述

1.3.3 word embedding API

在这里插入图片描述

在这里插入图片描述

1.3.4 数据的形状变化

思考:每个batch中的每个句子有10个词语,经过形状为[20,4]的Word emebedding之后,原来的句子会变成什么形状?
每个词语用长度为4的向量表示,所以,最终句子会变为 [batch_size,10,4]的形状。增加了一个维度,这个维度是embedding的dim

二、文本情感分类

目标

  1. 知道文本处理的基本方法
  2. 能够使用数据实现情感分类的

2.1 案例介绍

在这里插入图片描述

2.2 思路分析

首先可以把上述问题定义为分类问题,情感评分分为1-10,10个类别(也可以理解为回归问题,这里当做分类问题考虑)。那么根据之前的经验,我们的大致流程如下:

  1. 准备数据集
  2. 构建模型
  3. 横型训练
  4. 模型评估
    知道思路之后,那么我们一步步来完成上述步骤

2.3 准备数据集

在这里插入图片描述

2.3.1 基础Dataset的准备

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.3.2 文本序列化

再介绍word embedding的时候,我们说过,不会直接把文本转化为向量,而是先转化为数字,再把数字转化为向量,那么这个过程该如何实现呢?
这里我们可以考虑把文本中的每个词语和其对应的数字,使用字典保存,同时实现方法把句子通过字典映射为包含数字的列表
实现文本序列化之前,考虑以下几点:

  1. 如何使用字典把词语和数字进行对应
  2. 不同的语出现的次数不尽相同,是否需要对高频或者低频词语进行过滤,以及总的词语数量是否需要进行限制
  3. 得到词典之后,如何把句子转化为数字序列,如何把数字序列转化为句子
  4. 不同子长度不相同,每个batch的句子如何构造成相同的长度(可以对短句子进行填充,填充特殊字符)
  5. 对于新出现的词语在词典中没有出现怎么办(可以使用特殊字符代理)
    思路分析:
  6. 对所有句了进行分词
  7. 词语存入字典,根据次数对词语进行过滤,并统计次数
  8. 实现文本转数字序列的方法
  9. 实现数字序列转文本方法
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

2.4 构建模型

在这里插入图片描述

2.5 模型的训练和评估

在这里插入图片描述在这里插入图片描述

三、循环神经网络

目标

  1. 能够说出结环神经网络的概念和作用
  2. 能够说出循环神经网络的类型和应用场景
  3. 能够说出LSTM的作用和原理
  4. 能够说出GRU的作用和原理

3.1 循环神经网络的介绍

为什么有了神经网络还需要有循环神经网络?
在普通的神经网络中,信息的传递是单向的,这种限制虽然使得网络变得更容易学习,但在一定程度上也减弱了神经网络模型的能力。特别是在很多现实任务中,网络的输出不仅和当前时刻的输入相关,也和具过去一段时间的输出相关。此外,普通网络难以处理时序数据,比如视频、语音、文本等,时序数据的长度一般显不固定的,而前馈神经网络要求输入和输出的维数都是固定的,不能任意改变,因此,当处理这一类和时序相关的问题时,就需要一种能力更强的悦型。
循环神经网络(Recurrent Neural Network,RNN)是一类具有短期记忆能力的神经网络。在循环神经网络中,神经元不但可以接受其它神经元的信息,也可以接受自身的信息,形成具有环路的网络结构。换句话说:神经元的输出可以在下一个时间步直接作用到自身(作为输入)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2 LSTM和GRU

3.2.1 LSTM的基础介绍

假如现在有这样一个需求,根掘现有文本预测下一个词语,比如天上的云朵漂浮在_,通过问隔不远的位置就可以预测出来词语是天上,但是对于其他一些句子,可能需要被预测的词语在前100个词语之前,那么此时由于间隔非常大,随着间隔的增加可能会导致真实的预测值对结果的影响变的非常小,而无法非常好的进行预测(RNN中的长期依赖问题 (long-TermDependencies))
那么为了解决这个问题需要LSTM (Long Short-Term Memory网络)
LSTM是一种RNN特殊的类型,可以学习长期依赖信息。在很多问题上,LSTM都取得相当巨大的成功,并得到了广泛的应用。
在这里插入图片描述

3.2.2 LSTM的核心

在这里插入图片描述
在这里插入图片描述

3.2.3 逐步理解LSTM

3.2.3.1 遗忘门

在这里插入图片描述

3.2.3.2 输入门

在这里插入图片描述
在这里插入图片描述

3.2.3.3 输出门

在这里插入图片描述

3.2.4 GRU,LSTM的变形

在这里插入图片描述
LSTM内容参考地址: https://colah.github.ioposts/2015-08-Understanding:LSTMs/

3.3 双向LSTM

单向的 RNN,是根据前面的信息推出后面的,但有时候只看前面的词是不够的,可能需要预测的词语和后面的内容也相关,那么此时需要一种机制,能够让模型不仅能够从前往后的具有记忆,还需要从后往前需要记忆。此时双向LSTM就可以帮助我们解决这个问题
在这里插入图片描述

四、循环神经网络实现情感分类

目标

  1. 知道LSTM和GRU的使用方法及输入输出的格式
  2. 能够应用LSTM和GRU实现文本情感分类

4.1 Pytorch中LSTM和GRU模块使用

4.1.1 LSTM介绍

在这里插入图片描述
在这里插入图片描述

4.1.2 LSTM使用示例

假设数掘输入为 input,形状是[10,20],假设embedding的形状是[100,30]
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.1.2 LSTM和GRU的使用注意点

在这里插入图片描述

4.2 使用LSTM完成文本情感分类

在前面,我们使用了word embedding去实现了toy级别的文本情感分类,那么现在我们在这个模型中添加上LSTM层,观察分类效果。
为了达到更好的效果,对之前的模型做如下修改

  1. MAX_LEN = 200
  2. 构建dataset的过程,把数据转化为2分类的问题,pos为1,neg为0,否则25000个样本完成10个类别的划分数据量是不够的
  3. 在实例化LSTM的时候,使用dropout=0.5,在model.eval0的过程中,dropout自动会为0

五、Pythorch中的序列化容器

目标

  1. 知道梯度消失和梯度爆炸的原理和解决方法
  2. 能够使用nn.sequentia1完成模型的搭建
  3. 知道nn.BatchNormld的使用方法
  4. 知道nn.Dropout 的使用方法

5.1 梯度消失和梯度爆炸

在使用pytorch中的序列化 容器之前,我们先来了解一下常见的梯度消失和梯度海炸的问题

5.1.1 梯度消失

假设我们有四层极简神经网络:每层只有一个神经元
在这里插入图片描述
在这里插入图片描述

5.1.2 梯度爆炸

在这里插入图片描述

5.1.3 解决梯度消失或者梯度爆炸的经验

在这里插入图片描述

5.2 nn.Sequential

在这里插入图片描述
在这里插入图片描述

5.3 nn.BatchNormld

batch normalization 翻泽成中文就是批规范化,即在每个batch训练的过程中,对参数进行归一化的处理,从而达到加快训练速度的效果。
以sigmoid激活函数为例,他在反向传摇的过程中,在值为0,1的时候,梯度接近0,导致参数被更新的幅度很小,训练速度慢。但是如果对数掘进行归一化之后,就会尽可能的把数据拉倒[0-1]的范围,从而让参数更新的幅度变大,提高训练的速度。
batchNorm一般会放到激活函数之后,即对输入进行激活处理之后再进入batchNorm
在这里插入图片描述

5.4 nn.Dropout

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45529272/article/details/128129284