A. gru-190gy如何设置
方法/步骤
RNN回顾
先简单回顾一下RNN隐层神经元计算公式为:
B. Python中文分词的原理你知道吗
中文分词,即 Chinese Word Segmentation,即将一个汉字序列进行切分,得到一个个单独的词。表面上看,分词其实就是那么回事,但分词效果好不好对信息检索、实验结果还是有很大影响的,同时分词的背后其实是涉及各种各样的算法的。
中文分词与英文分词有很大的不同,对英文而言,一个单词就是一个词,而汉语是以字为基本的书写单位,词语之间没有明显的区分标记,需要人为切分。根据其特点,可以把分词算法分为四大类:
基于规则的分词方法
基于统计的分词方法
基于语义的分词方法
基于理解的分词方法
下面我们对这几种方法分别进行总结。
基于规则的分词方法
这种方法又叫作机械分词方法、基于字典的分词方法,它是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行匹配。若在词典中找到某个字符串,则匹配成功。该方法有三个要素,即分词词典、文本扫描顺序和匹配原则。文本的扫描顺序有正向扫描、逆向扫描和双向扫描。匹配原则主要有最大匹配、最小匹配、逐词匹配和最佳匹配。
最大匹配法(MM)。基本思想是:假设自动分词词典中的最长词条所含汉字的个数为 i,则取被处理材料当前字符串序列中的前 i 个字符作为匹配字段,查找分词词典,若词典中有这样一个 i 字词,则匹配成功,匹配字段作为一个词被切分出来;若词典中找不到这样的一个 i 字词,则匹配失败,匹配字段去掉最后一个汉字,剩下的字符作为新的匹配字段,再进行匹配,如此进行下去,直到匹配成功为止。统计结果表明,该方法的错误率 为 1/169。
逆向最大匹配法(RMM)。该方法的分词过程与 MM 法相同,不同的是从句子(或文章)末尾开始处理,每次匹配不成功时去掉的是前面的一个汉字。统计结果表明,该方法的错误率为 1/245。
逐词遍历法。把词典中的词按照由长到短递减的顺序逐字搜索整个待处理的材料,一直到把全部的词切分出来为止。不论分词词典多大,被处理的材料多么小,都得把这个分词词典匹配一遍。
设立切分标志法。切分标志有自然和非自然之分。自然切分标志是指文章中出现的非文字符号,如标点符号等;非自然标志是利用词缀和不构成词的词(包 括单音词、复音节词以及象声词等)。设立切分标志法首先收集众多的切分标志,分词时先找出切分标志,把句子切分为一些较短的字段,再用 MM、RMM 或其它的方法进行细加工。这种方法并非真正意义上的分词方法,只是自动分词的一种前处理方式而已,它要额外消耗时间扫描切分标志,增加存储空间存放那些非 自然切分标志。
最佳匹配法(OM)。此法分为正向的最佳匹配法和逆向的最佳匹配法,其出发点是:在词典中按词频的大小顺序排列词条,以求缩短对分词词典的检索时 间,达到最佳效果,从而降低分词的时间复杂度,加快分词速度。实质上,这种方法也不是一种纯粹意义上的分词方法,它只是一种对分词词典的组织方式。OM 法的分词词典每条词的前面必须有指明长度的数据项,所以其空间复杂度有所增加,对提高分词精度没有影响,分词处理的时间复杂度有所降低。
此种方法优点是简单,易于实现。但缺点有很多:匹配速度慢;存在交集型和组合型歧义切分问题;词本身没有一个标准的定义,没有统一标准的词集;不同词典产生的歧义也不同;缺乏自学习的智能性。
基于统计的分词方法
该方法的主要思想:词是稳定的组合,因此在上下文中,相邻的字同时出现的次数越多,就越有可能构成一个词。因此字与字相邻出现的概率或频率能较好地反映成词的可信度。可以对训练文本中相邻出现的各个字的组合的频度进行统计,计算它们之间的互现信息。互现信息体现了汉字之间结合关系的紧密程度。当紧密程 度高于某一个阈值时,便可以认为此字组可能构成了一个词。该方法又称为无字典分词。
该方法所应用的主要的统计模型有:N 元文法模型(N-gram)、隐马尔可夫模型(Hiden Markov Model,HMM)、最大熵模型(ME)、条件随机场模型(Conditional Random Fields,CRF)等。
在实际应用中此类分词算法一般是将其与基于词典的分词方法结合起来,既发挥匹配分词切分速度快、效率高的特点,又利用了无词典分词结合上下文识别生词、自动消除歧义的优点。
基于语义的分词方法
语义分词法引入了语义分析,对自然语言自身的语言信息进行更多的处理,如扩充转移网络法、知识分词语义分析法、邻接约束法、综合匹配法、后缀分词法、特征词库法、矩阵约束法、语法分析法等。
扩充转移网络法
该方法以有限状态机概念为基础。有限状态机只能识别正则语言,对有限状态机作的第一次扩充使其具有递归能力,形成递归转移网络 (RTN)。在RTN 中,弧线上的标志不仅可以是终极符(语言中的单词)或非终极符(词类),还可以调用另外的子网络名字分非终极符(如字或字串的成词条件)。这样,计算机在 运行某个子网络时,就可以调用另外的子网络,还可以递归调用。词法扩充转移网络的使用, 使分词处理和语言理解的句法处理阶段交互成为可能,并且有效地解决了汉语分词的歧义。
矩阵约束法
其基本思想是:先建立一个语法约束矩阵和一个语义约束矩阵, 其中元素分别表明具有某词性的词和具有另一词性的词相邻是否符合语法规则, 属于某语义类的词和属于另一词义类的词相邻是否符合逻辑,机器在切分时以之约束分词结果。
基于理解的分词方法
基于理解的分词方法是通过让计算机模拟人对句子的理解,达到识别词的效果。其基本思想就是在分词的同时进行句法、语义分析,利用句法信息和语义信息来处理歧义现象。它通常包括三个部分:分词子系统、句法语义子系统、总控部分。在总控部分的协调下,分词子系统可以获得有关词、句子等的句法和语义信息来对分词歧义进行判断,即它模拟了人对句子的理解过程。这种分词方法需要使用大量的语言知识和信息。目前基于理解的分词方法主要有专家系统分词法和神经网络分词法等。
专家系统分词法
从专家系统角度把分词的知识(包括常识性分词知识与消除歧义切分的启发性知识即歧义切分规则)从实现分词过程的推理机中独立出来,使知识库的维护与推理机的实现互不干扰,从而使知识库易于维护和管理。它还具有发现交集歧义字段和多义组合歧义字段的能力和一定的自学习功能。
神经网络分词法
该方法是模拟人脑并行,分布处理和建立数值计算模型工作的。它将分词知识所分散隐式的方法存入神经网络内部,通过自学习和训练修改内部权值,以达到正确的分词结果,最后给出神经网络自动分词结果,如使用 LSTM、GRU 等神经网络模型等。
神经网络专家系统集成式分词法
该方法首先启动神经网络进行分词,当神经网络对新出现的词不能给出准确切分时,激活专家系统进行分析判断,依据知识库进行推理,得出初步分析,并启动学习机制对神经网络进行训练。该方法可以较充分发挥神经网络与专家系统二者优势,进一步提高分词效率。
以上便是对分词算法的基本介绍。
C. 吴恩达:序列模型(Sequence Models)
x: Harry Potter and Hermione Granger invented a new spell.
y: 1 1 0 1 1 0 0 0 0
RNN的限制是它在某一时刻的预测只来自于序列之前的输入信息
many-to-many: 多对多,识别姓名(、机器翻译
many-to-one:多对一,电影评级
one-to-one:一对一,简单神经网络
one-to-many:音乐生成
[图片上传失败...(image-7bfbcd-1627733070469)]
language model and sequence processing
sampling a sequence from a trained RNN
[图片上传失败...(image-a3d162-1627733070469)]
gradient clipping梯度修剪:观察你的梯度向量,如果它大于某个阈值,缩放梯度向量,保证它不会太大。
GRU改变了RNN的隐藏层,使其可以更好地捕捉深层连接,并改善了梯度消失问题。
GRU单元(门控循环神经网络)可以有效解决梯度消失的问题,并且能够使你的神经网络捕获更长的长期依赖。
GRU(simplified)
[图片上传失败...(image-5bc757-1627733070469)]
long short term memory
[图片上传失败...(image-bb377a-1627733070469)]
[图片上传失败...(image-6eb33e-1627733070469)]
何时使用GRU还是LSTM没有统一的准则,GRU的优点是这是个更简单的模型,所以更容易创建一个更大的网络,而且它只有两个门,在计算性上也运行得更快,也可以扩大模型的规模。但是LSTM更加强大和灵活,因为它有三个门。
[图片上传失败...(image-e9bde9-1627733070469)]
visualizing word embeddings 可视化词嵌入
[图片上传失败...(image-d0afbd-1627733070469)]
analogies using word vectors
cosine similarity
skip-grams
I want a glass of orange juice to go along with my cereal.
content c ("orange") —— target t ("juice")
6257 4834
<svg xmlns:xlink="http://www.w3.org/1999/xlink" width="97.241ex" height="10.719ex" viewBox="0 -788 41867.7 4615.2" role="img" focusable="false" style="vertical-align: -8.889ex; max-width: 79900px;" class="in-text-selection"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g transform="translate(14076,-2308)"><g transform="translate(3844,0)"><text font-family="STIXGeneral, 'PingFang SC', serif" stroke="none" transform="scale(52.4) matrix(1 0 0 -1 0 0)">;</text></g></g></g></svg>
分母部分的求和会很缓慢,解决方案是使用一个分级的softmax分类器(hierarchical softmax classifier)
[图片上传失败...(image-fdfc93-1627733070469)]
[图片上传失败...(image-cff3d2-1627733070469)]
[图片上传失败...(image-b61aea-1627733070469)]
greedy search vs beam search
Bleu score on n-grams only
combined Bleu score:
[图片上传失败...(image-258f73-1627733070468)]
在图像描述应用中,对于同一图片的不同描述,可能是同样好的;或者对于机器翻译来说,有多个一样好的翻译结果,BLEU提供了一个能够自动评估的方法,帮助加快算法开发进程。
[图片上传失败...(image-a593f2-1627733070468)]
[图片上传失败...(image-4b045-1627733070468)]
attention model for speech recognition
[图片上传失败...(image-dce0f7-1627733070468)]
CTC(connectionist temporaral classification) cost for speech recognition
D. LSTM与GRU数学推导
RNN 的关键点之一就是他们可以用来连接先前的信息到当前的任务上,例如使用过去的视频段来推测对当前段的理解。如果 RNN 可以做到这个,他们就变得非常有用。但是真的可以么?答案是,还有很多依赖因素。
有时候,我们仅仅需要知道先前的信息来执行当前的任务。例如,我们有一个语言模型用来基于先前的词来预测下一个词。如果我们试着预测 “the clouds are in the sky” 最后的词,我们并不需要任何其他的上下文 —— 因此下一个词很显然就应该是 sky。在这样的场景中,相关的信息和预测的词位置之间的间隔是非常小的,RNN 可以学会使用先前的信息。
但是同样会有一些更加复杂的场景。假设我们试着去预测“I grew up in France... I speak fluent French”最后的词。当前的信息建议下一个词可能是一种语言的名字,但是如果我们需要弄清楚是什么语言,我们是需要先前提到的离当前位置很远的 France 的上下文的。这说明相关信息和当前预测位置之间的间隔就肯定变得相当的大。
不幸的是,在这个间隔不断增大时,RNN 会丧失学习到连接如此远的信息的能力。
在理论上,RNN 绝对可以处理这样的 长期依赖 问题。人们可以仔细挑选参数来解决这类问题中的最初级形式,但在实践中,RNN 肯定不能够成功学习到这些知识。Bengio, et al. (1994)等人对该问题进行了深入的研究,他们发现一些使训练 RNN 变得非常困难的相当根本的原因。
然而,幸运的是,LSTM 并没有这个问题!
Long Short Term 网络—— 一般就叫做 LSTM ——是一种 RNN 特殊的类型,可以学习长期依赖信息。LSTM 由Hochreiter & Schmidhuber (1997)提出,并在近期被Alex Graves进行了改良和推广。在很多问题,LSTM 都取得相当巨大的成功,并得到了广泛的使用。
LSTM 通过刻意的设计来避免长期依赖问题。记住长期的信息在实践中是 LSTM 的默认行为,而非需要付出很大代价才能获得的能力!
所有 RNN 都具有一种重复神经网络模块的链式的形式。在标准的 RNN 中,这个重复的模块只有一个非常简单的结构,例如一个 tanh 层。
LSTM 同样是这样的结构,但是重复的模块拥有一个不同的结构。不同于 单一神经网络层,这里是有四个,以一种非常特殊的方式进行交互。
不必担心这里的细节。我们会一步一步地剖析 LSTM 解析图。现在,我们先来熟悉一下图中使用的各种元素的图标。
在上面的图例中,每一条黑线传输着一整个向量,从一个节点的输出到其他节点的输入。粉色的圈代表 pointwise 的操作,诸如向量的和,而黄色的矩阵就是学习到的神经网络层。合在一起的线表示向量的连接,分开的线表示内容被复制,然后分发到不同的位置。
LSTM 的关键就是细胞状态,水平线在图上方贯穿运行。
细胞状态类似于传送带。直接在整个链上运行,只有一些少量的线性交互。信息在上面流传保持不变会很容易。
LSTM 有通过精心设计的称作为“门”的结构来去除或者增加信息到细胞状态的能力。门是一种让信息选择式通过的方法。他们包含一个 sigmoid 神经网络层和一个 pointwise 乘法操作。
Sigmoid 层输出 0 到 1 之间的数值,描述每个部分有多少量可以通过。0 代表“不许任何量通过”,1 就指“允许任意量通过”!
LSTM 拥有三个门,来保护和控制细胞状态。
在我们 LSTM 中的第一步是决定我们会从细胞状态中丢弃什么信息。这个决定通过一个称为忘记门层完成。该门会读取h_{t-1}和x_t,输出一个在 0 到 1 之间的数值给每个在细胞状态C_{t-1}中的数字。1 表示“完全保留”,0 表示“完全舍弃”。
让我们回到语言模型的例子中来基于已经看到的预测下一个词。在这个问题中,细胞状态可能包含当前主语的性别,因此正确的代词可以被选择出来。当我们看到新的主语,我们希望忘记旧的主语。
下一步是确定什么样的新信息被存放在细胞状态中。这里包含两个部分。第一,sigmoid 层称 “输入门层” 决定什么值我们将要更新。然后,一个 tanh 层创建一个新的候选值向量,\tilde{C}_t,会被加入到状态中。下一步,我们会讲这两个信息来产生对状态的更新。
在我们语言模型的例子中,我们希望增加新的主语的性别到细胞状态中,来替代旧的需要忘记的主语。
现在是更新旧细胞状态的时间了,C_{t-1}更新为C_t。前面的步骤已经决定了将会做什么,我们现在就是实际去完成。
我们把旧状态与f_t相乘,丢弃掉我们确定需要丢弃的信息。接着加上i_t * \tilde{C}_t。这就是新的候选值,根据我们决定更新每个状态的程度进行变化。
在语言模型的例子中,这就是我们实际根据前面确定的目标,丢弃旧代词的性别信息并添加新的信息的地方。
最终,我们需要确定输出什么值。这个输出将会基于我们的细胞状态,但是也是一个过滤后的版本。首先,我们运行一个 sigmoid 层来确定细胞状态的哪个部分将输出出去。接着,我们把细胞状态通过 tanh 进行处理(得到一个在 -1 到 1 之间的值)并将它和 sigmoid 门的输出相乘,最终我们仅仅会输出我们确定输出的那部分。
在语言模型的例子中,因为他就看到了一个 代词,可能需要输出与一个 动词 相关的信息。例如,可能输出是否代词是单数还是负数,这样如果是动词的话,我们也知道动词需要进行的词形变化。
我们到目前为止都还在介绍正常的 LSTM。但是不是所有的 LSTM 都长成一个样子的。实际上,几乎所有包含 LSTM 的论文都采用了微小的变体。差异非常小,但是也值得拿出来讲一下。
其中一个流形的 LSTM 变体,就是由 Gers & Schmidhuber (2000) 提出的,增加了 “peephole connection”。是说,我们让 门层 也会接受细胞状态的输入。
上面的图例中,我们增加了 peephole 到每个门上,但是许多论文会加入部分的 peephole 而非所有都加。
另一个变体是通过使用 coupled 忘记和输入门。不同于之前是分开确定什么忘记和需要添加什么新的信息,这里是一同做出决定。我们仅仅会当我们将要输入在当前位置时忘记。我们仅仅输入新的值到那些我们已经忘记旧的信息的那些状态 。
另一个改动较大的变体是 Gated Recurrent Unit (GRU),这是由 Cho, et al. (2014) 提出。它将忘记门和输入门合成了一个单一的 更新门。同样还混合了细胞状态和隐藏状态,和其他一些改动。最终的模型比标准的 LSTM 模型要简单,也是非常流行的变体。
这里只是部分流行的 LSTM 变体。当然还有很多其他的,如Yao, et al. (2015) 提出的 Depth Gated RNN。还有用一些完全不同的观点来解决长期依赖的问题,如Koutnik, et al. (2014) 提出的 Clockwork RNN。
要问哪个变体是最好的?其中的差异性真的重要吗?Greff, et al. (2015) 给出了流行变体的比较,结论是他们基本上是一样的。Jozefowicz, et al. (2015) 则在超过 1 万种 RNN 架构上进行了测试,发现一些架构在某些任务上也取得了比 LSTM 更好的结果。
刚开始,我提到通过 RNN 得到重要的结果。本质上所有这些都可以使用 LSTM 完成。对于大多数任务确实展示了更好的性能!
由于 LSTM 一般是通过一系列的方程表示的,使得 LSTM 有一点令人费解。然而本文中一步一步地解释让这种困惑消除了不少。
LSTM 是我们在 RNN 中获得的重要成功。很自然地,我们也会考虑:哪里会有更加重大的突破呢?在研究人员间普遍的观点是:“Yes! 下一步已经有了——那就是注意力!” 这个想法是让 RNN 的每一步都从更加大的信息集中挑选信息。例如,如果你使用 RNN 来产生一个图片的描述,可能会选择图片的一个部分,根据这部分信息来产生输出的词。实际上,Xu, et al. (2015)已经这么做了——如果你希望深入探索注意力可能这就是一个有趣的起点!还有一些使用注意力的相当振奋人心的研究成果,看起来有更多的东西亟待探索……
注意力也不是 RNN 研究领域中唯一的发展方向。例如,Kalchbrenner, et al. (2015) 提出的 Grid LSTM 看起来也是很有前途。使用生成模型的 RNN,诸如Gregor, et al. (2015) Chung, et al. (2015) 和 Bayer & Osendorfer (2015) 提出的模型同样很有趣。在过去几年中,RNN 的研究已经相当的燃,而研究成果当然也会更加丰富!
先看一下比较典型的BPTT一个展开的结构,如下图,这里只考虑了部分图,因为其他部分不是这里要讨论的内容。
对于t时刻的误差信号计算如下:
这样权值的更新方式如下:
上面的公式在BPTT中是非常常见的了,那么如果这个误差信号一直往过去传呢,假设任意两个节点u, v他们的关系是下面这样的:
那么误差传递信号的关系可以写成如下的递归式:
n表示图中一层神经元的个数,这个递归式的大概含义不难理解,要求t-q时刻误差信号对t时刻误差信号的偏导,就先求出t-q+1时刻对t时刻的,然后把求出来的结果传到t-q时刻,递归停止条件是q = 1时,就是刚开始写的那部分计算公式了。将上面的递归式展开后可以得到:
论文里面说的是可以通过归纳来证明,我没仔细推敲这里了,把里面连乘展开看容易明白一点:
整个结果式对T求和的次数是n^(q-1), 即T有n^(q-1)项,那么下面看问题出在哪儿。
如果|T| > 1, 误差就会随着q的增大而呈指数增长,那么网络的参数更新会引起非常大的震荡。
如果|T| < 1, 误差就会消失,导致学习无效,一般激活函数用simoid函数,它的倒数最大值是0.25, 权值最大值要小于4才能保证不会小于1。
误差呈指数增长的现象比较少,误差消失在BPTT中很常见。在原论文中还有更详细的数学分析,但是了解到此个人觉的已经足够理解问题所在了。
为了克服误差消失的问题,需要做一些限制,先假设仅仅只有一个神经元与自己连接,简图如下:
根据上面的,t时刻的误差信号计算如下:
为了使误差不产生变化,可以强制令下式为1:
根据这个式子,可以得到:
这表示激活函数是线性的,常常的令fj(x) = x, wjj = 1.0,这样就获得常数误差流了,也叫做CEC。
但是光是这样是不行的,因为存在输入输出处权值更新的冲突(这里原论文里面的解释我不是很明白),所以加上了两道控制门,分别是input gate, output gate,来解决这个矛盾,图如下:
图中增加了两个控制门,所谓控制的意思就是计算cec的输入之前,乘以input gate的输出,计算cec的输出时,将其结果乘以output gate的输出,整个方框叫做block, 中间的小圆圈是CEC, 里面是一条y = x的直线表示该神经元的激活函数是线性的,自连接的权重为1.0
最初lstm结构的一个缺点就是cec的状态值可能会一直增大下去,增加forget gate后,可以对cec的状态进行控制,它的结构如下图:
这里的相当于自连接权重不再是1.0,而是一个动态的值,这个动态值是forget gate的输出值,它可以控制cec的状态值,在必要时使之为0,即忘记作用,为1时和原来的结构一样。
上面增加遗忘门一个缺点是当前CEC的状态不能影响到input gate, forget gate在下一时刻的输出,所以增加了Peephole connections。结构如下:
这里的gate的输入部分就多加了一个来源了,forget gate, input gate的输入来源增加了cec前一时刻的输出,output gate的输入来源增加了cec当前时刻的输出,另外计算的顺序也必须保证如下:
1. input gate, forget gate的输入输出
2. cell的输入
3. output gate的输入输出
4. cell的输出(这里也是block的输出)
我记得当时看论文公式推导的时候很多地方比较难理解,最后随便谷歌了几下,找到一个写的不错的类似课件的PDF,但是已经不知道出处了,很容易就看懂LSTM的前向计算,误差反传更新了。把其中关于LSTM的部分放上来,首先网络的完整结构图如下:
这个结构也是rwthlm源码包中LSTM的结构,下面看一下公式的记号:
前向的计算:
误差反传更新:
此外,还有GRU结构同样是解决RNN的缺点,这里将LSTM和GRU进行对比。
LSTM与GRU:
1) LSTM:
2)GRU:
3)概括的来说,LSTM和GRU都能通过各种Gate将重要特征保留,保证其在long-term 传播的时候也不会被丢失;还有一个不太好理解,作用就是有利于BP的时候不容易vanishing:
实验用了三个unit,传统的tanh,以及LSTM和GRU:
可以发现LSTM和GRU的差别并不大,但是都比tanh要明显好很多,所以在选择LSTM或者GRU的时候还要看具体的task data是什么, 不过在收敛时间和需要的epoch上,GRU应该要更胜一筹:
相关博客和教程:
https://zybuluo.com/hanbingtao/note/581764
http://www.jianshu.com/p/9dc9f41f0b29
http://www.csdn.net/article/2015-06-05/2824880
http://blog.csdn.net/zdy0_2004/article/details/49977423
http://blog.csdn.net/a635661820/article/details/45390671
http://deeplearning.net/tutorial/lstm.html
https://www.hu.com/question/29411132
原文参考:http://www.cnblogs.com/taojake-ML/p/6272605.html
E. 推荐系统论文阅读(十)-基于图神经网络的序列推荐算法
论文:
论文地址: https://arxiv.org/abs/1811.00855
论文题目:《Session-based Recommendation with Graph Neural Networks》SR-GNN
github: https://github.com/CRIPAC-DIG/SR-GNN
基于会话的推荐一般是将序列会话建模,将整个session进行编码,变成一个隐向量,然后利用这个隐向量进行下一个点击预测。但是这种方法没有考虑到item直接复杂的转换(transitions)关系,也就是item之间在点击的session中除了时间顺序外还有复杂的有向图内的节点指向关系,所以之前的方法不足以很好的对点击序列进行建模。
现有基于会话的推荐,方法主要集中于循环神经网络和马尔可夫链,论文提出了现有方法的两个缺点:
1)当一个session中用户的行为数量十分有限时,这些方法难以获取准确的用户行为表示。如当使用RNN模型时,用户行为的表示即最后一个单元的输出,论文认为只有这样并非十分准确。
2)根据先前的工作发现,物品之间的转移模式在会话推荐中是十分重要的特征,但RNN和马尔可夫过程只对相邻的两个物品的 单向转移关系 进行建模,而忽略了会话中其他的物品。
为了克服上述缺陷,本文提出了用图神经网络对方法对用户对session进行建模:
下面具体介绍怎么进行图序列推荐
V = {v1,v2...vm}为全部的item,S = { }为一个session里面按时间顺序的点击物品,论文的目标是预测用户下一个要点击的物品vs,n+1,模型的任务是输出所有item的预测概率,并选择top-k进行推荐。
我们为每一个Session构建一个子图,并获得它对应的出度和入度矩阵。
假设一个点击序列是v1->v2->v4->v3,那么它得到的子图如下图中红色部分所示:
另一个例子,一个点击序列是v1->v2->v3->v2->v4,那么它得到的子图如下:
同时,我们会为每一个子图构建一个出度和入度矩阵,并对出度和入度矩阵的每一行进行归一化,如我们序列v1->v2->v3->v2->v4对应的矩阵如下:
这个矩阵里面的值是怎么计算的呢?下面讲一下:
看左边的出度矩阵,第一行为 0 1 0 0 ,代表着v1->v2,因为v1,只有一个指向的item,所以为1;看第二行,0 0 1/2 1/2,因为v2有指向v3和v4的边,所以进行归一化后每一个值都变成了1/2。入度矩阵的计算方法也是一样的,就不再说了。
本文采用的是GRU单元进行序列建模,将图信息嵌入到神经网络中,让GRU充分学习到item之间的关系,传统的GRU只能学到相邻的两个物品之间的关系,加入图信息后就能学到整个session子图的信息。
计算公式如下:
为了刚好的理解这个计算过程,我们还是使用之前那个例子:v1->v2->v3->v2->v4来一步步分析输入到输出的过程。
(1) 是t时刻,会话s中第i个点击对应的输入, 是n✖️2n的矩阵,也就是会话子图的完整矩阵,而 是其中一行,即物品vi所对应的那行,大小为1✖️2n,n代表序列中不同物品的数量。
如果按照例子来看,如果i取2,那么 为 [0 0 1/2 1/2 1/2 0 1/2 0]
进一步的,可以把 :拆解为[ , ]
(2) 可以理解为序列中第i个物品,在训练过程中对应的嵌入向量,这个向量随着模型的训练不断变化,可以理解为隐藏层的状态,是一个d维向量。
(3) H是d*2d的权重向量,也可以看作是一个分块的矩阵,可以理解为H=[Hin|Hout],每一块都是d*d的向量。
那么我们来看看计算过程:
1)[ ..., ] ,结果是d * n的矩阵,转置之后是n*d的矩阵,计作
2) : H相当于[ ],即拆开之后相乘再拼接,因此结果是一个1 * 2d的向量。
上面就是完整的第i个点击的输入的计算过程,可以看到,在进入GRU计算之前,通过跟As,i矩阵相乘,把图信息嵌入到了神经网络中取,加深了神经网络学习到的item之间的交互信息。
此外,就是GRU的计算过程了,跟原始的GRU不一样的地方在于输入从xt变成了嵌入了图信息的as,i。
通样也有更新门和重置门,计算方法跟原始GRU一模一样。
这里的 其实就是相当于原始gru中的 ,只不过在SR-GNN里面,进行一轮运算的时候i是没有变化,相当于每个物品单独进去GRU进行计算,得到自己的向量,也就是说在GRU的计算过程中, 是不断变化的,看一下源码更易于理解:
hidden就是公式里面的 ,在gru的每一个step计算中都会进行更新,这里我有个疑问,如果所有item的hidden都更新的话,那么应该是整个序列中所有的item并行进入GRU中进行计算,每一个step都得到自己的vector,当每个item的vector更新后,下一个step就重新根据新的 计算 ,接着计算下一个step。
计算过程大概就是下面这样:
这里有四个GRU并行计算,没次更新自己的hidden状态,输入则考虑所有的hidden和图信息。
从上面的图看来,每一个item都要进行T个step得到自己的item-vec,所以经过T个step后,我们就得到了序列中所有item的向量,即:
图中用蓝色框框画出来的向量,有了这些向量后,我们怎么得到预测结果呢?这就引入了下一个问题。
观察上面的模型结构,我们看到attention,没错,我们认为一个session中的这些item-vec并不都对预测结果产生影响,有些item对结果影响很大,有些影响很小,所以我们进行了加权求和。同时,论文认为session对最后一个item-vec,s1=vn是重要的,所以单独拿出来:
公式(6)就是简单的attention操作,其实从公式上来看就是计算每个vi跟最后一个向量vn的权值,然后进行加权求和。
在最后的输出层,使用sh和每个物品的embedding进行内积计算,这里vi应该是item的embedding层出来的向量,而不是后面一直更新的hidden:
最后通过一个softmax得到最终每个物品的点击概率:
损失函数为交叉熵损失函数:
从数据上来看,SR-GNN超过了经典的GRU4REC,这也说明了图信息的嵌入能带来更好的推荐效果。
本论文很巧妙的将图信息嵌入的神经网络中,更高地让GRU学习到每个item之间的关系,不再局限于相邻的物品之间进行学习。近年来,图神经网络的思想和方法屡屡被用在推荐系统中,学好图神经网络应该是推荐系统的下一个热潮。
F. 输入循环的三种主要控制方式
1.查询方式、2.中断方式、3.DMA方式。
循环神经网络(RNN/recurrentneuralnetwork)是一类人工神经网络,其可以通过为网络添加额外的权重来在网络图(networkgraph)中创建循环,以便维持一个内部状态。为神经网络添加状态的好处是它们将能在序列预测问题中明确地学习和利用背景信息(context)。
这类问题包括带有顺序或时间组件的问题。在这篇文章中,你将踏上了解用于深度学习的循环神经网络的旅程。在读完这篇文章后,你将了解:用于深度学习的顶级循环神经网络的工作方式,其中包括LSTM、GRU和NTM、顶级RNN与人工神经网络中更广泛的循环(recurrence)研究的相关性。
RNN研究如何在一系列高难度问题上实现了当前最佳的表现。注意,我们并不会覆盖每一种可能的循环神经网络,而是会重点关注几种用于深度学习的循环神经网络(LSTM、GRU和NTM)以及用于理解它们的背景。
那就让我们开始吧!概述我们首先会设置循环神经网络领域的场景;然后,我们将深入了解用于深度学习的LSTM、GRU和NTM;之后我们会花点时间介绍一些与用于深度学习的RNN相关的高级主题。
G. 神经网络模型-27种神经网络模型们的简介
【1】Perceptron(P) 感知机
【1】感知机
感知机是我们知道的最简单和最古老的神经元模型,它接收一些输入,然后把它们加总,通过激活函数并传递到输出层。
【2】Feed Forward(FF)前馈神经网络
【2】前馈神经网络
前馈神经网络(FF),这也是一个很古老的方法——这种方法起源于50年代。它的工作原理通常遵循以下规则:
1.所有节点都完全连接
2.激活从输入层流向输出,无回环
3.输入和输出之间有一层(隐含层)
在大多数情况下,这种类型的网络使用反向传播方法进行训练。
【3】Radial Basis Network(RBF) RBF神经网络
【3】RBF神经网络
RBF 神经网络实际上是 激活函数是径向基函数 而非逻辑函数的FF前馈神经网络(FF)。两者之间有什么区别呢?
逻辑函数--- 将某个任意值映射到[0 ,... 1]范围内来,回答“是或否”问题。适用于分类决策系统,但不适用于连续变量。
相反, 径向基函数--- 能显示“我们距离目标有多远”。 这完美适用于函数逼近和机器控制(例如作为PID控制器的替代)。
简而言之,RBF神经网络其实就是, 具有不同激活函数和应用方向的前馈网络 。
【4】Deep Feed Forword(DFF)深度前馈神经网络
【4】DFF深度前馈神经网络
DFF深度前馈神经网络在90年代初期开启了深度学习的潘多拉盒子。 这些依然是前馈神经网络,但有不止一个隐含层 。那么,它到底有什么特殊性?
在训练传统的前馈神经网络时,我们只向上一层传递了少量的误差信息。由于堆叠更多的层次导致训练时间的指数增长,使得深度前馈神经网络非常不实用。 直到00年代初,我们开发了一系列有效的训练深度前馈神经网络的方法; 现在它们构成了现代机器学习系统的核心 ,能实现前馈神经网络的功能,但效果远高于此。
【5】Recurrent Neural Network(RNN) 递归神经网络
【5】RNN递归神经网络
RNN递归神经网络引入不同类型的神经元——递归神经元。这种类型的第一个网络被称为约旦网络(Jordan Network),在网络中每个隐含神经元会收到它自己的在固定延迟(一次或多次迭代)后的输出。除此之外,它与普通的模糊神经网络非常相似。
当然,它有许多变化 — 如传递状态到输入节点,可变延迟等,但主要思想保持不变。这种类型的神经网络主要被使用在上下文很重要的时候——即过去的迭代结果和样本产生的决策会对当前产生影响。最常见的上下文的例子是文本——一个单词只能在前面的单词或句子的上下文中进行分析。
【6】Long/Short Term Memory (LSTM) 长短时记忆网络
【6】LSTM长短时记忆网络
LSTM长短时记忆网络引入了一个存储单元,一个特殊的单元,当数据有时间间隔(或滞后)时可以处理数据。递归神经网络可以通过“记住”前十个词来处理文本,LSTM长短时记忆网络可以通过“记住”许多帧之前发生的事情处理视频帧。 LSTM网络也广泛用于写作和语音识别。
存储单元实际上由一些元素组成,称为门,它们是递归性的,并控制信息如何被记住和遗忘。
【7】Gated Recurrent Unit (GRU)
【7】GRU是具有不同门的LSTM
GRU是具有不同门的LSTM。
听起来很简单,但缺少输出门可以更容易基于具体输入重复多次相同的输出,目前此模型在声音(音乐)和语音合成中使用得最多。
实际上的组合虽然有点不同:但是所有的LSTM门都被组合成所谓的更新门(Update Gate),并且复位门(Reset Gate)与输入密切相关。
它们比LSTM消耗资源少,但几乎有相同的效果。
【8】Auto Encoder (AE) 自动编码器
【8】AE自动编码器
Autoencoders自动编码器用于分类,聚类和特征压缩。
当您训练前馈(FF)神经网络进行分类时,您主要必须在Y类别中提供X个示例,并且期望Y个输出单元格中的一个被激活。 这被称为“监督学习”。
另一方面,自动编码器可以在没有监督的情况下进行训练。它们的结构 - 当隐藏单元数量小于输入单元数量(并且输出单元数量等于输入单元数)时,并且当自动编码器被训练时输出尽可能接近输入的方式,强制自动编码器泛化数据并搜索常见模式。
【9】Variational AE (VAE) 变分自编码器
【9】VAE变分自编码器
变分自编码器,与一般自编码器相比,它压缩的是概率,而不是特征。
尽管如此简单的改变,但是一般自编码器只能回答当“我们如何归纳数据?”的问题时,变分自编码器回答了“两件事情之间的联系有多强大?我们应该在两件事情之间分配误差还是它们完全独立的?”的问题。
【10】Denoising AE (DAE) 降噪自动编码器
【10】DAE降噪自动编码器
虽然自动编码器很酷,但它们有时找不到最鲁棒的特征,而只是适应输入数据(实际上是过拟合的一个例子)。
降噪自动编码器(DAE)在输入单元上增加了一些噪声 - 通过随机位来改变数据,随机切换输入中的位,等等。通过这样做,一个强制降噪自动编码器从一个有点嘈杂的输入重构输出,使其更加通用,强制选择更常见的特征。
【11】Sparse AE (SAE) 稀疏自编码器
【11】SAE稀疏自编码器
稀疏自编码器(SAE)是另外一个有时候可以抽离出数据中一些隐藏分组样试的自动编码的形式。结构和AE是一样的,但隐藏单元的数量大于输入或输出单元的数量。
【12】Markov Chain (MC) 马尔科夫链
【12】Markov Chain (MC) 马尔科夫链
马尔可夫链(Markov Chain, MC)是一个比较老的图表概念了,它的每一个端点都存在一种可能性。过去,我们用它来搭建像“在单词hello之后有0.0053%的概率会出现dear,有0.03551%的概率出现you”这样的文本结构。
这些马尔科夫链并不是典型的神经网络,它可以被用作基于概率的分类(像贝叶斯过滤),用于聚类(对某些类别而言),也被用作有限状态机。
【13】Hopfield Network (HN) 霍普菲尔网络
【13】HN霍普菲尔网络
霍普菲尔网络(HN)对一套有限的样本进行训练,所以它们用相同的样本对已知样本作出反应。
在训练前,每一个样本都作为输入样本,在训练之中作为隐藏样本,使用过之后被用作输出样本。
在HN试着重构受训样本的时候,他们可以用于给输入值降噪和修复输入。如果给出一半图片或数列用来学习,它们可以反馈全部样本。
【14】Boltzmann Machine (BM) 波尔滋曼机
【14】 BM 波尔滋曼机
波尔滋曼机(BM)和HN非常相像,有些单元被标记为输入同时也是隐藏单元。在隐藏单元更新其状态时,输入单元就变成了输出单元。(在训练时,BM和HN一个一个的更新单元,而非并行)。
这是第一个成功保留模拟退火方法的网络拓扑。
多层叠的波尔滋曼机可以用于所谓的深度信念网络,深度信念网络可以用作特征检测和抽取。
【15】Restricted BM (RBM) 限制型波尔滋曼机
【15】 RBM 限制型波尔滋曼机
在结构上,限制型波尔滋曼机(RBM)和BM很相似,但由于受限RBM被允许像FF一样用反向传播来训练(唯一的不同的是在反向传播经过数据之前RBM会经过一次输入层)。
【16】Deep Belief Network (DBN) 深度信念网络
【16】DBN 深度信念网络
像之前提到的那样,深度信念网络(DBN)实际上是许多波尔滋曼机(被VAE包围)。他们能被连在一起(在一个神经网络训练另一个的时候),并且可以用已经学习过的样式来生成数据。
【17】Deep Convolutional Network (DCN) 深度卷积网络
【17】 DCN 深度卷积网络
当今,深度卷积网络(DCN)是人工神经网络之星。它具有卷积单元(或者池化层)和内核,每一种都用以不同目的。
卷积核事实上用来处理输入的数据,池化层是用来简化它们(大多数情况是用非线性方程,比如max),来减少不必要的特征。
他们通常被用来做图像识别,它们在图片的一小部分上运行(大约20x20像素)。输入窗口一个像素一个像素的沿着图像滑动。然后数据流向卷积层,卷积层形成一个漏斗(压缩被识别的特征)。从图像识别来讲,第一层识别梯度,第二层识别线,第三层识别形状,以此类推,直到特定的物体那一级。DFF通常被接在卷积层的末端方便未来的数据处理。
【18】Deconvolutional Network (DN) 去卷积网络
【18】 DN 去卷积网络
去卷积网络(DN)是将DCN颠倒过来。DN能在获取猫的图片之后生成像(狗:0,蜥蜴:0,马:0,猫:1)一样的向量。DNC能在得到这个向量之后,能画出一只猫。
【19】Deep Convolutional Inverse Graphics Network (DCIGN) 深度卷积反转图像网络
【19】 DCIGN 深度卷积反转图像网络
深度卷积反转图像网络(DCIGN),长得像DCN和DN粘在一起,但也不完全是这样。
事实上,它是一个自动编码器,DCN和DN并不是作为两个分开的网络,而是承载网路输入和输出的间隔区。大多数这种神经网络可以被用作图像处理,并且可以处理他们以前没有被训练过的图像。由于其抽象化的水平很高,这些网络可以用于将某个事物从一张图片中移除,重画,或者像大名鼎鼎的CycleGAN一样将一匹马换成一个斑马。
【20】Generative Adversarial Network (GAN) 生成对抗网络
【20】 GAN 生成对抗网络
生成对抗网络(GAN)代表了有生成器和分辨器组成的双网络大家族。它们一直在相互伤害——生成器试着生成一些数据,而分辨器接收样本数据后试着分辨出哪些是样本,哪些是生成的。只要你能够保持两种神经网络训练之间的平衡,在不断的进化中,这种神经网络可以生成实际图像。
【21】Liquid State Machine (LSM) 液体状态机
【21】 LSM 液体状态机
液体状态机(LSM)是一种稀疏的,激活函数被阈值代替了的(并不是全部相连的)神经网络。只有达到阈值的时候,单元格从连续的样本和释放出来的输出中积累价值信息,并再次将内部的副本设为零。
这种想法来自于人脑,这些神经网络被广泛的应用于计算机视觉,语音识别系统,但目前还没有重大突破。
【22】Extreme Learning Machine (ELM) 极端学习机
【22】ELM 极端学习机
极端学习机(ELM)是通过产生稀疏的随机连接的隐藏层来减少FF网络背后的复杂性。它们需要用到更少计算机的能量,实际的效率很大程度上取决于任务和数据。
【23】Echo State Network (ESN) 回声状态网络
【23】 ESN 回声状态网络
回声状态网络(ESN)是重复网络的细分种类。数据会经过输入端,如果被监测到进行了多次迭代(请允许重复网路的特征乱入一下),只有在隐藏层之间的权重会在此之后更新。
据我所知,除了多个理论基准之外,我不知道这种类型的有什么实际应用。。。。。。。
【24】Deep Resial Network (DRN) 深度残差网络
【24】 DRN 深度残差网络
深度残差网络(DRN)是有些输入值的部分会传递到下一层。这一特点可以让它可以做到很深的层级(达到300层),但事实上它们是一种没有明确延时的RNN。
【25】Kohonen Network (KN) Kohonen神经网络
【25】 Kohonen神经网络
Kohonen神经网络(KN)引入了“单元格距离”的特征。大多数情况下用于分类,这种网络试着调整它们的单元格使其对某种特定的输入作出最可能的反应。当一些单元格更新了, 离他们最近的单元格也会更新。
像SVM一样,这些网络总被认为不是“真正”的神经网络。
【26】Support Vector Machine (SVM)
【26】 SVM 支持向量机
支持向量机(SVM)用于二元分类工作,无论这个网络处理多少维度或输入,结果都会是“是”或“否”。
SVM不是所有情况下都被叫做神经网络。
【27】Neural Turing Machine (NTM) 神经图灵机
【27】NTM 神经图灵机
神经网络像是黑箱——我们可以训练它们,得到结果,增强它们,但实际的决定路径大多数我们都是不可见的。
神经图灵机(NTM)就是在尝试解决这个问题——它是一个提取出记忆单元之后的FF。一些作者也说它是一个抽象版的LSTM。
记忆是被内容编址的,这个网络可以基于现状读取记忆,编写记忆,也代表了图灵完备神经网络。