IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 自然语言处理(NLP)(三)模型篇之传统模型和RNN模型 -> 正文阅读

[人工智能]自然语言处理(NLP)(三)模型篇之传统模型和RNN模型

1.基础模型

1.1传统模型(HMM和CRF)

隐马尔可夫模型(Hidden Markov Model),隐马尔可夫模型,一般以文本序列数据为输入,以该序列对应的隐含序列为输出。
在这里插入图片描述

CRF(Conditional Random Fields)模型,称为条件随机场,一般也以文本序列数据为输入,以该序列对应的隐含序列为输出。
可用于解决文本序列标注问题,如分词,词性标注,命名实体识别。
在这里插入图片描述
在这里插入图片描述
感觉黑马视频这一部分讲得不是很好,以后看到了好的理论解释再补充。

1.2 传统RNN模型

RNN(Recurrent Neural Network)循环神经网络,循环使用一个隐藏层单元,将序列信息作为输入,能够很好地利用序列之间的关系。
根据输入输出结构来划分:

  1. N对N的RNN:输入输出等长都是序列数据,应用如诗句生成;

在这里插入图片描述

  1. N对1的RNN:输入序列数据,生成一种判断预测,应用如文本分类,用户意图识别;

在这里插入图片描述

  1. 1对N的RNN:输入一个结构化输入(如图片),应用如图片生成文字;

在这里插入图片描述

  1. N对M的RNN:输入输出端不规定长度,也常被称为seq2seq,由编码器和解码器组成(相当于N对1+1对M)。

在这里插入图片描述
传统RNN内部结构:
在这里插入图片描述
RNN基本使用:

import torch
import torch.nn as nn

rnn = nn.RNN(input_size, hidden_size, num_layers)
input = torch.randn(seq_len, batch_size, input_size)
h0 = torch.randn(num_layers, batch_size, hidden_size)
output, hn = rnn(input, h0)

优点:计算资源要求低,短序列任务性能效果比较优异;
缺点:长序列会导致梯度消失或梯度爆炸(反向传播算法和链式求导法则,sigmoid函数导致对特征进行运算后的值范围在[0, 0.025]之间,当权重很大时会导致梯度爆炸,当权重很小时会导致梯度消失)

2. 改进的RNN模型

2.1 LSTM模型

LSTM(Long Short-Term Memory),能够有效捕捉长序列之间的语义关联,缓解梯度消失或爆炸的问题。
LSTM结构:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Bi-LSTM:双向LSTM,模型复杂度翻倍。
在这里插入图片描述
pytorch中的LSTM:

"""
nn.LSTM类主要参数:
input_size: 输入张量x中特征维度的大小
hidden_szie: 隐层张量h中特征维度的大小
num_layers: 隐含层的数量
bidirectional: 是否选择双向

nn.LSTM类实例化对象主要参数:
input: 输入张量x
h0:初始化的隐层张量h
c0:初始化的细胞状态张量c
"""

import torch.nn as nn
import torch
# input_size, hidden_size, num_layers
rnn = nn.LSTM(5, 6, 2)
input_tensor = torch.randn(1, 3, 5)
h0 = torch.randn(2, 3, 6)
c0 = torch.randn(2, 3, 6)
output, (hm, cn) = rnn(input_tensor, (h0, c0))

2.1 GRU模型

GRU(Gated Recurrent Unit)也称为门控循环单元结构,核心结构可以分为两个部分:更新门和重置门。
在这里插入图片描述
GRU的pytorch实现:

"""
类参数和LSTM类似
nn.GRU实例化对象主要参数:
input: 输入张量x
h0:初始化的隐层张量h
"""
import torch
import torch.nn as nn
rnn = nn.GRU(5, 6, 2)
input_tensor = torch.randn(1, 3, 5)
h0 = torch.randn(2, 3, 6)
output, hn = rnn(input_tensor, h0)

2.3 注意力机制

注意力机制计算规则:需要三个指定的输入Q(query)、K(key)、V(value),然后通过计算公式得到注意力的结构,这个结果代表query在key和value作用下的注意力表示,当输入的Q=K=V表示自注意力机制。
常见的注意力计算规则:

将Q,K进行纵轴拼接,做一次线性变化,再使用softmax处理获得结果后与V做张量乘法:
A t t e n t i o n ( Q , K , V ) = s o f t m a x ( L i n e a r ( [ Q , K ] ) ) ? V Attention(Q,K,V)=softmax(Linear([Q,K]))·V Attention(Q,K,V)=softmax(Linear([Q,K]))?V
将Q,K进行纵轴拼接,做一次线性变化后再使用tanh函数激活,然后再进行内部求和,最后使用softmax处理获得结果再与V做张量乘法:
A t t e n t i o n ( Q , K , V ) = s o f t m a x ( ∑ ( t a n h ( L i n e a r ( [ Q , K ] ) ) ) ) ? V Attention(Q,K,V)=softmax(\sum(tanh(Linear([Q,K]))))·V Attention(Q,K,V)=softmax((tanh(Linear([Q,K]))))?V
将Q与K的转置做点积运算,然后除以一个缩放系数,再使用softmax处理获得结果最后与V做张量乘法:
A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q ? K T d k ) ) ? V Attention(Q,K,V)=softmax(\frac {Q·K^T}{\sqrt d_k}))·V Attention(Q,K,V)=softmax(d ?k?Q?KT?))?V

注:当注意力权重矩阵和V都是三维张量👎第一维度表示batch_size时,则做bmm运算:

# shape1(b*n*m) shpae2(b*m*p) shape3(b*n*p)
input_tensor = torch.randn(10, 3, 4)
mat2 = torch.randn(10, 4, 5)
res = torch.bmm(input_tensor, mat2)
print(res.size)
# torch.Size([10, 3, 5])

注意力机制的作用:

  1. 在解码器端的注意力机制:能够根据模型目标有效的聚焦编码器输出结果,当其作为解码器的输入时提升效果,改善以往编码器输出时单一定长张量,无法存储过多信息的情况;
  2. 在编码器端的注意力机制:主要解决表征问题,相当于特征提取过程,得到输入的注意力表示,一般使用自注意力。

pytorch实现:

import torch
import torch.nn as nn
import torch.nn.functional as F

class Attn(nn.Module):
	def __init__(self, query_size, key_size, value_szie1, value_size2, output_size):
	super(Attn, self).__init__()
	self.query_size = query_size
	self.key_size = key_size
	self.value_szie1 = value_szie1
	self.value_szie2 = value_szie2
	self.output_size = output_size

	# 初始化注意力机制实现第一步中需要的线性层
	self.attn = nn.Linear(self.query_size + self.key_size, value_size1)
	# 初始化注意力机制实现第三步中需要的线性层
	self.attn_combine = nn.Linear(self.query_size + self.value_size2, output_szie)

def forward(self, Q, K, V):
	# 第一步按照计算规则
	# 将Q,K进行纵轴拼接,做一次线性变化,再使用softmax处理获得结果
	attn_weights = F.softmax(self.attn(torch.cat(Q[0], K[0]), 1)), dim=1)
	# 与V进行矩阵乘法运算
	attn_applied = torch.bmm(attn_weights.unsqueeze(0), V)
	output = torch.cat(Q[0], attn_applied[0], 1)
	
	output = self.attn_combine(output).unsqueeze(0)
	return output, attn_weights
  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-07-26 12:05:46  更:2021-07-26 12:07:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/25 13:01:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码