【NLP入门教程】二十三、循环神经网络(RNN)| 小白专场

2023-07-27 22:19:57

本教程旨在为初学者提供一份全面而系统的NLP入门指南,探索NLP的核心概念、方法和技术。无论你是计算机科学的新手,还是对自然语言处理领域感兴趣的研究人员,本教程都将为你提供所需的基础知识和实用技能。

当谈到自然语言处理(NLP)时,深度学习已经成为一种强大而广泛应用的技术。深度学习是一种机器学习方法,通过构建具有多层神经网络的模型来模拟和学习数据的复杂特征。在NLP领域,深度学习模型已经在多个任务上取得了突破性的性能,如文本分类、情感分析、机器翻译等。


🚀🚀🚀往期精彩文章:

循环神经网络(RNN)

循环神经网络(Recurrent Neural Networks,简称RNN)是一类特殊的神经网络,用于处理序列数据。与传统的前馈神经网络不同,RNN 在处理序列数据时引入了循环结构,使得网络可以保持一种记忆能力,能够更好地处理时序信息。RNN 在自然语言处理(NLP)、语音识别、时间序列预测等任务中取得了显著的成功。在本节中,我们将深入探讨RNN的原理、数学表达以及其在NLP中的应用。

1. RNN基本原理


RNN的核心思想是将当前时刻的输入和上一时刻的隐状态(hidden state)结合起来来进行计算。这种结构允许网络在处理序列数据时对先前的信息进行编码,从而具备处理时序信息的能力。在每个时间步上,RNN的计算可以表示如下:

h t = activation ( W h h ⋅ h t − 1 + W x h ⋅ x t + b h ) h_t = \text{activation}(W_{hh} \cdot h_{t-1} + W_{xh} \cdot x_t + b_h) ht=activation(Whhht1+Wxhxt+bh)

其中, h t h_t ht 是当前时刻的隐状态, h t − 1 h_{t-1} ht1 是上一时刻的隐状态, x t x_t xt 是当前时刻的输入, W h h W_{hh} Whh W x h W_{xh} Wxh b h b_h bh 是可学习的参数, activation \text{activation} activation 是激活函数。

2. BPTT:RNN的反向传播


为了训练RNN,我们需要定义损失函数并通过反向传播算法来更新网络的参数。在RNN中,我们使用一种称为Backpropagation Through Time(BPTT)的算法来完成反向传播。BPTT的过程与传统的反向传播类似,但由于RNN的循环结构,需要在时间维度上展开计算梯度。

BPTT的数学表达式如下:

∂ L ∂ W h h = ∑ t = 1 T ∂ L t ∂ W h h \frac{\partial L}{\partial W_{hh}} = \sum_{t=1}^{T} \frac{\partial L_t}{\partial W_{hh}} WhhL=t=1TWhhLt

∂ L ∂ W x h = ∑ t = 1 T ∂ L t ∂ W x h \frac{\partial L}{\partial W_{xh}} = \sum_{t=1}^{T} \frac{\partial L_t}{\partial W_{xh}} WxhL=t=1TWxhLt

其中, L L L 是损失函数, L t L_t Lt 是在时间步 t t t 上的损失, T T T 是序列的长度。

3. 长短时记忆网络(LSTM)


尽管RNN具备一定的记忆能力,但它面临着长期依赖问题,即在处理长序列时,隐状态的信息可能在时间上逐渐消失,导致较远的输入信息无法有效传递。为了解决这个问题,我们引入了长短时记忆网络(Long Short-Term Memory,简称LSTM)。

LSTM引入了称为门控机制的组件,包括输入门(input gate)、遗忘门(forget gate)和输出门(output gate)。这些门控制着信息的流动,允许LSTM在处理长序列时更好地保留和使用先前的信息。

LSTM的数学表达式如下:

其中, i t i_t it f t f_t ft o t o_t ot 分别是输入门、遗忘门和输出门的激活向量, C ~ t \tilde{C}_t C~t 是候选细胞状态, C t C_t Ct 是细胞状态, h t h_t ht 是隐状态, σ \sigma σ 是sigmoid激活函数, ⊙ \odot 表示逐元素乘法。

4. 双向循环神经网络(BiRNN)


双向循环神经网络(Bidirectional RNN,简称BiRNN)是一种结合了正向和反向信息的网络。在传统的RNN中,我们只利用了过去的信息,而忽略了未来信息。BiRNN通过在同一层次上构建两个RNN,一个正向处理序列,一个反向处理序列,从而有效利用了全部序列信息。

BiRNN的输出由两个RNN输出连接而成,可表示为:

h t = [ h t → , h t ← ] h_t = [\overrightarrow{h_t}, \overleftarrow{h_t}] ht=[ht ,ht ]

其中, h t → \overrightarrow{h_t} ht 是正向RNN在时刻 t t t 的隐状态, h t ← \overleftarrow{h_t} ht 是反向RNN在时刻 t t t 的隐状态。

5. 应用示例:情感分类


现在,让我们通过一个简单的NLP任务来演示RNN在实际中的应用。我们将使用情感分类作为示例,将一段文本分类为正面情感或负面情感。

假设我们有以下训练数据:

文本情感
“这部电影太棒了!”正面
“这个餐馆很糟糕。”负面
“我喜欢这个产品。”正面
“这个服务很差。”负面

首先,我们需要将文本数据转换为数值向量,通常使用词嵌入来表示每个单词。然后,我们可以构建一个简单的RNN模型来进行情感分类。

import tensorflow as tf
from tensorflow.keras.layers import Embedding, SimpleRNN, Dense

# 定义词汇表大小和词向量维度
vocab_size = 10000
embedding_dim = 100

# 构建RNN模型
model = tf.keras.Sequential([
    Embedding(vocab_size, embedding_dim),
    SimpleRNN(64),
    Dense(1, activation='sigmoid')
])

# 编译模型
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

# 训练模型
model.fit(X_train, y_train, epochs=10, batch_size=32, validation_data=(X_val, y_val))

在这个例子中,我们使用了一个简单的RNN层来处理序列数据,并在顶部添加了一个全连接层来输出二分类的结果。模型将文本转换为词向量后,通过RNN层进行序列处理,最终输出正面或负面情感的预测结果。

结论

本节中,我们深入探讨了循环神经网络(RNN)的基本原理、数学表达以及其在NLP中的应用。我们还介绍了LSTM和双向RNN的概念,并通过情感分类示例演示了RNN在实际NLP任务中的应用。RNN作为一种强大的序列处理工具,在NLP领域发挥着重要作用,但也有其局限性。为了更好地处理长序列和解决长期依赖问题,我们还可以探索更复杂的循环单元结构,如GRU和Transformer等。

深入学习循环神经网络和其他NLP技术将帮助你在自然语言处理领域取得更进一步的进展。希望本节内容对你理解和学习NLP有所帮助。

更多推荐

JavaScript系列从入门到精通系列第三篇:JavaScript基本语法(一)

文章目录一:JavaScript基本语法1:JS注释(一):JS多行注释(二):JS单行注释(三):JS中大小写(四):分号问题(五):空格和换行2:字面量和变量(一):字面量(二):变量(三):如何声明变量(四):如何给变量赋值(五):标识符二:JS中6种数据类型(一)1:JS字符串(一):JS字符串基本使用(二):

Ubuntu 安装 CUDA 与 OPENCL

前言:最近需要做一些GPU并行计算,因而入坑CUDA和OPENCL,两者都有用到一些,刚好有点时间,同时记录一些学习过程,排掉一些坑,这篇是环境安装篇,基本跟着走就没什么问题,环境:ubuntu18.04/ubuntu20.04显卡:Nvidia一、CUDA安装1.查看电脑是否识别GPUlspci|grep-invid

Liunx(Ubuntu20)常用指令

-rwxr-xr-x,在Linux系统中权限是区分用户的,即用户、组用户、其他用户,第一位表示文件的类型,-代表文件,d代表目录,其他每个用户占三个字符用户、组用户、其他用户都是rwx形式,其中r表示读、w表示写、x表示可执行,-表示没有权限,拿用户组举例,r只能出现在第一个位置、w只能出现在第二个位置、x只能出现在第

在 CentOS 上安装 Docker Engine

文章目录在CentOS上安装DockerEngine先决条件操作系统要求卸载旧版本安装方法使用rpm存储库安装设置存储库安装DockerEngine安装最新版本安装指定版本以非root用户身份管理Docker配置Docker以使用systemd启动参考官方文档:https://docs.docker.com/engin

阿里云服务器价格表,轻量和服务器最新活动价格表汇总

租用阿里云服务器怎么收费?阿里云服务器配置不同一年价格也不同,阿里云2核2G3M带宽108元一年、2核4G4M带宽297.98元12个月,云服务器u1公网带宽可选1M到5M,系统盘为ESSD云盘40GB起,CPU内存配置可选2核2G、2核4G、4核8G、8核16G等配置,还有ECS计算型c7、通用型g7和内存型r7多C

【SLAM】前端-视觉里程计之对极几何

文章目录【SLAM】前端-视觉里程计之对极几何1.对极几何2.本质矩阵及其求解3.单应矩阵及其求解3.三角测量4.思考4.1本质矩阵的自由度为多少4.2直接法求本质矩阵的过程涉及求解齐次线性方程,而对于齐次线性方程的解,要么只有零解,要么有无穷多个解,这里取哪一个解呢5.附录5.1相机成像模型【SLAM】前端-视觉里程

接口测试——接口协议抓包分析与mock_L1

目录:接口测试价值与体系常见的接口协议接口测试用例设计postman基础使用postman实战练习1.接口测试价值与体系接口测试概念接口:不同的系统之间相互连接的部分,是一个传递数据的通道接口测试:检查数据的交换、传递和控制管理过程接口测试的价值传统的测试方法成本急剧上升测试效率下降分层测试体系越往上,发现Bug的时间

CSS 布局 (三) 浮动、定位、多列布局

6、浮动最初用于在文本块内浮动图像,float属性成为在网页上创建多列布局最常用的工具之一。随着flexbox和grid的出现,它现在又回到了最初的目的,正如本文所解释的那样。6.1浮动的背景引入float属性是为了允许web开发人员实现包含图像在文本列内浮动的布局,文本在其左侧或右侧环绕。就像你在报纸版面上看到的那样

函数扩展之——内存函数

前言:小伙伴们又见面啦。本篇文章,我们将讲解C语言中比较重要且常用的内存函数,并尝试模拟实现它们的功能。让我们一起来学习叭。目录一.什么是内存函数二.内存函数有哪些1.memcpy(1)库函数memcpy(2)模拟实现memcpy2.memmove(1)库函数memmove(2)模拟实现memmove3.memset4

【大数据】HDFS 的常用命令

HDFS的常用命令1.操作命令1.1创建文件夹1.2列出指定的文件和目录1.3新建文件1.4上传文件1.5将本地文件移动到HDFS1.6下载文件1.7查看文件1.8追写文件1.9删除目录或者文件1.10显示占用的磁盘空间大小1.11HDFS中的文件复制1.12HDFS中的文件移动2.管理命令2.1报告文件系统的基本信息

ElasticSearch(二)

1.DSL查询文档elasticsearch的查询依然是基于JSON风格的DSL来实现的。1.1.DSL查询分类Elasticsearch提供了基于JSON的DSL(DomainSpecificLanguage)来定义查询。常见的查询类型包括:查询所有:查询出所有数据,一般测试用。例如:match_all全文检索(fu

热文推荐