王树森RNN系列学习笔记
- 数据处理
- Simple Recurrent Neural Networks
- Stacker RNN
- Bidirectional RNN
- LSTM
- 变体1
- 变体2
- 变体3 GRU
- Attention
- Self-Attention
- Transformer
- Attention层
- Self-Attention层
- Muti-Head
- Transformer
- Bert
- Vision Transformer
视频地址https://www.youtube.com/watch?v=NWcShtqr8kc&list=PLvOO0btloRnuTUGN4XqO85eKPeFSZsEqK
主讲人王树森。
数据处理
这里主要为文本数据处理过程。
文本数据包含数值化描述(Numeric Features),和类别化描述(Categorical Features)。
数值化描述如年龄,数值之间是有大小关系的,比如50岁比30岁大。
类别化描述如性别、国籍,需要转化为数值化描述,才能被计算机处理。
- 简单的编码方式,如序列编码1、2、3、4,会存在大小之分,但是实际对应的类别,却不应该有大小之分,所以不能用标量表示类别化描述。同时,0作为保留编码,用于表示缺失的或者未知的数据。
- 那么使用one-hot编码方式,可以避免大小之分,0作为保留编码,用于表示缺失的或者未知的数据。但是one-hot向量的长度由类别数量决定,且one-hot编码形成的输入矩阵非常稀疏,存储和计算效率低。
文本处理的步骤:
-
Tokenization(Text to Words)
词分割,将文本分割成单独的序列词汇。
要注意:大写是否要转为小写;移除断句符,the、a、of等;错误拼写修正。
-
Build Dictionary
计算每个单词出现的频率。
然后按照词频由高到低进行排序。
排序后,每个单词的索引,可以用于表示该单词。
文本中单词的集合,被称为词汇表,vocabulary。保留词汇表中的高频词,删除低频词,因为低频词有可能是名字、错误拼写。另一方面,去掉低频词,可以有效降低词汇表one-hot编码的维度。
由于去掉了低频词,文本词分割后,进行one-hot编码时,会出现词汇表中没有的词,可以忽略或者用0编码。 -
One-Hot Encoding
将文本,转为用词汇表索引表示的sequence,如有表要,将索引进一步转为one-hot编码。 -
Align Sequences
由于文本有长有短,转为sequence后,也有长有短。为了把所有的文本存储在tensor中,要求所有文本都一样长。
设置一个固定长度,长于这个长度的文本,截取开头或者末尾,短于这个长度的文本,用0补齐。 -
word to vector
由于one-hot的编码方式,具有稀疏、效率低的特点,所以进一步进行转化word embedding。
d为用户设置的词向量维度,v为词汇表的长度。
Simple Recurrent Neural Networks
将状态信息存储在h中。某个节点的h,会包含这个节点以及之前节点的信息。
由于梯度消失的问题,SimpleRNN擅长短期之内的预测,长期的记忆会被遗忘。
SimpleRNN只有一个参数矩阵。
计算过程:
- 文本one-hot编码,转为embedding编码。参数量为:shape(x)×shape(vocabulary)
[ d i m e m b e d d i n g , n u m b e r w o r d ] = [ d i m e m b e d d i n g , l e n g t h v o c a b u l a r y ] ∗ [ n u m b e r w o r d , l e n g t h v o c a b u l a r y ] T [dim_{embedding},number_{word}]=[dim_{embedding},length_{vocabulary}]*[number_{word},length_{vocabulary}]^T [dimembedding,numberword]=[dimembedding,lengthvocabulary]∗[numberword,lengthvocabulary]T
2.embedding编码,输入简单RNN,参数量为:shape(h)×[shape(h)+shape(x)]
逐个计算embedding对应的状态向量h,不能并行计算。
[ d i m h , 1 ] = [ d i m h , d i m h + d i m e m b e d d i n g ] ∗ [ 1 , d i m h + d i m e m b e d d i n g ] T [dim_{h},1]=[dim_{h},dim_{h}+dim_{embedding}]*[1,dim_{h}+dim_{embedding}]^T [dimh,1]=[dimh,dimh+dimembedding]∗[1,dimh+dimembedding]T
Stacker RNN
堆叠RNN,上一层的输入为下一层的输出。
Bidirectional RNN
双向RNN,以从前到后、从后到前两种顺序阅读文本。可以记忆靠近输入和输出的信息。
LSTM
LSTM通过引入传送带,将历史信息直接传动到当前节点之后的状态向量中,而不是依靠状态向量本身去传递。LSTM缓解了梯度消失的问题,延长了对历时信息的记忆时间。
计算过程:
逐个计算embedding对应的向量,不能并行计算。
- forget gate:
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) - input gate:
i t = σ ( W i ∗ [ h t − 1 , x t ] + b i ) C t n = t a n h ( W C ∗ [ h t − 1 , x t ] + b C ) i_t=\sigma(W_i*[h_{t-1},x_t]+b_i) \\ C^{n}_t=tanh(W_C*[h_{t-1},x_t]+b_C) it=σ(Wi∗[ht−1,xt]+bi)Ctn=tanh(WC∗[ht−1,xt]+bC) - 计算新的C
C t = f t ∗ C t − 1 + i t ∗ C t n C_t=f_t*C_{t-1}+i_t*C^n_t Ct=ft∗Ct−1+it∗Ctn - output gate:
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
h t = o t ∗ t a n h ( C t ) h_t=o_t*tanh(C_t) ht=ot∗tanh(Ct)
参数量为: 4×shape(h)×[shape(h)+shape(x)+1]
变体1
添加peephole connection,使所有gate可以查看C的状态。
变体2
耦合forget gate和input gate,由两个门共同决定忘记什么、添加什么。
变体3 GRU
将forget gate和input gate组合为update gate。
Attention
sequence to sequence模型,主要由编码器Encoder和解码器Decoder组成,encoder将输入embedding向量转换到编码空间,decoder将输出embedding向量转换到解码空间。解码器的初始状态由编码器的最终状态决定。由于RNN的遗忘性质,编码器的最终状态并不能完全概括输入的所有信息,尤其在输入长度较长的时候,这个缺点更为明显。
Attention机制,在于解码器的每个状态,由编码器的所有状态、当前输出序列信息、历史输出序列信息共同决定。有效的避免了输入信息的丢失。
以下是计算编码器每个状态对解码器每个状态的影响系数计算方法,方法二较为流行。
以下为Attention机制更新参数方式。
- 计算解码器状态向量S,与编码器所有状态向量 hi 的相关系数;
- 利用相关系数,对编码器所有状态向量加权平均,得到 语境向量c;
- 利用输出序列、解码器状态向量S、向量c,更新输出序列的状态向量。
Self-Attention
计算当前状态与历史状态的相关性,用于更新状态。
Transformer
计算过程:
- 计算解码器状态向量的查询向量,Q;
- 计算编码器状态向量的关键词向量,K;
- 计算Q与K的相关系数;
- 计算编码器状态向量的值向量,V;
- 利用Q与K的相关系数,对V进行加权平均,得到语境向量C。
抛开RNN的架构,直接使用Attention机制。
- 计算输出序列的查询向量,Q;
- 计算输入序列的关键词向量,K;
- 计算Q与K的相关系数;
- 计算输入序列的值向量,V;
- 利用Q与K的相关系数,对V进行加权平均,得到语境向量C。
Attention层
Attention层的输入为:输入序列、输出序列,输出为语境向量C。
Self-Attention层
Self-Attention层的输入为:输入序列,输出为语境向量C。
Muti-Head
由多个Attention或者Self Attention的输出,进行堆叠,即可得到多头Attention或多头Self Attention。
Transformer
Transformer的Encoder由6个相同结构的block组成,每个block由multi-head self-attention和dense组成。
Transformer的Decoder由6个相同结构的block组成,每个block由multi-head self-attention、multi-head attention和dense组成。
Bert
使用两类任务预训练transformer。
- 判断两个句子是否相邻;
- 预测句子中随机被遮挡的单词。
BERT训练无需标注信息,可以使用海量数据。
Vision Transformer
算法流程:
- 将图像划分为不同的patch;
- 将patch打平为一个向量;
- 将向量经过全连接层输出,并在输出中加入patch的位置编码信息;
- 在全连接层输出向量后,加入多个Multi-head Self-Attentino层和Dense层;
- 最后输出的向量c0,经过softmax分类器,得到分类结果。
论文使用的数据集有三个,在数据集小于1亿张图片时, ResNet的预训练更好些: