本文共 3357 字,大约阅读时间需要 11 分钟。
本文将从LSTM循环神经网络入手,逐步介绍如何使用TensorFlow框架进行NLP入门,并从简单的NNLM模型逐步深入探讨。NNLM神经网络语言模型在理解Word2Vec等模型方面具有重要作用,尤其在后续应用CNN和LSTM进行文本分析时提供了有力支持。
语言建模概述与LSTM实践
1. 前言
本节以LSTM循环神经网络为例,介绍如何基于TensorFlow框架构建神经网络语言模型。通过实际代码演示,逐步实现从数据预处理到模型训练的完整流程。
2. 预处理
语言模型的训练需要大量文本数据,这些数据通常采用无监督学习方式训练。在实际应用中,可以选择公共数据集或自行收集生语料。公共数据集经过预处理后可以直接使用,而生语料则需要经过清洗、分词等步骤。
预处理步骤
- 句子分割:基于标点符号将文本分割为句子序列。英文句子分割时可能需要额外处理标点和缩写。
- 分词:对于没有词边界的语言(如中文),需要进行分词处理。可以选择基于字符级别的模型或使用现有的分词工具包。
3. 词典构建
词典是语言模型的核心,需要从训练数据中收集词频最高的分词,并分配唯一的索引。常见的处理步骤包括:
<unk>、<bos> 和 <pad> 等标识符,处理未登录词和填充/截断操作。4. 批数据生成
为了利用GPU加速,语言模型训练采用批处理方式。具体步骤包括:
5. 语言模型构建
模型主要由 embedding 层、LSTM层和输出层组成。
- 占位变量:定义输入和目标索引的占位符。
- 词向量映射:通过 embedding 层将词索引映射为向量。
- LSTM结构:使用多层LSTM处理时序信息,结合Dropout防止过拟合。
- 输出层:全连接层映射隐层状态到词向量空间,输出非归一化条件概率。
- Softmax归一化:将输出进行归一化,得到最终条件概率。
6. 模型训练
采用随机梯度下降(SGD)优化算法,训练语言模型。模型性能通过困惑度(Perplexity)评估,困惑度越小表示模型预测越好。
7. 模型预测
语言模型的预测分为两种模式:
第二部分 NNLM(Neural Network Language Model)神经网络语言模型
1. 前言
NNLM通过分布式词表示解决了N-gram模型的数据稀疏问题,同时具有更强的模式识别能力。其结构包括前向神经网络、循环神经网络(RNN)及其改进版LSTM和GRU。
2. 语言模型
语言模型的目标是评估词序列的概率,最大似然评估准则为基础。模型输出的目标序列与输入序列类似,通过链式法则计算条件概率。
3. 前向神经网络语言模型
前向神经网络语言模型采用全连接结构,主要局限是难以捕捉长距离依赖关系。其输入为前一个词的向量,输出为当前词的条件概率。
4. NNLM训练代码
以下是NNLM的训练代码示例:
import tensorflow as tfimport numpy as nptf.reset_default_graph()sentences = ["i like dog", "i love coffee", "i hate milk"]word_list = " ".join(sentences).split()word_list = list(set(word_list))word_dict = {w: i for i, w in enumerate(word_list)}number_dict = {i: w for i, w in enumerate(word_list)}n_class = len(word_dict)n_step = 2 # input sequence lengthn_hidden = 2 # number of hidden unitsdef make_batch(sentences): input_batch = [] target_batch = [] for sen in sentences: word = sen.split() input = [word_dict[n] for n in word[:-1]] target = word_dict[word[-1]] input_batch.append(np.eye(n_class)[input]) target_batch.append(np.eye(n_class)[target]) return input_batch, target_batchX = tf.placeholder(tf.float32, [None, n_step, n_class])Y = tf.placeholder(tf.float32, [None, n_class])input = tf.reshape(X, shape=[-1, n_step * n_class])H = tf.Variable(tf.random_normal([n_step * n_class, n_hidden]))d = tf.Variable(tf.random_normal([n_hidden]))U = tf.Variable(tf.random_normal([n_hidden, n_class]))b = tf.Variable(tf.random_normal([n_class]))tanh = tf.nn.tanh(d + tf.matmul(input, H))model = tf.matmul(tanh, U) + bcost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=model, labels=Y))optimizer = tf.train.AdamOptimizer(0.001).minimize(cost)prediction = tf.argmax(model, 1)init = tf.global_variables_initializer()sess = tf.Session()sess.run(init)input_batch, target_batch = make_batch(sentences)for epoch in range(5000): _, loss = sess.run([optimizer, cost], feed_dict={X: input_batch, Y: target_batch}) if (epoch + 1) % 1000 == 0: print('Epoch:', '%04d' % (epoch + 1), 'cost =', '{:.6f}'.format(loss))predict = sess.run([prediction], feed_dict={X: input_batch})test_input = [sen.split()[:2] for sen in sentences]print([sen.split()[:2] for sen in sentences], '>', [number_dict[n] for n in predict[0]]) 以上代码实现了一个简单的NNLM模型,能够在给定训练数据上进行词序列预测。
发表评论
最新留言
关于作者