Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
models
提交
f495dda9
M
models
项目概览
PaddlePaddle
/
models
大约 1 年 前同步成功
通知
222
Star
6828
Fork
2962
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
602
列表
看板
标记
里程碑
合并请求
255
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
M
models
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
602
Issue
602
列表
看板
标记
里程碑
合并请求
255
合并请求
255
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
f495dda9
编写于
6月 08, 2017
作者:
Z
zhaopu
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
format README
上级
4c0d936b
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
29 addition
and
24 deletion
+29
-24
language_model/README.md
language_model/README.md
+29
-24
未找到文件。
language_model/README.md
浏览文件 @
f495dda9
# 语言模型
## 简介
语言模型即 Language Model,简称LM,它是一个概率分布模型,简单来说,就是用来计算一个句子的概率的模型。给定句子(词语序列):
<br>
语言模型即 Language Model,简称LM,它是一个概率分布模型,简单来说,就是用来计算一个句子的概率的模型。给定句子(词语序列):
<div
align=
center
><img
src=
'images/s.png'
/></div>
它的概率可以表示为:
<br><br>
它的概率可以表示为:
<div
align=
center
><img
src=
'images/ps.png'
/>
(式1)
</div>
语言模型可以计算(式1)中的P(S)及其中间结果。
**利用它可以确定哪个词序列的可能性更大,或者给定若干个词,可以预测下一个最可能出现的词语。**
...
...
@@ -23,7 +26,7 @@ Language Model 常见的实现方式有 N-Gram、RNN、seq2seq。本例中实现
*
lm_rnn.py:实现了基于rnn的语言模型的定义、训练以及做预测。
*
lm_ngram.py:实现了基于n-gram的语言模型的定义、训练以及做预测。
**
注:**
*一般情况下基于N-Gram的语言模型不如基于RNN的语言模型效果好,所以实际使用时建议使用基于RNN的语言模型,本例中也将着重介绍基于RNN的模型,简略介绍基于N-Gram的模型。*
**
*注:*
*
一般情况下基于N-Gram的语言模型不如基于RNN的语言模型效果好,所以实际使用时建议使用基于RNN的语言模型,本例中也将着重介绍基于RNN的模型,简略介绍基于N-Gram的模型。
*
## RNN 语言模型
### 简介
...
...
@@ -52,6 +55,7 @@ lm_rnn.py 中的 lm() 函数定义了模型的结构。解析如下:
num_passs = 2
num_layer = 2
```
其中 rnn\_type 用于配置rnn cell类型,可以取‘lstm’或‘gru’;hidden\_size配置unit个数;num\_layer配置RNN的层数;num\_passs配置训练的轮数;emb_dim配置embedding的dimension。
*
2,将输入的词(或字)序列映射成向量,即embedding。
...
...
@@ -61,6 +65,7 @@ lm_rnn.py 中的 lm() 函数定义了模型的结构。解析如下:
target = paddle.layer.data("label", paddle.data_type.integer_value_sequence(vocab_size))
emb = paddle.layer.embedding(input=data, size=emb_dim)
```
*
3,根据配置实现RNN层,将上一步得到的embedding向量序列作为输入。
```python
...
...
@@ -77,6 +82,7 @@ lm_rnn.py 中的 lm() 函数定义了模型的结构。解析如下:
rnn_cell = paddle.networks.simple_gru(
input=rnn_cell, size=hidden_size)
```
*
4,实现输出层(使用softmax归一化计算单词的概率,将output结果返回)、定义模型的cost(多类交叉熵损失函数)。
```python
...
...
@@ -151,7 +157,7 @@ lm\_rnn.py中的predict()方法实现了做prediction、生成文本。流程如
parameters = paddle.parameters.Parameters.from_tar(gzip.open(model_file_name))
```
*
2,生成文本,本例中生成文本的方式是启发式图搜索算法beam search,即lm
\_
rnn.py中的
\_
generate
\_
with
\_
beamSearch()
方法。
*
2,生成文本,本例中生成文本的方式是启发式图搜索算法beam search,即lm
\_
rnn.py中的
\_
generate
\_
with
\_
beamSearch()
方法。
### <font color='red'>使用此demo</font>
...
...
@@ -172,6 +178,7 @@ lm\_rnn.py中的predict()方法实现了做prediction、生成文本。流程如
min_sentence_length = 3
max_sentence_length = 60
```
其中,vocab\_max\_size定义了词典的最大长度,如果语料中出现的不同词的个数大于这个值,则根据各词的词频倒序排,取top(vocab\_max\_size)个词纳入词典。
*注:需要注意的是词典越大生成的内容越丰富但训练耗时越久,一般中文分词之后,语料中不同的词能有几万乃至几十万,如果vocab\_max\_size取值过小则导致\<UNK\>占比过高,如果vocab\_max\_size取值较大则严重影响训练速度(对精度也有影响),所以也有“按字”训练模型的方式,即:把每个汉字当做一个词,常用汉字也就几千个,使得字典的大小不会太大、不会丢失太多信息,但汉语中同一个字在不同词中语义相差很大,有时导致模型效果不理想。建议用户多试试、根据实际情况选择是“按词训练”还是“按字训练”。*
...
...
@@ -180,12 +187,10 @@ lm\_rnn.py中的predict()方法实现了做prediction、生成文本。流程如
根据语料的大小按需调整模型的
\_\_
main
\_\_
中定义的参数。
然后运行 python lm_rnn.py即可训练模型、做prediction。
然后运行 python lm
\
_
rnn.py即可训练模型、做prediction。
## n-gram 语言模型
n-gram模型也称为n-1阶马尔科夫模型,它有一个有限历史假设:当前词的出现概率仅仅与前面n-1个词相关。因此 (式1) 可以近似为:
<div
align=
center
><img
src=
'images/ps2.png'
/></div>
一般采用最大似然估计(Maximum Likelihood Estimation,MLE)的方法对模型的参数进行估计。当n取1、2、3时,n-gram模型分别称为unigram、bigram和trigram语言模型。一般情况下,n越大、训练语料的规模越大,参数估计的结果越可靠,但由于模型较简单、表达能力不强以及数据稀疏等问题。一般情况下用n-gram实现的语言模型不如RNN、seq2seq效果好。
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录