【自然语言处理(NLP)】基于Word2Vec的语言模型实践

时间:2022-10-19 17:00:57

【自然语言处理(NLP)】基于Word2Vec的语言模型实践


作者简介:在校大学生一枚,华为云享专家,阿里云专家博主,腾云先锋(TDP)成员,云曦智划项目总负责人,全国高等学校计算机教学与产业实践资源建设专家委员会(TIPCC)志愿者,以及编程爱好者,期待和大家一起学习,一起进步~ . 博客主页ぃ灵彧が的学习日志 . 本文专栏人工智能 . 专栏寄语:若你决定灿烂,山无遮,海无拦 . 【自然语言处理(NLP)】基于Word2Vec的语言模型实践

(文章目录)


前言

(一)、任务描述

本文主要介绍基于lstm的语言的模型的实现,给定一个输入词序列(中文分词、英文tokenize),计算其ppl(语言模型困惑度,用户表示句子的流利程度),基于循环神经网络语言模型的介绍可以参阅论文。相对于传统的方法,基于循环神经网络的方法能够更好的解决稀疏词的问题。


(二)、效果说明

在small meidum large三个不同配置情况的ppl对比:

small config train valid test
paddle 40.962 118.111 112.617
tensorflow 40.492 118.329 113.788
medium config train valid test
paddle 45.620 87.398 83.682
tensorflow 45.594 87.363 84.015
large config train valid test
paddle 37.221 82.358 78.137
tensorflow 38.342 82.311 78.121

一、数据准备


(一)、数据集下载

此任务的数据集合是采用ptb dataset,下载地址为: http://www.fit.vutbr.cz/~imikolov/rnnlm/simple-examples.tgz


(二)、模型调用

训练或fine-tune

任务训练启动命令如下:

!python train.py --use_gpu True --data_path data/data11325/simple-examples/data --model_type small --rnn_model basic_lstm
  • 需要指定数据的目录,默认训练文件名为 ptb.train.txt,可用--train_file指定;默认验证文件名为 ptb.valid.txt,可用--eval_file指定;默认测试文件名为 ptb.test.txt,可用--test_file指定
  • 模型的大小(默认为small,用户可以选择medium, 或者large)
  • 模型的类型(默认为static,可选项static|padding|cudnn|basic_lstm)
  • batch大小默认和模型大小有关,可以通过--batch_size指定
  • 训练轮数默认和模型大小有关,可以通过--max_epoch指定
  • 默认将模型保存在当前目录的models目录下

二、进阶使用

(一)、任务定义与建模

此任务目的是给定一个输入的词序列,预测下一个词出现的概率。


(二)、模型原理介绍

此任务采用了序列任务常用的rnn网络,实现了一个两层的lstm网络,然后lstm的结果去预测下一个词出现的概率。计算的每一个概率和实际下一个词的交叉熵,然后求和,做e的次幂,得到困惑度ppl。当前计算方式和句子的长度有关,仍需要继续优化。

由于数据的特殊性,每一个batch的last hidden和last cell会被作为下一个batch 的init hidden 和 init cell,数据的特殊性下节会介绍。


(三)、数据格式说明

此任务的数据格式比较简单,每一行为一个已经分好词(英文的tokenize)的词序列。

目前的句子示例如下图所示:

aer banknote berlitz calloway centrust cluett fromstein gitano guterman hydro-quebec ipo kia memotec mlx nahb punts rake regatta rubens sim snack-food ssangyong swapo wachter
pierre <unk> N years old will join the board as a nonexecutive director nov. N
mr. <unk> is chairman of <unk> n.v. the dutch publishing group

特殊说明:ptb的数据比较特殊,ptb的数据来源于一些文章,相邻的句子可能来源于一个段落或者相邻的段落,ptb 数据不能做shuffle


(四)、目录结构

.
├── train.py             # 训练代码
├── reader.py            # 数据读取
├── args.py              # 参数读取
├── config.py              # 训练配置
├── data                # 数据下载
├── language_model.py  		  # 模型定义文件

三、组建模型

(一)、自定义数据

关于数据,如果可以把自己的数据先进行分词(或者tokenize),然后放入到data目录下,并修改reader.py中文件的名称,如果句子之间没有关联,用户可以将train.py中更新的代码注释掉。

   init_hidden = np.array(fetch_outs[1])
   init_cell = np.array(fetch_outs[2])

(二)、网络结构更改

网络只实现了基于lstm的语言模型,用户可以自己的需求更换为gru或者self等网络结构,这些实现都是在language_model.py 中定义


四、相关代码

(一)、解压数据集

# 解压数据集
!cd data/data11325 && unzip -qo simple-examples.zip


(二)、模型训练

# 运行训练,使用GPU,并且使用小模型
# 训练轮数也限制到3轮,以避免日志过多
# 最终可以通过提高训练轮数达到比较好的效果
!echo "training"
!python train.py --use_gpu True --data_path data/data11325/simple-examples/data --model_type small --rnn_model basic_lstm --max_epoch=3

部分输出结果如下图1所示:

【自然语言处理(NLP)】基于Word2Vec的语言模型实践


(三)、模型预测

# 加模型进行预测
!python infer.py --rnn_model basic_lstm

输出结果如下图2所示:

【自然语言处理(NLP)】基于Word2Vec的语言模型实践


总结

本系列文章内容为根据清华社出版的《自然语言处理实践》所作的相关笔记和感悟,其中代码均为基于百度飞桨开发,若有任何侵权和不妥之处,请私信于我,定积极配合处理,看到必回!!!

最后,引用本次活动的一句话,来作为文章的结语~( ̄▽ ̄~)~:

【**学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。**】

【自然语言处理(NLP)】基于Word2Vec的语言模型实践