<commit_before>--- 
layout: post 
title: Tensorflow学习笔记（五） RNN语言模型（RNNLM-Model）
date: 2016-10-15 
categories: blog 
tags: [tensorflow, DeepLearning, NLP] 
description: rnnlm
--- 
# Previous

1.[Tensorflow学习笔记（一） 基础](http://skyhigh233.com/blog/2016/10/10/tf-note1/)  
2.[Tensorflow学习笔记（二） Toy Demo](http://skyhigh233.com/blog/2016/10/14/tf-note2/)  
3.[Tensorflow学习笔记（三） 使用Skip-Gram和CBOW训练Word Embedding](http://skyhigh233.com/blog/2016/10/14/tf-note3/)  
4.[Tensorflow学习笔记（四） 命名实体识别模型（NER-Model）](http://skyhigh233.com/blog/2016/10/14/tf-note4/)

# Tensorflow学习笔记（五） RNN语言模型（RNNLM-Model）

本节的内容主要来自于CS224d课程里的Pset2程序作业部分。希望通过这个部分，学习到以下内容：

* RNN的实现过程
* 明白这个模型的实现不是truncated（截断）的，它会一直BP求导到第一个时间步骤
* 困惑度和对数交叉熵损失的关系（对数交叉熵=log困惑度）
* 多维矩阵的转置、reshape和split要弄清楚
* 变量的共用，通过scope.reuse_variables()实现
* 序列损失sequence_loss可以看源码了解它的输入格式

## 需要的矩阵和python的知识

### 矩阵的转置和shape

```python
# 例1
a=np.array([[[2,3],[5,6]], [[2,7],[9,8]]])
print np.concatenate(a, 1)
print np.concatenate(a, 1).reshape(-1, 2)

output:
[[2 3 2 7]
 [5 6 9 8]]

[[2 3]
 [2 7]
 [5 6]
 [9 8]]

# 例2
print a.transpose([1,0,2])
print a.reshape(-1, 2)

output:
[
 [[2 3]
  [2 7]]
 
 [[5 6]
  [9 8]]
]
  
[[2 3]
 [5 6]
 [2 7]
 [9 8]]
```

### *args 和**kwargs的用法

python的打包和拆包。打包即把多个参数合成一个列表或字典，拆包则是把一个列表或字典拆解成多个参数。
* *在作为函数形参时对列表打包，\*\*在作为函数形参时对字典打包。
* *在作为函数实参时对列表拆包，\*\*在作为函数实参时对字典拆包。

```python
# 例1
def aa(*args, **kwargs):
    print args<commit_msg>refresh<commit_after>--- 
layout: post 
title: Tensorflow学习笔记（五） RNN语言模型（RNNLM-Model）
date: 2016-10-15 
categories: blog 
tags: [tensorflow, DeepLearning, NLP] 
description: rnnlm
--- 
# Previous

1.[Tensorflow学习笔记（一） 基础](http://skyhigh233.com/blog/2016/10/10/tf-note1/)  
2.[Tensorflow学习笔记（二） Toy Demo](http://skyhigh233.com/blog/2016/10/14/tf-note2/)  
3.[Tensorflow学习笔记（三） 使用Skip-Gram和CBOW训练Word Embedding](http://skyhigh233.com/blog/2016/10/14/tf-note3/)  
4.[Tensorflow学习笔记（四） 命名实体识别模型（NER-Model）](http://skyhigh233.com/blog/2016/10/14/tf-note4/)

# Tensorflow学习笔记（五） RNN语言模型（RNNLM-Model）

本节的内容主要来自于CS224d课程里的Pset2程序作业部分。希望通过这个部分，学习到以下内容：

* RNN的实现过程
* 明白这个模型的实现不是truncated（截断）的，它会一直BP求导到第一个时间步骤
* 困惑度和对数交叉熵损失的关系（对数交叉熵=log困惑度）
* 多维矩阵的转置、reshape和split要弄清楚
* 变量的共用，通过scope.reuse_variables()实现
* 序列损失sequence_loss可以看源码了解它的输入格式

## 需要的矩阵和python的知识

### 矩阵的转置和shape

```python
# 例1
a=np.array([[[2,3],[5,6]], [[2,7],[9,8]]])
print np.concatenate(a, 1)
print np.concatenate(a, 1).reshape(-1, 2)

output:
[[2 3 2 7]
 [5 6 9 8]]

[[2 3]
 [2 7]
 [5 6]
 [9 8]]

# 例2
print a.transpose([1,0,2])
print a.reshape(-1, 2)

output:
[
 [[2 3]
  [2 7]]
 
 [[5 6]
  [9 8]]
]
  
[[2 3]
 [5 6]
 [2 7]
 [9 8]]
```

### *args 和**kwargs的用法

python的打包和拆包。打包即把多个参数合成一个列表或字典，拆包则是把一个列表或字典拆解成多个参数。

* *在作为函数形参时对列表打包，\*\*在作为函数形参时对字典打包。
* *在作为函数实参时对列表拆包，\*\*在作为函数实参时对字典拆包。

```python
# 例1
def aa(*args, **kwargs):
    print args
{'fraction_non_alphanumeric': 0.192102454642476, 'fraction_numerical': 0.08253290643898968, 'mean_word_length': 4.907563025210084, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3194683', 'n_tokens_mistral': 1852, 'n_tokens_neox': 1843, 'n_words': 201}