前言
- LSTM——起源、思想、结构 与“门”
- 完全图解RNN、RNN变体、Seq2Seq、Attention机制
- 完全解析RNN, Seq2Seq, Attention注意力机制
- Sequence to sequence入门详解:从RNN, LSTM到Encoder-Decoder, Attention, transformer
- 从RNN到Attention到Transformer系列-Attention介绍及代码实现
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
引言
应用示例-槽填充(slot filling)-订票系统
将句子输入给系统,系统将关键信息放到相应的槽内。
这个问题可以用前馈网络(Feedward network)?
输入: 一个词(每一个词都可以用一个向量表示)
怎么把一个词汇用一个向量表示呢?
- 1-of-N encoding
- Beyond 1-of-N encoding
-
Dimension of ‘Other’
-
Word hashing
输出: 输入词汇属于每个槽的几率
但是同一个词在不同语句中的语义可能不同
如果我们的网络有记忆力的话就可以根据上下文产生不同的输出。
二、循环神经网络(RNN)
隐层的输出会被存到memory里,memory会作为下一次的输入。
下面举一个例子:
假设所有的权重都是“1”,没有偏差;所有激活函数都是线性的。
输入序列:
[
1
1
]
[
1
1
]
[
2
2
]
.
.
.
\begin{bmatrix} 1 \\ 1 \\ \end{bmatrix} \begin{bmatrix} 1 \\ 1 \\ \end{bmatrix} \begin{bmatrix} 2 \\ 2 \\ \end{bmatrix} ...
[11][11][22]...
1.给memory初始值,eg. [0, 0], 输入 [1, 1]
输出 [4, 4]
2.更新memory, [2, 2], 在输入 [1, 1]
输出 [12,12]
2.更新memory, [6, 6], 在输入 [2, 2]
输出 [32,32]
memory变为[16, 16]
改变序列顺序将会改变输出。
所以我们要用RNN处理slot filling的问题的话:
由于存入的memory不一样,导致相同词的输出不一样。
当然上面是原理,RNN的架构我们可以自己设计
-
Elman Network:把hidden layer的值存起来,下一个时间点读取
-
Jordan Network: 把output的值存起来,下一个时间点读取
传说Jordan Network有着更好表现,因为不知道RNN的潜层学到了什么 -
Bidirectional RNN:双向读取数据,更好的学习上下文
-
Long Short-term Memory (LSTM):比较长的短时记忆网络
三、Long Short-term Memory (LSTM)
LSTM原理
有四个输入:
Z
,
Z
i
,
Z
f
,
Z
o
Z, Z_i, Z_f, Z_o
Z,Zi,Zf,Zo,memory记录为c
三个门:输入门、遗忘门(打开记得,关闭遗忘)、输出门
Z
i
,
Z
f
,
Z
o
Z_i, Z_f, Z_o
Zi,Zf,Zo通过的激活函数f通常是sigmoid函数,选择sigmoid函数意义就是它界在0,1之间,这个0到1的值代表这个Gate打开的程度。
接下来,
c
′
=
g
(
z
)
f
(
z
i
)
+
c
f
(
z
f
)
c' = g(z)f(z_i) + cf(z_f)
c′=g(z)f(zi)+cf(zf)
a
=
h
(
c
′
)
f
(
z
o
)
a = h(c')f(z_o)
a=h(c′)f(zo)
[总结](https://zhuanlan.zhihu.com/p/42717426)
输入 Z , Z i , Z f , Z o Z, Z_i, Z_f, Z_o Z,Zi,Zf,Zo分别为:
- Z = [ h t − 1 , x t ] Z = [h_{t-1}, x_t] Z=[ht−1,xt]
- Z i = W i ∗ [ h t − 1 , x t ] + b i Z_i = W_i*[h_{t-1}, x_t] + b_i Zi=Wi∗[ht−1,xt]+bi
- Z f = W f ∗ [ h t − 1 , x t ] + b f Z_f= W_f*[h_{t-1}, x_t] + b_f Zf=Wf∗[ht−1,xt]+bf
- Z o = W o ∗ [ h t − 1 , x t ] + b o Z_o= W_o*[h_{t-1}, x_t] + b_o Zo=Wo∗[ht−1,xt]+bo
其中 f = σ , g = h = tanh f = \sigma, g = h = \tanh f=σ,g=h=tanh
三个门:
- i t = σ ( W i ∗ [ h t − 1 , x t ] + b i ) i_t = \sigma (W_i*[h_{t-1}, x_t] + b_i) it=σ(Wi∗[ht−1,xt]+bi)
- f t = σ ( W f ∗ [ h t − 1 , x t ] + b f ) f_t= \sigma (W_f*[h_{t-1}, x_t] + b_f) ft=σ(Wf∗[ht−1,xt]+bf)
- 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)
输出 h t , C t h_t, C_t ht,Ct:
- C t = i t C ^ t + f t ∗ C t − 1 C_t = i_t\hat{C}_t + f_t*C_{t-1} Ct=itC^t+ft∗Ct−1, 其中 C ^ t = g ( Z ) \hat{C}_t=g(Z) C^t=g(Z)
- h t = o t h ( C t ) h_t = o_th(C_t) ht=oth(Ct)
LSTM例子
输入是三维的向量,输出是一维的向量:
当x_2=1时,将x_1的数字就会被写到memory里面
当x_2=-1时,memory中的值会被遗忘
当x_3=1时,才会打开output gate,输出memory中的数字
lstm的训练
RNN的训练是复杂的:
原因是误差面不是很平就是很陡(sigmoid function):
解决方法:
梯度裁剪,不让梯度大于某个值。
从这个例子可以看出来为什么RNN会有问题。
RNN从时间点到另一个时间点,weight被反复使用。
RNN的每个时间点的memory都会被覆盖掉。
有用的技巧——长时短期记忆
可以处理渐变消失(不是渐变爆炸)?
- RNN的每个时间点的memory都会被覆盖掉,而LSTM是memory与输入相加。
- 影响永远不会消失,除非忘记关门
没有渐变消失(如果忘记门被打开)。
门控递归单元 (Gated GRU) :比LSTM简单
如果lstm的overfitting很严重,可以试一试GRU
others工作:
RNN不但可以N2N
Many2One(输入是一个矢量序列,但输出只有一个矢量)
Many2Many(Output is shorter)
- Speech Recognition
- Connectionist Temporal Classication
多对多(不限)
输入和输出都是长度不同的序列。一序列到序列的学习
- 例如机器翻译(machine learning 一> 机器学习)
他不知道何时停下来。
推一个‘断’,他就停下来了。
类比Seq2Seq也是如此。
Seq2Seq也可以用在
- 超越序列(Beyond Sequence)。
句法分析
- 自动编码器-文本(Auto-encoder-Text)
要理解一个语序的意思,语序是不能忽略的。
比较容易得到文法的意思。
- 自动编码器-语音(Auto-encoder-Speech)
变长序列的降维
audio segments(word-level) —> Fixed-length vector
可以用于语音搜寻:
但是只有RNN的encoder我们没有办法train
Demo: Chat-bot
Attention-based Model
大脑可以根据提问,回答与之相关的事情。Machine也可以:
RNN与Structured Learning可以结合
底部用RNN、LSTM,输出在通过HMM, CRF Structured Perceptron/SVM
- 显式建模依赖关系
- Cost是Error的上界
p
(
x
l
)
p(x_l)
p(xl)可以直接无视,因为最后你得到这个几率在inference的时候,x是声音信号是已知的,你是穷举y,看那个可以让P(x,y)最大。文章来源:https://www.toymoban.com/news/detail-602294.html
文章来源地址https://www.toymoban.com/news/detail-602294.html
到了这里,关于RNN&LSTM的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!