循环神经网络
1. 场景与多种应用
- 模仿论文(生成序列)
- 模型Linux内核代码“写程序” (生成序列)
- 模仿小四的作品(生成文本序列)
- 机器翻译
- Image to text/ 看图说话
我们知道神经网络结构如下:
那循环神经网络和它是什么关系呢?
循环神经网络
为什么有BP神经网络,CNN,还要RNN?
- 传统神经网络(包括RNN),输入和输出都是互相独立的;
- 图像上的猫和狗是分隔开的,但有些任务,后序的输出和之前的内容是相关的;
- “我是中国人,我的母语是__”
- RNN引入“记忆”的概念
- 循环2字来源于其每个元素都执行相同的任务;
- 但是输出依赖于输入和“记忆”
2. 层级结构
简单来看,把序列按时间展开
- Xt是时间t处的输入;
- St是时间t处的“记忆”,St=f(UXt+WSt-1),f可以是tanh等;
- Ot是时间t处的输出,比如是预测下个词的话,可能是softmax输出的属于每个候选词的概率,Ot=softmax(VSt)
结构细节:
- 可以把隐状态St视作“记忆体”,捕获了之前时间点上的信息;
- 输出Ot由当前时间及之前所有的“记忆”共同计算得到;
- 很可惜,实际应用中,St并不能捕获和保留之前所有信息(记忆有限?)
- 不同于CNN,这里的RNN其实整个神经网络都共享一组参数(U, V, W),极大减小了需要训练和预估的参数量;
- 图中的Ot在有些任务下是不存在的,比如文本情感分析,其实只需要最后的output结果就行;
3. 多种RNN
双向RNN
有些情况下,当前的输出不只依赖于之前的序列元素,还可能依赖之后的序列元素;
比如从一段话踢掉部分词,让你补全;
直观理解:双向RNN叠加;
深层双向RNN
和双向RNN的区别是每一步/ 每个时间点我们设定多层结构
4. BPTT算法
MPL(DNN)与CNN用BP算法求偏导
BPTT和BP是一个思路,只不过既然有step,就和时间t有关系
5. 生成模型与图像描述
简单image to text
图片描述数据集
Microsoft COCO数据集: http://mscoco.org
RNN与图片描述
部分结果
LSTM
前面提到的RNN解决了,对之前的信息保存的问题
但是!存在长期依赖的问题。
- 看电影的时候,某些情节的推断需要依赖很久以前的一些细节;
- 很多其他的任务也一样;
- 很可惜随着时间间隔不断增大时,RNN会丧失学习到连接如此远的信息的能力;
- 也就是说,记忆容量有限,一本书从头到尾一字不漏的去记哦,肯定离得越远的东西忘得越多。
- 怎么办:LSTM
LSTM是RNN一种,大体结构几乎一样,区别是:
- 它的“记忆细胞”改造过;
- 该记的信息会一直传递,不该记的会被“门”截断;
1. 长时依赖问题
RNN的结构
把“记忆细胞”表现的炫酷一点
LSTM呢
“记忆细胞”变得稍微复杂了一点点
2. “记忆细胞”与状态
LSTM关键:“细胞状态”
细胞状态类似于传送带,直接在整个链上运行,只有一些少量的线性交互。信息在上面流传保持不变会很容易。
LSTM怎么控制“细胞状态”?
- 通过“门”让信息选择性通过,来去除或者增加信息到细胞状态;
- 包含一个sigmoid神经网络层和一个pointwise乘法操作;
- sigmoid层输出0到1之间的概率值,描述每个部分有多少量可以通过。0代表“不允许量通过”,1就指“运行任意量通过”
LSTM的几个关键“门”与操作
- 第一步:决定从“细胞状态”中丢弃什么信息 => “忘记门”
- 比如完形填空中填“他” 或者“她”的问题,细胞状态可能包含当前主语的类别,当我们看到新的代词,我们希望忘记旧的代词。
第二步:决定放什么信息到“细胞状态”中
- sigmoid层决定什么值需要更新;
- tanh层创建一个新的候选值向量Ct ;
- 上述2步是为状态更新做准备;
第三步:更新“细胞状态”
- 更新Ct-1为Ct
- 把旧状态与ft 相乘,丢弃掉我们确定需要丢弃的信息;
- 加上it * Ct ,这就是新的候选值,根据我们决定更新每个状态的程度进行变化。
第四步:基于“细胞状态”得到输出
- 首先运行一个sigmoid层来确定细胞状态的哪个部分将输出;
- 接着用tanh处理细胞状态(得到一个在-1到1之间的值),再将它和sigmoid门的输出相乘,输出我们确定输出的那部分。
- 比如我们可能需要单复数信息来确定输出“他”还是“他们”
3. LSMT的变体
变种1
- 增加“peephole connection”
- 让门层也会接受细胞状态的输入;
变种2
通过使用coupled忘记和输入门;
之前是分开确定需要忘记和添加的信息,这里是一同做出决定。
4. GRU
Gated Recurrent Unit (GRU),2014年提出
- 将忘记门和输入门合成了一个单一的更新门;
- 同样还混合了细胞状态和隐藏状态,和其他一些改动;
- 比标准LSTM简单;
生成模式
字符级别的生成模型
纯手工撸制代码请戳 https://gist.github.com/karpathy/d4dee566867f8291f086
标签:状态,RNN,输出,细胞,神经网络,深度,LSTM From: https://www.cnblogs.com/shengyang17/p/17278069.html