Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
imhuay committed Sep 25, 2018
1 parent 517b3df commit 61d89cd
Show file tree
Hide file tree
Showing 8 changed files with 703 additions and 612 deletions.
8 changes: 4 additions & 4 deletions A-深度学习/C-专题-优化算法.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ Index


## 梯度下降
> 数学/[梯度下降法](../数学/深度学习的核心.md#梯度下降法)
> ../数学/[梯度下降法](../C-数学/B-深度学习的核心#梯度下降法)
- 梯度下降是一种**优化算法**,通过**迭代**的方式寻找模型的**最优参数**
- 所谓最优参数指的是使**目标函数**达到最小值时的参数;
Expand All @@ -60,7 +60,7 @@ Index

### 小批量随机梯度下降
- 为了降低随机梯度的**方差**,使模型迭代更加稳定,实践中会使用**一批**随机数据的损失来近似平均损失。
> ./机器学习基础/[偏差与方差](./ML-机器学习基础.md#偏差与方差)
> ../机器学习基础/[偏差与方差](../A-机器学习/A-机器学习基础#偏差与方差)
- 使用批训练的另一个主要目的,是为了利用高度优化的**矩阵运算**以及**并行计算框架**

### 小批量 SGD 的更新过程
Expand Down Expand Up @@ -156,7 +156,7 @@ Index
> Hinton, 2012
- RMSProp 主要是为了解决 AdaGrad 方法中**学习率过度衰减**的问题—— AdaGrad 根据平方梯度的**整个历史**来收缩学习率,可能使得学习率在达到局部最小值之前就变得太小而难以继续训练;
- RMSProp 使用**指数衰减平均**(递归定义)以丢弃遥远的历史,使其能够在找到某个“凸”结构后快速收敛;此外,RMSProp 还加入了一个超参数 `ρ` 用于控制衰减速率。
> ./术语表/[指数衰减平均](./Base-A-术语表.md#指数加权平均指数衰减平均)
> ./术语表/[指数衰减平均](./备忘-术语表#指数加权平均指数衰减平均)
- 具体来说(对比 AdaGrad 的算法描述),即修改 `r`
<div align="center"><a href="http://www.codecogs.com/eqnedit.php?latex=\fn_jvn&space;\begin{aligned}&space;&r\leftarrow&space;\mathbb{E}[g^2]_t=\rho\cdot\mathbb{E}[g^2]_{t-1}&plus;(1-\rho)\cdot&space;g^2&space;\end{aligned}"><img src="../_assets/公式_20180819204219.png" height="" /></a></div>
Expand Down Expand Up @@ -226,7 +226,7 @@ Index
- 梯度下降使用的梯度信息实际上是**一阶导数**
- 牛顿法除了一阶导数外,还会使用**二阶导数**的信息
- 根据导数的定义,一阶导描述的是函数值的变化率,即**斜率**;二阶导描述的则是斜率的变化率,即曲线的弯曲程度——**曲率**
> 数学/[泰勒级数](../数学/微积分的本质.md#泰勒级数)
> 数学/[泰勒级数](../C-数学/B-微积分的本质#泰勒级数)
**牛顿法更新过程** TODO
> 《统计学习方法》 附录 B
Expand Down
110 changes: 55 additions & 55 deletions A-深度学习/D-专题-序列建模.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,82 +2,82 @@
===

**相关专题**
- [专题-RNN](./DL-B-专题-RNN.md)
- [专题-DNN](./DL-B-专题-DNN.md)
- [专题-RNN](./B-专题-RNN.md)
- [专题-RNN](./B-专题-RNN.md)

Index
---
<!-- TOC -->

- [序列建模简述](#序列建模简述)
- [Seq2Seq](#seq2seq)
- [解码方法(贪心、Beam Search、维特比算法)](#解码方法贪心beam-search维特比算法)
- [Beam Search(集束搜索)](#beam-search集束搜索)
- [维特比(Viterbi)算法 TODO](#维特比viterbi算法-todo)
- [其他最短路径算法](#其他最短路径算法)
- [构建 Seq2Seq 一般做法](#构建-seq2seq-一般做法)
- [解码方法(贪心、Beam Search、维特比算法)](#解码方法贪心beam-search维特比算法)
- [Beam Search(集束搜索)](#beam-search集束搜索)
- [维特比(Viterbi)算法 TODO](#维特比viterbi算法-todo)
- [其他最短路径算法](#其他最短路径算法)
- [构建 Seq2Seq 一般做法](#构建-seq2seq-一般做法)
- [序列的表示学习](#序列的表示学习)
- [学习任务无关的 Sentence Embedding](#学习任务无关的-sentence-embedding)
- [学习任务无关的 Sentence Embedding](#学习任务无关的-sentence-embedding)
- [CNN 与序列建模](#cnn-与序列建模)
- [一维卷积](#一维卷积)
- [一维卷积](#一维卷积)
- [时间卷积网络(TCN)](#时间卷积网络tcn)
- [WaveNet](#wavenet)
- [因果卷积](#因果卷积)
- [空洞卷积](#空洞卷积)
- [Highway 网络](#highway-网络)
- [残差模块](#残差模块)
- [WaveNet](#wavenet)
- [因果卷积](#因果卷积)
- [空洞卷积](#空洞卷积)
- [Highway 网络](#highway-网络)
- [残差模块](#残差模块)
- [Reference](#reference)

<!-- /TOC -->

## 序列建模简述
> [从循环到卷积,探索序列建模的奥秘](https://mp.weixin.qq.com/s/f0sv7c-H5o5L_wy2sUonUQ) - 机器之心
- 序列建模就是将一个**输入/观测**序列映射到一个**输出/标记**序列
> 《统计学习方法》中称之为标注问题
> 《统计学习方法》中称之为标注问题
-**传统机器学习**方法中,常用的模型有:隐马尔可夫模型(HMM),条件随机场(CRF)等
> 机器学习专题 TODO
> 机器学习专题 TODO
-**深度学习领域**的很长一段时间里,RNN/LSTM 都是序列建模的首选。
> 《深度学习》 10 序列建模:循环和递归网络
> 《深度学习》 10 序列建模:循环和递归网络
- 最近,CNN 开始在序列建模领域流行,一个**关键想法**是——在一维时间序列上使用**一维卷积运算**
<div align="center"><img src="../_assets/TIM截图20180808105242.png" height="" /></div>
<div align="center"><img src="../_assets/TIM截图20180808105242.png" height="" /></div>

> [CNN for Sentence Classification](https://arxiv.org/abs/1408.5882) (Kim, 2014)
> [CNN for Sentence Classification](https://arxiv.org/abs/1408.5882) (Kim, 2014)

## Seq2Seq
- Seq2Seq 的核心思想是把一个输出序列,通过**编码**(Encode)和**解码**(Decode)两个过程映射到一个新的输出序列。
<div align="center"><img src="../_assets/seq2seq.png" height="" /></div>

> [Translation with a Sequence to Sequence Network and Attention](https://pytorch.org/tutorials/intermediate/seq2seq_translation_tutorial.html) — PyTorch
<div align="center"><img src="../_assets/seq2seq.png" height="" /></div>
> [Translation with a Sequence to Sequence Network and Attention](https://pytorch.org/tutorials/intermediate/seq2seq_translation_tutorial.html) — PyTorch
- 经典的 Seq2Seq 模型中,**编码器**(Encoder)和**解码器**(Decoder)都使用 **RNN** 进行建模
<!-- <div align="center"><img src="../_assets/seq2seq-text.jpg" height="250" /></div> -->
<div align="center"><img src="../_assets/TIM截图20180829162307.png" height="" /></div>

> 上图是一次**机器翻译**的过程,输入是一个源语言的一个句子 "A B C",Encoder 一次读入每个单词直到结束符 `<EOS>`(End of Sequence);<br/>
> 在解码的第一步,Decoder 先读取 **Encoder 的最终状态**,生成目标语言的第一个词 'W',接着 Decoder 读取第一步的输出 'W' 作为第二步的输入,进而生成第二个词 'X',如此直到生成 `<EOS>` 或达到指定**最大长度**
>> Decoder 生成每个词还要结合当前时间步的隐状态(如果是 LSTM 还有 记忆状态),更深入的细节暂时略过。
<!-- <div align="center"><img src="../_assets/seq2seq-text.jpg" height="250" /></div> -->
<div align="center"><img src="../_assets/TIM截图20180829162307.png" height="" /></div>
> 上图是一次**机器翻译**的过程,输入是一个源语言的一个句子 "A B C",Encoder 一次读入每个单词直到结束符 `<EOS>`(End of Sequence);<br/>
> 在解码的第一步,Decoder 先读取 **Encoder 的最终状态**,生成目标语言的第一个词 'W',接着 Decoder 读取第一步的输出 'W' 作为第二步的输入,进而生成第二个词 'X',如此直到生成 `<EOS>` 或达到指定**最大长度**
>> Decoder 生成每个词还要结合当前时间步的隐状态(如果是 LSTM 还有 记忆状态),更深入的细节暂时略过。
- Seq2Seq 之所以流行,是因为它为不同的问题提供了一套**端到端**(End to End)的解决方案,免去了繁琐的中间步骤,从输入直接得到结果.
- 根据任务的输入输出差异,编码器和解码器的设计也不尽相同,但是“Encoder-Decoder”的结构都是一致的。
- **机器翻译**:输入源语言的一个句子,输出目标语言的句子;
- **机器问答**:输入问题/查询,输出答案;
- **文本摘要**:输入一个长句或段落,输出一个摘要短句;
- **语音识别**:输入是音频序列信号,输出为识别出的文本;
- **图像描述**:输入是图像经过视觉网络的特征,输出是图像的描述文本。
- ...
- **机器翻译**:输入源语言的一个句子,输出目标语言的句子;
- **机器问答**:输入问题/查询,输出答案;
- **文本摘要**:输入一个长句或段落,输出一个摘要短句;
- **语音识别**:输入是音频序列信号,输出为识别出的文本;
- **图像描述**:输入是图像经过视觉网络的特征,输出是图像的描述文本。
- ...

### 解码方法(贪心、Beam Search、维特比算法)

- Seq2Seq 中的解码方法主要有三种:**贪心****Beam Search****维特比算法**(动态规划)
- 这三种方法的思想本质上是一致的,假设选取相同的评价标准(比如概率最大、路径最短等)
- **贪心**每到达一个节点,只选择当前状态的**最优结果**,其他都忽略,直到最后一个节点;贪心法只能得到某个局部最优解;
- **Beam Search** 会在每个节点保存当前**最优的 k 个结果**(排序后),其他结果将被“剪枝”,因为每次都有 k 个分支进入下一个状态。Beam Search 也不能保证全局最优,但能以较大的概率得到全局最优解。
- **维特比算法**利用**动态规划**的方法可以保证得到全局最优解,但是当候选状态极大时,需要消耗大量的时间和空间搜索和保存状态,因此维特比算法只适合状态集比较小的情况。
- **贪心**每到达一个节点,只选择当前状态的**最优结果**,其他都忽略,直到最后一个节点;贪心法只能得到某个局部最优解;
- **Beam Search** 会在每个节点保存当前**最优的 k 个结果**(排序后),其他结果将被“剪枝”,因为每次都有 k 个分支进入下一个状态。Beam Search 也不能保证全局最优,但能以较大的概率得到全局最优解。
- **维特比算法**利用**动态规划**的方法可以保证得到全局最优解,但是当候选状态极大时,需要消耗大量的时间和空间搜索和保存状态,因此维特比算法只适合状态集比较小的情况。

#### Beam Search(集束搜索)
- Beam Search 是一种启发式算法
- 该方法会保存前 `beam_size` 个最佳状态,每次解码时会根据所有保存的状态进行下一步**扩展****排序**,依然只保留前 `beam_size` 个最佳状态;循环迭代至最后一步,保存最佳选择。
- Beam Search 图示
<div align="center"><img src="../_assets/TIM截图20180829172245.png" height="" /></div>
<div align="center"><img src="../_assets/TIM截图20180829172245.png" height="" /></div>

-`beam_size = 1` 时,Beam Search 即退化为贪心搜索
- 一般为了计算资源和性能的平衡,`beam_size` 会选择一个适中的范围;通常 `beam_size``8~12` 即可(机器翻译、文本摘要)
Expand All @@ -89,22 +89,22 @@ Index

#### 其他最短路径算法
- Dijkstra 算法(迪杰斯特拉算法)
- 基于贪心
- 用于求解某个顶点到其他所有顶点之间的最短路径
- 时间复杂度 `O(N^2)`
- Dijkstra 算法的使用范围比 Viterbi 算法更广,可用于求解大部分图结构中的最短路径。
- 基于贪心
- 用于求解某个顶点到其他所有顶点之间的最短路径
- 时间复杂度 `O(N^2)`
- Dijkstra 算法的使用范围比 Viterbi 算法更广,可用于求解大部分图结构中的最短路径。
- Floyd 算法(弗洛伊德算法)
- 求解的是每一对顶点之间的最短路径
- 时间复杂度 `O(N^3)`
- 求解的是每一对顶点之间的最短路径
- 时间复杂度 `O(N^3)`


### 构建 Seq2Seq 一般做法
- 堆叠 RNN/CNN
> [CNN 与序列建模](#cnn-与序列建模)
> [CNN 与序列建模](#cnn-与序列建模)
- Dropout 机制
- **残差**连接
- **Attention 机制**
> [Attention 专题](./DL-C-专题-Attention.md)
<!-- > [Attention 专题](./DL-C-专题-Attention.md) -->


## 序列的表示学习
Expand All @@ -122,21 +122,21 @@ Index

## CNN 与序列建模
- 一般认为 CNN 擅长处理**网格结构的数据**,比如图像(二维像素网络)
- 卷积层试图将神经网络中的每一小块进行更加深入的分析,从而得出抽象程度更高的特征。
- 一般来说通过卷积层处理的神经元结点矩阵会变得更深,即神经元的组织在第三个维度上会增加。
- 卷积层试图将神经网络中的每一小块进行更加深入的分析,从而得出抽象程度更高的特征。
- 一般来说通过卷积层处理的神经元结点矩阵会变得更深,即神经元的组织在第三个维度上会增加。
- **时序数据**同样可以认为是在时间轴上有规律地采样而形成的一维网格
<div align="center"><img src="../_assets/TIM截图20180808105242.png" height="" /></div>
<div align="center"><img src="../_assets/TIM截图20180808105242.png" height="" /></div>

> [CNN for Sentence Classification](https://arxiv.org/abs/1408.5882) (Kim, 2014)
> [CNN for Sentence Classification](https://arxiv.org/abs/1408.5882) (Kim, 2014)
### 一维卷积
- 适用于序列建模的卷积网络一般就是采用的是一维卷积
<div align="center"><img src="../_assets/TIM截图20180808135512.png" height="200" /></div>
<div align="center"><img src="../_assets/TIM截图20180808135512.png" height="200" /></div>

- 最下层的 `x_i` 可视为句子的输入序列
- 最上层的 `g_j` 即输出序列
- 流行的网络中一般使用 **embedding** 作为输入,也就说每个 `x_i` 其实是一个多维向量 `v(x_i)`
> [NLP-词向量](./NLP-词向量.md)
- 最下层的 `x_i` 可视为句子的输入序列
- 最上层的 `g_j` 即输出序列
- 流行的网络中一般使用 **embedding** 作为输入,也就说每个 `x_i` 其实是一个多维向量 `v(x_i)`
> ../自然语言处理/[词向量](../B-自然语言处理/B-专题-词向量.md)

## 时间卷积网络(TCN)
Expand Down
Loading

0 comments on commit 61d89cd

Please sign in to comment.