Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
D_ACMER
apachecn-dl-zh
提交
61da6550
A
apachecn-dl-zh
项目概览
D_ACMER
/
apachecn-dl-zh
与 Fork 源项目一致
Fork自
OpenDocCN / apachecn-dl-zh
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
A
apachecn-dl-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
61da6550
编写于
8月 27, 2020
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
2020-08-27 22:19:13
上级
a1d96314
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
14 addition
and
14 deletion
+14
-14
docs/handson-tl-py/3.md
docs/handson-tl-py/3.md
+14
-14
未找到文件。
docs/handson-tl-py/3.md
浏览文件 @
61da6550
...
...
@@ -440,15 +440,15 @@ GRU 相对较新,其性能与 LSTM 相当,但由于结构更简单,参数
| 6 | 1 | 0 | | 0 | 1 | 0 | 0 |
| 7 | | | | | | | |
**O**
模块通过在给定问题 q 的情况下找到 k 个支持存储器来产生输出特征。 对于 k = 2
,使用以下方法检索最高得分的支持内存:
`O`
模块通过在给定问题 q 的情况下找到 k 个支持存储器来产生输出特征。 对于
`k = 2`
,使用以下方法检索最高得分的支持内存:
![](
img/113b62ab-656d-4d22-9e1c-26c2855cf9e5.png
)
其中
*s <sub>0</sub>*
是对输入
*q*
和
*m*
<sub>
*i [*
。
</sub>
o1 是具有最佳匹配的内存索引
*m*
。 现在,使用查询和第一个检索到的内存,我们可以检索下一个内存 m
<sub>
o2
</sub>
,这两个内存都很接近:
其中
`s[0]`
是输入
`q`
和
`m[i]`
之间的评分函数,
`o1`
是具有最佳匹配的内存
`m`
的索引。 现在,使用查询和第一个检索到的内存,我们可以检索下一个内存
`m[o2]`
,这两个内存都很接近:
![](
img/2b447e60-be65-4f11-a9e0-0b28d3c0e730.png
)
合并的查询和内存结果为
o = [q,m
<sub>
o1
</sub>
,m
<sub>
o2
</sub>
] = [现在牛奶在哪里,乔离开了牛奶。乔去了办公室。 ]。 最后,模块
**R**
需要产生文本响应
*r*
。
*R*
模块可以输出一个单词的答案,或者可以输出一个完整句子的 RNN 模块。 对于单字响应,令
<sub>
r
</sub>
是对[q,m
<sub>
o1
</sub>
,m
<sub>
o2
</sub>
]和单词
*w*
。 因此,最后的回应
*r*
是办公室一词:
合并的查询和内存结果为
`o = [q, m[o1], m[o2]] = [现在牛奶在哪里, 乔离开了牛奶, 乔去了办公室]`
。 最后,模块
`R`
需要产生文本响应
`r`
。
`R`
模块可以输出一个单词的答案,或者可以输出一个完整句子的 RNN 模块。 对于单字响应,令
`r`
是对
`[q, m[o1], m[o2]]`
和单词
`w`
的回应。 因此,最后的回应
`r`
是办公室一词:
![](
img/7edbfaa7-ef11-4918-b0bf-23ecb6bb5098.png
)
...
...
@@ -456,17 +456,17 @@ GRU 相对较新,其性能与 LSTM 相当,但由于结构更简单,参数
# MemN2Ns
我们从一个查询开始:牛奶现在在哪里? 使用大小为
*V*
的向量,用成袋的单词进行编码。 在最简单的情况下,我们使用嵌入
*B(d x V)*
将向量转换为大小为
*d*
的词嵌入。 我们有
**u = embeddingB(q)**
:
我们从一个查询开始:牛奶现在在哪里? 使用大小为
`V`
的向量,用成袋的单词进行编码。 在最简单的情况下,我们使用嵌入
`B(d x V)`
将向量转换为大小为
`d`
的词嵌入。 我们有
`u = embeddingB(q)`
:
![](
img/d6252a46-1170-4bd3-a61c-ec067acd5310.png
)
输入句子 x1,x2,...和 xi 通过使用另一个嵌入矩阵
A(dx Vd x V)存储在内存中,其大小与 B
**mi = embeddingA(x <sub>i [</sub>**
**)**
。 每个嵌入式查询
*u*
与每个内存
*m <sub>i</sub>*
之间的相似度是通过取内积和 softmax 来计算的:
**p <sub>i</sub> = softmax(u <sup><sub>T</sub></sup> m <sub>i</sub> )**
。
输入句子 x1,x2,...和 xi 通过使用另一个嵌入矩阵
`A(d x V)`
存储在内存中,其大小与
`B[mi] = embeddingA(x[i])`
。 每个嵌入式查询
`u`
与每个内存
`m[i]`
之间的相似度是通过取内积和 softmax 来计算的:
`p[i] = softmax(u^T m[i])`
。
输出存储器表示如下:每个
xi 具有对应的输出向量
*c <sub>i</sub>*
,可以用另一个嵌入矩阵
*C*
表示。 然后,来自存储器的响应向量
*o*
是
*c <sub>i</sub>*
上的总和,并由来自以下输入的概率向量加权:
输出存储器表示如下:每个
`x[i]`
具有对应的输出向量
`c[i]`
,可以用另一个嵌入矩阵
`C`
表示。 然后,来自存储器的响应向量
`o`
是
`c[i]`
上的总和,并由来自以下输入的概率向量加权:
**![](img/f448c97e-6ab7-4718-90ff-cc360122bce3.png)**
![](
img/f448c97e-6ab7-4718-90ff-cc360122bce3.png
)
最后,将
*o*
和
*u*
之和与权重矩阵 W(V x d)
相乘。 结果传递到 softmax 函数以预测最终答案:
最后,将
`o`
和
`u`
之和与权重矩阵
`W(V x d)`
相乘。 结果传递到 softmax 函数以预测最终答案:
![](
img/00a99297-3d3b-4387-a888-ff58f137672d.png
)
...
...
@@ -490,31 +490,31 @@ NTM 体系结构包含两个基本组件:神经网络控制器和内存。 下
控制器输出用于确定要读取或写入的存储器位置。 这由一组分布在所有内存位置上的权重定义,这些权重之和为 1。权重由以下两种机制定义。 想法是为控制器提供几种不同的读取或写入内存的模式,分别对应于不同的数据结构:
*
**基于内容的**
:使用相似度度量(例如余弦相似度(S))将控制器的键
**k**
输出与所有存储位置进行比较,然后所有距离均由 softmax 归一化 得到的权重加起来为 1:
*
**基于内容的**
:使用相似度度量(例如余弦相似度(S))将控制器的键
`k`
输出与所有存储位置进行比较,然后所有距离均由 softmax 归一化 得到的权重加起来为 1:
![](
img/9c2898fa-79f4-4806-a527-d2a1fbf1f977.png
)
在这种情况下,β≥1 称为清晰度参数,并控制对特定位置的聚焦。 它还为网络提供了一种方法来决定其希望内存位置访问的精确度。 就像模糊 c 均值聚类中的模糊系数。
*
**基于位置的**
:基于位置的寻址机制旨在跨存储器位置的简单迭代。 例如,如果当前权重完全集中在单个位置上,则旋转 1 会将焦点移到下一个位置。 负移将使权重朝相反方向移动。 控制器输出一个移位内核
*s*
(即[-n,n]
上的 softmax),将其与先前计算的存储器权重进行卷积以产生移位的存储器位置,如下图所示。 这种转变是循环的; 也就是说,它环绕边界。 下图是内存的热图表示—较深的阴影表示更多的权重:
*
**基于位置的**
:基于位置的寻址机制旨在跨存储器位置的简单迭代。 例如,如果当前权重完全集中在单个位置上,则旋转 1 会将焦点移到下一个位置。 负移将使权重朝相反方向移动。 控制器输出一个移位内核
`s`
(即
`[-n, n]`
上的 softmax),将其与先前计算的存储器权重进行卷积以产生移位的存储器位置,如下图所示。 这种转变是循环的; 也就是说,它环绕边界。 下图是内存的热图表示—较深的阴影表示更多的权重:
![](
img/0952f060-fd33-4b79-a530-a3ef4c96a006.png
)
在应用旋转移位之前,将内容寻址所给定的权重向量与先前的权重向量
w
<sub>
t-1
</sub>
相结合,如下所示:!
[](
img/31390bf5-05d0-4451-926c-5146b31a240c.png
)
。 在此,g
<sub>
t
</sub>
是由控制器头发出的标量
*内插门*
,范围为(0,1)。 如果 g
<sub>
t
</sub>
= 1
,则忽略先前迭代的加权。
在应用旋转移位之前,将内容寻址所给定的权重向量与先前的权重向量
`w[t-1]`
相结合,如下所示:!
[](
img/31390bf5-05d0-4451-926c-5146b31a240c.png
)
。 在此,
`g[t]`
是由控制器头发出的标量
*内插门*
,范围为
`(0, 1)`
。 如果
`g[t] = 1`
,则忽略先前迭代的加权。
# 读取操作
令
**M <sub>t</sub>**
为时间
*t*
时 N x M 存储矩阵的内容,其中
*N*
是存储位置的数量,
*M*
是每个位置的向量大小。 时间
*t*
的读取头由向量
**w <sub>t</sub>**
,
给出。
令
`M[t]`
为时间
`t`
的
`N x M`
存储矩阵的内容,其中
`N`
是存储位置的数量,
`M`
是每个位置的向量大小。 时间
`t`
的读取头由向量
`w[t]`
给出。
![](
img/1e4d609a-d3bb-41ee-8b63-6e137fa2eb4a.png
)
*M*
读取向量
**r <sub>t</sub>**
的长度定义为行向量
**M <sub>t</sub> (i)的凸组合[**
在内存中:
`M`
读取向量
`r[t]`
的长度定义为行向量
`M[t](i)`
的凸组合,
在内存中:
![](
img/3e35f31d-36ad-4097-aa25-7dcd5b0fe6ad.png
)
# 写操作
每个写头接收一个
*擦除向量*
,
**e <sub>t</sub>**
和一个
*加*
向量,
**a <sub>t</sub>**
,以像 LSTM 单元一样重置和写入存储器,如下所示:M
<sub>
t
</sub>
(i)←M
<sub>
t
</sub>
(i) [1- e
<sub>
t
<sup>
(i)
</sup></sub>
w
<sub>
t
</sub>
(i)] + w
<sub>
t
</sub>
(i)a
<sub>
t
</sub>
(i)
。
每个写头接收一个
*擦除向量*
,
`e[t]`
和一个
*加*
向量,
`a[t]`
,以像 LSTM 单元一样重置和写入存储器,如下所示:
`M[t](i) ← M[t](i) [1 - e[t](i) w[t](i)] + w[t](i) a[t](i)`
。
这是上述操作的伪代码:
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录