# 语言模型 # 简介 ## 1. 任务说明 本文主要介绍基于lstm的语言的模型的实现,给定一个输入词序列(中文分词、英文tokenize),计算其ppl(语言模型困惑度,用户表示句子的流利程度),基于循环神经网络语言模型的介绍可以[参阅论文](https://arxiv.org/abs/1409.2329)。相对于传统的方法,基于循环神经网络的方法能够更好的解决稀疏词的问题。 ## 2. 效果说明 | | train | valid | test | | :------------- | :---------: | :--------: | :----------: | | PaddlePaddle | 47.234 | 86.801 | 83.159 | | Tensorflow | 45.594 | 87.363 | 84.015 | ## 3. 数据集 此任务的数据集合是采用ptb dataset,下载地址为: http://www.fit.vutbr.cz/~imikolov/rnnlm/simple-examples.tgz # 快速开始 ## 1. 开始第一次模型调用 ### 安装说明 * PaddlePaddle 安装 本项目依赖于 PaddlePaddle 2.0-rc1 及以上版本,请参考 [安装指南](http://www.paddlepaddle.org/#quick-start) 进行安装 * PaddleNLP 安装 ```shell pip install paddlenlp>=2.0.0b ``` * 环境依赖 Python的版本要求 3.6+ ### 数据准备 为了方便开发者进行测试,我们内置了数据下载脚本,默认自动下载PTB数据集。 ### 训练或fine-tune 任务训练启动命令如下: ``` python train_hapi.py ``` 程序运行时将会自动进行训练,评估,测试。同时训练过程中会自动保存模型到checkpoint、中。 还可以在启动命令后以--的形式修改网络参数或数据位置,具体可修改的参数和参数的默认值参考`args.py`。 **NOTE:** 如需恢复模型训练,则init_from_ckpt只需指定到文件名即可,不需要添加文件尾缀。如`--init_from_ckpt=checkpoints/test`即可,程序会自动加载模型参数`checkpoints/test.pdparams`,也会自动加载优化器状态`checkpoints/test.pdopt`。 # 进阶使用 ## 1. 任务定义与建模 此任务目的是给定一个输入的词序列,预测下一个词出现的概率。 ## 2. 模型原理介绍 此任务采用了序列任务常用的rnn网络,实现了一个两层的lstm网络,然后lstm的结果去预测下一个词出现的概率。 由于数据的特殊性,每一个batch的last hidden和last cell会被作为下一个batch 的init hidden 和 init cell。 ## 3. 数据格式说明 此任务的数据格式比较简单,每一行为一个已经分好词(英文的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 N years old will join the board as a nonexecutive director nov. N mr. is chairman of n.v. the dutch publishing group ``` 特殊说明:ptb的数据比较特殊,ptb的数据来源于一些文章,相邻的句子可能来源于一个段落或者相邻的段落,ptb 数据不能做shuffle。 ## 4. 目录结构 ```text . ├── README.md # 文档 ├── train.py # 训练代码 ├── model.py # 模型定义文件 ├── args.py # 参数读取 ``` ## 5. 如何组建自己的模型 + **自定义数据:** 关于数据,如果可以把自己的数据先进行分词(或者tokenize),通过`--data_path`来指定本地数据集所在文件夹,并需要在`train.py`中修改对应的文件名称。 + **网络结构更改:** 网络只实现了基于lstm的语言模型,用户可以自己的需求更换为gru等网络结构,这些实现都是在`model.py`中定义。 # 其他 ## 如何贡献代码 如果你可以修复某个issue或者增加一个新功能,欢迎给我们提交PR。如果对应的PR被接受了,我们将根据贡献的质量和难度进行打分(0-5分,越高越好)。如果你累计获得了10分,可以联系我们获得面试机会或者为你写推荐信。