文章目录
1.1 循环神经网络与应用
- 模仿论文
利用标记序列将论文写成一个序列
- 模仿linux内核代码“写程序”
学习到函数的定义方式,函数语句,括号,判断方式,写出的程序可能没有实际意义,但可以学到格式。
- 模仿某个诗词类型写作
本质上学习的是一个统计的东西
-
机器翻译
-
看图说话
1.2 循环神经网络模型
很多任务的输入和输出之间是相关的,RNN引入记忆的概念,也就是其输出依赖于此时的“输入”和之前的“记忆”。
**循环/递归:**每个元素(cell)都会执行相同的任务,所以每次变更的就是输入和记忆。
循环神经网络是将有很多层的网络叠加起来,按时间展开之后如下:
示例:语言模型
语言模型会学习中文的表达方式,会学习哪些词在一起出现的概率高,在知道前n个序列之后,推断出下一个时刻可能出现的序列。
比如:我+是+中国+,判断后面出现的哪个词的概率最高
循环神经网络的结构:
举例说明:五年级为止,你学习到的知识时由五年级学到的知识和前四年学到的知识的组合
如何将知识做一个组合:
- 传统的感知器是给每个知识乘以一个权值,得到最终的结果
- RNN也是一样,将五年级的知识赋权值U,和前四年的记忆赋权值W,来组合信息
- f是激活函数,五年级学到的东西更高级,也更重要(比如乘法的计算优于加法),所以激活函数是起到过滤的作用,非线性处理。
RNN的过程:
-
现在已有了前 t − 1 t-1 t−1个样本积累的记忆 S t − 1 S_{t-1} St−1
-
t t t时刻的输入为 X t X_t Xt
-
计算 t t t时刻的新的记忆: S t = t a n h ( U X t + W S t − 1 ) S_t=tanh(UX_t+WS_{t-1}) St=tanh(UXt+WSt−1)
-
计算 t t t时刻的输出,也就是对 t t t时刻的新的记忆进行softmax映射 O t = s o f t m a x ( V S t ) O_t=softmax(VS_t) Ot=softmax(VSt),判断出词典中的哪个词最可能在下一时刻出现。
RNN的细节:
- 隐状态 S t S_t St:视作记忆体,捕捉到当前时间点的信息
- 输出 O t O_t Ot:由当前时间及之前所有的“记忆” S t S_t St共同计算得到
- 实际中的 S t S_t St:不能捕捉和保留之前的所有信息,也就是矩阵 S t S_t St的维度是有限的,即能够存储的信息量是有限的,
- RNN的整个神经网络都共享一组参数 ( U , V , W ) (U,V,W) (U,V,W),极大的减小了训练和预估的参数量(U:t时刻输出的权重,W:t-1时刻记忆的权重,V:softmax时对St的权重)
- 图中的 O t O_t Ot在某些任务下是不存在的,也就是不一定每个时刻都要有输出,比如对新闻的文本的分类,看完全部的文本,得到一个文本的分类结果。
不同类型的RNN:
1、双向RNN:
有些情况,当前的输出不仅仅依赖于之前的序列,还可能依赖于后面的序列,比如完形填空,剔除中间的词,要补全的话,要利用双向的信息。
备注:此处的 h h h即为前面的 S S S
h → \overrightarrow{h} h:表示从左往右迭代的结果
h ← \overleftarrow {h} h:是从右往左左迭代的结果
y t y_t yt:原本是100x1的向量,现在变为了100x2的向量,两个合并,变为一个矩阵,c为偏置,
2、双向深层RNN:
由单层变为多层
1.3 BPTT算法
Back propagation through time,依据时间的反向传播
总的损失函数=t个时刻的损失函数之和:
E ( y , y ^ ) = ∑ t E t ( y t , y ^ t ) = − ∑ y t l o g y ^ t E(y,\hat y)=\sum_tE_t(y_t,\hat y_t)=-\sum y_tlog\hat y_t E(y,y^)=t∑Et(yt,y^t)=−∑ytlogy^t
t时刻的损失函数如下:
E t ( y t , y ^ t ) = − y t l o g y ^ t E_t(y_t,\hat y_t)=-y_tlog\hat y_t Et(yt,y^t)=−ytlogy^t
-
预测过程,假设词典有4w个词 ,利用softmax来预测哪个词最有可能是当前时刻会出现的词。
-
每个时间点的输出都会计算一个损失函数—— E t ( y t , y ^ t ) E_t(y_t,\hat y_t) Et(yt,y^t),
标签 y y y:[0 0 0 1 0 0 0 0 …0](4000x1的向量)
预测 y ^ \hat y y^:[0.2 ,0.0001 , 0.0004,…,](4000x1的向量)
-
整个时间轴的损失就是所有时刻的损失值的和 E ( y , y ^ ) E(y,\hat y) E(y,y^)
-
利用随机梯度下降法最小化损失函数,对w求偏导,不能直接用BP,要用BPTT
∂ E ∂ W = ∑ t ∂ E t ∂ W \frac{\partial E}{\partial W}=\sum_t\frac{\partial E_t}{\partial W} ∂W∂E=t∑∂W∂Et
假如求第三个位置的偏导,利用链式法则:
∂ E 3 ∂ W = ∂ E 3 ∂ y ^ 3 ∂ y ^ 3 ∂ s 3 ∂ s 3 ∂ W \frac{\partial E_3}{\partial W}=\frac{\partial E_3}{\partial \hat y_3}\frac{\partial \hat y_3}{\partial s_3}\frac{\partial s_3}{\partial W} ∂W∂E3=∂y^3∂E3∂s3∂y^3∂W∂s3
又因为: s 3 = t a n h ( U x t + W s 2 ) s_3=tanh(Ux_t+Ws_2) s3=tanh(Uxt+Ws2)
根据链式法则有: ∂ E 3 ∂ W = ∑ k = 0 3 ∂ E 3 ∂ y ^ 3 ∂ y ^ 3 ∂ s 3 ∂ s 3 ∂ s k ∂ s k ∂ W \frac{\partial E_3}{\partial W}=\sum_{k=0}^3\frac{\partial E_3}{\partial \hat y_3}\frac{\partial \hat y_3}{\partial s_3} \frac{\partial s_3}{\partial s_k} \frac{\partial s_k}{\partial W} ∂W∂E3=k=0∑3∂y^3∂E3∂s3∂y^3∂sk∂s3∂W∂sk
也就是:
∂ E 3 ∂ W = ∑ k = 0 3 ∂ E 3 ∂ y ^ 3 ∂ y ^ 3 ∂ s 3 ( ∏ j = k + 1 3 ∂ s 3 ∂ s j − 1 ) ∂ s k ∂ W \frac{\partial E_3}{\partial W}=\sum_{k=0}^3\frac{\partial E_3}{\partial \hat y_3}\frac{\partial \hat y_3}{\partial s_3}(\prod_{j=k+1}^3 \frac{\partial s_3}{\partial s_{j-1}}) \frac{\partial s_k}{\partial W} ∂W∂E3=k=0∑3∂y^3∂E3∂s3∂y^3(j=k+1∏3∂sj−1∂s3)∂W∂sk
沿着时间轴的反向传播,对当前时刻的记忆求导,当前时刻的记忆和前一时刻的记忆有关,要追溯前面所有的记忆。
但是随着时间间隔不断增大,RNN会丧失学习到连接很远的信息的能力,也就是出现梯度消失,原因如下:
-
RNN的激活函数tanh可以将所有值映射到-1~1之间,以及在利用梯度下降算法调优时利用链式法则,会造成很多小于1的项连乘很快逼近于0,造成梯度消失情况,网络无法训练。
-
因为为了避免梯度爆炸的发生,我们不能利用Relu函数作为激活函数
-
合适的初始化矩阵W可以适当的减小梯度消失的现象,正则化也能起到作用,更好的方案是采用长短时记忆LSTM或门限递归单元(GRU)结构。
1.4 图像描述
1、利用CNN提取图像特征
利用AlexNet前馈,得到一个4096x1维的向量,向量中包含了图像的很有用的信息,也就是利用CNN提取图像的特征。
2、利用RNN进行文本描述
未加入图像信息V之前的状态:
S t = t a n h ( W x h ⋅ X t + W h h ⋅ S t − 1 ) S_t=tanh(W_{xh}\cdot X_t+W_{hh}\cdot S_{t-1}) St=tanh(Wxh⋅Xt+Whh⋅St−1)
加入了图像信息V之后的状态:
S t = t a n h ( W x h ⋅ X t + W h h ⋅ S t − 1 + W i h ⋅ V ) S_t=tanh(W_{xh}\cdot X_t+W_{hh}\cdot S_{t-1}+W_{ih}\cdot V) St=tanh(Wxh⋅Xt+Whh⋅St−1+Wih⋅V)
要在考虑当前文本 X t X_t Xt和之前状态 S t − 1 S_{t-1} St−1的情况下,同时考虑图像的特征信息 V V V,w都是权重矩阵。
加入图像的信息只在第一步进行,后面的步骤不再添加图像信息。
1.5 LSTM(Long Short Time Memory)
如果存储记忆的矩阵是有限的,那么不能对以前的记忆进行很好的保存,离得越远,忘得东西越多。
LSTM是RNN的一种,区别如下:LSTM的记忆细胞(cell)被更改了,需要记住的东西会一直往下传,不需要记住的东西被“gate”截断。
RNN的记忆细胞:
LSTM的记忆细胞:包括输入、忘记、输出门
下图粗线表示从上一时刻的记忆到这一时刻的记忆的传递,有些少量的线性交互。
LSTM如何控制“细胞状态”:门
门:让信息选择性通过,来去除或增加信息到细胞状态
比如sigmoid函数,让输出变为(0~1)的概率,之后利用该概率和信息量的乘积来控制每个部分有多少的量可以通过,“0”表示不允许任何量通过,“1”表示允许任意量通过。
第一步:忘记门:利用sigmoid函数将数据转换到[0,1]之间,利用概率来选择留下的部分
利用前一时刻的记忆和当前时刻的输入的sigmoid映射结果,获得一个概率,该概率决定了多大程度的信息能够留下来。
第二步:输入门:既然过滤掉了一部分信息,则决定放什么新信息到“细胞状态中”
C ~ t \tilde C_t C~t:当前t时刻的记忆(相当于六年级学的新的知识)
C ~ t = t a n h ( W C ⋅ [ h t − 1 , x t ] + b c ) \tilde C_t=tanh(W_C\cdot [h_{t-1},x_t]+b_c) C~t=tanh(WC⋅[ht−1,xt]+bc)
i t i_t it:确定概率p,利用该概率确定应该补充到新记忆中的记忆,新知识加到记忆中的概率。
判断t时刻学习到的东西对新的记忆起到多大的作用,也就是将t时刻学到的东西加到t-1学到的东西,利用i_t来过滤,确定哪些新东西是要补充到以前的记忆中,获得新的记忆。
i
t
=
σ
(
W
i
⋅
[
h
t
−
1
,
x
t
]
+
b
i
i_t=\sigma(W_i\cdot [h_{t-1},x_t]+b_i
it=σ(Wi⋅[ht−1,xt]+bi
sigmoid层决定什么值需要更新,Tanh层创建一个新的要添加的候选值向量
第三步:更新“细胞状态”
将旧的记忆 C t − 1 C_{t-1} Ct−1更新为新记忆 C t C_{t} Ct
- f t f_t ft:旧状态的通过率
- i t i_t it:新知识的筛选器,确定哪些新知识要添加到记忆中
C t = f t ∗ C t − 1 + i t ∗ C ~ t C_{t}=f_t*C_{t-1}+i_t* \tilde C_t Ct=ft∗Ct−1+it∗C~t
对旧的信息利用概率,保留一部分有用的信息,同时确定新的学习到的知识中用哪些来更新记忆
第四步:基于“细胞状态”得到输出,利用tanh得到细胞状态[-1,1],再和sigmoid输出相乘,确定需要的输出值
h
t
=
o
t
∗
t
a
n
h
(
C
t
)
h_t=o_t*tanh(C_t)
ht=ot∗tanh(Ct)
其中,
o
t
o_t
ot为筛选出的真正能解决该问题的知识,
h
t
h_t
ht为最终的结果
o
t
=
σ
(
W
o
[
h
t
−
1
,
x
t
]
+
b
o
)
o_t=\sigma(W_o[h_{t-1},x_t]+b_o)
ot=σ(Wo[ht−1,xt]+bo)
sigmoid:当前信息的筛选,sigmoid输出的0~1的概率确定信息保留率
-
relu的话信息会全部过去,造成信息爆炸
-
tanh输出为[-1,1],不能输出概率
tanh:当前新信息的保留,保证输出都在一个范围内
1.6 LSTM为什么不会比RNN更容易出现梯度消失
RNN的记忆更新会出现连乘的形式,而且激活函数用到tanh,网络深度越深,会出现梯度消失,网络无法学习。
S t = t a n h ( W ∗ X t + U ∗ S T − 1 ) S_t=tanh(W*X_t+U*S_{T-1}) St=tanh(W∗Xt+U∗ST−1)
LSTM将梯度利用两路传递,将连乘的形式变成的连乘+求和的形式,保证了梯度更好的回传,即使一项的导数约等于0,另一项的导数也不为0。
1.7 LSTM的变体
1.7.1 让门层也接收细胞状态的输入
1.7.2 通过使用couple忘记和输入门
LSTM本是分开确定要忘记和添加的信息,这里是一次完成概率的求解,添加的概率为p,忘记概率1-p。
1.7.3 GRU(Gated Recurrent Unit)
将忘记门和输入门合成了一个单一的更新门。