如何有效的区分和理解RNN循环神经网络与递归神经网络 rnn

/question/
阅读(...) 评论()循环和递归神经网络 (RNN) 与 长短时记忆 (LSTM)
即使不是 NLPer,现实中依然会面对很多序列问题。
全文内容来自 Ian Goodfellow, Yoshua Bengio 和 Aaron Courville 3位大老爷的作品“Deep Learning”的其中1章“Sequence Modeling: Recurrent and Recursive Nets” 。
1986年 Rumelhart 等人提出循环神经网络。循环网络与多层网络相比,会共享每层的权重,从而能够扩展和应用网络于不同长度的序列案例,以及泛化这些案例。当1片特定的信息可以在序列中多处出现时,这样的共享尤为重要。比如,有两句话:“I went to Nepal in 2009”和“In 2009, I went to Nepal.”如果要求模型提取叙述者哪一年去的 Nepal,不管是输入句子的第2处还是第6处,2009 都是应识别的信息片。传统全连接前向网络对每处输入的特征都有单独的参数,所以要单独学习输入句子每一处的所有语法。相比之下,循环网络在不同时间步间共享权重。
现在很多“神经网络”的字眼已被“网络”替换。且后面不会涉及神经元的内容,所以一概用“网络”。
相关的想法是1维时间序列间用卷积。卷积方法是延时神经网络的基础 ()。卷积操作允许网络在时间轴上共享参数,但为浅层网络 (输出序列的每个节点输出为很多相邻节点输入的函数)。每个时间步上用相同的卷积核。
循环网络以不同的方式共享参数。节点输出为前面节点输出的函数,节点的输出由前面节点输出用相同的更新规则产生。通过很深的计算图来共享权重,从而形成循环。
为简化描述,RNN 看作对1个包含时间步索引t (从1到τ) 的向量x(t)的序列的操作。实际上,循环网络通常操作小的序列块 (batch)。这里简化表示,剔除块索引。此外,时间步长的索引仅指序列中的位置,而不一定指现实世界中的时间通道。 RNN 也可以应用于2维空间数据 (如图像) 。甚至当数据涉及时间时,如果提供观察到的整个序列给网络,那么网络可能要有及时回顾过去的连接。
循环代表某变量的过去值对未来值的影响。用循环的计算图定义循环网络。
1. 展开计算图 (Computational Graph)
计算图是形成一系列计算结构 (如涉及映射输入和参数到输出和损失) 的1种方式。把1个循环/递归计算展开为1个有重复结构 (对应1连串事件) 的图,从而实现深度网络结构间的参数共享。
例如,考虑动态系统的经典形式:
s(t)=f(s(t-1);θ)
其中,s(t)为系统的状态。
上述系统是循环的,因为时刻t的状态s的定义回溯到时刻t-1的状态s的定义。
对于有限时间步τ,用定义τ-1次来展开成图。当τ=3 (时间步) 时,有
s(3)=f(s(2);θ)=f(f(s(1);θ);θ)
展开后的表达式可以表示为传统的有向非循环计算图。
再举1例,外部输入x(t)驱动的动态系统:
s(t)=f(s(t-1),x(t);θ)
现在的状态s包含所有过去序列的信息。
循环网络可用很多不同方式搭建。几乎任何函数都可看作1个前向网络,本质上任何涉及循环的函数都能当作1个循环网络 (RNN)。
为表明状态即为网络的隐藏单元,上述方程重写为:
h(t)=f(h(t-1),x(t);θ)
典型的 RNN 增加从状态h读取信息的输出层来预测。
当训练循环网络来用过去预测未来时,网络通常学习去用状态h(t)作为与截止到t的过去输入序列的任务相关方面的有损总结 (lossy summary),因为该总结映射任意长度的序列(x(t),x(t-1),x(t-2),...,x(2),x(1))到固定长度的向量h(t)。取决于训练要求,该总结可能有选择地更明确地保持过去序列的某些部分。比如,RNN 用于统计语言建模时,通常给定前面的句子去预测下一个单词,它可能没必要保存截至时间t的输入序列的所有信息,只保存足够预测剩下语句的信息即可。
画 RNN 有2种方式。
每部分仅包含1个节点。网络定义为1个实时操作的电路,该电路物理部分的当前状态会影响未来状态 (如上左图示)。黑色方块表示状态从时间t到时间t+1发生了1个时间步长的延时。
展开的计算图。每部分由许多不同的变量表示,每个时间步长1个变量 (该变量表示某时刻该部分的状态,计算图中画成单独的节点)。展开之意为映射左图中的电路至右图带重复部分的计算图。展开图的长度取决于序列长度。
用函数g(t)表示t时间步后的展开循环:
h(t)=g(t)(x(t),x(t-1),x(t-2),...,x(2),x(1))=f(h(t-1),x(t);θ)
函数g(t)的输入为整个过去的序列(x(t),x(t-1),x(t-2),...,x(2),x(1)),输出为当前状态,但展开的循环结构分解g(t)为函数f的重复应用。展开有两种好处:
不管序列长度,学习到的模型的输入大小相同,因为它被指定从1个状态转到另1个状态,而不是可变长度状态的历史。
每个时间步,参数相同,转换函数f相同。
以上好处使得单个模型f能在所有时间步和所有序列长度上操作。学习单个模型可以泛化到训练集中未出现的序列长度,参数共享使模型估计用到更少的训练样本。
循环图和展开图各有用途。循环图简明;展开图清晰地描述计算过程,并有助于说明随时间前向 (计算输出和损失) 和反向 (计算梯度) 的信息流。
2. 循环网络 (Recurrent Neural Networks)
循环网络的重要设计模式包括:
1个时间步产生1个输出,隐含单元之间循环连接 (下图左)。
1个时间步的输出连入另1时间步的隐含单元 (下图中)。
隐含单元之间循环连接,读取整个序列,最后1个隐含单元产生1个输出 (下图右)。
上图左对应的 RNN 是通用的。理论上的 RNN 被证用 RNN 的激活函数和权重 (无限精度的有理数) 可模拟1个无限长的堆栈。
假定隐含单元选用双曲正切激活函数,输出为离散值,如预测单词或字符。离散变量的每个可能值的未归一化对数概率表示离散变量的输出o,输入给 softmax 回归,输出归一化的概率向量y^。前向传播的起始状态指定为h(0)。从时间步t=1~τ,用下面的更新方程:
a(t)=b+Wh(t+1)+Ux(t)h(t)=tanh(a(t))o(t)=c+Vh(t)y^(t)=softmax(o(t))
其中,b和c为偏置,U,V和W为输入到隐含单元,隐含单元到输出,隐含单元到隐含单元的连接权重。这里,输入序列与输出序列的长度相同。全部损失为所有时间步的损失之和。比如,如果给定x(1),...,x(τ),L(t)为y(t)的负对数似然损失,则
L({x(1),...,x(τ)},{y(1),...,y(τ)})=∑t=1τL(t)=-∑t=1τlog1pmodel(y(t)|{x(1),...,x(τ)})
其中,pmodel(y(t)|{x(1),...,x(τ)})为模型的输出向量y^(t)预测为y(t)的概率。该损失函数的梯度计算费时。见上图左,梯度计算涉及展开图上的从左往右的前向传播,紧随从右往左的反向传播。运行时间为O(τ),因前向传播图本质上为序列,所以不能并行减少时间。先计算前1个时间步才能得到后面的每个时间步。前向计算的状态会被保存直到反向计算时重用,所以内存开销也为O(τ)。应用于代价为O(τ)的展开图的反向传播算法被称为穿过时间的反向传播 (BPTT)。隐含单元间的循环网络因此很强大但训练困难。
(1) 老师强迫 (Teacher Forcing) 与 输出循环的网络
某1时间步的输出仅循环连接到下1时间步的隐含单元的网络是严格弱的,因为它缺少隐含单元到隐含单元的循环连接。比如,它不能模拟1个通用的图灵机。因为它缺少隐含层到隐含层间的循环,所以网络用于预测未来时,输出单元要求捕捉过去所有的信息。显式训练输出单元来匹配训练集合的目标不太可能捕获关于输入过去历史的必要信息,除非用户了解系统的全部状态且把它作为训练目标的一部分。
对时间步t的预测与其训练目标比较的任何损失函数来说,消除隐含单元到隐含单元的循环可解耦所有的时间步。单独计算每个时间步t的梯度可并行训练,不必先算前面时间步的输出,因为训练集已提供输出的完美值。
从输出到状态的循环连接模型可能用“老师强迫”训练。训练时,模型接受真实输出y(t)为时间步t+1的输入,老师强迫是遵从最大似然标准的过程。检查两个时间步的序列,条件最大似然标准为:
log1p(y(1),y(2)|x(1),x(2))=log1p(y(2)|y(1),x(1),x(2))+log1p(y(1)|x(1),x(2))
本例中,时间步t=2时,给定训练数据中的截至t的x序列和y值,训练模型来最大化y(2)的条件概率。训练时指定最大似然,而非输出自循环。
隐含单元间缺少连接的模型上用老师强迫可避免穿过时间的反向传播。老师强迫也能用于输出与状态循环连接的模型。然而,一旦隐含单元变成1个前面时间步的函数,BPTT算法是必要的。一些模型同时用老师强迫与 BPTT。
如果网络用于开环模式 (网络输出反馈给输入),严格老师强迫会出问题。训练时网络输入与测试时输入可以有很大差异。
训练时,同时用老师强迫的输入与未来几个时间步后预测的正确目标作输入。另外1种缓和训练与测试输入间的差异,随机选择泛化输出或实际数据作输入。该方式用课程学习策略,逐渐用更多的泛化值作输入。
“老师强迫”原意可这样理解:假设状态为学生的学习态度,输入为学生的作业,输出为尽可能好的期末考试成绩。老师没办法让学渣突然爱上学习,所以,一般会通过强迫学生写作业这样的外在手段来提高学生的成绩。
(2) 循环网络中的梯度计算
循环网络的梯度计算比较直接。展开的计算图上用泛化的反向传播算法即可。展开图上的反向传播应用被称为穿过时间的反向传播 (BPTT) 算法。反向传播得到的梯度接着可用作任何通用的基于梯度的技术来训练 RNN。
BPTT 为 RNN 方程 (上述 RNN 的正向传播) 计算梯度。以重要设计模式中的左图为例 (隐含层单元间循环连接),计算图的节点包括U,V,W,b,c,x(t),h(t),o(t),L(t)。
a. 沿时间步的正向梯度
递归地计算每个节点N的梯度损失?NL。首先:
并不是L=L(t),L为所有时间步的L(t)的和。
假定 softmax 回归输入o(t)输出y^,且损失是真实目标y(t)的负对数似然。时间步t上输出的梯度?o(t)L,对所有的i,t:
(?o(t)L)i=?L?L(t)?L(t)?y^(t)i?y^(t)i?o(t)i=1×??-1y^(t)i??×y^(t)i×(1-y^(t)i)=y^(t)i-1
其中,i为输出向量o(t)的第i个元素。
b. 沿时间步的反向梯度
从序列末端开始,时间步τ,h(τ)仅派生了o(τ) (不存在h(τ+1)),有:
?h(τ)L=VT?oτL
沿时间轴往回迭代 (从τ-1到1) 来反向传播梯度。注意到h(t)派生了o(t)和h(t+1)。所以梯度为:
?h(t)L=(?h(t+1)?h(t))T(?h(t+1)L)+(?o(t)?h(t))T(?o(t)L)=WT(?h(t+1)L)1diag(1-(h(t+1))2)+VT(?o(t)L)
其中,diag(1-(h(t+1))2)为包含元素1-(h(t+1)i)2的对角矩阵。这是第i个隐含单元在时间步t+1的双曲正切的 Jacobian 矩阵。
h(t+1)=tanh(b+Wh(t)+Ux(t+1))
c. 单个时间步内的参数梯度
获得计算图的内部节点的梯度后,可获得参数节点上的梯度。因参数在许多时间步间共享,所以当微积分操作涉及这些参数时必须小心处理。用反向传播方法得到计算图中单个边 (edge) 的梯度。然而,?Wf考虑W对基于计算图中所有边的f的分布。为方便解释,引入伪变量W(t) (定义为W在时间步t的复制)。用?W(t)表示时间步t的权重分布的梯度。
{c,V}:o(t)=c+Vh(t)
{b,W,U}:h(t)=tanh(b+Wh(t-1)+Ux(t))
这样,内部参数的梯度为:
?cL=∑t=1τ(?o(t)?c)T?o(t)L=∑t=1τ?o(t)L?VL=∑t=1τ∑i???L?o(t)i???Vo(t)i=∑t=1τ(?o(t)L)h(t)T?bL=∑t=1τ(?h(t)?b(t))T?h(t)L=∑t=1τdiag(1-(h(t))2)?h(t)L?WL=∑t=1τ∑i???L?h(t)i???W(t)h(t)i=∑t=1τ((?h(t)L)T1diag(1-(h(t))2))Th(t-1)T?UL=∑t=1τ∑i???L?h(t)i???Uh(t)i=∑t=1τ((?h(t)L)T1diag(1-(h(t))2))Tx(t)T
(3) 循环网络视为有向图模型 (Directed Graphical Models)
a. 图模型参数化
上例的循环网络的损失L(t)为训练目标y(t)与o(t)间的交叉熵。正如1个前向网络,原则上应使用1个循环网络中几乎所有的损失。应选择基于任务的损失。通常希望视 RNN 的输出为1个概率分布,且与该分布相关的交叉熵定义为损失。均方差是1个输出为正态分布的交叉熵。
训练 RNN 时,给定过去输入,最大对数似然来估计下1个序列元素y(t)的条件分布:
log1p(y(t)|x(1),...,x(t))
若该模型包含从1个时间点到另1个时间点输出的连接,有:
log1p(y(t)|x(1),...,x(t),y(1),...,y(t-1))
当过去的y值不影响下1时间步的预测时,有向图模型不包含从过去的y(i)(i=1,...,t-1)到当前y(t)的边;否则包含所有这样的边。直接参数化该图模型 (下图左) 效率低,输入和参数的数目增长快。RNN 具有相同的全连接,且参数化更高效。
考虑 RNN 为1个随机标量序列Y={y(1),...,y(τ)},无输入x,时间步t的输入仅为时间步t-1的输出 (上图右)。这样,RNN 模型定义为1个关于变量y的有向图模型。用条件概率的链式规则参数化y的联合分布:
P(Y)=P(y(1),...,P(y(τ)))=P(y(τ)|y(τ-1),...,y(1))P(y(τ-1)|y(τ-2),...,y(1))...P(y(2)|y(1))P(y(1))=∏t=1τP(y(t)|y(t-1),...,y(1))
当t=1时,P(Y)=P(y(1))。因此,值{y(1)*,...,y(τ)*}的负对数似然为:
L=∑t=1τL(t)=∑t=1τ-log1p(y(t)=y(t)*|y(t-1)*,...,y(1)*)
图模型的边表明变量与其它变量直接的依赖关系。删除节点间相互作用弱的边可使许多图模型的统计与计算更高效。如 Markov 假设 (图模型应仅包含{y(t-k),...,y(t-1)}至y(t)的边,而非包含所有过去的边)。然而,所有过去的输入应对序列的下一个元素有影响。当遥远过去的某个y(i)值对y(t-1)无影响,但却对y(t)产生影响时,RNN 更有用。
b. 图模型解释 RNN
视 RNN 为1个具有完整的图结构,可表示任意y值对间的直接依赖的图模型。排除隐含单元h(t)的 RNN 模型可解释为完整的图。
视隐含单元h(t)为随机变量得出 RNN 的概率图模型结构。概率图模型中包含隐含单元显示 RNN 极为有效地参数化观测值的联合分布。假定用表格表示任意1个离散量的联合分布 (每个元素给出事件发生的概率),如果y可取k个不同值,表格有O(kτ)个参数。相比之下,参数共享使 RNN 有O(1)个参数 (为序列长度的函数)。RNN 参数数目可能会被调整来控制模型容量,而不必按序列长度扩展。RNN 每个时间步上循环使用相同的f和θ。图模型中插入隐含单元h(t)节点解耦了过去与未来,为它们之间的中间量。遥远过去的某个变量y(i)可能通过影响h来影响y(t)。
有效参数化后的图模型难以预测序列中间的丢失值。减少参数数目后循环网络却难以优化参数。
循环网络的权重共享的前提是假设相同的参数可用于不同的时间步。给定时间步t的变量,时间步t+1的变量的条件概率分布是静态的,即前后时间步的关系与t无关。原则上,t可用作每个时间步的额外输入,从而学习者能够在尽可能共享权重的同时发现任何的时变性。这已经强过每个时间步t对应1个条件概率分布。但出现新的时间步时,仍要推断网络新增时间步的时变性。
c. 序列长度
在对模型采样前,先确定序列长度:
改变模型输入
改变模型输出
当输出y为单词中的字符时,加1个特殊标志来结束1个序列。特殊字符产生时,采样过程终止。训练集中,每个训练样本的x(τ)后面添加特殊字符输入。
添加二值输出,决定每个时间步继续或终止产生序列。该方法更通用,不会局限于字符序列,还可用于实数序列等。新的输出单元为交叉熵损失训练出的 Sigmoid 单元,来最大化每个时间步上继续还是终止序列正确预测时的对数似然概率。
添加序列长度τ,用模型来预测τ。先采样τ,再采样τ长度的序列样本。该方法要求在每个时间步的循环更新处添加额外的输入,来提示是否接近1个序列的末端。该输入可以是序列长度τ或者τ-t (剩余的时间步),从而避免 RNN 产生序列结束前突然终止的可能。强行分解序列的联合概率分布:
P(x(1),...,P(x(τ)))=P(x(1),...,x(τ)|τ)P(τ)
(4) 取决于 RNN 上下文的训练模型
任何变量为P(y;θ)的模型都可解释为条件分布为P(y|ω) (ω=θ)的模型。如果ω为输入x的函数,那么P(y|x)能表示与P(y|ω)分布相同的模型。
I. 向量输入
前面讨论过 x(t) 序列 (t=1,...,τ) 为输入的 RNN。另1种方法,添加单个定长的向量 x (序列的元素) 为 RNN 的额外输入。为 RNN 提供额外输入的常用方法:
作为每个时间步的额外输入
作为初始状态h(0)
引入权重矩阵R,每个时间步上隐含单元的输入为xTR。x的选择决定了每个隐含单元新的偏置xTR是否有效。非条件模型 (无输入x或x(t)) 的参数θ变为ω后仍然保持不变,除了ω中的偏置参数现在变为输入x的函数。
前面讨论的输入为{x(1),...,x(τ)},现在讨论的输入为{xTR,...,xTR}。
该 RNN 适用于给图像加标题 (输入为单幅图像,输出为描述图像的语句)。观测序列的元素y(t)既为当前时间步的输入,也为训练时前面时间步的目标。
II. 向量序列输入
RNN 输入为向量序列{x(1),...,x(τ)}时,假设输出y(t)条件独立,,则分解为 (见“图模型参数化”部分):
P(y(1),...,y(τ)|x(1),...,x(τ))=∏t=1τP(y(t)|y(t-1),...,y(1),x(1),...,x(τ))=∏t=1τP(y(t)|x(1),...,x(τ))
假设不条件独立,时间步t的输出连到时间步t+1的隐含单元。此时,模型能表示任意序列y的概率分布。给定序列x来描述另1个序列y分布的模型时,限制两个序列长度相同。
3. 双向 RNN
大标题 (“1., 2., 3. …”) 为原作者给的,以 RNN 类型来区分;小标题 (“I., II., III. …”) 是我给的,以 实际问题的输入类型区分。所以,唯独这里的小标题的索引会不连贯。
III. 完整向量序列输入
许多应用的预测输出y(t)可能取决于完整的输入序列。如语音识别中,当前音位的正确解释可能因协同发音取决于后几个音位,且甚至可能因单词间语境取决于后几个单词:须往过去或未来看得更远来区分当前单词的两个声学相似的解释。手写识别和其它序列到序列的学习类似。
1997 年 Schuster 和 Paliwal 发明双向 RNN。 年间在手写体识别,语音识别和生物信息等方面的应用取得巨大成功。
双向 RNN 结合正向 RNN 和 反向 RNN。正向 RNN 从序列起点随时间移动至终点,反向 RNN 从序列终点随时间移动至起点。正反向 RNN 的状态分别为h(t)和g(t)。过去和未来都会影响输出单元o(t),但输出对时间步t周围的输入最为敏感,且不必指定围绕时间步t的固定大小的窗口。
用4个 RNN 可扩展至2维输入 (如图像)。每个 RNN 沿1个方向 (上,下,左和右) 移动。输入 2D 网格上的每个点(i,j),当每个 RNN 的输入序列足够长时,输出O(i,j)能捕获大部分局部信息。与卷积网络相比,RNN 用于图像的计算耗时,但可得到同一特征图上特征间远程的相互作用。与前者相比,该 RNN 的正向传播方程改成用卷积来计算每层自底向上的输入会更好。
4. 编码-解码 或 序列到序列的结构
前面讨论过从输入序列到定长向量,从定长向量到输出序列,从输入序列到与输入序列长度相同的输出序列。
“向量序列输入”部分提及的 RNN 是长度为τ的 RNN,即定长 RNN。这里排除输入和输出变为相同长度的子序列,因为若子序列可完整描述模型输入,可重新定义τsub(&τ),此时新的 RNN 依然是定长序列的输入输出。
IV. 可变向量序列输入
应用于语音识别,机器翻译或问答等的 RNN 输入序列长度不必等于输出序列长度。输入语句长度和输出语句长度通常不相同,尽管两者可能相关。
RNN 的输入经常称为“上下文”。上下文C为概括输入序列X=(x(1),...,x(nx))的1个向量或序列。
2014 年 Cho 等人首次提出输入和输出为可变长序列的最简 RNN 结构,同年 Sutskever 等人对该结构扩展,首次用该方法取得领先的翻译效果。前者 (编码到解码结构) 排序另1个机器翻译产生的建议,后者 (序列到序列结构) 用1个单独的 RNN 完成翻译。
(1) 编码-解码结构
编码 (encoder/reader/input) RNN 处理输入序列,输出上下文C (通常为最后隐含状态的简单函数)。
解码 (decoder/writer/output) RNN 输入单个定长的向量 (见”向量输入”部分的x),输出语句Y=(y(1),...,y(ny))。
该结构的创新处为nx和ny可变,而之前所述的结构有约束nx=ny=τ。
编码 RNN 的最后的状态hnx的输出C为解码 RNN 的输入。如果C为向量,解码 RNN 仅仅是1个向量到序列的 RNN (见”向量输入”部分)。
编码器的隐含单元数目与解码器的隐含单元数目可以不相等。
2015 年 Bahdanau 等人在机器翻译的上下文中观察到,编码 RNN 的上下文输出C的维度太小会难以合适地概括长序列,因此它们把C从1个定长向量改为变长序列。另外,引入学习关联序列C元素至输出序列元素的注意机制。
(2) 序列到序列的结构
联合训练两个 RNN 来最大化训练集中所有x-y序列对的log1P(y1,...,yny|x1,...,xnx)均值。
5. 深度循环网络
大多数 RNN 计算分解为参数与相关变换的3步:
从输入到隐含状态;
从上1个隐含状态到下1个隐含状态;
从隐含状态到输出。
每部分关联1个权重矩阵。换句话说,展开网络时,每部分的矩阵对应1个浅变换。深 MLP 中的单层变换称为浅变换。典型的浅变换用1个学得的仿射变换 (紧随1个固定的非线性) 表示。
实验证据强烈建议对浅变换引入深度,一致认为需要足够的深度来满足映射要求。
2013 年 Graves 等人首次显示分解 RNN 状态进多层的巨大收益。下图 (a) 中分层的底层可视为转换原输入成隐含状态更高层的更合适的表示。
2014 年 Pascanu 等人让上述每部分有1个 MLP,如下图 (b)。根据对每部分分配足够容量来考虑整体的表示容量,但该方法添加深度后会因优化困难而可能影响训练。
总的来说,浅层结构优化更容易,添加额外的深度延长了变量从时间步t到时间步t+1的最短路径。比如,状态间用1个单隐含层的 MLP,则与常规 RNN 相比,任意两个不同时间步间变量的最短路径变为两倍。
然而,跳过隐含单元到隐含单元路径上的连接可缓解路径延长问题,见下图 (c)。
与图 (b) 相比,图 (c) 的隐含单元到隐含单元的路径上,多出了1个连接与 MLP 的单隐含层并联。
6. 递归网络 (Recursive Neural Networks)
递归网络是循环网络的另1种泛化,但计算图的结构为1个深层树,而不是 RNN 的链式结构。
1990 年 Pollack 提出递归网络。在 NLP 和计算机视觉方面,递归网络成功用于处理送入神经网络的数据结构。
对序列长度为τ的循环网络,递归网络的深度 (构成非线性操作的数目) 从τ大幅减少至O(logτ),有助于处理长期依赖 (long-term dependencies)。最好的树结构的设计问题尚未解决。1种选择为采用独立于数据的树结构 (如平衡二叉树)。某些领域中,外在方法能表现出合适的树结构。比如处理自然语句时,递归网络的树结构可固定为由自然语言解析器提供的语句解析树。学习器根据给定输入发现和推断出的树结构是理想的树结构。
递归网络的变种很多。1997 和 1998 年 Frasconi 等人用数据关联树结构,且用输入和输出关联树的节点。每个节点的计算不必是传统的人工神经计算 (所有输入的仿射变换,紧随1个单调的非线性)。比如,2013 年 Socher 发现建模概念 (连续向量表示) 间的关系时张量操作和双线性形式有用。
7. 长期依赖的挑战
循环网络中,学习长期依赖的基本问题为许多层上传播的梯度往往会消失 (常见) 或爆炸 (少见,优化伤害大)。即使参数稳定 (可保存记忆,且梯度不爆炸),与短期作用相比,长期作用的权重指数衰减,依然难以解决问题。其它方法用更深的处理 (Hochreiter, 1991; Bengio 等, 1994; Pascanu 等, 2013)。
循环网络的多个时间步相同函数组合产生了极强的非线性。
循环网络的组成函数类似矩阵乘法。循环关系可表示为1个去掉非线性激活函数和输入x的简单循环网络:
h(t)=WTh(t-1)
循环关系本质上用次方描述,可简化为:
h(t)=(Wt)Th(0)
若W可用正交阵Q分解为:
则该循环可简化为:
h(t)=((QΛQT)t)Th(0)=(QΛQTQΛQT...QΛQT)Th(0)=(QΛΛ...ΛQT)Th(0)=(QΛtQT)Th(0)=QTΛtQh(0)
特征值提高为它的t次方后,导致小于1的特征值衰减至0,大于0的特征值爆炸。任何h^{(0)}中的非最大特征值部分都会被丢弃。
循环网络中该问题尤为明显。假设权重ω为标量,权重自乘很多次后会根据ω的幅值消失或爆炸。然而,对每个时间步权重w(t)不同的非循环网络不成立。如果初始状态给定为1,则t时刻的状态为∏tw(t)。假设w(t)从均值为0,方差为v的分布 (独立同分布) 中随机产生。则该乘积的方差为O(vn)。为获得理想的方差v*,选择每个时间步的权重为v=v*--√n。因此,小心选择缩放的很深前向网络可以避免梯度消失或爆炸问题。
有人希望通过保留梯度在不消失和不爆炸的参数空间区域内,不幸的是,为保存对小扰动鲁棒的区域,RNN 一定会进入梯度消失的参数空间区域。具体地,长期作用的梯度指数级地小于短期作用的梯度。这并不意味着梯度不可学,只是要花很长的时间去学长期作用,因为短期作用出现的波动常会隐藏长期作用的信号。1994 年 Bengio 等人实验表明扩大捕获的依赖范围会使基于梯度的优化难度加大,对长度为10或20的序列,用 SGD 的 传统 RNN 训练权重的成功率快速减为0。
8. 回响状态网络 (Echo State Networks)
从h(t-1)到h(t)的循环权重与从x(t)到h(t)的输入权重为循环网络中最难学的参数。避免该问题的1种方法为让隐含单元捕获过去输入的历史,仅学习输出权重。该想法被称为回响状态网络 (ESN) 和 液态机 (liquid state machine)。与前者相比,后者用尖峰神经元 (二值输出) 替换连续值的隐含单元。两者都属于储备池计算 (reservoir computing),储备时序特征的隐含单元可捕捉不同方面的输入历史。
储备池计算循环网络与核机器相似:映射1个任意长度的序列 (截止至时间步t的输入历史) 至1个定长的向量 (循环状态h^{(t)}),可以用线性预测器 (典型地,线性回归)。训练标准可设计为输出权重的凸函数。比如,从隐含单元到输出的映射用线性回归,且训练标准为均方差,那么该标准为凸函数且可用简单的学习算法求解。
因此,如何设置输入和循环权重使循环网络的状态能够表示1套丰富的输入历史。存储池计算给出的答案为视循环网络为1个动态系统,且设置输入和循环权重使动态系统接近稳定。
使状态至状态的转换函数的 Jacobian 特征值接近1。(?) 1个循环网络的重要特征是 Jacobians J(t)=?s(t)?s(t-1)的特征值谱。J(t)的谱半径定义为其特征值绝对值的最大值。
为理解谱半径的影响,考虑t不变时的 Jacobian 矩阵 J 的反向传播 (如当网络纯线性时)。假设J为对应特征λ的1个特征向量v。用梯度向量g开始,1步反传后得到Jg,n步反传得到J(n)g。换为g的扰动版本g+δv开始反传,n步后得到J(n)(g+δv)。所以,从g+δv反传n步后多发散J(n)δv。如果v选为特征值为λ的J的单位特征向量,Jacobian 的乘法仅在每步乘以1个常数。两个反传的差值为δ|λ|(n)。 当v对应λ的最大值时,该扰动得到的差值最大。
当λ&1时,δ|λ(n)|指数增大;当λ&1时,δ|λ(n)|指数减小。
该例假定每步的 Jacobian 相同,对应1个线性的循环网络。引入非线性时,非线性的导数经过许多时间步后将接近0,避免大的谱半径引起的爆炸。
用重复的矩阵乘法的反传的一切,同样适用于1个线性网络的正向传播,状态h(t+1)=h(t)TW。
当线性映射WT总按L2模缩小h,那么该映射是收缩的,每个时间步后都会变小一点。因此,当我们用有限精度来保存状态向量时,会使网络容易遗忘历史信息。
Jacobian 矩阵告诉我们h(t)正向迭代或h(t+1)反向迭代时的微小变化。W和J不必为对称阵 (实数方阵),所以它们可以有复数特征值和特征向量,虚部对应潜在的震荡行为 (迭代使用相同的 Jacobian)。尽管h(t)或反传中ht的小变化为实值,但可用复数形式表示。迭代应用 Jacobian 矩阵时,复数绝对值大于1时的特征值对应指数增长,否则缩小。
带非线性的 Jacobian 在每个时间步都可无约束地变化,因此具有更复杂的动态特性。然而,1个起始的小差异,若干时间步后仍然会变为大差异。 与纯线性相比,非线性网络用诸如tanh这样压扁的非线性导致循环的动态特性有界。注意到,即使正向传播的动态特性有界,反向传播可能会保持动态特性无界。 比如,当tanh单元的序列插入纯线性网络的线性区,且用谱半径大于1的权重矩阵相连。然而,所有tanh单元同时为线性激活点的状况很少见。
回响状态网络只是修正权重的谱半径,但因如tanh这样饱和非线性的稳定效果,使权重不会爆炸。
最近,设置ESN中权重的技术可用于在1个可学习的循环网络 (随时间步反传的隐含层间的循环的权重) 中初始化权重,以便学习长期依赖。其中,结合稀疏初始化模式,谱半径为1.2时效果不错。
9. 泄漏单元 (Leaky Units) 和其它多时间尺度的策略
处理长期依赖的1种方式为设计多时间尺度上操作的模型。细粒度时间尺度上操作可处理更多细节,粗粒度时间尺度上操作可更有效将遥远的历史信息转换为当前信息。所以针对既细又粗的时间尺度来设计策略:其中包含跨时间步跳过连接,“泄露单元”累积不同时间常数的信号,删除某些连接来建立细粒度时间尺度。
(1) 跨时间步跳过连接
为获取粗粒度,将遥远过去的变量与当前变量直接相连。受 1988 年 Lang 与 Hinton 在前向神经网络中插入延时的启发,1996 年 Lin 等人采用直连的方法。
梯度随时间步数的增加可能会指数地消失或爆炸。为缓解该问题, Lin 等人引入d个延时进循环连接。此时梯度指数消失可看成1个关于τd (而非τ) 的函数。
对1个指数规律衰减的量,幅值变为其1e倍所需的时间τ称为时间常数。 如果为τd,梯度会消失得更快。所以,应该改为τd吧~
因延时和单步连接,梯度依然会按τ指数地爆炸。所以,尽管该方法不可能很好地表示所有的长期依赖,但可捕获相对更长的依赖。
(2) 泄漏单元和1个不同时间尺度谱
为使路径上的导数乘积接近1,线性自连接单元和连接权重接近1。
累积某值 v(t) (?) 的移动平均μ(t):用μ(t)←αμ(t-1)+(1-α)v(t)更新,α为连接μ(t-1)到μ(t)的参数。当α接近1时,移动平均可记住过去的信息很长一段时间;当α接近0时,过去信息被迅速排除。线性自连接的隐含单元类似于移动平均,被称为泄露单元。
跳过d个时间步的连接可确保单元总能学习到d个时间步前的影响。另1种方式为用1个接近1的权重来线性自连接。线性自连接方法通过调整实数值α (而非调整整型跳过的长度),效果更平滑和灵活。
用泄漏单元设置时间常数有两种基本策略。一种为手动固定值,比如,初始时刻从某分布中采样1次值。另一种为将时间常数设置为自由参数,然后学习它。不同时间尺度上的泄露单元有助于长期依赖。
(3) 删除连接
解决长期依赖的另1种方式为多时间尺度上组织 RNN 的状态,让信息更容易在缓慢时间尺度上长距离地流动。
与前面跳过时间步的连接不同,删除连接涉及删除时间步长度为1的连接,且替换成更长的连接。 修改后的单元只能在更长时间尺度上操作,但也可选择聚焦到短项连接上。
使循环单元在不同的时间尺度上操作的方法很多。1种为令循环单元泄漏,但不同组的单元关联不同的固定时间尺度 (1992 年 Mozer 提出,2013 年 Pascanu 等人成功应用)。另1种为对不同组的单元用不同的更新频率,在不同的时间步上显式离散地更新。 这是 1996 年 Bengio 和 2014 年 Koutnik 的方法,在许多 Benchmark 数据集上效果不错。
10. 长短时记忆 (Long Short-Term Memory) 与其它门控 (gated) RNNs
实际应用中本文最有效的序列模型为门控 RNN,包括长短时记忆和基于门控循环单元的网络。
类似泄漏单元,门控 RNN 基于使随时间的路径上的导数不消失或爆炸。泄漏单元用手动选择的常数或参数作为连接权重。门控 RNNs 将连接权重泛化成每个时间步都可能改变。
泄漏单元使网络能够在很长的时间内累积信息 (如特定的特征或类型)。然而,用到累积的信息后,网络会遗忘过去的状态。比如,当子序列组成序列,且需要通过设置过去的状态为0来遗忘它。除了手动决定何时清除状态,希望网络能学习到何时去决定清除。
1997 年 Hochreiter 和 Schmidhuber 最早提出的长短时记忆的主要贡献是引入自循环来创建使信息长期流动的路径。
使自循环取决于上下文,而非固定不变。通过使自循环的权重可门控,累积的时间尺度能动态变化。此时,即使 LSTM 固定参数,累积的时间尺度可随着输入序列而改变,因为时间常数为模型的输出。LSTM 在很多应用中极为成功,如无约束手写体识别,语音识别,手写体生成,机器翻译,图像加标题和解析。
LSTM 的框图见上图。LSTM 循环网络单元间彼此循环连接,来替换普通循环网络的隐含单元。用1个常规人工神经单元计算输入特征。如果 Sigmoid 门允许,输入的特征值会累加给状态。状态单元有1个由遗忘门控制的线性自循环。输出门可关闭LSTM 循环网络的输出。所有的门单元都用 Sigmoid 非线性,而输入单元可用压扁的非线性 (如 tanh)。状态单元可用作门单元的额外输入。黑色方块为1个时间步的延时。
压扁的非线性的原文为“squashing nonlinearity”。通常指各种非线性的激活函数 ,这里用 tanh 为例。
对应的前向传播方程用浅层循环网络结构给出。更深的结构也有成功的应用。每个循环单元不再是仅对输入到循环单元的仿射变换按元素应用非线性,除了 RNN 外部循环,LSTM 循环网络有“LSTM 单元”,每个单元有1个内部自循环。每个“LSTM 单元”有与普通 RNN 相同的输入和输出,但有更多的参数且有1个控制信息流的门控单元。
最重要的部分是状态单元s(t)i,具有1个与泄漏单元相似的线性自循环。但遗忘门 (forget gate) 单元f(t)i (时间步t的单元i) 用1个 Sigmoid 单元设置权重至0~1之间,来控制自循环的权重 (或相关时间常数):
f(t)i=σ??bfi+∑jUfi,jx(t)j+∑jWfi,jh(t-1)j??
其中,x(t)为当前输入向量。h(t)为当前隐含单元向量,包含所有 LSTM 单元的输出。且bf,Uf,Wf分别为遗忘门的偏置,输入权重和循环权重。
用条件自循环权重f(t)i来更新LSTM 单元的内部状态。
s(t)i=f(t)is(t-1)i+g(t)iσ??bi+∑jUi,jx(t)j+∑jWi,jh(t-1)j??
其中,b,U,W分别为LSTM 单元的偏置,输入权重和循环权重。外部输入门 (external input gate) 单元g(t)i与遗忘门单元计算类似,但有自己的参数:
g(t)i=σ??bgi+∑jUgi,jx(t)j+∑jWgi,jh(t-1)j??
输出门 (output gate) 单元 q(t)i可关闭 LSTM 单元的输出h(t)i:
q(t)i=σ??boi+∑jUoi,jx(t)j+∑jWoi,jh(t-1)j??h(t)i=tanh(s(t)i)q(t)i
其中,参数bo,Uo,Wo分别为输出门的偏置,输入权重和循环权重。LSTM 的变种中,选择把单元状态s(t)i送入第i个单元的3个门作为额外的输入 (带权重)。
有上标f的参数属于遗忘门,有上标g的参数属于外部输入门,有上标o的参数属于输出门。
与简单的循环结构相比,LSTM 网络在测试长期依赖能力的合成数据集和挑战性任务处理任务上可学习到更长期的依赖。
(2) 其它门控 RNN
LSTM 哪一部分是必要的?还能设计出其它成功的结构,使网络能动态控制时间尺度和遗忘不同单元的行为?
近期门控 RNN 上的工作,网络单元为门控循环单元或 GRUs。与 LSTM 不同之处为仅有1个门单元同时控制遗忘因子和决定是否更新状态单元。更新方程如下:
h(t)i=u(t-1)ih(t-1)i+(1-u(t-1)i)σ??bi+∑jUi,jx(t-1)j+∑jWi,jr(t-1)jh(t-1)j??
其中,u为更新门,r为复位门。它们的值定义为:
u(t)i=σ??bui+∑jUui,jx(t)j+∑jWui,jh(t)j??r(t)i=σ??bri+∑jUri,jx(t)j+∑jWri,jh(t)j??
更新门和复位门忽略了状态向量s(t)i部分。更新门更像是可线性门控任意维度的条件泄漏积分器,因此选择复制状态值 (极端为 Sigmoid 值) 或替换成新的“目标状态”值 (泄漏积分器收敛的值)。复位门控制哪一部分状态用来计算下一目标状态,引入过去状态和未来状态关系的1个额外的非线性影响。
该情形下可设计更多的变体。比如,多隐含单元间共享复位门 (或遗忘门) 输出。此外,1个全局门 (覆盖整组单元,如1整个层) 和 1个局部门 (每个单元) 可用于结合全局控制和局部控制。然而,LSTM 和 GRU 的结构变体据调查并未在各项任务中完败原结构。2015 年 Greff 等人 发现关键部分为遗忘门,而同年 Jozefowicz 等人发现对 LSTM 的遗忘门添加偏置1,使 LSTM 成为目前最好的结构变体。
11. 长期依赖的优化
优化 RNN 时,许多时间步后梯度会消失或爆炸。
2011 年 Martens 和 Sutskever 提出1阶导数消失的同时,2阶导数可能也会消失。若2阶导数以与1阶导数相似的比率缩小,那么1阶和2阶导数的比率可能保持为常数。不幸的是,2阶方法缺点很多,包括计算损失高,需要1个大的小块 (minibatch) 及 易受鞍点吸引。他们用2阶方法效果很好。2013 年 Sutskever 等人发现简单的方法 (谨慎初始化的 Nesterov 动量) 可获得类似的效果。两种方法被应用于 LSTM 的 SGD (甚至没有动量) 取代。机器学习领域中,通常设计1个易优化的模型会比设计1个更强大的优化算法更容易。
(1) 裁剪梯度
1个循环网络的强非线性函数经过许多时间步后的梯度幅值会太大或太小,见下图。目标函数 (参数的函数) 有“悬崖”地形:宽阔平坦的区域被目标函数快速变化的小区域分开,形成1种悬崖。
困难在于当参数梯度非常大时,梯度下降的参数更新会把参数甩出到很远的区域,该区域的目标函数更大且与逼近当前解没什么关系。梯度告诉我们当前参数周围的无穷小区域内最陡的下降方向。无穷小区域之外的代价函数可能开始曲率上升。更新步必须足够小以避免穿越过多的上升曲率。典型的学习率缓慢衰减,缓慢到连续步间的学习率近似相同。适用地形相对线性部分的步长通常不合适,且当下一时间步进入地形曲率更大的部分时,会使目标函数值上升运动。
上图的循环网络包含两个参数w和b。梯度裁剪使悬崖附近的梯度下降更合理。悬崖常发生在近似线性行为的循环网络中。该悬崖在多个时间步后会指数级的陡,因为每个时间步权重矩阵自乘1次。当它开始攀爬悬崖表面时,限制步长使其不会从解附近的陡峭区域推开来。
多年来1个简单的解决方法常用:裁剪梯度。2012 年 Mikolov 在参数更新前,对1个小块按元素裁剪参数梯度。2013 年 Pascanu 等人在参数更新前,裁剪梯度g的模||g||:
if1||g||&v2g←gv||g||
其中,v为模的阈值,g为更新参数。因为用单个缩放因子联合地重新归一化所有参数 (包括不同组的参数,如参数和偏置) 的梯度。Pascanu 的方法保证了每步依然在梯度方向上,但实验得到的两种方式效果相似。尽管参数更新 (裁剪梯度的模) 与真实梯度的方向相同,但参数更新向量的模是受限的。该受限的梯度避免了梯度爆炸时有害的步。实际上,当梯度幅值超过阈值时仅随机走一步的效果也不错。如果梯度爆炸使得梯度值为 Inf 或 Nan (无穷大或不是数),然后走大小为v的1个随机步,将会从数值不稳定的结构中移出来。对每小块裁剪梯度的模将不会改变每个小块的梯度方向。然而,对许多小块的梯度模裁剪后取平均并不等于实际梯度的模 (所有例子形成的梯度)。大的梯度模的例子和同一小块出现的例子对最后的梯度方向无贡献。这和传统的小块梯度下降 (真实梯度等于所有小块梯度的平均) 相反。换句话说,传统的随机梯度下降为梯度的无偏估计,而模裁剪的梯度下降引入了1个我们经验上认为有用的启发式的偏置。用按元素裁剪,更新的方向与真实梯度或小块梯度并不一致,但它依然是1个下降的方向。 2013 年 Graves 等人提出裁剪隐含单元间反向传播的梯度,但变体间并未比较,我们推断这些方法效果相似。
(2) 正则化来促进信息流
裁剪梯度帮助解决梯度爆炸问题,但未解决梯度消失问题。为弄清梯度消失且更好地捕捉长期依赖,讨论在展开的循环结构的计算图中创建路径,路径上用弧接近1的梯度相乘。实现的1种方式为用 LSTM 和 其它自循环或门控机制。另1种是正则化或约束参数来促进“信息流”。我们希望梯度向量?h(t)L反传时保持它的幅值不变,即使损失函数仅惩罚序列末端的输出。我们希望:
(?h(t)L)?h(t)?h(t-1)
和?h(t)L一样大。
对目标函数,2013 年 Pascanu 等人提出如下正则项:
Ω=∑t???||(?(t)hL?h(t)?h(t-1))||||?h(t)L||-1???2
计算该正则项的梯度看似困难,但 Pascanu 等人提出近似反传向量?h(t)L为常数 (则该正则项不需要反向传播)。正则项实验表明,若与模裁剪的启发式结合,正则项可扩大 RNN 学习到的依赖范围。因 RNN 的动态特性接近爆炸梯度,梯度裁剪尤为重要。没有梯度裁剪,梯度爆炸会阻止学习成功。
该方法关键的弱点是当数据充足时,它不如 LSTM 那么有效,如语言建模。
12. 显式记忆
智能需要知识,通过学习获取知识促进了大规模深度结构的发展。然而,知识包含不同的类型。有些知识是隐式的,潜意识的且很难描述的——如如何行走,或狗如何看起来与猫不同。其它知识是显式的,声明性的且相对直接组成语句——常识,如“猫是1种动物”,或你需要知道去完成的当前目标这样具体的事实,如“下午3点141室销售团队开会”。
神经网络擅长保存隐式知识。然而,它们记忆事实困难。随机梯度下降在输入的表示保存进网络参数前,之后输入甚至不会特别精确地保存表示,要求相同输入的很多表示。2014 年 Graves 等人假设因神经网络缺少工作记忆系统,该系统使人类可显式地保持和操作与实现目标相关的信息片段。这样的显式记忆允许我们的系统快速有意地保存和恢复具体的事实,且用它们按序推理。可处理1个序列信息的神经网络的需求,改变了每步放入网络的输入方式,长期以来使推理能力比输入的自动直接响应显得更为重要 (Hinton, 1990)。
为解决该困难,2014 年 Weston 引入通过寻址访问1堆记忆单元的记忆网络。记忆网络刚开始要求监督信号来指导网络使用记忆单元。2014 年 Graves 等人引入神经图灵机,在没有动作指示的显式监督时,能学习在记忆单元上读写任意内容;用基于内容的软注意机制,允许无监督地端到端训练 (Bahdanau, 2015)。该软寻址机制成为其它模仿算法机制 (仍允许梯度优化) 的相关结构的标准。
每个记忆单元可视为 LSTMs 和 GRUs 的记忆单元的扩展。不同之处在于网络输出读写记忆单元的内在状态,正如在数字计算机上读取或写入某个具体地址的记忆访问。
优化函数难以产生准确的整型地址。为缓和该问题,NTMs 同时从许多记忆单元中读写。它们对许多单元加权平均来读取,修改不同数目的单元来写入。用非0导数的权重通过梯度下降来控制函数访问要优化的记忆。这些系数的梯度暗示它们是增加还是减少,但梯度仅当接收到很大系数的记忆地址时会很大。
这些记忆单元被增广成包含1个向量,而非 LSTM 或 GRU 记忆单元保存的单个标量。此时,会增加访问记忆单元的成本,为产生许多单元的1个系数付出了计算成本,但我们希望这些系数可聚类一小部分单元。通过读取1个向量值而非标量值,也抵消了一些成本。用向量值的记忆单元允许基于内容的寻址,用来读写单元的权重为单元的函数。若能产生匹配部分而非全部元素的模式,向量值单元可恢复出完整的向量值记忆。类似人们基于一些语句来回忆歌词。1个基于内容的读指令就像“已有’黄色潜水艇’副歌,恢复这首歌的歌词”。当对象恢复量很大时 (如果歌词的每个字母分散保存在记忆单元中),基于内容的寻址更有用。与基于地址的寻址相比,1个基于地址的读指令就像“恢复位置 347 处的歌词”。当记忆单元很小时,基于位置的寻址通常是完全合理的机制。
如果1个记忆单元的内容在大多数时间步被复制 (未被遗忘),那么前向和反向传递的信息不会消失或爆炸。
显式记忆方法见上图,1个“任务神经网络”附带1个记忆。尽管任务神经网络是前向或循环的,但整个系统是循环网络。任务网络可选择读写具体的记忆地址。显式记忆可使模型学习到常规 RNN 或 LSTM 学不到的任务,可能因为信息和梯度能长期传播。
为通过记忆单元加权平均反传,解释记忆寻址系数为概率,且每次随机读取1个单元 (Zaremba 和 Sutskever, 2015)。离散决策的模型优化要求特定的优化方法。到目前为止,训练随机结构来做离散决定依然难于训练确定结构来做软决定。
不管是软的 (允许反传) 或随机的或硬的,寻址机制和注意力机制形式上相同。手写体产生中的注意力机制被约束仅在时间序列上前向传播。机器翻译中的注意力在与前面步比较后,可移动到另1个完全不同的位置。
硬的应该是指离散决策的随机结构。
循环网络将深度学习扩展到序列数据。它们是我们深度学习工具箱中最后1个主要工具。剩下的问题转向选择和使用这些工具,应用它们解决现实任务。
小白随心译,遗漏部分内容 (感觉不太重要或有些重复~)。最近一些事情弄得各种前途堪忧状,心情很烦乱,中间进度断了不少次。所以理解必然可能存在有误之处,欢迎新老司机带路~ ︿( ̄︶ ̄)︽( ̄︶ ̄)︿
看过本文的人也看了:
我要留言技术领域:
取消收藏确定要取消收藏吗?
删除图谱提示你保存在该图谱下的知识内容也会被删除,建议你先将内容移到其他图谱中。你确定要删除知识图谱及其内容吗?
删除节点提示无法删除该知识节点,因该节点下仍保存有相关知识内容!
删除节点提示你确定要删除该知识节点吗?

我要回帖

更多关于 rnn神经网络代码 的文章

 

随机推荐