0

0

基于PaddlePaddle2.0-构建长短期记忆网络

P粉084495128

P粉084495128

发布时间:2025-07-29 10:44:58

|

313人浏览过

|

来源于php中文网

原创

本文介绍用PaddlePaddle2构建长短期记忆网络模型。先讲引入时间步的单隐藏层、多隐藏层模型,说明隐藏层输出与输入及前一时间步输出的关系;再阐述长短期记忆网络通过输入门、遗忘门、输出门处理长跨度时间依赖。最后用该模型对IMDB电影评论做情感预测,经10轮训练,测试集准确率约84% - 85%。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

基于paddlepaddle2.0-构建长短期记忆网络 - php中文网

PaddlePaddle2构建长短期记忆网络模型

作者:陆平

现实世界中,有一类问题是需要考虑时间顺序,比如,文本分类、机器翻译、语音识别、证券价格走势分析、宏观经济指标预测等。这类问题在推断下一个时间点的预测值时候,不仅需要依赖当前时间点的输入,还要依赖过去时间点的情况。利用长短期记忆网络模型可以用来处理具有长跨度时间依赖的问题。为了更易于理解,采用以下循序渐进的方式:首先需要理解如何在单隐藏层模型中引入时间步,其次是要理解如何构建引入时间步的多隐藏层模型,最后理解长短期记忆网络模型。

1. 引入时间步的单隐藏层模型

在解析模型之前,我们首先回顾一下多层感知机模型。多层感知机模型至少拥有1个隐藏层。给定一个大小为n的批量样本,特征数量为d,输入表示为XRn×dX∈Rn×d,批量化的输入特征与权重相乘,之后用函数σσ进行激活,隐藏层输出HRn×hH∈Rn×h为:

H=σ(Xwxh+bh)H=σ(Xwxh+bh)

其中,wxhRd×hwxh∈Rd×h,bhR1×hbh∈R1×h.如果是分类问题,设最终的类别数为c,接下来,把经过隐藏层激活的输出值进行线性转化,得到输出层的值。

O=Hwo+boO=Hwo+bo

其中,ORn×cO∈Rn×c,woRh×cwo∈Rh×c,boR1×cbo∈R1×c.

最后,进行SoftMax运算,把输出值转变成概率分布。

现在我们在模型中引入时间步概念。时间步t的隐藏层输出由时间步t-1的隐藏层输出与时间步t的输入共同决定。

设时间步t的输入为XtRn×dXt∈Rn×d,时间步t-1的隐藏层输出为Ht1Rn×hHt−1∈Rn×h,时间步t的隐藏层输出为:

Ht=σ(Xtwxh+Ht1whh+bh)Ht=σ(Xtwxh+Ht−1whh+bh)

其中,wxhRd×hwxh∈Rd×h,whhRh×hwhh∈Rh×h,bhR1×hbh∈R1×h.

接下来与多层感知机类似,把经过时间步t的隐藏层输出值进行线性转化,最后接SoftMax运算得到输出类别的概率。

2. 引入时间步的多隐藏层模型

下面我们来看拥有2个隐藏层的考虑时间步的多隐藏层模型。仍以构建多层感知机来理解,构造一个具有2个隐藏层的多层感知机。给定一个大小为n的批量样本,特征数量为d,输入表示为XRn×dX∈Rn×d,批量化的输入特征与权重相乘,之后用函数σσ进行激活,第一个隐藏层h1输出H(1)Rn×h1H(1)∈Rn×h1为:

H(1)=σ(Xwx,h1+bh1)H(1)=σ(Xwx,h1+bh1)

其中,wx,h1Rd×h1wx,h1∈Rd×h1,bh1R1×h1bh1∈R1×h1。 之后,接第二个隐藏层h2,该层的输出H(2)Rn×h2H(2)∈Rn×h2为:

H(2)=σ(H(1)wh1,h2+bh2)H(2)=σ(H(1)wh1,h2+bh2)

其中,wh1,h2Rh1×h2wh1,h2∈Rh1×h2,bh2R1×h2bh2∈R1×h2。 设最终的类别数为c,接下来,把经过隐藏层激活的输出值进行线性转化,得到输出层的值。

O=H(2)wh2,o+boO=H(2)wh2,o+bo

其中,ORn×cO∈Rn×c,wh2,oRh2×cwh2,o∈Rh2×c,boR1×cbo∈R1×c.

通过SoftMax运算,把输出值转变成概率分布。

参考多层感知机的构建方法,我们构造一个具有2个隐藏层的模型。 设时间步t的输入为XtRn×dXt∈Rn×d,时间步t-1的隐藏层h1输出为Ht11Rn×h1Ht−11∈Rn×h1,时间步t的隐藏层h1输出为:

Ht(1)=σ(Xtwx,h1+Ht1(1)wh1,h1+bh1)Ht(1)=σ(Xtwx,h1+Ht−1(1)wh1,h1+bh1)

其中,wx,h1Rd×h1wx,h1∈Rd×h1,wh1,h1Rh1×h1wh1,h1∈Rh1×h1,bhR1×h1bh∈R1×h1.

AI Web Designer
AI Web Designer

AI网页设计师,快速生成个性化的网站设计

下载

接下来进入第二个隐藏层,时间步t的隐藏层h2输出Ht(2)Rn×h2Ht(2)∈Rn×h2为:

Ht(2)=σ(Ht(1)wh1,h2+Ht1(2)wh2,h2+bh2)Ht(2)=σ(Ht(1)wh1,h2+Ht−1(2)wh2,h2+bh2)

其中,wh1,h2Rh1×h2wh1,h2∈Rh1×h2,wh2,h2Rh2×h2wh2,h2∈Rh2×h2,bh2R1×h2bh2∈R1×h2.

接下来,把经过第二个隐藏层的输出值进行线性转化,得到输出层的值。

Ot=Ht(2)wh2,o+boOt=Ht(2)wh2,o+bo

其中,OtRn×cOt∈Rn×c,wh2,0Rh2×cwh2,0∈Rh2×c,b0R1×cb0∈R1×c。最后通过SoftMax运算,把输出值转变成概率分布。

3. 长短期记忆网络

为了让模型具有处理具有长跨度时间依赖能力,长短期记忆网络模型通过输入门、遗忘门与输出门来选择性记忆时序信息。

长短期记忆网络模型的整体结构如下:

基于PaddlePaddle2.0-构建长短期记忆网络 - php中文网

输入门(input gate)是用来衡量当前时间步输入的重要程度。给定一个大小为n的批量样本,输入特征数量为d,输出特征数量为q。时间步t的输入表示为XtRn×dXt∈Rn×d,它与权重WiRd×qWi∈Rd×q相乘,再加上时间步t-1的输出特征Ht1Rn×qHt−1∈Rn×q与权重UiRq×qUi∈Rq×q乘积,接sigmoid函数激活,得到输出itRn×qit∈Rn×q为:

it=σ(XtWi+Ht1Ui)it=σ(XtWi+Ht−1Ui)

遗忘门(foget gate)是用来衡量上一个时间步的单元状态值Ct1Rn×qCt−1∈Rn×q被记忆的程度。时间步t的输入XtRn×dXt∈Rn×d与权重WfRd×qWf∈Rd×q相乘,时间步t-1的输出特征Ht1Rn×qHt−1∈Rn×q与权重UfRq×qUf∈Rq×q乘积,这两者相加后用sigmoid函数激活,得到输出ftRn×qft∈Rn×q:

ft=σ(XtWf+Ht1Uf)ft=σ(XtWf+Ht−1Uf)

输出门(output gate)是用来衡量单元状态值CtRn×qCt∈Rn×q的暴露程度。时间步t的输入XtRn×dXt∈Rn×d与权重WoRd×qWo∈Rd×q相乘,时间步t-1的输出特征Ht1Rn×qHt−1∈Rn×q与权重UoRq×qUo∈Rq×q乘积,这两者相加后用sigmoid函数激活,得到输出OtRn×qOt∈Rn×q:

Ot=σ(XtWo+Ht1Uo)Ot=σ(XtWo+Ht−1Uo)

假设新的单元状态值是当前时间步输入信息与上一时间步输出的某种融合。时间步t的输入XtRn×dXt∈Rn×d与权重WcRd×qWc∈Rd×q相乘,时间步t-1的输出特征Ht1Rn×qHt−1∈Rn×q与权重UcRq×qUc∈Rq×q乘积,这两者相加后用tanh函数激活。用以下式子表示:

C~t=tanh(XtWc+Ht1Uc)C~t=tanh(XtWc+Ht−1Uc)

通过上面三个门,实现对时序信息进行选择性记忆与遗忘。时间步t的单元状态值CtCt是以下两者的结合:一是上一时间步单元状态值Ct1Ct−1与记忆度ftft按元素相乘,用来衡量被留下来的记忆。二是新的单元状态值C~tC~t与重要度itit按元素相乘,用来衡量新信息的重要性。

Ct=ftCt1+itC~tCt=ft⨀Ct−1+it⨀C~t

最后,用输出门控制单元状态值CtCt的暴露程度,得到输出HtRn×qHt∈Rn×q,表示如下:

Ht=OttanhCtHt=Ot⨀tanhCt

4. 基于LSTM模型的电影评论情感倾向预测

基于PaddlePaddle2.0基础API构建LSTM模型,利用互联网电影资料库Imdb数据来进行电影评论情感倾向预测。

In [1]
import numpy as npimport paddle#准备数据#加载IMDB数据imdb_train = paddle.text.datasets.Imdb(mode='train') #训练数据集imdb_test = paddle.text.datasets.Imdb(mode='test') #测试数据集#获取字典word_dict = imdb_train.word_idx#在字典中增加一个<pad>字符串word_dict['<pad>'] = len(word_dict)#参数设定vocab_size = len(word_dict)
embedding_size = 256hidden_size = 256n_layers = 2dropout = 0.5seq_len = 200batch_size = 64epochs = 10pad_id = word_dict['<pad>']#每个样本的单词数量不一样,用Padding使得每个样本输入大小为seq_lendef padding(dataset):
    padded_sents = []
    labels = []    for batch_id, data in enumerate(dataset):
        sent, label = data[0].astype('int64'), data[1].astype('int64')
        padded_sent = np.concatenate([sent[:seq_len], [pad_id] * (seq_len - len(sent))]).astype('int64')
        padded_sents.append(padded_sent)
        labels.append(label)    return np.array(padded_sents), np.array(labels)

train_x, train_y = padding(imdb_train)
test_x, test_y = padding(imdb_test)    
class IMDBDataset(paddle.io.Dataset):
    def __init__(self, sents, labels):
        self.sents = sents
        self.labels = labels    def __getitem__(self, index):
        data = self.sents[index]
        label = self.labels[index]        return data, label    def __len__(self):
        return len(self.sents)

train_dataset = IMDBDataset(train_x, train_y)
test_dataset = IMDBDataset(test_x, test_y)

train_loader = paddle.io.DataLoader(train_dataset, return_list=True, shuffle=True, batch_size=batch_size, drop_last=True)
test_loader = paddle.io.DataLoader(test_dataset, return_list=True, shuffle=True, batch_size=batch_size, drop_last=True)#构建模型class LSTM(paddle.nn.Layer):
    def __init__(self):
        super(LSTM, self).__init__()
        self.embedding = paddle.nn.Embedding(vocab_size, embedding_size)
        self.lstm_layer = paddle.nn.LSTM(embedding_size, 
                                         hidden_size, 
                                         num_layers=n_layers, 
                                         direction='bidirectional', 
                                         dropout=dropout)
        self.linear = paddle.nn.Linear(in_features=hidden_size * 2, out_features=2)
        self.dropout = paddle.nn.Dropout(dropout)        
    def forward(self, text):
        #输入text形状大小为[batch_size, seq_len]
        embedded = self.dropout(self.embedding(text))        #embedded形状大小为[batch_size, seq_len, embedding_size]
        output, (hidden, cell) = self.lstm_layer(embedded)        #output形状大小为[batch_size,seq_len,num_directions * hidden_size]
        #hidden形状大小为[num_layers * num_directions, batch_size, hidden_size]
        #把前向的hidden与后向的hidden合并在一起
        hidden = paddle.concat((hidden[-2,:,:], hidden[-1,:,:]), axis = 1)
        hidden = self.dropout(hidden)        #hidden形状大小为[batch_size, hidden_size * num_directions]
        return self.linear(hidden)#以下使用PaddlePaddle2.0高层API进行训练与评估#封装模型model = paddle.Model(LSTM()) #用Model封装lstm模型#配置模型优化器、损失函数、评估函数model.prepare(paddle.optimizer.Adam(learning_rate=0.001, parameters=model.parameters()),
              paddle.nn.CrossEntropyLoss(),
              paddle.metric.Accuracy())#模型训练与评估model.fit(train_loader,
          test_loader,
          epochs=epochs,
          batch_size=batch_size,
          verbose=1)
Cache file /home/aistudio/.cache/paddle/dataset/imdb/imdb%2FaclImdb_v1.tar.gz not found, downloading https://dataset.bj.bcebos.com/imdb%2FaclImdb_v1.tar.gz 
Begin to download

Download finished
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/distributed/parallel.py:119: UserWarning: Currently not a parallel execution environment, `paddle.distributed.init_parallel_env` will not do anything.
  "Currently not a parallel execution environment, `paddle.distributed.init_parallel_env` will not do anything."
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddle/fluid/layers/utils.py:77: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
  return (isinstance(seq, collections.Sequence) and
The loss value printed in the log is the current step, and the metric is the average value of previous step.
Epoch 1/10
step 390/390 [==============================] - loss: 0.5087 - acc: 0.6604 - 59ms/step         
Eval begin...
The loss value printed in the log is the current batch, and the metric is the average value of previous step.
step 390/390 [==============================] - loss: 0.5934 - acc: 0.7306 - 20ms/step        
Eval samples: 24960
Epoch 2/10
step 390/390 [==============================] - loss: 0.5487 - acc: 0.7938 - 59ms/step         
Eval begin...
The loss value printed in the log is the current batch, and the metric is the average value of previous step.
step 390/390 [==============================] - loss: 0.4090 - acc: 0.7619 - 20ms/step        
Eval samples: 24960
Epoch 3/10
step 390/390 [==============================] - loss: 0.3800 - acc: 0.8056 - 59ms/step         
Eval begin...
The loss value printed in the log is the current batch, and the metric is the average value of previous step.
step 390/390 [==============================] - loss: 0.4242 - acc: 0.8118 - 20ms/step        
Eval samples: 24960
Epoch 4/10
step 390/390 [==============================] - loss: 0.3291 - acc: 0.8685 - 59ms/step         
Eval begin...
The loss value printed in the log is the current batch, and the metric is the average value of previous step.
step 390/390 [==============================] - loss: 0.3761 - acc: 0.8407 - 20ms/step        
Eval samples: 24960
Epoch 5/10
step 390/390 [==============================] - loss: 0.3086 - acc: 0.8935 - 59ms/step         
Eval begin...
The loss value printed in the log is the current batch, and the metric is the average value of previous step.
step 390/390 [==============================] - loss: 0.2944 - acc: 0.8450 - 20ms/step        
Eval samples: 24960
Epoch 6/10
step 390/390 [==============================] - loss: 0.3261 - acc: 0.9089 - 59ms/step        
Eval begin...
The loss value printed in the log is the current batch, and the metric is the average value of previous step.
step 390/390 [==============================] - loss: 0.2982 - acc: 0.8532 - 20ms/step        
Eval samples: 24960
Epoch 7/10
step 390/390 [==============================] - loss: 0.1241245 - acc: 0.9227 - 58ms/step        
Eval begin...
The loss value printed in the log is the current batch, and the metric is the average value of previous step.
step 390/390 [==============================] - loss: 0.5826 - acc: 0.8406 - 20ms/step        
Eval samples: 24960
Epoch 8/10
step 390/390 [==============================] - loss: 0.2069 - acc: 0.9365 - 59ms/step         
Eval begin...
The loss value printed in the log is the current batch, and the metric is the average value of previous step.
step 390/390 [==============================] - loss: 0.4760 - acc: 0.8495 - 20ms/step        
Eval samples: 24960
Epoch 9/10
step 390/390 [==============================] - loss: 0.1122 - acc: 0.9460 - 59ms/step         
Eval begin...
The loss value printed in the log is the current batch, and the metric is the average value of previous step.
step 390/390 [==============================] - loss: 0.3009 - acc: 0.8424 - 20ms/step        
Eval samples: 24960
Epoch 10/10
step 390/390 [==============================] - loss: 0.1645 - acc: 0.9540 - 59ms/step         
Eval begin...
The loss value printed in the log is the current batch, and the metric is the average value of previous step.
step 390/390 [==============================] - loss: 0.6611 - acc: 0.8377 - 20ms/step        
Eval samples: 24960
代码解释

经过10轮epoch训练,模型在测试数据集上的准确率大约为84%至85%。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

46

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

178

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

51

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

92

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

102

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

227

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

532

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

171

2026.03.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号