array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 【深度学习 理论】Recurrent Neural Network (RNN) - 2 - 爱码网

给一个Training Sentences,RNN做出了如下分类。

我们把”arrive“丢到RNN中,它的y1的reference vector属于”other“ slot。这个reference vector的长度就是slot的个数(属于哪个slot,哪个维度就是1,其余0)。

RNN在Learning时如何定义loss function呢?

以slot filling 为例,对每个输入, 其输出的与相应的reference vector计算cross entropy, cross entropy之和就是loss function,这就是train的目标对象。. sentence的每个word进入RNN的顺序不能乱。定义好loss function之后,也要用gradient descent做训练。

【深度学习 理论】Recurrent Neural Network (RNN) - 2

计算偏微分之后,就用gradient descent的方法去做。而gradient descent的算法从BP进阶为BPTT(Backpropagation through time). 这里不讲BPTT了。

【深度学习 理论】Recurrent Neural Network (RNN) - 2

RNN的training是比较困难的。Loss有时会剧烈抖动,只有幸运的时候才会逐渐变小。

【深度学习 理论】Recurrent Neural Network (RNN) - 2

Total  Lossde 的变化,在有的地方很平坦,有的地方很陡峭。不幸的话,可能恰好踩在“悬崖”上,原来变化很小,learning rate可能调的很大,但在“悬崖”上的gradient很大,再乘上一个很大的learning rate,整个参数就“飞”出去了。

解决办法:clipping——当gradient大于某个值时,就让gradient等于这个值。

【深度学习 理论】Recurrent Neural Network (RNN) - 2

为什么RNN会出现这种情况呢?

通常,可能有人会认为是Activition function的问题,其实,关键点不在这里。

举一个直观的例子,把一个参数做小小的变化,看它output的变化有多大。下面是一个线性的例子。

【深度学习 理论】Recurrent Neural Network (RNN) - 2

RNN把同样的东西在不同的时间点反复使用。(memory)。这个w只要一有变化,它可能不会造成任何影响;一旦它造成影响,一半就是“天崩地裂”的影响。

有什么技巧可以帮助我们解决这个问题?

现在最广泛的方法是LSTM。

LSTM可以使error surface不那么崎岖,可以把把比较平坦的地方拿掉,可以把learning rate设得小一点,在learning rate特别小的时候训练。

【深度学习 理论】Recurrent Neural Network (RNN) - 2

为什么LSTM可以避免让Gradient特别小呢?

在RNN中,在每个时间点,memory都会被覆盖。而LSTM把memory的值乘一个值再加上output放到cell中去。如果weight会影响memory的话,LSTM会一直存在,除非forget gate关闭。但RNN中由于memory的值会被清除掉,不会一直有影响。

有人又会说,LSTM有forget gate啊,也会把memory清除掉。实际上,LSTM第一个版本的诞生就是为了解决gradient vanish问题的,forget gate是后来加上去的。(甚至现在有一个“传言”:在训练LSTM的时候你要给forget gate特别大的bias,来保证forget gate在大多数时候使打开的。)

 

现在有另外一个版本的用gate来操控memory的cell叫做Gated Recurrent Unit(GRU)。GRU只有2个gate:input gate、forget gate。我们不讲GRU详细的原理,它的“精神”是“新的不去,就得不来”——当input gate打开时,forget gate自动关闭,就会清除memory中的值;当cell中的值被清除后,才能进行input。

还有其他的方法来解决这个问题:Clockwise RNN Structurally Constrained Recurrent Network (SCRN)……

相关文章: