提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,深度学习这门技术也越来越重要,很多人都开启了学习深度学习,本文就介绍了深度学习的基础内容。
#博学谷IT学习技术支持#
一、循环神经网络
在本章节,我主要带着同学们学习循环神经网络相关知识,主要包含内容如下:
了解词嵌入层的作用
了解循环网络层的作用
最后,我将会带着同学们使用前面学习的知识来构建一个卷积神经网络,实现对歌词数据的学习,并能够根据给出的词来预测出指定长度的歌词。
二、RNN 概述
自然语言处理(Nature language Processing, NLP)研究的主要是通过计算机算法来理解自然语言。对于自然语言来说,处理的数据主要就是人类的语言,例如:汉语、英语、法语等,由于该类型的数据不像我们前面接触的过的结构化数据、或者图像数据可以很方便的进行数值化。所以,在本章节,我们主要学习如何将文本数据进行数值化的词嵌入技术、以及如何对文本数据建模的循环网络模型。
最后,我们通过使用学习到的技术完成文本生成任务,即:输入一个词,由模型预测出指定长度的歌词。
三、词嵌入层
词嵌入层首先会根据输入的词的数量构建一个词向量矩阵,例如: 我们有 100 个词,每个词希望转换成 128 维度的向量,那么构建的矩阵形状即为: 100*128,输入的每个词都对应了一个该矩阵中的一个向量。
在 PyTorch 中,我们可以使用 nn.Embedding 词嵌入层来实现输入词的向量化。接下来,我们将会学习如何将词转换为词向量,其步骤如下:
先将语料进行分词,构建词与索引的映射,我们可以把这个映射叫做词表,词表中每个词都对应了一个唯一的索引;
然后使用 nn.Embedding 构建词嵌入矩阵,词索引对应的向量即为该词对应的数值化后的向量表示。
例如,我们的文本数据为: “北京冬奥的进度条已经过半,不少外国运动员在完成自己的比赛后踏上归途。”,接下来,我们看下如何使用词嵌入层将其进行转换为向量表示,步骤如下:
首先,将文本进行分词;
然后,根据词构建词表;
最后,使用嵌入层将文本转换为向量表示。
nn.Embedding 对象构建时,最主要有两个参数:
num_embeddings 表示词的数量
embedding_dim 表示用多少维的向量来表示每个词
nn.Embedding(num_embeddings=10, embedding_dim=4)
代码如下:
import torch
import torch.nn as nn
import jieba
if __name__ == '__main__':
text = '北京冬奥的进度条已经过半,不少外国运动员在完成自己的比赛后踏上归途。'
# 1. 文本分词
words = jieba.lcut(text)
print('文本分词:', words)
# 2. 构建词表
index_to_word = {}
word_to_index = {}
# 分词去重并保留原来的顺序
unique_words = list(set(words))
for idx, word in enumerate(unique_words):
index_to_word[idx] = word
word_to_index[word] = idx
# 3. 构建词嵌入层
# num_embeddings: 表示词表词的总数量
# embedding_dim: 表示词嵌入的维度
embed = nn.Embedding(num_embeddings=len(index_to_word), embedding_dim=4)
# 4. 文本转换为词向量表示
print('-' * 82)
for word in words:
# 获得词对应的索引
idx = word_to_index[word]
# 获得词嵌入向量
word_vec = embed(torch.tensor(idx))
print('%3s\t' % word, word_vec)
四、关于词嵌入层的思考¶
我们的词嵌入层默认使用的是均值为 0,标准差为 1 的正态分布进行初始化,也可以理解为是随机初始化。有些同学可能就想,这个用来表示词的文本真的能够表达出词的含义吗?
nn.Embedding 中对每个词的向量表示都是随机生成的
当一个词输入进来之后,会使用随机产生的向量来表示该词
该词向量参与到下游任务的计算
下游任务计算之后,会和目标结果进行对比产生损失
接下来,通过反向传播更新所有的网络参数,这里的参数就包括了 nn.Embedding 中的词向量表示
这样通过反复的前向计算、反向传播、参数更新,最终我们每个词的向量表示就会变得更合理。
五、循环网络层
我们前面学习了词嵌入层,可以将文本数据映射为数值向量,进而能够送入到网络进行计算。但是,还存在一个问题,文本数据是具有序列特性的,例如: “我爱你”, 这串文本就是具有序列关系的,“爱” 需要在 “我” 之后,“你” 需要在 “爱” 之后, 如果颠倒了顺序,那么可能就会表达不同的意思。
为了能够表示出数据的序列关系我们需要使用循环神经网络(Recurrent Nearal Networks, RNN) 来对数据进行建模,RNN 是一个具有记忆功能的网络,它作用于处理带有序列特点的样本数据。
本小节,我们将会带着大家深入学习 RNN 循环网络层的原理、计算过程,以及在 PyTorch 中如何使用 RNN 层。
示例代码如下:
import torch
import torch.nn as nn
# 1. RNN 送入单个数据
def test01():
# 输入数据维度 128, 输出维度 256
rnn = nn.RNN(input_size=128, hidden_size=256)
# 第一个数字: 表示句子长度
# 第二个数字: 批量个数
# 第三个数字: 表示数据维度
inputs = torch.randn(1, 1, 128)
hn = torch.zeros(1, 1, 256)
output, hn = rnn(inputs, hn)
print(output.shape)
print(hn.shape)
# 2. RNN层送入批量数据
def test02():
# 输入数据维度 128, 输出维度 256
rnn = nn.RNN(input_size=128, hidden_size=256)
# 第一个数字: 表示句子长度
# 第二个数字: 批量个数
# 第三个数字: 表示数据维度
inputs = torch.randn(1, 32, 128)
hn = torch.zeros(1, 32, 256)
output, hn = rnn(inputs, hn)
print(output.shape)
print(hn.shape)
if __name__ == '__main__':
test01()
test02()
总结
本小节主要讲解了在自然语言处理任务中,经常使用的词嵌入层的使用。它的主要作用就是将输入的词映射为词向量,便于在网络模型中进行计算。
这里需要注意的是, 词嵌入层中的向量表示是可学习的,并不是固定不变的。
在本章节中我们学习了 RNN 层及其原理,并学习了 PyTorch 中 RNN 网络层的基本使用。