Week 7
为序列建模 Modeling sequences: A brief overview
- 目标:
- 将一个输入序列转变成另一个域中的输出序列
- 在没有明确目标序列的情况下,通过预测下一个项目获取一个引导信号
- 预测下一个项目的任务实际上模糊了监督学习和非监督学习的边界
- 在使用监督学习方法是,并不需要一个独立的引导信号(非监督学习)
- 无记忆(memoryless)模型
- 自回归(autoregressive)模型:从固定的几个项目得到后一个项目(线性权重平均)
- 前馈神经网络:返回上面的自回归模型,加入一个非线性隐藏层
- 超越无记忆模型
- 如果我们给生成模型一些隐藏状态和内部动态性,我们可以构建一种更有趣的模型
- 这类模型可以在很长一段时间内保存信息于隐藏状态
- 如果动态性是有噪声的,同时生成输出也是有噪声的,那么我们无法直到隐藏状态内部的内容
- 我们能做的就是推断一个隐藏状态向量空间的概率分布
- 只有两类隐藏状态模型的推断是可行的
- 线性动态系统
- 生成模型
- 隐藏状态为实值,且无法直接观察
- 隐藏状态具有含高斯噪声的线性动态性,并使用一个线性模型产生带有高斯噪声的观察值
- 可能包含驱动输入,其直接影响着隐藏状态值
- 为了产生下一个输出,我们需要推断隐藏状态
- 性质:一个线性变换的高斯分布还是一个高斯分布,所以隐藏状态同样是一个高斯分布,虽然很复杂,但是我们可以使用卡尔曼滤波器(Kalman Filter)高效计算,并进行评估
- 隐式马尔科夫模型(离散分布)
- 具有离散的N中其1的状态
- 状态见的转换是随机的,并由一个转换矩阵(概率矩阵)控制
- 输出的产生也是随机的
- 因此,我们无法明确一个输出是由哪一个状态产生的——隐藏状态
- 使用N个数表示N个状态的概率分布是十分容易的
- 为了预测下一个输出,我们需要推断隐藏状态的概率分布
- HMM可以很高效地完成这个
- HMM的限制:
- 生成数据时,在每一个时间点,由于受限于N个状态,其只能记住 log N \log N logN个位的历史信息
- 当生成前一半内容时,为了生成后一半内容,HMM需要确保很多内容的适配和统一(所有的状态的总量将是指数级的)
- 递归神经网络
- 分布式隐藏状态允许其存储过去的信息(很多个单元)
- 非线性动态性允许以一种复杂方式更新隐藏状态
- 只要神经元数量和时间足够,任何可计算内容都可以通过RNN实现
- 生成模型需要是随机的吗?
- 线性系统是随机模型,但是我们得到的输出的概率分布是隐藏状态的一个确定性函数
- RNN是确定性的,但是其隐藏状态实际上是线性动态系统的概率分布的等价
- RNN能做到什么?
- 震荡(电机控制)
- 确定点吸引子(检索记忆)
- 无规律
- 学习可能的小程序,这些小程序平行运行,并以复杂的方式交流
- 但是其复杂性导致其难以训练
使用反向传播训练RNN Training RNNs with back propagation
-
前馈网络和循环网络的等价性
- 循环网络实际上是重复使用相同权重的多层网络
-
反向传播很容易修改以引入权重间的线性约束
- 按照往常计算梯度,然后将梯度修改以满足约束
- 限制 w 1 = w 2 w_1 = w_2 w1=w2,则需要 Δ w 1 = Δ w 2 \Delta w_1 = \Delta w_2 Δw1=Δw2
- 计算KaTeX parse error: Undefined control sequence: \part at position 7: \frac{\̲p̲a̲r̲t̲ ̲E}{\part w_1}和KaTeX parse error: Undefined control sequence: \part at position 7: \frac{\̲p̲a̲r̲t̲ ̲E}{\part w_2},使用KaTeX parse error: Undefined control sequence: \part at position 7: \frac{\̲p̲a̲r̲t̲ ̲E}{\part w_1} +…用于两个权重的更新
-
按照时间的反向传播算法
- 前馈过程在每一个时间节点建立了一组活动
- 反向过程在每一个时间点取出这些活动并计算误差梯度
- 反向过程后,将同一权重的每个时间点的梯度加起来
-
一个麻烦的问题:初始化
- 将这个初始状态视为一个可学习参数进行学习
- 先随机猜一些权重,然后再反向传播更新之
-
RNN的输入方式
- 指定初始状态
- 指定初始状态的一个子集(一个输入)
- 指定每一个时间点的状态(序列输入)
-
RNN的输出方式
- 指定理想的全部单元最终激活值
- 指定理想的全部单元的后几层的激活值(便于学习点吸引子以及加入额外的错误梯度)
- 指定子集的理想激活值(其他单元就是输入或者是隐藏单元)
RNN实例 A toy example of training an RNN
- RNN相对需要学习的模式基本一致,但是其能够使用更少的参数来表示尽可能多的模式
- 对于成倍增加的输入,RNN只需要成倍增加的参数,而不至于平方增加的前馈网络
训练RNN的难点 Why it is difficult to train an RNN
- 反向传播是线性的
- 前向传播中,我们使用逻辑函数这类函数避免激活向量爆炸
- 但是反向传播中,整个过程是线性的(使用逻辑函数各点的导数)
- 因此反向传播中很容易爆炸或消亡
- 多层网络的梯度爆炸和消失
- 如果权重很小,梯度会指数级缩小,对浅层不起作用
- 如果权重很大,梯度会指数级增大,抹掉所有学过的知识
- 对一般的前馈网络,这一问题影响很小,但对于按时间形成层次的RNN,这一问题十分严重
- 尽管拥有一个很好的初始状态,这一网络的输出很难依赖上数个步骤之前
- 因此RNN很难处理长距离依赖
- 四种有效训练RNN方式
- 长短期记忆(Long Short Term Memory):让RNN由小模块组成,这些小模块用来维持一段时间的记忆
- 无黑森优化(Hessian Free Optimization):使用一个可以检测微小梯度方向优化器解决梯度消失问题
- 回声状态网络(Echo State Networks):非常小心地将输入到隐藏状态,隐藏状态到隐藏状态和输出到隐藏状态初始化,这样隐藏状态可以拥有一个巨大的弱配对池可以被输入选择性地驱动(输入的波动和输出的波动的特征关系学习,只学习隐藏状态到输出的连接)
- 含动量方法的优秀初始化:像回升状态网络那样初始化,但是使用动量方法学习各种连接
长短期记忆 Long-term Short-term-memory
- 我们将神经网路的动态状态作为短期记忆,我们需要做的就是让这个短期记忆维持一段时间
- 使用门限开关来决定当前动态状态是否会影响已经保存的状态(输入),以及保存的状态是否会延续到当前状态(输出)
- 更新记住的内容,“写”门打开
- 保留记住的内容,“留”门打开
- 读取记住的内容,“读”门打开