Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
d2l-zh
提交
d6ecff20
D
d2l-zh
项目概览
OpenDocCN
/
d2l-zh
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
d2l-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
d6ecff20
编写于
5月 29, 2018
作者:
A
Aston Zhang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
hidden state
上级
7144793d
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
66 addition
and
15 deletion
+66
-15
chapter_recurrent-neural-networks/hidden-state.md
chapter_recurrent-neural-networks/hidden-state.md
+59
-0
chapter_recurrent-neural-networks/index.md
chapter_recurrent-neural-networks/index.md
+1
-0
chapter_recurrent-neural-networks/lm.md
chapter_recurrent-neural-networks/lm.md
+4
-2
chapter_recurrent-neural-networks/rnn-scratch.md
chapter_recurrent-neural-networks/rnn-scratch.md
+2
-13
img/rnn-bptt.pdf
img/rnn-bptt.pdf
+0
-0
未找到文件。
chapter_recurrent-neural-networks/hidden-state.md
0 → 100644
浏览文件 @
d6ecff20
# 隐藏状态
上一节介绍的$n$元语法中,时刻$t$的词$w_t$基于文本序列最近$n-1$个词的条件概率为
$$
\m
athbb{P}(w_t
\m
id w_{t-(n-1)},
\l
dots, w_{t-1}).$$
显然,以上概率并没有考虑到比$t-(n-1)$更早时刻的词对当前时刻词可能的影响。然而,考虑这些影响将很容易造成$n$元语法的计算和存储开销过高。为了解决$n$元语法的局限性,我们将在神经网络中引入隐藏状态来记录时间序列的历史信息。
## 不含隐藏状态的神经网络
首先让我们回顾一下不含隐藏状态的神经网络,例如只有一个隐藏层的多层感知机。
假设隐藏层的激活函数是$
\p
hi$,对于一个样本数为$n$特征向量维度为$x$的批量数据$
\b
oldsymbol{X}
\i
n
\m
athbb{R}^{n
\t
imes x}$($
\b
oldsymbol{X}$是一个$n$行$x$列的实数矩阵)来说,那么这个隐含层的输出就是
$$
\b
oldsymbol{H} =
\p
hi(
\b
oldsymbol{X}
\b
oldsymbol{W}_{xh} +
\b
oldsymbol{b}_h)$$
假定隐含层长度为$h$,其中的$
\b
oldsymbol{W}_{xh}
\i
n
\m
athbb{R}^{x
\t
imes h}$是权重参数。偏移参数 $
\b
oldsymbol{b}_h
\i
n
\m
athbb{R}^{1
\t
imes h}$在与前一项$
\b
oldsymbol{X}
\b
oldsymbol{W}_{xh}
\i
n
\m
athbb{R}^{n
\t
imes h}$ 相加时使用了
[
广播
](
../chapter_crashcourse/ndarray.md
)
。这个隐含层的输出的形状为$
\b
oldsymbol{H}
\i
n
\m
athbb{R}^{n
\t
imes h}$。
把隐含层的输出$
\b
oldsymbol{H}$作为输出层的输入,最终的输出
$$
\h
at{
\b
oldsymbol{Y}} =
\t
ext{softmax}(
\b
oldsymbol{H}
\b
oldsymbol{W}_{hy} +
\b
oldsymbol{b}_y)$$
假定每个样本对应的输出向量维度为$y$,其中 $
\h
at{
\b
oldsymbol{Y}}
\i
n
\m
athbb{R}^{n
\t
imes y},
\b
oldsymbol{W}_{hy}
\i
n
\m
athbb{R}^{h
\t
imes y},
\b
oldsymbol{b}_y
\i
n
\m
athbb{R}^{1
\t
imes y}$且两项相加使用了
[
广播
](
../chapter_crashcourse/ndarray.md
)
。
## 含隐藏状态的循环神经网络
将上面网络改成循环神经网络,我们首先对输入输出加上时间戳$t$。假设$
\b
oldsymbol{X}_t
\i
n
\m
athbb{R}^{n
\t
imes x}$是序列中的第$t$个批量输入(样本数为$n$,每个样本的特征向量维度为$x$),对应的隐含层输出是隐含状态$
\b
oldsymbol{H}_t
\i
n
\m
athbb{R}^{n
\t
imes h}$(隐含层长度为$h$),而对应的最终输出是$
\h
at{
\b
oldsymbol{Y}}_t
\i
n
\m
athbb{R}^{n
\t
imes y}$(每个样本对应的输出向量维度为$y$)。在计算隐含层的输出的时候,循环神经网络只需要在前馈神经网络基础上加上跟前一时间$t-1$输入隐含层$
\b
oldsymbol{H}_{t-1}
\i
n
\m
athbb{R}^{n
\t
imes h}$的加权和。为此,我们引入一个新的可学习的权重$
\b
oldsymbol{W}_{hh}
\i
n
\m
athbb{R}^{h
\t
imes h}$:
$$
\b
oldsymbol{H}_t =
\p
hi(
\b
oldsymbol{X}_t
\b
oldsymbol{W}_{xh} +
\b
oldsymbol{H}_{t-1}
\b
oldsymbol{W}_{hh} +
\b
oldsymbol{b}_h)$$
输出的计算跟前面一致:
$$
\h
at{
\b
oldsymbol{Y}}_t =
\t
ext{softmax}(
\b
oldsymbol{H}_t
\b
oldsymbol{W}_{hy} +
\b
oldsymbol{b}_y)$$
一开始我们提到过,隐含状态可以认为是这个网络的记忆。该网络中,时刻$t$的隐含状态就是该时刻的隐含层变量$
\b
oldsymbol{H}_t$。它存储前面时间里面的信息。我们的输出是只基于这个状态。最开始的隐含状态里的元素通常会被初始化为0。
## 小结
*
语言模型是自然语言处理的重要技术。
*
$N$元语法是基于$n-1$阶马尔可夫链的概率语言模型。但它有一定的局限性。
## 练习
*
假设训练数据集中有十万个词,四元语法需要存储多少词频和多词相邻频率?
*
你还能想到哪些语言模型的应用?
## 扫码直达[讨论区](https://discuss.gluon.ai/t/topic/6650)
![](
../img/qr_lm.svg
)
chapter_recurrent-neural-networks/index.md
浏览文件 @
d6ecff20
...
...
@@ -12,6 +12,7 @@
:maxdepth: 2
lm
hidden-state
rnn-scratch
bptt
gru-scratch
...
...
chapter_recurrent-neural-networks/lm.md
浏览文件 @
d6ecff20
# 语言模型
语言模型(language model)是自然语言处理的重要技术。
给定一个长度为$T$的词的序列:$w_1, w_2,
\l
dots, w_T$,语言模型
计算该序列的概率:
语言模型(language model)是自然语言处理的重要技术。
自然语言处理中最常见的数据是文本数据。实际上,我们可以把一段自然语言文本看作是一段时间序列。假设一段长度为$T$的文本中的词依次为$w_1, w_2,
\l
dots, w_T$,那么在时间序列中,$w_t$($1
\l
eq t
\l
eq T$)可看作是在时刻$t$的输出或标签。给定一个长度为$T$的词的序列:$w_1, w_2,
\l
dots, w_T$,语言模型将
计算该序列的概率:
$$
\m
athbb{P}(w_1, w_2,
\l
dots, w_T).$$
...
...
@@ -39,7 +39,9 @@ $$
\e
nd{aligned}
$$
当$n$较小时,$n$元语法往往并不准确。例如,在一元语法中,由三个词组成的句子“你走先”和“你先走”的概率是一样的。然而,当$n$较大时,$n$元语法需要计算并存储大量的词频和多词相邻频率。实际上,循环神经网络可以在语言模型中更好地平衡这两点。我们将在下一节介绍循环神经网络的设计、实现与应用。
当$n$较小时,$n$元语法往往并不准确。例如,在一元语法中,由三个词组成的句子“你走先”和“你先走”的概率是一样的。然而,当$n$较大时,$n$元语法需要计算并存储大量的词频和多词相邻频率。
那么,有没有方法在语言模型中更好地平衡以上这两点呢?我们将在本章探究这样的方法。
## 小结
...
...
chapter_recurrent-neural-networks/rnn-scratch.md
浏览文件 @
d6ecff20
# 循环神经网络——从零开始
前面的教程里我们使用的网络都属于
**前馈神经网络**
。之所以叫前馈,是因为整个网络是一条链(回想下
`gluon.nn.Sequential`
),每一层的结果都是反馈给下一层。这一节我们介绍
**循环神经网络**
,这里每一层不仅输出给下一层,同时还输出一个
**隐含状态**
,给当前层在处理下一个样本时使用。下图展示这两种网络的区别。
本节将介绍循环神经网络的设计和实现。有了上一节的知识做铺垫,我们还会把循环神经网络应用在语言模型中。实验中,我们将使用基于循环神经网络的
![](
../img/rnn_1.png
)
循环神经网络的这种结构使得它适合处理前后有依赖关系数据样本。我们拿语言模型举个例子来解释这个是怎么工作的。语言模型的任务是给定句子的前
*t*
个字符,然后预测第
*t+1*
个字符。假设我们的句子是“你好世界”,使用前馈神经网络来预测的一个做法是,在时间1输入“你”,预测”好“,时间2向同一个网络输入“好”预测“世”。下图左边展示了这个过程。
![](
../img/rnn_2.png
)
注意到一个问题是,当我们预测“世”的时候只给了“好”这个输入,而完全忽略了“你”。直觉上“你”这个词应该对这次的预测比较重要。虽然这个问题通常可以通过
**n-gram**
来缓解,就是说预测第
*t+1*
个字符的时候,我们输入前
*n*
个字符。如果
*n=1*
,那就是我们这里用的。我们可以增大
*n*
来使得输入含有更多信息。但我们不能任意增大
*n*
,因为这样通常带来模型复杂度的增加从而导致需要大量数据和计算来训练模型。
循环神经网络使用一个隐含状态来记录前面看到的数据来帮助当前预测。上图右边展示了这个过程。在预测“好”的时候,我们输出一个隐含状态。我们用这个状态和新的输入“好”来一起预测“世”,然后同时输出一个更新过的隐含状态。我们希望前面的信息能够保存在这个隐含状态里,从而提升预测效果。
## 循环神经网络
在对输入输出数据有了解后,我们来正式介绍循环神经网络。
首先回忆一下单隐含层的前馈神经网络的定义,例如
[
多层感知机
](
../chapter_supervised-learning/mlp-scratch.md
)
。假设隐含层的激活函数是$
\p
hi$,对于一个样本数为$n$特征向量维度为$x$的批量数据$
\b
oldsymbol{X}
\i
n
\m
athbb{R}^{n
\t
imes x}$($
\b
oldsymbol{X}$是一个$n$行$x$列的实数矩阵)来说,那么这个隐含层的输出就是
首先回忆一下单隐含层的前馈神经网络的定义,例如
[
多层感知机
](
../chapter_supervised-learning/mlp-scratch.md
)
。假设隐含层的激活函数是$
\p
hi$,对于一个样本数为$n$、特征向量维度为$x$的批量数据$
\b
oldsymbol{X}
\i
n
\m
athbb{R}^{n
\t
imes x}$($
\b
oldsymbol{X}$是一个$n$行$x$列的实数矩阵)来说,那么这个隐含层的输出就是
$$
\b
oldsymbol{H} =
\p
hi(
\b
oldsymbol{X}
\b
oldsymbol{W}_{xh} +
\b
oldsymbol{b}_h)$$
...
...
img/rnn-bptt.pdf
0 → 100644
浏览文件 @
d6ecff20
文件已添加
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录