README.md 3.8 KB
Newer Older
Z
Zeyu Chen 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
# 语言模型

# 简介

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

**目前语言模型要求使用PaddlePaddle 2.0及以上版本或适当的develop版本。**


## 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. 开始第一次模型调用

### 数据准备
为了方便开发者进行测试,我们内置了数据下载脚本,默认自动下载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 <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。



## 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分,可以联系我们获得面试机会或者为你写推荐信。