文章目录
摘要
本周在上周simple RNN的基础上学习了RNN based on LSTM。首先,学习了LSTM的结构,了解了LSTM如何运作以及LSTM与传统网络的关系。随后基于训练的效果讨论了如何改进simple RNN并给出了多个方案。之后介绍了RNN based on LSTM在各个领域的应用。最后讨论了RNN与之前学到的各种结构化预测方法,总结了各自的优势,并在文末给出了二者相结合的可能性。本周第一次进行了文献阅读,该文利用LSTM网络解决了code2vec中的一些缺点。
Abstract
This week RNN based on LSTM is learned. First, the structure of LSTM is learned, how LSTM works and how LSTM relates to traditional networks. Then, based on the effect of training, how to improve simple RNN is discussed, and several schemes are given. After that, the application of RNN based on LSTM in various fields is introduced. Finally, RNN and various structured forecasting methods learned before are discussed, the advantages of each are summarized, and the possibility of combining the two is given at the end of the paper. The first literature reading was carried out. This paper uses the LSTM network to solve some shortcomings in code2vec.
一、RNN(RNN based on LSTM)
1. LSTM
在LSTM被提出并逐渐成熟之后,现在通常提到的RNN均是以LSTM为neuron的,而上一节中提到的RNN则被称为simple RNN
Long Short-term Memory的结构如下图
LSTM中的memory存储空间是受网络控制的
输入门/写门(input gate):当收到对应的网络网络信号时,才可以向空间中写入信息
记忆门/读门(output gate):收到信号后,才能从空间中读取信息
遗忘门(forget gate):收到信号后,会选择性的删除存储空间中的信息
这个结构的记忆是相对短时的,故为short-term;而不仅仅像RNN中仅保留上次输入的记忆,故Long Short-term;同时需要forget gate删除一些信息来保持信息的有效性,故不为long-term
LSTM的运行逻辑如下图
通常信号控制为sigmoid function,这样可以保证数值分布在0-1
假设输入为 g ( z ) g(z) g(z),输入门为 f ( z i ) f(z_i) f(zi),memory存储空间中为c,遗忘门为 f ( z f ) f(z_f) f(zf)
在上述情况下,存储空间中的值 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)
若输出门为 f ( z 0 ) f(z_0) f(z0),则 a = h ( c ′ ) f ( z 0 ) a=h(c')f(z_0) a=h(c′)f(z0)
1.1 example
下图中为LSTM的粗略计算过程
当 x 2 = 1 x_2=1 x2=1,将 x 1 x_1 x1的值存入memory,即下图中蓝色方框
当 x 2 = − 1 x_2=-1 x2=−1,重置memory中的值
当 x 3 = 1 x_3=1 x3=1,将memory中的数字输出
memory=0
term2, x2=1, add number in memory, memory=memory+x1=3
term4, x2=1, add number in memory, memory=memory+x1=7
term6, x3=1, output memory, y=memory=7
term7, x2=-1, reset memory, memory=0
term8, x2=1, add number in memory, memory=memory+x1=6
term9, x3=1, output memory, y=memory=6
下图中详细展示了LSTM的计算过程,以下对网络的结构进行说明
输入,只有x1的权重为1,故输入值即为x1
输入门,bias为-10,x2权重为100,当x2为正值时输入门打开,否则通常为关闭状态
遗忘门,bias为10,x2权重为100,当x2为负值时遗忘门关闭,否则通常为打开状态
memory输出时不做处理,即 h ( c ) = c 9 h(c)=c9 h(c)=c9
输出门,bias为-10,x3权重为100,当x3为正值时输出门打开,否则通常为关闭状态
输入序列如下图右下角,假设四个输入的均为同一个vector x
计算过程如下
1.2 LSTM与传统网络的关系
LSTM与传统网络的关系
只需要将neurons从某一种函数切换为LSTM cell
下图中LSTM四个接口对应的输入参数可以是四个参数
LSTM与RNN的联系
对于一个LSTM组成的RNN网络,假设输入仅为 x t x^t xt
memory: 将每个memory cell的c组合为一个向量 c t − 1 c^{t-1} ct−1
input: 输入的 x t x^t xt会经过四个不同的变换从而得到四个不同的向量,即 z f , z i , z , z o z^f,z^i,z,z^o zf,zi,z,zo
output: 而输出可以表达为 y t = ( z × z i + c t − 1 × z f ) z o y_t=(z\times z^i+c^{t-1}\times z^f)z^o yt=(z×zi+ct−1×zf)zo
上述的计算过程可以表示为下图的网络
在前文中several networks部分提到的Jordan network以及Elman network提到,在RNN中memory以及output均是有效的,因此可以将本次的memory以及output作为下次计算的输入。同时也可以将多个LSTM串联为deep network。综上会得到下图中的网络结构multiple-layer LSTM
2. learning target of simple RNN训练目标
对于之前的例句,其期望的分类结果如下表。下表中第一行为输入序列,第二行为期望得到的类别
例如,在输入arrive之后,memory存储a1,而分类为other。在输入taipei之后,结合之前存储的a1,执行更新memory为a2,并输出分类为dest。
arrive | taipei | on | november | 2nd |
---|---|---|---|---|
other | dest | other | time | time |
backpropagetion through time(BPTT)
基于RNN的网络通常是难以训练的
- 在RNN网络的训练中有时loss并不会随着epoch增加而减少,反而会剧烈的波动,如下图绿色
这是因为RNN的error surface是比较粗糙的。其误差面部分比较平坦,部分比较陡峭。因此,在RNN的训练中可能出现下图中蓝色长实线的情况。恰好训练至平坦区域与陡峭区域的交界处,下次迭代时参数会因为梯度的暴涨而更新非常大的步幅。
为了解决上述的问题,可以使用Clipping,当梯度过大时,将梯度限制在一个确定的值之内。例如限制值为15,而gradient为50,此时gradient会被网络看作15。
这个问题并不是由于采用了sigmoid function导致的,甚至采用ReLU函数在RNN网络上的训练效果会更差。以下对原因进行解释
以下图中简易的RNN为例,在此输入序列的情况下,经过1000次迭代的输出 y 1000 = w 999 y^{1000}=w^{999} y1000=w999
这样只需要对w进行极其微小的调整,输出值均会发生极大的变化,此时需要对学习率进行非常大的调整。由于这样的w可能会反复的被使用,其影响会随着迭代次数以次方级的速度被放大。下面会提出并解释针对这个问题的解决方法。
3. helpful techniques
-
long short-term memory(LSTM)
- 该方法可以处理梯度塌缩,但并不能处理梯度爆炸
- 因此在LSTM训练可以将参数设置的较小甚至极小
- 这是因为以下原因
- 在LSTM中memory与input是以相加的方式进行运算
- 该影响会一直存在除非遗忘门决定将其中参数删除
-
还有另一种neuron的形式gated recurrent unit(GRU)
- 这种RNN中仅有遗忘门与重置门,故其参数量相较于LSTM更小,从而相对更容易训练
下图是GRU的网络结构示意图,出自文章人人都能看懂的GRU
下图中还有几种可以处理梯度塌缩的RNN
4. more application
在week9的例子中给出的task,其输入与输出是相同长度的,但RNN的能力不止于此,以下介绍RNN的一些其他应用。
3.1 多对一
输入是一个向量序列参数,但输出仅为一个向量
- 例如在sentiment analysis情绪分析领域,可以将许多评论输入进网络中,而网络的任务是给出各个评论对应的评级(好/坏)
- key term extraction关键词提取,输入一篇论文,输出为一组key term
3.2 多对多(输出相对较短)
输入与输出均是一组序列,但输出相对较短
- 例如speech recognition,输入一组声音讯号的向量序列,输出是文字的序列
- 通常是一小段声音讯号,转换为一个字,再通过trimming的方式删除序列中的重复文字。但有时这种方式会产生歧义,因此需要其他的方式更为合理地进行该操作
- connectionist temporal classificaiton(CTC)可以解决上述问题。即添加一个符号,该符号表示无意义,则可以通过这种方式可以有选择地删除一部分的重复字节。
- 训练过程中,由于给出的标签是不包含各文字对应序列位置的,因此需要进行穷举。当然这个过程可以通过其他的算法进行优化。
3.3 多对多(无限制)
- sequence to sequence learning,例如机器翻译,下图中为过程的示意图
-
-
显然若以上述的方式进行翻译,则翻译是无法停止的
-
解决方法与CTC类似,方法是添加一个或者一组代表停止的字符,若输出该字符,则停止
-
下图是面向语音辨识基于注意力机制的模型在机器翻译上的表现效果
-
-
3.4 beyond sequence超越序列
- syntactic parsing句法解析,即解析一个句子中各个词对应的成分,并使用树的形式表达,具体效果如下图
3.5 sequence-to-sequence auto-encoder-text
-
理解一段文字序列的意思,词语的排列顺序不能被忽略
-
A Hierarchical Neural Autoencoder for Paragraphs and Documents
本文用自动编码器实现文档表示
网络结构的描述
-
首先可以使用标准的LSTM实现
-
其次使用分层LSTM,例如下图中显示的使用标点作为分割的标志
-
-
在word这一层,用一个标准的LSTM作为encoder,每一句中的最后一个word的hidden state作为该句的state,在sentence这一层,文档中所有的句子构成一个序列,用一个标准的LSTM作为encoder,得到整个文档的表示。decoder部分同样是一个分层结构,初始state就是刚刚生成的文档表示向量,然后先decoder出sentence这一层的表示,然后再进入该sentence对其内部的word进行decoder。
-
-
最后加入了注意力机制,分层LSTM+attention,注意力机制仅在sentence层。
-
-
在decoder部分中生成句子表示时,会重点注意输入中与该句子相关的句子,也就是输入中与之相同的句子。
-
在语音辨识领域可以用于具有各种长度的序列的降维
-
输入为声音讯号的片段,输出为转换后的向量,类似的语音在坐标系中的位置会聚团。
-
-
应用
- 在数据集中搜索一段与输入讯号相关的信息
- 将数据集中语音文件分割为各种长度的声音片段,并将这些片段转换为向量
- 输入一段内容相关的语音,将此语音也转换为向量
- 计算目标语音向量与数据集中各个声音片段的向量的相似性
- 将其输入RNN编码器,存储在memory中的值代表了整段声音讯号
- 再将经过编码的向量接入RNN解码器
解码器要与编码器一起训练
- 在数据集中搜索一段与输入讯号相关的信息
-
效果如下图
-
-
3.7 基于注意力机制的模型Attention-based Model
-
输入RNN/DNN的网络中,将经过处理的向量输入阅读控制器,控制器会从机器记忆machine’s memory中选择对应的信息返回RNN/DNN,经过处理后输出
-
-
神经图灵机neural turing machine
- 相较于上图中的神经网络,该网络添加了写入控制器,输入同样为经过RNN/DNN处理的向量,RNN/DNN会根据该控制器提供的位置信息写入machine’s memory
-
上述网络会应用于阅读理解、视觉问答、语音问答
5. RNN vs structured learning
- 序列相关性
- 单向的RNN并不会考虑整段序列,双向的RNN可以考虑
- HMM+viterbi会考虑整段序列
- 结构化预测可以明确的考虑标签的依赖关系
- 开销与误差相关性
- RNN、LSTM的开销与误差不相关
- 结构化预测的开销是误差的上界
- 但RNN与LSTM其网络结构可以做的特别deep,而结构化预测中的各种方法由于程式是线性的,当构造为deep structure之后较难训练与收敛,所以在这点上RNN占优势。
基于上述原因,可以首先使用RNN处理数据,再将结果以结构化预测的方式处理,这样可以兼顾二者的优点。
整合二者的应用
- 在语音辨识中,二者可以以如下方式整合
将语音序列输入RNN中,输出为一个分布 P ( z ′ ∣ x l ) , z ′ ∈ { a , b , c , . . . } P(z'|x_l),\ z'\in\{a,b,c,...\} P(z′∣xl), z′∈{a,b,c,...},为了使得该输出与HMM中所需的相同,将HMM公式中蓝色下划线的部分做如图右下角的变换即可。
注:HMM隐马尔可夫模型
- 在语义标记中,双向LSTM+CRF/structured SVM(条件随机场/结构化支持向量机)
6. 结构化预测的实用性
生成对抗网络
GAN的简述:将从高斯分布中提取出的噪声输入生成器中,生成器会输出使其取值最大的x,将生成的x与真实的x输入辨别器,最后输出真假。在GAN的训练过程中,生成器与辨识器会不断的交替迭代。
例如文字生成图片
将x输入生成器,生成器输出生成的图片y,将这个组合与真实的组合输入辨识器中
深度学习与结构化预测相结合在未来是一种可能的方向,下图是一些在该领域的研究成果
未来的课程:机器学习:深度&结构化MLDS
二、文献阅读
1. 题目
题目:Improvements to code2vec: Generating path vectors using RNN
作者:Xuekai Sun11; Chunling Liu1CA2; Weiyu Dong13; Tieming Liu14
期刊:Computers & Security,2023,Vol.132: 103322
2. abstract
The authors analyzed code2vec and pointed out its shortcomings. This paper uses RNN networks to generate path vectors for code2vec, and achieves a very good result. The effects of using various strategies in this regard are also described.
作者分析了code2vec,指出了其中的不足之处。这篇文章利用RNN网络为code2vec生成路径向量,取得了一个非常好的效果。同时介绍了使用各种策略在该方面的效果
3. 网络架构
下图为网路架构,向量首先经过全连接层随后进入注意力机制层,最后经过softmax分类生成预测结果
4. 文献解读
4.1 Introduction
作者分析了code2vec方法,两条基本相似路径却对应不同标识符导致冗余的路径嵌入词汇表,并给出了使用RNN表示路径上下文中间路径的方法。该方法发跳过生成标识符的部分直接创建向量。作者将之与原方法比较,证明了方法有效性;且在短路径函数上表现优于code2seq。最后提出了几种替代设计并进行评估。
4.2 创新点
传统code2vec算法的缺点
该论文使用RNN生成code2vec算法的路径向量。传统的code2vec算法使用哈希算法生成标识符,该标识符对于算法而言无法确定其路径。这导致code2vec算法在仅处理少量节点时可能保有大量的路径,从而需要耗费大量的训练参数去维护各个标识符的嵌入式。该论文第二部分末尾提到对于249个节点需要保持93764个不同的标识符。
RNN生成路径的向量表示
- 输入数据
下图中为路径表示策略,用一个可学习的嵌入性矩阵 E n o d e s E^{nodes} Enodes表示每个节点,之后使用RNN对于整个序列的结果生成向量 v e c t o r p a t h vector_{path} vectorpath,即下图中黄色部分。
v e c t o r p a t h = R N N ( E n 1 n o d e s , … , E n l n o d e s ) vector_{path}=RNN(E_{n_1}^{nodes},\dots,E_{n_l}^{nodes}) vectorpath=RNN(En1nodes,…,Enlnodes)
下图中蓝色部分为子标记。使用一个可学习的嵌入式矩阵 E s u b t o k e n s E^{subtokens} Esubtokens表示每个子标记,之后将这些子标记向量求和,结果用于表示整个标记。
v e c t o r t o k e = ∑ S ∈ s p l i t ( t o k e n ) E S s u b t o k e n s vector_{toke}=\sum_{S\in split(token)}{E_S^{subtokens}} vectortoke=∑S∈split(token)ESsubtokens
最后将路径表示 v e c t o r p a t h vector_{path} vectorpath与两个终端节点的标记表示向量 v e c t o r t o k e n vector_{token} vectortoken结合用于表示路径文本
Rep ( p a t h c o n t e x t ) = e m b e d d i n g ( < x s , p , x t > ) = [ v e c t o r t o k e n ( s ) ; v e c t o r p a t h , v e c t o r t o k e n ( t ) ] \text{Rep}(path\ context)=embedding(<x_s,p,x_t>)=[vector_{token(s)};vector_{path},vector_{token(t)}] Rep(path context)=embedding(<xs,p,xt>)=[vectortoken(s);vectorpath,vectortoken(t)]
- 网络处理
上一步中的结果作为网络的输入, c ^ \hat c c^为输入数据经过全连接层的结果,其中W是一个可学习的权重矩阵,全连接网络通过与权重矩阵相乘,将上下文向量转为组合上下文向量,然后将tanh函数分别应用于每个元素。
c ^ = tanh W ⋅ Rep ( p a t h c o n t e x t ) \hat c=\tanh{W\cdot \text{Rep}(path\ context)} c^=tanhW⋅Rep(path context)
之后使用注意力机制将多个组合上下文向量聚合为单个向量表示。对于给定组合上下文向量 { c ^ 1 , c ^ 2 , … , c ^ n } \{\hat c_1,\hat c_2, \dots, \hat c_n\} {c^1,c^2,…,c^n},组合上下文向量与全局注意力向量 a a a之间的归一化内积,即每个 c ^ i \hat c_i c^i的注意力权重 a i a_i ai。其中 a a a由网络初始化并训练
a i = exp ( c ^ i T ⋅ a ) ∑ j = 1 n exp ( c ^ j T ⋅ a ) a_i=\frac{\exp{(\hat c_i^T\cdot a)}}{\sum_{j=1}^n\exp(\hat c_j^T\cdot a)} ai=∑j=1nexp(c^jT⋅a)exp(c^iT⋅a)
代码函数由聚合函数向量 v v v表示, v = ∑ i = 1 n a i ⋅ c ^ i v=\sum_{i=1}^n a_i\cdot\hat c_i v=∑i=1nai⋅c^i
代码向量将用于预测标签。定义标签词汇表 t a g s _ v o c a b tags\_vocab tags_vocab,其中第 i i i行对应 t a g i tag_i tagi的嵌入式。模型q(y)的预期分布由代码向量与每个标签嵌入式之间的点积生成。其中 Y 是在训练语料库中找到的标签值集
f o r y i ∈ Y : q ( y ) = exp ( v t ⋅ t a g s _ v o c a b i ) ∑ y j ∈ Y exp ( v T ⋅ t a g s _ v o c a b j ) for\ y_i\in Y:q(y)=\frac{\exp(v_t\cdot tags\_vocab_i)}{\sum_{y_j\in Y}\exp(v^T\cdot tags\_vocab_j)} for yi∈Y:q(y)=∑yj∈Yexp(vT⋅tags_vocabj)exp(vt⋅tags_vocabi)
4.3 实验过程
模型训练
使用交叉熵作为损失函数,使用梯度下降以及反向传播函数更新参数
使用已训练模型
已经训练的模型可被用于处理各种下游任务,因为未知代码可被算作通过模型嵌入的代码。
设计策略
- 路径节点处理:由于RNN不太擅长处理长序列,因此改论文提出了以各种处理路径节点的策略:为路径序列中的节点数量设置一个阈值,然后去除低频节点,直至节点达到阈值。
- 路径表示:除了RNN外,还可以使用LSTM或双向LSTM生成路径表示
- 无子标记:文中在处理路径上下文中的路径节点时,使用的时带有子标记的方法。相应的也有无子标记方法,即直接生成标记的嵌入式。
参数设置
使用了adam优化算法,对上下文向量应用dropout=0.25。从每个训练实例中选取k=200个路径上下文。使用精度、召回率和F1分数作为评估指标。
数据集
使用 10,072 个 Java GitHub 存储库的数据集来评估我们的方法在实际项目中的功能。在此数据集中,来自所有项目的文件被打乱并分为 12,636,998 个训练、371,364 个验证和 368,445 个测试。我从测试集中随机选择了 7,454 个文件作为抽样测试集。 5.1 节中的评估实验使用该数据集。
为了评估模型在短路径函数上的性能,过滤掉 java-small 中具有长路径长度的样本以形成短路径数据集。因此,取平均节点数不超过5的函数来组成新的数据集。在此数据集中,函数被打乱并分为 250,736 个训练和 62,684 个测试。该数据集用于第 5.2 节的评估。
使用较小的训练语料库进行了实验,以进一步研究模型的数据效率以及替代策略对模型的影响。为了每个类别都有足够的训练样本,丢弃了一些样本较少的类别,并选择了 61 个类别,每个类别的样本数超过 100 个,形成 61 类数据集。我们还将数据集按 8:2 的比例分为训练集和测试集。该模型在训练集上进行训练,并在测试集上评估性能。 5.3 节和 5.4 节中的评估实验使用了该数据集。
Quantitative evaluation
在这一部分该论文将文中的模型与code2vec和code2seq比较。下图中是每个模型的精确率、召回率和 F1 分数。
Comparison with code2seq
在本小节中该论文将 GPVUR 与 code2seq 在预处理的短路径数据集上进行比较。在这次评估中加入了一个新的指标,即训练率(TR),它表示模型每秒处理的样本数。
Evaluation using the 61-class dataset
论文在该部分,评估模型在较小的预处理数据集上的表现,以及与 code2vec 相比该论文的改进是否仍然有效。
下表显示了模型在 61 类数据集上的结果。显示了两个模型的最大 F 1 分数以及相应的 top ( 1 ) 、 准确率和召回率。
下图显示了每轮训练后模型和 code2vec 在测试集上的性能
Evaluation of alternative designs
使用了在设计策略中提到的PNP、LSTM、BiLSTM和No-subtokens,用于评估模型。
下表显示了所有设计的评估指标的比较
下图显示了每轮训练后测试集上所有模型的 F 1 的详细信息
下图显示了每轮训练后模型设计所花费的累积训练时间
5. 结论
如果使用LSTM或BILSTM代替RNN来生成路径向量,模型的性能会略有提高,但代价是训练时间显着增加。采用子代币策略,同时评估不使用此策略对模型的影响。结果表明,子代币策略确实提高了模型的性能,但也增加了模型的训练时间。
小结
本周在上周simple RNN的基础上学习了RNN based on LSTM。首先,学习了LSTM的结构,以举例的方式了解了LSTM如何运作并手算。了解了LSTM与传统网络的关系,LSTM相当于传统网络中的neuron,且可以将传统网络中neuron简单的替换为LSTM,从而赋予其LSTM的相关特性。如果将LSTM与在上周中学到的多种RNN相结合并以deep network的方式实现,那么会得到multi-layer LSTM。随后给出了要进行这种结合的原因,即由于memory中的误差会极速的累积,从而simple RNN是难以训练的。为了解决这个问题,可以clipping的方式简单的限制gradient,当然也可以用LSTM或GRU替换neuron。其中,GRU是一种LSTM的简化形式,其仅有遗忘门与重置门。之后介绍了RNN based on LSTM在各个领域的应用,例如与自编码器相结合用于观察语音序列的相似性。最后讨论了RNN与之前学到的各种结构化预测方法,总结了各自的优势,并在文末给出了二者相结合的可能性。本周第一次进行了文献阅读,该文利用LSTM网络解决了code2vec中向量生成相关的缺点。
参考文献
[1]Xuekai Sun;Chunling Liu;Weiyu Dong;Tieming Liu.Improvements to code2vec: Generating path vectors using RNN[J].Computers & Security,2023,Vol.132: 103322