ChatGPT入门之文本情绪识别:先了解LSTM如何处理文字序列

文章目录

    • 0. 首先聊聊什么是RNN
    • 1. 理解LSTM,从数据如何喂给 LSTM开始
    • 2. LSTM每个门是如何处理序列数据的?
      • 2.1 遗忘门(Forget Gate):该忘掉哪些信息?
      • 2.2 输入门(Input Gate):该记住哪些新信息?
      • 2.3 输出门(Output Gate):此刻该吐露什么?
    • 3. 用代码实现文本情感识别
      • **数据预处理**
      • **构建LSTM模型**
    • 4. 总结:LSTM如何发掘情感?
    • 5. 内容延展
    • 6.参考资料


想象这样一个任务:你希望训练一个模型,它能说出一段文字的情感是“正面”还是“负面”,比如:

  • “这部电影简直太棒了!” → 正面情感
  • “糟糕透顶,浪费了两个小时的时间。” → 负面情感

这就是一个典型的文本情感识别任务,而LSTM(长短期记忆网络)特别适合这种顺序依赖的数据。

接下来,我们通过这个具体的例子,从输入文本到情感分类,逐步剖析LSTM的内部机制,结合每一个“门”的作用,帮助你理解它是如何工作的。

0. 首先聊聊什么是RNN

思考问题时,人类不是每一时刻都是从零开始的。当你阅读这篇短文时,对于每一个词的理解都是基于这个词之前的词的含义。你不会把前面看到的丢弃,然后从零开始。你的思考是连贯的。

传统的神经网络无法做到这一点,并且这是它的一个主要的缺点。例如,假如你想清楚地知道在一个电影的每一个片段发生了什么样的事情。现在,还不能确定,传统的神经网络如何能够基于已知的事件推断出将要发生的事件。

循环神经网络致力于解决该问题。这样的网络通过环回链接,保持信息的连贯性。

带环的循环神经网络

在上图中,A是一个神经网络的一部分,输入 x t x_t xt得到输出 h t h_t ht。环回链接控制信息被从网络的一层传递到下一层。

这些环回链接使得循环神经网络看起来有些神秘。但是,如果你更进一步地思考,它与普通的神经网络没有太大的区别。一个循环神经网络可以被认为是一个网络的多个拷贝,每一个把信息传递给下一个。对循环神经网络做循环展开后,它就是下面的样子:
请添加图片描述

循环展开的循环神经网络

这种链式的本质说明了循环神经网络本质上与序列和链表相关。它天生就是要应用到这样的数据上。

RNNs最令人着迷的是,它也许能够将当前的任务与之前的信息联系起来。例如,通过视频以播放过的帧来理解当前的这一帧。如果RNNs能做到,它的作用是巨大的。RNNs能做到吗?在某些条件下是的。
有些时候,当前的任务是可以依据最近的信息推测出来的。例如,依据前面已经出现的词推测下一个词的语言模型。当我们推测“the clouds are in the sky,”这句话的最后一个词时,已经不需要其他的上下文了;非常明显这个词是“sky”或者"mountain"。在这种情况下,相关联的词汇间的距离很短,RNNs能够学习如何使用这些信息。

但是在某些情况下需要更多的上下文。例如预测这句话 - “I grew up in France… I speak fluent French.” - 的最后一个词。与目标词最近的相关信息表明这个词很可能指某个语言。但是如果把这个词缩小到某个具体的语言上,就需要与距离较远的France的上下文考虑到。
与目标点相关的信息与目标点之间的间隔非常的大,这是完全可能的。

不幸的是,随着距离的增加,RNNs就不能学习到这些关联信息。

在理论上,RNNs绝对能够处理长距离间的依赖关系。通过仔细挑选参数,能够在一些实验性的玩具项目上取得很好的效果。不幸的是,在现实中,RNNs不能学习使用这些信息。Hochreiter (1991) [German] 和 Bengio, et al. (1994), 在这方面做了深入的研究,他们的研究结果揭示了一些RNNs在这方面的本质上的缺陷。

令人欣慰的是,LSTMs能解决这个问题!


1. 理解LSTM,从数据如何喂给 LSTM开始

在情感识别中,输入是一段文本,比如:

输入句子

“This movie is fantastic and I love it!”

LSTM接收的数据要求是一个序列型输入,因此我们需要以下预处理步骤:

  1. 分词和索引化
    将句子分割成单词并用数值表示。例如:
    "This movie is fantastic and I love it!" → [1, 2, 3, 4, 5, 6, 7]
    (假设 “This” 对应索引 1,“movie” 对应索引 2,依此类推。)

  2. 嵌入向量表示
    每个单词会用一个固定长度的向量表示,例如通过**词嵌入(Embedding)**生成300维向量:

    [1, 2, 3, 4, 5, 6, 7] →
    [[0.5, 0.8, ...], [0.2, 0.9, ...], ..., [0.7, 0.4, ...]]
    

    输入的数据就变成了一个二维矩阵,形状为:
    (单词数, 每个单词的向量维度) = (7, 300)


2. LSTM每个门是如何处理序列数据的?

请添加图片描述

现在我们以这句输入 “This movie is fantastic and I love it!” 为例,逐步拆解 LSTM 的门机制,看看它是如何从文字序列中提取情感特征的。

2.1 遗忘门(Forget Gate):该忘掉哪些信息?

首先,遗忘门会接收当前单词的表示(如第一个单词 “This” 的嵌入向量)和上一时间步的信息(即隐藏状态 h t − 1 h_{t-1} ht1),决定过去哪些记忆应该被“遗忘”。

公式如下:

f t = σ ( W f [ h t − 1 , x t ] + b f ) f_t = \sigma(W_f[h_{t-1}, x_t] + b_f) ft=σ(Wf[ht1,xt]+bf)

  • x t x_t xt:当前时间步的输入(如 “This” 的向量表示)。
  • h t − 1 h_{t-1} ht1:上一时间步的隐藏状态(尚未产生)。
  • f t f_t ft:遗忘门输出向量(值在 0 和 1 之间)。接近1的值会保留过去信息,接近0的值会遗忘。

在解读句子的时候,“This”和情感无关,因此模型可能输出低遗忘比例,例如 f t = [ 0.3 , 0.1 , 0.2 , . . . ] f_t = [0.3, 0.1, 0.2, ...] ft=[0.3,0.1,0.2,...],表示对当前单词(“This”)相关的记忆会部分清除。


2.2 输入门(Input Gate):该记住哪些新信息?

遗忘了无关信息后,输入门决定哪些新信息需要记住。两个核心过程:

  1. 生成候选记忆内容 C ~ t \tilde{C}_t C~t
    当前单词向量(如"fantastic")经过权重变换和激活函数处理,生成可能的记忆内容:

    C ~ t = tanh ⁡ ( W C [ h t − 1 , x t ] + b C ) \tilde{C}_t = \tanh(W_C[h_{t-1}, x_t] + b_C) C~t=tanh(WC[ht1,xt]+bC)

    例如,“fantastic” 强烈关联到积极情感,候选记忆向量 C ~ t \tilde{C}_t C~t 的值可能表示强正面情感。

  2. 输入门决定记忆的权重 i t i_t it
    i t = σ ( W i [ h t − 1 , x t ] + b i ) i_t = \sigma(W_i[h_{t-1}, x_t] + b_i) it=σ(Wi[ht1,xt]+bi)

    输入门输出 i t i_t it 决定该候选记忆的比重。

  3. 更新记忆单元 C t C_t Ct
    最终,记忆单元的更新公式为:

    C t = f t ⋅ C t − 1 + i t ⋅ C ~ t C_t = f_t \cdot C_{t-1} + i_t \cdot \tilde{C}_t Ct=ftCt1+itC~t

在处理"fantastic"时,输入门可能输出 i t = [ 0.9 , 0.8 , 0.7 , . . . ] i_t = [0.9, 0.8, 0.7, ...] it=[0.9,0.8,0.7,...],表示“要记住这个强正面情感的单词”。然后结合候选记忆单元 C ~ t \tilde{C}_t C~t,将它添加到记忆中。


2.3 输出门(Output Gate):此刻该吐露什么?

最后,输出门决定当前记忆中哪些信息需要释放给下一层或时间步,用于接续处理或最终的分类。

  1. 计算输出门权重 o t o_t ot
    o t = σ ( W o [ h t − 1 , x t ] + b o ) o_t = \sigma(W_o[h_{t-1}, x_t] + b_o) ot=σ(Wo[ht1,xt]+bo)

  2. 生成隐藏状态 h t h_t ht
    h t = o t ⋅ tanh ⁡ ( C t ) h_t = o_t \cdot \tanh(C_t) ht=ottanh(Ct)

    h t h_t ht 是 LSTM 的输出,会直接用于下一时间步的计算,或通过全连接层参与情感分类。

在处理到句子最后的 “it” 时,LSTM 的隐藏状态已经累积了上下文信息。此时的 h t h_t ht 可能非常接近“正面情感”的特征表示。


3. 用代码实现文本情感识别

以下代码演示如何用 TensorFlow 构建一个简单的 LSTM 模型,用于情感分类任务。

数据预处理

from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences# 样本数据
texts = ["This movie is fantastic and I love it!",  # 正面情感"This film is horrible, I hate it!"        # 负面情感
]# 标签 (1 表示正面, 0 表示负面)
labels = [1, 0]# 分词与索引化
tokenizer = Tokenizer(num_words=10000)
tokenizer.fit_on_texts(texts)
sequences = tokenizer.texts_to_sequences(texts)# 填充序列到固定长度
maxlen = 10
X = pad_sequences(sequences, maxlen=maxlen, padding='post')
y = labels
print("输入形状:", X.shape)

构建LSTM模型

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Embedding, LSTM, Dense# 定义LSTM情感分类模型
model = Sequential([Embedding(input_dim=10000, output_dim=300, input_length=maxlen),LSTM(128, return_sequences=False),Dense(1, activation='sigmoid')
])model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.summary()# 假设使用训练数据进行训练
model.fit(X, y, batch_size=2, epochs=10)

4. 总结:LSTM如何发掘情感?

结合我们的例子可以看到:

  • 遗忘门:过滤掉“无关”单词对情感的影响,比如 “This”。
  • 输入门:捕捉关键情感词汇,比如 “fantastic”、“horrible”。
  • 输出门:输出情感特征,逐步累积句子的情感信息。

最后,通过分类器,我们得到了精准的情感判断:
“This movie is fantastic and I love it!” → Positive

从这一任务中,可以感受到 LSTM 对时间序列建模的强大能力,它让机器逐步理解了句子的情感含义!


5. 内容延展

虽然LSTM在处理文本、音频和其他序列数据时表现十分优秀,但它也有一定的局限性,例如当序列非常长时,仍然可能有信息丢失的问题。近年来,更加先进的模型正在逐渐取代LSTM:

  1. Transformer
    Transformer模型通过自注意力机制建模长距离依赖,极大提升了序列数据的建模能力。在自然语言处理任务(如机器翻译)中,Transformer已成为主流。

  2. Conformer
    在语音识别任务中,Conformer结合了卷积网络和Transformer的优势,是处理语音序列的强大模型。

  3. Mamba
    Mamba 是一种由斯坦福大学研究团队在 2023 年底提出的新型状态空间模型架构,它专为信息密集型任务(如长序列数据或高维数据)而生。与LSTM相比,Mamba使用选择性状态空间模型(Selective State Space Model, SSM),能够以线性时间复杂度处理长序列数据。

在后续内容中,我们将逐步介绍这些更现代、更强大的模型,敬请期待!


6.参考资料

[1] 理解LSTM网络 (https://colah.github.io/posts/2015-08-Understanding-LSTMs/).

[2] 深入理解LSTM (https://xiaohutou.github.io/2018/05/01/understanding-lstm-networks/).

[3] LSTM情绪识别实战 (https://github.com/lukasgarbas/nlp-text-emotion).


感谢各位读者耐心看到这里!如果这篇文章对您有所启发,请收藏、点赞和分享给更多的朋友,让我们一起交流人工智能的魅力。如果您有任何问题或想法,欢迎在评论区留言,我会尽量回复每一条评论!

期待我们在学习之路上的共同成长!🎉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/65880.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI学习路线图-邱锡鹏-神经网络与深度学习

1 需求 神经网络与深度学习 2 接口 3 示例 4 参考资料

C#用直线和曲线抗锯齿

使用 GDI 绘制一条线时,要提供线条的起点和终点,但不必提供有关线条上各个像素的任何信息。 GDI 与显示驱动程序软件协同工作,确定将打开哪些像素以在特定显示设备上显示该线条。 效果对比 代码实现 关键代码 e.Graphics.SmoothingMode Sm…

【opencv】第8章 图像轮廓与图像分割修复

8.1 查找并绘制轮廓 一个轮廓一般对应一系列的点,也就是图像中的一条曲线。其表示方法可能 根据不同的情况而有所不同。在OpenCV 中,可以用findContours()函数从二值图 像中查找轮廓 8.1.1 寻找轮廓: findContours() 函数 findContours) 函…

Unity 大地图功能 离线瓦片地图

不使用第二个摄像机实现类似开放世界的大地图功能。 功能如下: 按下M键打开/关闭大地图功能 打开大地图时,默认玩家位置居中 大地图支持拖拽,可调节拖拽速度,支持XY轴翻转 支持大地图设置边缘偏移量 可设置是否启动拖拽边界 …

Bootstrap 前端 UI 框架

Bootstrap官网:Bootstrap中文网 铂特优选 Bootstrap 下载 点击进入中文文档 点击下载 生产文件是开发响应式网页应用,源码是底层逻辑代码,因为是要制作响应式网页,所以下载开发文件 引入 css 文件, bootstrap.css 和 …

error: linker `link.exe` not found

开始学习rust,安装好rust的环境,开始从hello world开始,结果用在win10环境下,使用vs code或cmd窗口编译rust报错: PS E:\study_codes\rust-demo\chart01> rustc hello.rs error: linker link.exe not found| note:…

django基于Python的校园个人闲置物品换购平台

Django 基于 Python 的校园个人闲置物品换购平台 一、平台概述 Django 基于 Python 的校园个人闲置物品换购平台是专为校园师生打造的一个便捷、环保且充满活力的线上交易场所。它借助 Django 这一强大的 Python Web 开发框架,整合了校园内丰富的闲置物品资源&…

【Vim Masterclass 笔记10】S06L23:Vim 核心操作训练之 —— 文本的搜索、查找与替换操作(第二部分)

文章目录 S06L23 Search, Find, and Replace - Part Two1 文本替换命令 :s/old/new/2 指定范围的文本替换3 特例:路径的替换4 文件行号的配置5 要点总结(1)搜索当前行(Same Line Searching)(2)跨…

【计算机网络】课程 实验五 静态路由配置

实验五 静态路由配置 一、实验目的 理解静态路由的工作原理,掌握如何配置静态路由。 二、实验分析与设计 【背景描述】 假设校园网分为 2 个区域,每个区域内使用 1 台路由器连接 2 个子网, 现要在路由器上 做适当配置,实现校…

Linux下部署Redis(本地部署超详细)

非docker 1、下载Redis 历史版本: http://download.redis.io/releases 我的: http://download.redis.io/releases/redis-7.0.5.tar.gz 2.安装教程 1.Redis是基于c语言编写的需要安装依赖,需要安装gcc yum install gcc-c 2.查看gcc版…

Spring——几个常用注解

环境配置 1.在配置文件中导入约束(context — 共三个)并添加一项配置( context:annotation-config/) 才能支持注解的使用 context 约束: xmlns:context“http://www.springframework.org/schema/context” 2.xsi:schemaLocation下的:" http://ww…

Oopsie【hack the box】

Oopsie 解题流程 文件上传 首先开启机器后,我们先使用 nmap -sC -SV来扫描一下IP地址: -sC:使用 Nmap 的默认脚本扫描(通常是 NSE 脚本,Nmap Scripting Engine)。这个选项会自动执行一系列常见的脚本&am…

单片机-定时器中断

1、相关知识 振荡周期1/12us; //振荡周期又称 S周期或时钟周期(晶振周期或外加振荡周期)。 状态周期1/6us; 机器周期1us; 指令周期1~4us; ①51单片机有两组定时器/计数器,因为既可以定时,又可以计数,故称之为定时器…

【蓝牙】win11 笔记本电脑连接 hc-06

文章目录 前言步骤 前言 使用电脑通过蓝牙添加串口 步骤 设置 -> 蓝牙和其他设备 点击 显示更多设备 更多蓝牙设置 COM 端口 -> 添加 有可能出现卡顿,等待一会 传出 -> 浏览 点击添加 hc-06,如果没有则点击 再次搜索 确定 添加成…

2 XDMA IP中断

三种中断 1. Legacy 定义:Legacy 中断是传统的中断处理方式,使用物理中断线(例如 IRQ)来传递中断信号。缺点: 中断线数量有限,通常为 16 条,限制了可连接设备的数量。中断处理可能会导致中断风…

【算法】时间复杂度以及O(N^2)的排序

目录 1.常数时间的操作 2.时间复杂度 2.1.以选择排序为例 2.2.O(n^2)从何而来 2.3.冒泡排序 2.3.1.抑或运算 2.4.插入排序 3.二分法 3.1.局部最小 4.递归 4.1.递归行为时间复杂度的估计 1.常数时间的操作 一个操作如果和样本的数据量无关,每次都是固定时…

C# 或 .NetCore 如何使用 NPOI 导出图片到 Excel 文件

今天在本文中,我们将尝试使用NPOI库将图像插入到 Excel 文件的特定位置。请将以下逻辑添加到您的写作方法中,在 Excel 文件中添加图像(JPEG、PNG),我已经有一个示例 jpeg 文件 - Read-write-excel-npoi.jpg ,我们将尝试…

Observability:将 OpenTelemetry 添加到你的 Flask 应用程序

作者:来自 Elastic jessgarson 待办事项列表可以帮助管理与假期计划相关的所有购物和任务。使用 Flask,你可以轻松创建待办事项列表应用程序,并使用 Elastic 作为遥测后端,通过 OpenTelemetry 对其进行监控。 Flask 是一个轻量级…

使用Matplotlib显示中文的方法

1 问题提出 使用图1所示的代码进行matplotlib绘图时,因为其默认不支持中文,此时无法显示正确内容,如图2所示。 图1 matplotlib绘图绘图代码 图2 matplotlib无法显示中文 2 问题解决 2.1 设置全局字体 在图1所示的代码中,第13…

详解opencv resize之INTER_LINEAR和INTER_AREA

一。先简单介绍一下resize的用法 src:输入图, dst:输出图 dsize:输出图的宽高,如果dsize不为空(即宽高都不是0),则以dsize为准进行resize。 fx, fy是放大缩小的比例,是…