博客
关于我
1.1 语言建模概述、LSTM具体实践、NNLM(Neural Network Language Model) 神经网络语言模型
阅读量:798 次
发布时间:2023-04-17

本文共 3357 字,大约阅读时间需要 11 分钟。

本文将从LSTM循环神经网络入手,逐步介绍如何使用TensorFlow框架进行NLP入门,并从简单的NNLM模型逐步深入探讨。NNLM神经网络语言模型在理解Word2Vec等模型方面具有重要作用,尤其在后续应用CNN和LSTM进行文本分析时提供了有力支持。

语言建模概述与LSTM实践

1. 前言

本节以LSTM循环神经网络为例,介绍如何基于TensorFlow框架构建神经网络语言模型。通过实际代码演示,逐步实现从数据预处理到模型训练的完整流程。

2. 预处理

语言模型的训练需要大量文本数据,这些数据通常采用无监督学习方式训练。在实际应用中,可以选择公共数据集或自行收集生语料。公共数据集经过预处理后可以直接使用,而生语料则需要经过清洗、分词等步骤。

预处理步骤
  • 清洗:去除不必要的字符,如URL、表情符号、特殊符号和HTML标签。
  • 字符转换:统一字符编码(如将全角转半角,简繁体转简体)。
  • 大小写处理:通常统一为小写或大写,但建议根据具体任务选择。
  • 分割
    • 句子分割:基于标点符号将文本分割为句子序列。英文句子分割时可能需要额外处理标点和缩写。
    • 分词:对于没有词边界的语言(如中文),需要进行分词处理。可以选择基于字符级别的模型或使用现有的分词工具包。
  • 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模型,能够在给定训练数据上进行词序列预测。

    转载地址:http://logfk.baihongyu.com/

    你可能感兴趣的文章
    MySql 创建函数 Error Code : 1418
    查看>>
    MySQL 创建新用户及授予权限的完整流程
    查看>>
    mysql 创建表,不能包含关键字values 以及 表id自增问题
    查看>>
    mysql 删除日志文件详解
    查看>>
    mysql 判断表字段是否存在,然后修改
    查看>>
    MySQL 到底能不能放到 Docker 里跑?
    查看>>
    mysql 前缀索引 命令_11 | Mysql怎么给字符串字段加索引?
    查看>>
    MySQL 加锁处理分析
    查看>>
    mysql 协议的退出命令包及解析
    查看>>
    mysql 参数 innodb_flush_log_at_trx_commit
    查看>>
    mysql 取表中分组之后最新一条数据 分组最新数据 分组取最新数据 分组数据 获取每个分类的最新数据
    查看>>
    MySQL 命令和内置函数
    查看>>
    mysql 四种存储引擎
    查看>>
    MySQL 在并发场景下的问题及解决思路
    查看>>
    MySQL 基础架构
    查看>>
    MySQL 基础模块的面试题总结
    查看>>
    MySQL 备份 Xtrabackup
    查看>>
    mYSQL 外键约束
    查看>>
    mysql 多个表关联查询查询时间长的问题
    查看>>
    mySQL 多个表求多个count
    查看>>