原文链接:https://tecdat.cn/?p=37634
原文出处:拓端数据部落公众号
本文聚焦于利用马尔可夫递归神经网络(MarkovRNN)结合树库展开建模工作。MarkovRNN 通过整合马尔可夫特性与离散随机变量来深入探索递归神经网络中的随机转换机制,旨在高效处理具有复杂潜在信息的高度结构化序列数据。在该模型中,每个时间步的离散样本均源自参数化的分类分布,且潜在信息的编码取决于所选状态对应的不同状态编码器。
一、引言
语言建模在自然语言处理领域至关重要,它对于理解和生成自然语言文本起着关键作用。传统方法在处理复杂数据结构和潜在信息时存在一定局限性,而 MarkovRNN 模型为解决这些问题提供了新的思路。
马尔可夫递归神经网络(MRNN)通过将马尔可夫性质与离散随机变量相结合来探索递归神经网络中的随机转换。提出这个模型是为了处理具有复杂潜在信息的高度结构化的序列数据。在每个时间步,离散样本从参数化的分类分布中抽取,而潜在信息则根据所选状态由不同的状态编码器进行编码。
二、实验设置
软件环境
采用 Tensorflow 1.4.1 构建和运行模型。
数据集
选用树库作为实验数据集。以下是部分关键的数据导入代码:
-
from tensorflow.examples.tutorials.mnist import input_data
-
import tensorflow as tf
-
import tensorflow.contrib.slim as slim
-
import numpy as np
-
import reader
三、模型构建
(一)配置参数
定义了一个配置类(Config),其中涵盖了模型训练和运行的关键参数,如初始化规模(init_scale)、最大训练轮数(max_epoch)、批量大小(batch_size)等。
-
-
init_scale = 0.2
-
max_epoch = 50
-
max_max_epoch = 50
-
batch_size = 50
-
display_step = 50
-
lr = 20.0
-
lr_decay = 0.3
-
embed_drop = 0.2
-
input_drop = 0.4
(二)数据处理
Input 类负责处理输入数据,对数据的批量大小、时间步数、轮次大小等进行了定义,并实现了输入数据和目标数据的生成。
-
class Input(object):
-
def __init__(self, config, data, name=None):
-
self.batch_size = config.batch_size
-
self.num_steps = config.num_steps
-
self.epoch_size = ((len(data) // self.batch_size) - 1) // self.num_steps
-
self.input_data, self.targets = reader.ptb_producer(data, self.batch_size, self.num_steps, name=name)
(三)模型架构
Model 类构建了核心的 MRNN 模型。在模型初始化过程中,定义了如嵌入层(embedding)、输入(inputs)等变量。例如:
-
class Model(object):
-
def __init__(self, is_training, config, data):
-
with tf.device("/cpu:0"):
-
self.embedding = tf.get_variable("embedding", [config.vocab_size, config.input_size], dtype=tf.float32)
-
self.inputs = tf.nn.embedding_lookup(self.embedding, self.data.input_data)
在不同的作用域(scope)下构建了 MRNN 的复杂结构,同时计算了交叉熵(cross - entropy)、负对数似然(NLL)、熵(entropy)、成本(cost)等重要指标,并定义了训练操作(train_op)等。
四、实验过程与结果
(一)数据准备
读取原始数据(raw_data),并根据配置(config)和评估配置(eval_config)创建训练、验证和测试的输入数据(train_input、valid_input、test_input)以及对应的模型(m、mvalid、mtest)。
-
import os
-
raw_data = reader.ptb_raw_data('./data/')
-
train_data, valid_data, test_data, w2id, id2w = raw_data
-
config = Config()
(二)模型训练与评估
利用 TensorFlow 的 Supervisor 管理会话(session)进行模型训练。在每个训练轮次中,根据特定规则调整学习率和温度。训练完成后,进行模型验证与测试。实验结果表明,模型在处理语言建模任务方面表现出一定的性能,最终得到了相应的困惑度(perplexity)值,并绘制了训练和验证的困惑度曲线。
-
initializer = tf.random_uniform_initializer(-config.init_scale,config.init_scale)
-
st_input)
-
-
plt.figure()
-
plt.plot(range(1,len(ppl_train)+1),ppl_train,'b')
-
plt.show()
-
plt.figure()
-
plt.plot(range(1,len(ppl_valid)+1),ppl_valid,'r')
-
plt.show()
-
h = np.array(h)
-
print(h.shape)
-
h = np.array(np.split(h,2,3))
-
print(h.shape)
-
z = np.squeeze(np.array(z),[1,2])
-
print(z.shape)
-
qz = np.squeeze(np.array(qz),[1,2])
-
print(qz.shape)
-
x = np.array(x)
-
print(x.shape)
-
y = np.array(y)
-
print(y.shape)
-
logits = np.squeeze(np.array(logits),[1,2])
-
print(logits.shape)
(三)数据可视化
为了进一步分析模型的数据特征,进行了数据可视化操作。
这些可视化操作包括使用t - SNE
算法对数据进行降维处理,并将处理后的数据绘制成散点图进行展示,同时还对部分数据的分布进行了图像展示和统计图表展示。
-
from sklearn.manifold import TSNE
-
start_time = time.time()
-
N = 10000
-
# h_tsne = TSNE(n_components=2).fit_transform(h[:N,1,:])
-
h_tsne = TSNE(n_components=2).fit_transform(h[0,:N,0,0,:])
-
print("time: %f" % (time.time()-start_time))
-
N1 = 0
-
N2 = 20
-
step=1000
-
N=10000
-
for i in range(0,N,step):
-
fig = plt.figure(figsize=[5,5])
-
plt.subplot(2,1,1)
-
plt.imshow(z[N1+i:N2+i,:].T)
-
plt.subplot(2,1,2)
-
plt.imshow(qz[N1+i:N2+i,:].T)
-
plt.savefig(URL+'/traj_'+str(i)+'.png')
-
plt.show()
-
plt.bar(np.arange(config.K), np.sum(z,0)/np.sum(z), alpha=0.8)
-
plt.savefig(URL+'/stat.png')
-
plt.show()