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

本文共 3400 字,大约阅读时间需要 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 tf
    import numpy as np
    tf.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 length
    n_hidden = 2 # number of hidden units
    def 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_batch
    X = 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) + b
    cost = 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 语句操作索引SQL语句
    查看>>
    MySQL 误操作后数据恢复(update,delete忘加where条件)
    查看>>
    MySQL 调优/优化的 101 个建议!
    查看>>
    mysql 转义字符用法_MySql 转义字符的使用说明
    查看>>
    mysql 输入密码秒退
    查看>>
    mysql 递归查找父节点_MySQL递归查询树状表的子节点、父节点具体实现
    查看>>
    mysql 通过查看mysql 配置参数、状态来优化你的mysql
    查看>>
    mysql 里对root及普通用户赋权及更改密码的一些命令
    查看>>
    Mysql 重置自增列的开始序号
    查看>>
    mysql 锁机制 mvcc_Mysql性能优化-事务、锁和MVCC
    查看>>
    MySQL 错误
    查看>>
    mysql 随机数 rand使用
    查看>>
    MySQL 面试题汇总
    查看>>
    MySQL 面试,必须掌握的 8 大核心点
    查看>>
    MySQL 高可用性之keepalived+mysql双主
    查看>>
    MySQL 高性能优化规范建议
    查看>>
    mysql 默认事务隔离级别下锁分析
    查看>>
    Mysql--逻辑架构
    查看>>
    MySql-2019-4-21-复习
    查看>>
    mysql-5.6.17-win32免安装版配置
    查看>>