TensorFlow2.0 循环神经网络

主宰稳场 提交于 2019-12-24 17:55:19

一、Embedding 层

1、词嵌入

在神经网络中,单词的表示向量可以直接通过训练的方式得到,我们把单词的表示层叫做Embedding 层。Embedding 层负责把单词编码为某个向量𝑣𝑒𝑐,他接受的是采用数字编码的单词𝑖𝑑𝑥,如2 表示“I”,3 表示“me”等,系统总单词数量记为𝑁𝑣𝑜𝑐𝑎𝑏,输出长度为f 的向量𝑣𝑒𝑐:𝑣𝑒𝑐 = 𝑓(𝑖𝑑𝑥|𝑁𝑣𝑜𝑐𝑎𝑏 , 𝑓)

Embedding 层实现起来非常简单,通过一个shape 为[𝑁𝑣𝑜𝑐𝑎𝑏, 𝑓]的查询表table,对于任意的单词𝑖𝑑𝑥,只需要查询到对应位置上的向量返回即可:𝑣𝑒𝑐 = 𝑡𝑎𝑏𝑙𝑒[𝑖𝑑𝑥]

Embedding 层是可训练的,他可放置在神经网络之前,完成单词到向量的转换,得到的表示向量可以继续通过神经网络完成后续任务,并计算误差ℒ,采用梯度下降算法来实现端到端(end-to-end)的训练。

from tensorflow.keras import Sequential,layers
import tensorflow as tf
x = tf.range(10)
x = tf.random.shuffle(x)
# 创建共10 个单词,每个单词用长度为4 的向量表示的层,每个索引代表一个单词的向量
net = layers.Embedding(10, 4)
out = net(x) # 通过输入索引得到对应的向量
print(out)
print(net.embeddings)
print(net.embeddings.trainable)

2、预训练的词向量

Embedding 层的查询表是随机初始化的,需要从零开始训练。实际上,我们可以使用预训练的Word embedding 模型来得到单词的表示方法,基于预训练模型的词向量相当于迁移了整个语义空间的知识,往往能得到更好的性能。目前应用的比较广泛的预训练模型有Word2Vec 和GloVe 等。他们已经在海量语料库训练得到了较好的表示方法,并可以直接导出学习到的词向量,方便迁移到其他任务。那么如何使用这些预训练的词向量模型来帮助提升NLP 任务的性能?非常简单,对于Embedding 层,不再采用随机初始化的方式,而是利用我们已经预训练好的模型参数去初始化Embedding 层的查询表。

# 从预训练模型中加载词向量表
embed_glove = load_embed('glove.6B.50d.txt')
# 直接利用预训练的词向量表初始化Embedding 层
net.set_weights([embed_glove])

3、语义信息

如何赋予网络提取整体语义特征的能力呢?或者说,如何让网络能够按序提取词向量的语义信息,并累积成整个句子的语境信息呢?我们想到了内存(Memory)机制。如果网络能够提供一个单独的memory 变量,每次提取词向量的特征并刷新memory,直至最后一个输入完成,此时的memory 即存储了所有序列的语义特征,并且由于输入之间的先后顺序,使得memory 内容与序列顺序紧密关联,如下图所示。而这个机制是全连接神经网络和卷积神经网络所不具备的,由此诞生了循环神经网络。

我们将上述Memory 机制实现为一个状态张量h,如图 所示,除了原来的w_{xh}参数共享外,我们额外增加了一个w_{hh}参数,每个时间戳t上状态张量h刷新机制为:

其中初始的状态张量h可以初始化为全0,经过s个词向量的输入后得到网络最终的状态张量 s, s较好地代表了句子的语义信息,基于s通过某个全连接层分类器完成情感分类任务。

二、循环神经网络

1、网络结构

2、梯度传播

未完待续 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!