Skip to content

Commit

Permalink
修改为 gitbook 模版,优化了公式的显示
Browse files Browse the repository at this point in the history
  • Loading branch information
jiangzhonglian committed Jul 22, 2019
1 parent eb412ee commit 739c006
Show file tree
Hide file tree
Showing 12 changed files with 267 additions and 87 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@ instance/
.scrapy

# Sphinx documentation
_book/

docs/_build/

# PyBuilder
Expand Down Expand Up @@ -102,3 +104,4 @@ venv.bak/

# mypy
.mypy_cache/
node_modules
35 changes: 35 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
language: node_js # 构建所需的语言环境
node_js:
- "v10.16.0" # 对应的版本

branches:
only:
- master # 构建的分支

cache:
directories:
- node_modules # 依赖缓存的目录

install:
- npm install -g gitbook-cli # 安装编译工具
- gitbook fetch 3.2.3 # 安装 Gitbook 子版本

script:
- sh run_website.sh

after_script:
- cd _book
- git init
- git config user.name ${GH_UN}
- git config user.email ${GH_EMAIL}
- git add -A
- git commit -am "$(date "+%Y-%m-%d %H:%M:%S")"
- git push "https://${GH_TOKEN}@github.com/${GH_USER}/${GH_REPO}.git" master:${GH_BRANCH} -f

env:
global:
- GH_UN=jiangzhonglian
- [email protected]
- GH_USER=apachecn
- GH_REPO=NLP-with-PyTorch
- GH_BRANCH=gh-pages
2 changes: 1 addition & 1 deletion SUMMARY.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
+ [Preface](docs/1.md)
+ [Chapter 1\. Introduction](docs/1.md)
+ [Chapter 2\. A Quick Tour of Traditional NLP](docs/2.md)
+ [Chapter 3\. Foundational Components of Neural Networks](docs/3.md)
+ [Chapter 4\. Feed-Forward Networks for Natural Language Processing](docs/4.md)
Expand Down
84 changes: 84 additions & 0 deletions book.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
{
"title" : "NLP with PyTorch 中文文档",
"author" : "ApacheCN",
"description" : "NLP with PyTorch 中文文档",
"language" : "zh-hans",
"plugins": [
"github",
"github-buttons",
"-sharing",
"insert-logo",
"sharing-plus",
"back-to-top-button",
"code",
"copy-code-button",
"mathjax",
"pageview-count",
"edit-link",
"emphasize",
"alerts",
"auto-scroll-table",
"popup",
"hide-element",
"page-toc-button",
"tbfed-pagefooter",
"sitemap",
"advanced-emoji",
"expandable-chapters",
"splitter",
"search-pro"
],
"pluginsConfig": {
"github": {
"url": "https://github.com/apachecn/NLP-with-PyTorch"
},
"github-buttons": {
"buttons": [
{
"user": "apachecn",
"repo": "NLP-with-PyTorch",
"type": "star",
"count": true,
"size": "small"
}
]
},
"insert-logo": {
"url": "https://github.com/apachecn/NLP-with-PyTorch/raw/master/cover.jpg",
"style": "background: none; max-height: 150px; min-height: 150px"
},
"hide-element": {
"elements": [".gitbook-link"]
},
"edit-link": {
"base": "https://github.com/apachecn/NLP-with-PyTorch/blob/master",
"label": "编辑本页"
},
"sharing": {
"qzone": true,
"weibo": true,
"twitter": false,
"facebook": false,
"google": false,
"qq": false,
"line": false,
"whatsapp": false,
"douban": false,
"all": [
"qq", "douban", "facebook", "google", "linkedin", "twitter", "weibo", "whatsapp"
]
},
"page-toc-button": {
"maxTocDepth": 4,
"minTocSize": 4
},
"tbfed-pagefooter": {
"copyright":"Copyright &copy ibooker.org.cn 2019",
"modify_label": "该文件修订时间: ",
"modify_format": "YYYY-MM-DD HH:mm:ss"
},
"sitemap": {
"hostname": "https://nlp-pt.apachecn.org"
}
}
}
16 changes: 7 additions & 9 deletions docs/1.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Preface
# Chapter 1.Introduction

> 本文标题:[Natural-Language-Processing-with-PyTorch(一)](https://yifdu.github.io/2018/12/17/Natural-Language-Processing-with-PyTorch%EF%BC%88%E4%B8%80%EF%BC%89/)
>
Expand All @@ -11,14 +11,12 @@
> 原始链接:[http://yifdu.github.io/2018/12/17/Natural-Language-Processing-with-PyTorch(一)/](https://yifdu.github.io/2018/12/17/Natural-Language-Processing-with-PyTorch%EF%BC%88%E4%B8%80%EF%BC%89/)
>
> 许可协议: [署名-非商业性使用-禁止演绎 4.0 国际](https://creativecommons.org/licenses/by-nc-nd/4.0/) 转载请保留原文链接及作者。
本书旨在为新人提供自然语言处理(NLP)和深度学习,以涵盖这两个领域的重要主题。这两个主题领域都呈指数级增长。对于一本介绍深度学习和强调实施的NLP的书,本书占据了重要的中间地带。在写这本书时,我们不得不对哪些材料遗漏做出艰难的,有时甚至是不舒服的选择。对于初学者,我们希望本书能够为基础知识提供强有力的基础,并可以瞥见可能的内容。特别是机器学习和深度学习是一种经验学科,而不是智力科学。我们希望每章中慷慨的端到端代码示例邀请您参与这一经历。当我们开始编写本书时,我们从PyTorch 0.2开始。每个PyTorch更新从0.2到0.4修改了示例。 PyTorch 1.0将于本书出版时发布。本书中的代码示例符合PyTorch 0.4,它应该与即将发布的PyTorch 1.0版本一样工作.1关于本书风格的注释。我们在大多数地方都故意避免使用数学;并不是因为深度学习数学特别困难(事实并非如此),而是因为它在许多情况下分散了本书主要目标的注意力——增强初学者的能力。在许多情况下,无论是在代码还是文本方面,我们都有类似的动机,我们倾向于对简洁性进行阐述。高级读者和有经验的程序员可以找到方法来收紧代码等等,但我们的选择是尽可能明确,以便覆盖我们想要达到的大多数受众。

# Chapter 1.Introduction
>
> 本书旨在为新人提供自然语言处理(NLP)和深度学习,以涵盖这两个领域的重要主题。这两个主题领域都呈指数级增长。对于一本介绍深度学习和强调实施的NLP的书,本书占据了重要的中间地带。在写这本书时,我们不得不对哪些材料遗漏做出艰难的,有时甚至是不舒服的选择。对于初学者,我们希望本书能够为基础知识提供强有力的基础,并可以瞥见可能的内容。特别是机器学习和深度学习是一种经验学科,而不是智力科学。我们希望每章中慷慨的端到端代码示例邀请您参与这一经历。当我们开始编写本书时,我们从PyTorch 0.2开始。每个PyTorch更新从0.2到0.4修改了示例。 PyTorch 1.0将于本书出版时发布。本书中的代码示例符合PyTorch 0.4,它应该与即将发布的PyTorch 1.0版本一样工作.1关于本书风格的注释。我们在大多数地方都故意避免使用数学;并不是因为深度学习数学特别困难(事实并非如此),而是因为它在许多情况下分散了本书主要目标的注意力——增强初学者的能力。在许多情况下,无论是在代码还是文本方面,我们都有类似的动机,我们倾向于对简洁性进行阐述。高级读者和有经验的程序员可以找到方法来收紧代码等等,但我们的选择是尽可能明确,以便覆盖我们想要达到的大多数受众。
像Echo (Alexa)、Siri和谷歌Translate这样的家喻户晓的产品名称至少有一个共同点。它们都是自然语言处理(NLP)应用的产物,NLP是本书的两个主要主题之一。NLP是一套运用统计方法的技术,无论是否有语言学的洞见,为了解决现实世界的任务而理解文本。这种对文本的“理解”主要是通过将文本转换为可用的计算表示,这些计算表示是离散或连续的组合结构,如向量或张量、图形和树。

从数据(本例中为文本)中学习适合于任务的表示形式是机器学习的主题。应用机器学习的文本数据有超过三十年的历史,但最近(2008年至2010年开始)$^1$一组机器学习技术,被称为深度学习,继续发展和证明非常有效的各种人工智能(AI)在NLP中的任务,演讲,和计算机视觉。深度学习是我们要讲的另一个主题;因此,本书是关于NLP和深度学习的研究。
从数据(本例中为文本)中学习适合于任务的表示形式是机器学习的主题。应用机器学习的文本数据有超过三十年的历史,但最近(2008年至2010年开始) $$^1$$ 一组机器学习技术,被称为深度学习,继续发展和证明非常有效的各种人工智能(AI)在NLP中的任务,演讲,和计算机视觉。深度学习是我们要讲的另一个主题;因此,本书是关于NLP和深度学习的研究。

简单地说,深度学习使人们能够使用一种称为计算图和数字优化技术的抽象概念有效地从数据中学习表示。这就是深度学习和计算图的成功之处,像谷歌、Facebook和Amazon这样的大型技术公司已经发布了基于它们的计算图形框架和库的实现,以捕捉研究人员和工程师的思维。在本书中,我们考虑PyTorch,一个越来越流行的基于python的计算图框架库来实现深度学习算法。在本章中,我们将解释什么是计算图,以及我们选择使用PyTorch作为框架。机器学习和深度学习的领域是广阔的。在这一章,在本书的大部分时间里,我们主要考虑的是所谓的监督学习;也就是说,使用标记的训练示例进行学习。我们解释了监督学习范式,这将成为本书的基础。如果到目前为止您还不熟悉其中的许多术语,那么您是对的。这一章,以及未来的章节,不仅澄清了这一点,而且深入研究了它们。如果您已经熟悉这里提到的一些术语和概念,我们仍然鼓励您遵循以下两个原因:为本书其余部分建立一个共享的词汇表,以及填补理解未来章节所需的任何空白。

Expand All @@ -39,7 +37,7 @@

虽然在NLP /深度学习建模或编写本书时,这在数学上并不是正式有效,但我们将正式重述监督学习范例,以便为该领域的新读者提供标准术语,以便他们拥有熟悉arXiv研究论文中的符号和写作风格。

考虑一个数据集D=$\{X_i,y_i\}_{i=1}^n$,有n个例子。给定这个数据集,我们想要学习一个由权值w参数化的函数(模型)f,也就是说,我们对f的结构做一个假设,给定这个结构,权值w的学习值将充分表征模型。对于一个给定的输入X,模型预测ŷ作为目标: ŷ =f(X;W) 在监督学习中,对于训练例子,我们知道观察的真正目标y。这个实例的损失将为L(y,ŷ)。然后,监督学习就变成了一个寻找最优参数/权值w的过程,从而使所有n个例子的累积损失最小化。
考虑一个数据集 $$D=\{X_i,y_i\}_{i=1}^n$$,有n个例子。给定这个数据集,我们想要学习一个由权值w参数化的函数(模型)f,也就是说,我们对f的结构做一个假设,给定这个结构,权值w的学习值将充分表征模型。对于一个给定的输入X,模型预测ŷ作为目标: $$ŷ =f(X;W)$$ 在监督学习中,对于训练例子,我们知道观察的真正目标y。这个实例的损失将为 $$L(y,ŷ)$$ 。然后,监督学习就变成了一个寻找最优参数/权值w的过程,从而使所有n个例子的累积损失最小化。

* * *

Expand All @@ -65,7 +63,7 @@ Fruit flies like a banana.

```

对句子进行标记,忽略标点符号,并将所有的单词都用小写字母表示,就会得到一个大小为8的词汇表:{time, fruit, flies, like, a, an, arrow, banana}。所以,我们可以用一个八维的one-hot向量来表示每个单词。在本书中,我们使用$1_w$表示令牌/单词w的one-hot表示。
对句子进行标记,忽略标点符号,并将所有的单词都用小写字母表示,就会得到一个大小为8的词汇表:{time, fruit, flies, like, a, an, arrow, banana}。所以,我们可以用一个八维的one-hot向量来表示每个单词。在本书中,我们使用 $$1_w$$ 表示令牌/单词w的one-hot表示。

对于短语、句子或文档,压缩的one-hot表示仅仅是其组成词的逻辑或的one-hot表示。使用图1-3所示的编码,短语“like a banana”的one-hot表示将是一个3×8矩阵,其中的列是8维的one-hot向量。通常还会看到“折叠”或二进制编码,其中文本/短语由词汇表长度的向量表示,用0和1表示单词的缺失或存在。“like a banana”的二进制编码是:[0,0,0,1,1,0,0,1]

Expand Down Expand Up @@ -109,7 +107,7 @@ sns.heatmap(one_hot, annot=True,

**IDF表示惩罚常见的符号,并奖励向量表示中的罕见符号。** 符号w的IDF(w)对语料库的定义为

其中$n_w$是包含单词w的文档数量,N是文档总数。TF-IDF分数就是TF(w) * IDF(w)的乘积。首先,请注意在所有文档(例如, $n_w$ = N), IDF(w)为0,TF-IDF得分为0,完全惩罚了这一项。其次,如果一个术语很少出现(可能只出现在一个文档中),那么IDF就是log n的最大值。
其中 $$n_w$$ 是包含单词w的文档数量,N是文档总数。TF-IDF分数就是TF(w) * IDF(w)的乘积。首先,请注意在所有文档(例如, $$n_w$$ = N), IDF(w)为0,TF-IDF得分为0,完全惩罚了这一项。其次,如果一个术语很少出现(可能只出现在一个文档中),那么IDF就是log n的最大值。

Example 1-2\. Generating TF-IDF representation using scikit-learn

Expand Down
2 changes: 1 addition & 1 deletion docs/3.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ class Perceptron(nn.Module):

```

线性运算$\vec{w}^T\vec{x}+b$称为仿射变换。PyTorch方便地在torch中提供了一个Linear()类。nn模块,它做权值和偏差所需的簿记,并做所需的仿射变换。在“深入到有监督的训练”中,您将看到如何从数据中“学习”权重w和b的值。前面示例中使用的激活函数是sigmoid函数。在下一节中,我们将回顾一些常见的激活函数,包括sigmoid函数。
线性运算 $$\vec{w}^T\vec{x}+b$$ 称为仿射变换。PyTorch方便地在torch中提供了一个Linear()类。nn模块,它做权值和偏差所需的簿记,并做所需的仿射变换。在“深入到有监督的训练”中,您将看到如何从数据中“学习”权重w和b的值。前面示例中使用的激活函数是sigmoid函数。在下一节中,我们将回顾一些常见的激活函数,包括sigmoid函数。

## Activation Functions

Expand Down
4 changes: 2 additions & 2 deletions docs/7.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,13 @@ Elman RNNs的第二个问题是,它们会导致梯度螺旋地失去控制,

## Gating as a Solution to a Vanilla RNN’s Challenges

为了直观地理解门控,假设您添加了两个量,a和b,但是您想控制b放入和的多少。数学上,你可以把a + b的和改写成 **a+λb** λ是一个值在0和1之间。如果λ= 0,没有贡献从b如果λ= 1,b完全贡献。这种方式看,你可以解释λ充当一个“开关”或“门”控制的b进入之和。这就是门控机制背后的直觉。现在,让我们重新访问Elman RNN,看看如何将门控与普通的RNN合并以进行条件更新。如果前面的隐藏状态是$h_{t−1}$和当前输入$x_t$, Elman RNN的周期性更新看起来像
为了直观地理解门控,假设您添加了两个量,a和b,但是您想控制b放入和的多少。数学上,你可以把a + b的和改写成 **a+λb** λ是一个值在0和1之间。如果λ= 0,没有贡献从b如果λ= 1,b完全贡献。这种方式看,你可以解释λ充当一个“开关”或“门”控制的b进入之和。这就是门控机制背后的直觉。现在,让我们重新访问Elman RNN,看看如何将门控与普通的RNN合并以进行条件更新。如果前面的隐藏状态是 $$h_{t−1}$$ 和当前输入 $$x_t$$, Elman RNN的周期性更新看起来像

其中F是RNN的递归计算。显然,这是一个无条件的和,并且有“Vanilla RNNs(或Elman RNNs)的问题”中描述的缺点。现在想象一下,替代常数,如果前面的例子的λ是一个函数之前的隐藏状态向量ht−1和当前输入xt,而且还产生所需的控制行为;也就是说,0到1之间的值。通过这个门控函数,我们的RNN更新方程如下:

现在就清楚函数λ控制当前输入的多少可以更新状态ht−1。进一步的函数λ是上下文相关的。这是所有门控网络的基本直觉。λ的函数通常是一个s形的函数,我们知道从第三章到产生一个值在0和1之间。

在长短期记忆的情况下,这个基本的直觉是扩展仔细将不仅条件更新,而且还故意忘记之前的隐藏状态$h_{t−1}$的值。这种“忘记”乘以发生前隐藏状态与另一个函数μ值ht−1,还产生值在0和1之间,取决于当前的输入:
在长短期记忆的情况下,这个基本的直觉是扩展仔细将不仅条件更新,而且还故意忘记之前的隐藏状态 $$h_{t−1}$$ 的值。这种“忘记”乘以发生前隐藏状态与另一个函数μ值ht−1,还产生值在0和1之间,取决于当前的输入:

您可能已经猜到,μ是另一个控制功能。在实际的LSTM描述中,这变得很复杂,因为门函数是参数化的,导致对未初始化的操作的复杂序列。但是,在掌握了本节的直观知识之后,如果您想深入了解LSTM的更新机制,现在就可以了。我们推荐Christopher Olah的经典文章。在本书中,我们将不涉及这些内容,因为这些细节对于LSTMs在NLP应用程序中的应用和使用并不是必需的。

Expand Down
Loading

0 comments on commit 739c006

Please sign in to comment.