传统的机器学习算法非常依赖人工提取特征, 使得图像识别, 语音识别, 自然语音处理等问题存在特征提取的瓶颈
基于全连接神经网络的方法存在参数太多, 无法利用时间序列信息等问题
??
卷积神经网络解决图像的特征提取问题, 参数太多问题
循环神经网络解决利用时间序列信息的问题
??
循环神经网络主要用于语音识别, 语言模型, 机器翻译, 时序分析等等
这些应用比如翻译, 单词预测都需要考虑上下文关系, 也就是说受时序的影响
网络结构
O(t-1) O(t) O(t+1)
↑ ↑ ↑
- | V | V | V
- W | W | W |
- ---> S(t-1) ---> S(t) ---> S(t+1)
↑ ↑ ↑
- | U | U | U
- | | |
- X(t-1) X(t) X(t+1)
X(t): 是 t 时刻的输入, 例如单词向量
??
S(t): 是 t 时刻的状态, 由上一个时刻的状态和当前输入得到
- ??
- ???\(\small S(t) = f( X(t) \times U + S(t-1) \times W + b\_state)\)
- ??
??? 其中 \(\small f\) 是非线性激活函数 (一般是 \(\small tanh\)), 设 \(\small S(-1)\) 为 0
??
O(t): 是 t 时刻的输出
- ??
- ???\(\small O(t) = softmax( S(t) \times V + b\_output )\)
- ??
每个时刻都使用相同的 U,V,W 参数, 反应出 RNN 中每一步都在做相同的事, 这样大大减少了参数
??
假设 X 的维度是 (1, n), 而 S 的维度是 (1, h), 则
??U 的维度是 (n, h)
??W 的维度是 (h, h)
??b_state 的维度是 (1, h)
??
??V 的维度是 (h, 1)
??b_output 的维度是 (1, 1)
??
?? 共需要参数为 (n x h) + (h x h) + h + h + 1 = (n+h+2) x h + 1
??
RNN 要求每一个时刻都有输入, 但不是每一个时刻都要有输出 (比如要接收完整的一句话才会有输出)
??
RNN 的输入输出可以有多种情况
??1. 一个输入比如一张图像, 输出是单词序列
??2. 输入序列比如一个句子, 输出一个值, 比如判断句子的分类或预测下一个单词
??3. 输入输出都是序列, 比如翻译
训练算法
参数训练通过随时间进行反向传播 (Backpropagation Through Time,BPTT) 算法
基本原理和 BP 算法一样, 也包含三个步骤:
??1. 前向计算每个神经元的输出值
??2. 反向计算每个神经元的误差项值, 它是误差函数对神经元的加权输入的偏导数
??3. 计算每个权重的梯度, 最后再用随机梯度下降算法更新权重
LSTM(Long Short Term Memory, 长短时记忆)
传统 RNN 在实际中很难处理长期依赖问题
比如 "I grew up in France ...... I speak fluent ()" 要预测 () 中该填哪个词, 跟很久之前的 "France" 有密切关系
LSTM 就是为了解决这个问题, 循环神经网络被成功应用的关键就是 LSTM
很多任务采用 LSTM 比标准的 RNN 表现要好
??
LSTM 是一个拥有三个门的结构
?? 门结构是一个使用 sigmoid 神经网络和一个按位做乘法的操作, 这两个操作合在一起就是门
??
??sigmoid 作为激活函数输出 0 到 1 之间的数值
?? 当输出为 0 时, 所有信息都无法通过, 当输出为 1 时, 所有信息都可以通过
??
?? 三个门分别是遗忘门, 输入门, 输出门
??
?? 遗忘门让 RNN 忘记之前没有用的信息
?? 比如一段文章先写了某地原来碧水蓝天, 但后来被污染了, 于是 RNN 应该忘记之前碧水蓝天的状态
??
?? 忘记部分历史信息后, 应该从当前输入补充新信息, 这就是输入门, 比如把环境被污染这个信息写进去
??
?? 遗忘门和输入门后产生了新的状态
?? 输出门根据新的状态和输入信息决定该时刻的输出
?? 比如当前状态为污染, 那么天空的颜色可能就是灰色的
C(t-1) ---> * ---------> + --- C(t) ---->
↑ ↑ ↓
| S --> * F
S ↑ ↑ ↓
↑ | F S --> *
| | ↑ ↑ ↓
h(t-1) ------------------------- --------- h(t) ------>
↑ |
| ↓
X(t) h(t)
其中 C 是状态, h 是输出, X 是输入, S 是 sigmoid 函数, F 是激活函数 (一般是 tanh)
??
h(t-1) 和 X(t) 共同作为输入, 被 3 个 S 和 1 个 F 使用, 每个都有自己的 W 和 b 系数
??
第一个 S 的输出和 C(t-1) 相乘, 起到遗忘门的作用
第二个 S 的输出和 F 的输出相乘得到要添加的新的信息, 再和遗忘门的输出相加, 起到输入门的作用, 得到新的状态 C(t)
第三个 S 的输出和 F 处理 C(t) 后的输出相乘, 得到 t 时刻的输出
RNN 的变种
双向循环神经网络: 有些问题中, 当前的输出不仅和之前的状态有关, 也和之后的状态相关
深层循环神经网络: 在每个时刻上将循环体结构复制了多次
来源: http://www.bubuko.com/infodetail-3477958.html