回归神经网络的不合理有效性

原文地址: http://karpathy.github.io/2015/05/21/rnn-effectiveness/

推荐这个看上去很牛逼的网站:http://www.52nlp.cn

Andrej Karpathy博客
关于 Hacker的神经网络指南
回归神经网络的不合理有效性
2015年5月21日

回归神经网络(RNNs)有一些神奇的东西。我还记得我训练第一个用于图像字幕的循环网络的时候。在几十分钟的训练中,我的第一个婴儿模型(具有相当任意选择的超参数)开始产生非常漂亮的图像描述,这些图像处于有意义的边缘。有时,模型的简单程度与您获得的结果质量的比例超出了您的期望,这是其中一个时间。让这个结果在当时如此令人震惊的原因是,人们普遍认为RNN应该很难训练(有了更多的经验,我实际上得出了相反的结论)。快进大约一年:我一直在训练RNN,我多次目睹了他们的力量和稳健性,但他们的神奇输出仍然让我感到有趣。这篇文章是关于与你分享一些魔力。

我们将训练RNN逐个字符生成文本并思考“这怎么可能?”

顺便说一下,与这篇文章一起,我也在Github上发布代码,允许你训练基于多层LSTM的字符级语言模型。你给它一大块文本,它将学习生成一次一个字符的文本。您也可以使用它来重现我的实验。但我们已经领先于自己; 无论如何,RNN是什么?

递归神经网络
序列。根据您的背景,您可能想知道:什么使Recurrent Networks如此特别?Vanilla神经网络(以及卷积网络)的一个明显局限是它们的API太受限制:它们接受固定大小的矢量作为输入(例如图像)并产生固定大小的矢量作为输出(例如不同类别的概率) )。不仅如此:这些模型使用固定数量的计算步骤(例如模型中的层数)执行此映射。其核心原因,经常网是更令人兴奋的是,他们让我们工作在序列的载体:序列输入,输出,或在最一般的情况下,两个。一些例子可能会使这更具体:

每个矩形是矢量,箭头表示函数(例如矩阵乘法)。输入向量为红色,输出向量为蓝色,绿色向量保持RNN的状态(很快就会更多)。从左到右:(1)没有RNN的香草处理模式,从固定大小的输入到固定大小的输出(例如图像分类)。(2)序列输出(例如图像字幕拍摄图像并输出单词的句子)。(3)序列输入(例如情感分析,其中给定句子被分类为表达正面或负面情绪)。(4)序列输入和序列输出(例如机器翻译:RNN用英语读取句子然后用法语输出句子)。(5)同步序列输入和输出(例如,我们希望标记视频的每个帧的视频分类)。请注意,在每种情况下,长度序列都没有预先指定的约束,因为循环变换(绿色)是固定的,并且可以根据需要应用多次。
正如您所料,与通过固定数量的计算步骤从一开始就注定的固定网络相比,操作的顺序制度要强大得多,因此对于那些渴望建立更智能的人来说也更具吸引力系统。此外,正如我们稍后将看到的,RNN将输入向量与其状态向量与固定(但已学习)的函数组合以产生新的状态向量。在编程术语中,这可以解释为运行具有某些输入和一些内部变量的固定程序。从这个角度来看,RNN基本上描述了程序。事实上,众所周知,RNN是图灵完备的从某种意义上说,他们可以模拟任意程序(具有适当的权重)。但是类似于神经网络的通用逼近定理,你不应该读太多。事实上,忘记我说了什么。

如果训练香草神经网络是对功能的优化,那么训练循环网络就是对程序的优化。

没有序列的顺序处理。您可能认为将序列作为输入或输出可能相对较少,但要实现的一个重要点是,即使您的输入/输出是固定向量,仍然可以使用这种强大的形式主义以顺序方式处理它们。例如,下图显示了来自DeepMind的两篇非常好的论文的结果。在左侧,算法学习一种循环网络策略,引导其关注图像; 特别是,它学会从左到右读出门牌号(Ba等人)。在右边,一个经常性的网络通过学习顺序地为画布添加颜色来生成数字图像(Gregor等人。):

左:RNN学会读取门牌号码。右:RNN学会绘制房屋号码。
需要注意的是,即使您的数据不是序列形式,您仍然可以制定和训练强大的模型,学习按顺序处理它。您正在学习处理固定大小数据的有状态程序。

RNN计算。那么这些东西如何运作呢?从本质上讲,RNN具有看似简单的API:它们接受输入向量x并为您提供输出向量y。但是,关键的是,这个输出向量的内容不仅会受到您刚刚输入的输入的影响,还会影响您过去输入的输入的整个历史记录。作为一个类编写,RNN的API由一个step函数组成:

rnn = RNN()
y = rnn.step(x) # x is an input vector, y is the RNN’s output vector
RNN类具有一些内部状态,每次step调用它都会更新。在最简单的情况下,该状态由单个隐藏向量组成h。以下是Vanilla RNN中step函数的实现:

class RNN:

def step(self, x):
# update the hidden state
self.h = np.tanh(np.dot(self.W_hh, self.h) + np.dot(self.W_xh, x))
# compute the output vector
y = np.dot(self.W_hy, self.h)
return y
以上指定了香草RNN的正向通过。该RNN的参数是三个矩阵W_hh, W_xh, W_hy。隐藏状态self.h用零向量初始化。该np.tanh函数实现非线性,将激活压缩到范围[-1, 1]。请简要说明这是如何工作的:tanh内部有两个术语:一个基于先前的隐藏状态,另一个基于当前输入。在numpy中np.dot是矩阵乘法。这两个中间体与加成相互作用,然后被tanh压扁到新的状态向量中。如果您对数学符号更加熟悉,我们也可以将隐藏状态更新写为hŤ= tanh(Wh hHŤ- 1+ WXHXŤ),其中tanh是元素应用的。

我们用随机数初始化RNN的矩阵,并且训练期间的大量工作用于找到产生理想行为的矩阵,用一些表示您偏好的偏好来表示您y希望看到的输出类型响应您的输入序列x。

去深。RNN是神经网络,如果你戴上你的深度学习帽并开始像煎饼一样堆叠模型,一切都会单调地更好地工作(如果做得好)。例如,我们可以形成如下的2层循环网络:

y1 = rnn1.step(x)
y = rnn2.step(y1)
换句话说,我们有两个单独的RNN:一个RNN正在接收输入向量,第二个RNN正在接收第一个RNN的输出作为其输入。除非这些RNN都不知道或关心 - 它们只是进出的向量,并且在反向传播过程中有一些梯度流过每个模块。

得到花哨的。我想简单提一下,在实践中,我们大多数人使用的配方与我上面提到的称为长期短期记忆(LSTM)网络的配方略有不同。LSTM是一种特殊类型的经常性网络,由于其更强大的更新方程和一些吸引人的反向传播动态,在实践中效果稍好。我不会详细介绍,但我所说的关于RNN的所有内容都保持不变,除了计算更新的数学形式(线条self.h = … )变得有点复杂。从这里开始,我将交替使用术语“RNN / LSTM”,但本文中的所有实验都使用LSTM。

字符级语言模型
好的,我们知道RNN是什么,为什么它们非常令人兴奋,以及它们是如何工作的。我们现在将其置于一个有趣的应用程序中:我们将训练RNN字符级语言模型。也就是说,我们将给RNN一大块文本,并要求它在给定一系列先前字符的序列中对下一个字符的概率分布进行建模。这将允许我们一次生成一个字符的新文本。

作为一个工作示例,假设我们只有四个可能的字母“helo”的词汇,并且想要在训练序列“hello”上训练RNN。这个训练序列实际上是4个独立训练样例的来源:1。“e”的概率应该可能是“h”的背景,2。“l”应该可能在“he”的背景下,3 。“l”也应该被赋予“hel”的背景,最后4.“o”应该被赋予“地狱”的背景。

具体地说,我们将使用1-k编码将每个字符编码为一个向量(即除了词汇表中字符索引处的单个字符外全部为零),并使用该step函数将它们一次一个地馈送到RNN中。然后我们将观察一系列4维输出向量(每个字符一维),我们将其解释为RNN当前为序列中下一个字符分配的置信度。这是一个图表:

具有4维输入和输出层的示例RNN,以及3个单元(神经元)的隐藏层。此图显示了当RNN被输入字符“地狱”作为输入时正向传递中的激活。输出层包含RNN为下一个字符分配的置信度(词汇表是“h,e,l,o”); 我们希望绿色数字高,红色数字低。
例如,我们看到在RNN看到字符“h”的第一个时间步骤中,它将1.0的置信度分配给下一个字母为“h”,2.2为字母“e”,-3.0为“l”和4.1。到“o”。因为在我们的训练数据(字符串“hello”)中,下一个正确的字符是“e”,我们希望增加其置信度(绿色)并降低所有其他字母(红色)的置信度。同样,我们在4个时间步骤中的每一个都有一个期望的目标角色,我们希望网络为其分配更大的信心。由于RNN完全由可微分运算组成,我们可以运行反向传播算法(这只是微积分链规则的递归应用),以确定我们应该调整每个权重的方向以增加正确目标的分数(绿色粗体数字)。然后我们可以执行一个参数更新,它在此梯度方向上轻微推动每个重量。如果我们在参数更新后将相同的输入馈送到RNN,我们会发现正确字符的分数(例如第一时间步中的“e”)会略高(例如2.3而不是2.2),并且分数不正确的字符会略低一些。然后,我们反复多次重复此过程,直到网络收敛并且其预测最终与训练数据一致,因为接下来始终预测正确的字符。

更技术性的解释是我们同时在每个输出矢量上使用标准Softmax分类器(通常也称为交叉熵损失)。RNN使用小批量随机梯度下降进行训练,我喜欢使用RMSProp或Adam(每参数自适应学习速率方法)来稳定更新。

还要注意,第一次输入字符“l”时,目标是“l”,但第二次是目标是“o”。因此,RNN不能单独依赖输入,必须使用其循环连接来跟踪上下文以完成此任务。

在测试时,我们将一个角色输入到RNN中,然后分配下一个可能出现的角色。我们从这个发行版中进行采样,然后将其反馈回来获取下一个字母。重复这个过程,你正在采样文本!现在让我们在不同的数据集上训练RNN,看看会发生什么。

为了进一步说明,出于教育目的,我还在Python / numpy中编写了一个最小字符级RNN语言模型。它只有大约100行,如果你在阅读代码而不是文本方面做得更好,它希望能给出简洁,具体和有用的上述摘要。我们现在将深入研究使用更高效的Lua / Torch代码库生成的示例结果。

有趣的RNNs
下面的所有5个示例角色模型都使用我在Github上发布的代码进行训练。每种情况下的输入都是带有一些文本的单个文件,我们正在训练RNN来预测序列中的下一个字符。

保罗格雷厄姆发电机
让我们首先尝试一个小的英语数据集作为健全性检查。我最喜欢的有趣数据集是Paul Graham的论文串联。基本的想法是,这些文章中有很多智慧,但不幸的是,保罗格雷厄姆是一个相对缓慢的发电机。如果我们能够按需提供启动智慧,那不是很好吗?这就是RNN的用武之地。

在过去的5年里连接所有的pg文章,我们得到大约1MB的文本文件,或大约100万个字符(顺便说一下,这被认为是一个非常小的数据集)。技术:让我们训练一个2层LSTM,其中有512个隐藏节点(约350万个参数),每层后丢失0.5。我们将训练100个例子,并在长度为100个字符的时间内截断反向传播。通过这些设置,TITAN Z GPU上的一批需要大约0.46秒(这可以用50个字符的BPTT减少一半,性能成本可以忽略不计)。不用多说,让我们看看来自RNN的样本:

“投资者感到惊讶不会筹集资金。我不是公司,有时间快速有趣,不必下车相同的程序员。有一个超级天使轮筹款,为什么你能这样做。如果你有一个不同的实物投资,那些在创业公司中减少的人就可以看到收购者可以看到他们只是你也是创造者的一部分用户提供的,并且改变了这个想法。[2]不要在第一个成员工作,看看孩子们在成功的初创公司之前的样子。如果你还要扮演大公司的角色。“

好吧,很明显,上述内容很快就不会取代Paul Graham了,但请记住,RNN必须从头开始学习英语并使用小数据集(包括你在哪里放逗号,撇号和空格)。我也喜欢它学会支持自己的论点(例如上面的[2])。有时它会提供一些提供一丝洞察力的东西,例如“公司是一个向投资者思考的会议”。这里的以50K字符样本的链接,如果你想看到更多。

温度。我们还可以在采样过程中使用Softmax的温度。将温度从1降低到更低的数值(例如0.5)使RNN更自信,但样品中也更保守。相反,较高的温度将带来更多的多样性,但代价是更多的错误(例如拼写错误等)。特别是,设定温度非常接近零将是保罗格雷厄姆可能会说的最可能的事情:

“就像创业公司一样,他们与创业公司完全一样,他们与创业公司完全相同,他们都是一样的”

看起来我们已经达到了关于创业公司的无限循环。

莎士比亚
看起来我们可以学习拼写英语单词。但是如果数据中有更多的结构和样式呢?为了检查这一点,我下载了莎士比亚的所有作品并将它们连接成一个(4.4MB)文件。我们现在可以负担得起培养更大的网络,在这种情况下,我们尝试在每层上使用512个隐藏节点的3层RNN。在我们训练网络几个小时后,我们获得了以下样本:

PANDARUS:
Alas, I think he shall be come approached and the day
When little srain would be attain’d into being never fed,
And who is but a chain and subjects of his death,
I should not sleep.

Second Senator:
They are away this miseries, produced upon my soul,
Breaking and strongly should be buried, when I perish
The earth and thoughts of many states.

DUKE VINCENTIO:
Well, your wit is in the care of side and that.

Second Lord:
They would be ruled after this chamber, and
my fair nues begun out of the fact, to be conveyed,
Whose noble souls I’ll have the heart of the wars.

Clown:
Come, sir, I will make did behold your worship.

VIOLA:
I’ll drink it.
请记住,所有RNN都知道是字符,所以特别是它会对说话者的姓名和内容进行抽样。有时我们也会得到相对宽松的独白段落,例如:

VIOLA:
Why, Salisbury must find his flesh and thought
That which I am not aps, not a man and in fire,
To show the reining of the raven and the wars
To grace my hand reproach within, and not a fair are hand,
That Caesar and my goodly father’s world;
When I was heaven of presence and our fleets,
We spare with hours, but cut thy council I am great,
Murdered and by thy master’s ready there
My power to give thee but so much as hell:
Some service in the noble bondman here,
Would show him to her wine.

KING LEAR:
O, if you were a feeble sight, the courtesy of your law,
Your sight and several breath, will wear the gods
With his heads, and my hands are wonder’d at the deeds,
So drop upon your lordship’s head, and your opinion
Shall be against your honour.
我几乎无法从实际的莎士比亚中认出这些样本:)如果你喜欢莎士比亚,你可能会欣赏这个100,000字符的样本。当然,您也可以使用提供的代码在不同温度下生成无限量的样本。

维基百科
我们看到LSTM可以学习拼写单词并复制一般的句法结构。让我们进一步增加难度,并对结构性降价进行培训。特别是,让我们获取原始维基百科的Hutter Prize 100MB数据集并训练LSTM。遵循Graves等人。,我使用了第一个96MB的培训,其余的用于验证,并在一夜之间运行了几个模型。我们现在可以提供维基百科文章样本 以下是一些有趣的摘录。首先,一些基本的降价输出:

Naturalism and decision for the majority of Arab countries’ capitalide was grounded
by the Irish language by [[John Clair]], [[An Imperial Japanese Revolt]], associated
with Guangzham’s sovereignty. His generals were the powerful ruler of the Portugal
in the [[Protestant Immineners]], which could be said to be directly in Cantonese
Communication, which followed a ceremony and set inspired prison, training. The
emperor travelled back to [[Antioch, Perth, October 25|21]] to note, the Kingdom
of Costa Rica, unsuccessful fashioned the [[Thrales]], [[Cynth’s Dajoard]], known
in western [[Scotland]], near Italy to the conquest of India with the conflict.
Copyright was the succession of independence in the slop of Syrian influence that
was a famous German movement based on a more popular servicious, non-doctrinal
and sexual power post. Many governments recognize the military housing of the
[[Civil Liberalization and Infantry Resolution 265 National Party in Hungary]],
that is sympathetic to be to the [[Punjab Resolution]]
(PJS)[http://www.humah.yahoo.com/guardian.
cfm/7754800786d17551963s89.htm Official economics Adjoint for the Nazism, Montgomery
was swear to advance to the resources for those Socialism’s rule,
was starting to signing a major tripad of aid exile.]]
如果您想知道,上面的雅虎网址实际上并不存在,该模型只是幻觉它。另请注意,模型学会正确打开和关闭括号。模型学习也有很多结构化的降价,例如有时会创建标题,列表等:

{ { cite journal | id=Cerling Nonforest Department|format=Newlymeslated|none } }
‘‘www.e-complete’’.

‘’‘See also’’’: [[List of ethical consent processing]]

== See also ==
*[[Iender dome of the ED]]
*[[Anti-autism]]

=[[Religion|Religion]]=
*[[French Writings]]
*[[Maria]]
*[[Revelation]]
*[[Mount Agamul]]

== External links==

  • [http://www.biblegateway.nih.gov/entrepre/ Website of the World Festival. The labour of India-county defeats at the Ripper of California Road.]

External links

  • [http://www.romanology.com/ Constitution of the Netherlands and Hispanic Competition for Bilabial and Commonwealth Industry (Republican Constitution of the Extent of the Netherlands)]

有时,模型会进入生成随机但有效的XML的模式:

Antichrist 865 15900676 2002-08-03T18:14:12Z Paris 23 Automated conversion #REDIRECT [[Christianity]] 该模型完全组成时间戳,ID等。另请注意,它会以正确的嵌套顺序正确关闭正确的标记。如果您有兴趣了解更多内容,这里有100,000个字符的采样维基百科。

代数几何(乳胶)
上述结果表明该模型实际上非常擅长学习复杂的句法结构。对这些结果印象深刻,我的同学(贾斯汀约翰逊)和我决定进一步推进结构化领域并掌握这本关于代数堆栈/几何的书。我们下载了原始Latex源文件(16MB文件)并训练了多层LSTM。令人惊讶的是,由此产生的采样乳胶几乎可以编译。我们不得不介入并手动修复一些问题但是你看起来似乎看起来很合理,这是非常令人惊讶的:

采样(假)代数几何。这是实际的pdf。
这是另一个例子:

更多幻觉代数几何。很好的尝试图(右)。
正如您在上面所看到的,有时模型会尝试生成乳胶图,但显然它并没有真正弄清楚它们。我也喜欢它选择跳过证明的部分(“Proof ignored。”,左上角)。当然,请记住,乳胶具有相对困难的结构化语法格式,我甚至都没有完全掌握自己。例如,这是模型中的原始样本(未编辑):

\begin{proof}
We may assume that I \mathcal{I} I is an abelian sheaf on C \mathcal{C} C.
\item Given a morphism Δ : F → I \Delta : \mathcal{F} \to \mathcal{I} Δ:FI
is an injective and let q \mathfrak q q be an abelian sheaf on X X X.
Let F \mathcal{F} F be a fibered complex. Let F \mathcal{F} F be a category.
\begin{enumerate}
\item \hyperref[setain-construction-phantom]{Lemma}
\label{lemma-characterize-quasi-finite}
Let F \mathcal{F} F be an abelian quasi-coherent sheaf on C \mathcal{C} C.
Let F \mathcal{F} F be a coherent O X \mathcal{O}_X OX-module. Then
F \mathcal{F} F is an abelian catenary over C \mathcal{C} C.
\item The following are equivalent
\begin{enumerate}
\item F \mathcal{F} F is an O X \mathcal{O}_X OX-module.
\end{lemma}
这个来自相对不错的模型的样本说明了一些常见的错误。例如,模型打开一个\begin{proof}环境,然后以a结束它\end{lemma}。这是我们必须手动修复的问题的一个例子,可能是由于依赖性太长期这一事实:当模型完成证明时,它已经忘记了它是否正在进行证明或引理。同样,它会打开\begin{enumerate}但会忘记关闭它。我们观察到这些在较大/较好的模型中变得不那么常见,但尽管如此,这些都是出现的错误。

Linux源代码
我想将结构化数据推向极限,因此对于最后的挑战,我决定使用代码。特别是,我在Github上获取了Linux repo中的所有源文件和头文件,将它们连接在一个巨大的文件中(474MB的C代码)(我原本只会在内核上进行训练,但这本身就是只有~16MB)。然后,我在几天的时间内训练了几个与我相同的GPU 3层LSTM。这些模型有大约1000万个参数,对于RNN模型来说仍然处于低端。结果是超级:

/*

  • Increment the size file of the new incorrect UI_FILTER group information
  • of the size generatively.
    /
    static int indicate_policy(void)
    {
    int error;
    if (fd == MARN_EPT) {
    /
    • The kernel blank will coeld it to userspace.
      */
      if (ss->segment < mem_total)
      unblock_graph_and_set_blocked();
      else
      ret = 1;
      goto bail;
      }
      segaddr = in_SB(in.addr);
      selector = seg / 16;
      setup_works = true;
      for (i = 0; i < blocks; i++) {
      seq = buf[i++];
      bpf = bd->bd.next + i * search;
      if (fd) {
      current = blocked;
      }
      }
      rw->name = “Getjbbregs”;
      bprm_self_clearl(&iv->version);
      regs->new = blocks[(BPF_STATS << info->historidac)] | PFMR_CLOBATHINC_SECONDS << 12;
      return segtable;
      }
      整个代码看起来非常棒。当然,我不认为它会编译,但是当你滚动生成代码时,它感觉非常像一个巨大的C代码库。请注意,RNN随机地在其中添加注释。它也很擅长制作很少的语法错误。例如,它正确使用字符串,指针符号等。它还可以{[正确打开和关闭括号,并学会很好地缩进其代码。一个常见的错误是它无法跟踪变量名称:它经常使用未定义的变量(例如rw上面的),声明它从不使用的变量(例如int error),或返回不存在的变量。让我们看一些例子。这是另一个片段,显示了RNN学习的更广泛的操作:

/*

  • If this error is set, we will need anything right after that BSD.
    */
    static void action_new_function(struct s_stat_info *wb)
    {
    unsigned long flags;
    int lel_idx_bit = e->edd, *sys & ~((unsigned long) *FIRST_COMPAT);
    buf[0] = 0xFFFFFFFF & (bit << 4);
    min(inc, slist->bytes);
    printk(KERN_WARNING "Memory allocated %02x/%02x, "
    “original MLL instead\n”),
    min(min(multi_run - s->len, max) * num_data_in),
    frame_pos, sz + first_seg);
    div_u64_w(val, inb_p);
    spin_unlock(&disk->queue_lock);
    mutex_unlock(&s->sock->mutex);
    mutex_unlock(&func->mutex);
    return disassemble(info->pending_bh);
    }

static void num_serial_settings(struct tty_struct *tty)
{
if (tty == tty)
disable_single_st_p(dev);
pci_disable_spool(port);
return 0;
}

static void do_command(struct seq_file *m, void v)
{
int column = 32 << (cmd[2] & 0x80);
if (state)
cmd = (int)(int_state ^ (in_8(&ch->ch_flags) & Cmd) ? 2 : 1);
else
seq = 1;
for (i = 0; i < 16; i++) {
if (k & (1 << 1))
pipe = (in_use & UMXTHREAD_UNCCA) +
((count & 0x00000000fffffff8) & 0x000000f) << 8;
if (count == 0)
sub(pid, ppc_md.kexec_handle, 0x20000000);
pipe_set_bytes(i, 0);
}
/
Free our user pages pointer to place camera if all dash /
subsystem_info = &of_changes[PAGE_SIZE];
rek_controls(offset, idx, &soffset);
/
Now we want to deliberately put it to device */
control_check_polarity(&context, val, 0);
for (i = 0; i < COUNTER; i++)
seq_puts(s, "policy ");
}
请注意,在第二个函数中,模型进行比较tty == tty,这是真空的。另一方面,tty这次至少变量存在于范围内!在最后一个函数中,请注意代码不返回任何内容,因为函数签名是正确的void。但是,前两个函数也被声明void并返回值。由于长期的相互作用,这又是一种常见错误。

有时模型决定是时候采样新文件了。这通常是一个非常有趣的部分:模型首先按字符描述GNU许可证,对一些包含示例,生成一些宏然后潜入代码:

/*

  • Copyright © 2006-2010, Intel Mobile Communications. All rights reserved.
  • This program is free software; you can redistribute it and/or modify it
  • under the terms of the GNU General Public License version 2 as published by
  • the Free Software Foundation.
  •    This program is distributed in the hope that it will be useful,
    
  • but WITHOUT ANY WARRANTY; without even the implied warranty of
  • MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  • GNU General Public License for more details.
  • You should have received a copy of the GNU General Public License
  • along with this program; if not, write to the Free Software Foundation,
  • Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
    */

#include
#include
#include
#include
#include
#include

#include
#include
#include
#include
#include
#include

#define REG_PG vesa_slot_addr_pack
#define PFM_NOCOMP AFSR(0, load)
#define STACK_DDR(type) (func)

#define SWAP_ALLOCATE(nr) (e)
#define emulate_sigs() arch_get_unaligned_child()
#define access_rw(TST) asm volatile(“movd %%esp, %0, %3” : : “r” (0));
if (__type & DO_READ)

static void stat_PC_SEC __read_mostly offsetof(struct seq_argsqueue,
pC>[1]);

static void
os_prefix(unsigned long sys)
{
#ifdef CONFIG_PREEMPT
PUT_PARAM_RAID(2, sel) = get_state_state();
set_pid_sum((unsigned long)state, current_state_str(),
(unsigned long)-1->lr_full; low;
}
有太多有趣的部分需要报道 - 我可能只在这部分写一篇完整的博客文章。我现在暂时缩短它,但这里有1MB的采样Linux代码供您观看。

生成宝宝名字
让我们再尝试一下吧。让我们为RNN提供一个大文本文件,其中包含列出的8000个婴儿名字,每行一个(从这里获得的名字)。我们可以将其提供给RNN然后生成新名称!以下是一些示例名称,仅显示训练数据中未出现的名称(90%不会):

Rudi Levette Berice Lussa Hany Mareanne Chrestina Carissy Marylen Hammine Janye Marlise Jacacrie Hendred Romand Charienna Nenotto Ette Dorane Wallen Marly Darine Salina Elvyn Ersia Maralena Minoria Ellia Charmin Antley Nerille Chelon Walmor Evena Jeryly Stachon Charisa Allisa Anatha Cathanie Geetra Alexie Jerin Cassen Herbett Cossie Velen Daurenge Robester Shermond Terisa Licia Roselen Ferine Jayn Lusine Charyanne销售Sanny Resa Wallon Martine Merus Jelen Candica Wallin Tel Rachene Tarine Ozila Ketia Shanne Arnande Karella Roselina Alessia Chasty Deland Berther Geamar Jackein Mellisand Sagdy Nenc Lessie Rasemy Guen Gavi Milea Anneda Margoris Janin Rodelin Zeanna Elyne Janah Ferzina Susta Pey Castina

你可以在这里看到更多。我最喜欢的一些包括“Baby”(哈哈),“Killie”,“Char”,“R”,“More”,“Mars”,“Hi”,“Saddie”,“With”和“Ahbort”。那很有趣。当然,你可以想象这在写小说或命名一个新创业时是非常有用的灵感:)

了解发生了什么
我们看到培训结束时的结果令人印象深刻,但这有什么用呢?让我们进行两次快速实验,简要介绍一下。

训练时样本的演变
首先,看模型训练时采样文本是如何演变的,这很有趣。例如,我训练了Leo Tolstoy的战争与和平的LSTM,然后每100次训练生成样本。在迭代100,模型对随机混乱进行采样:

tyntd-iafhatawiaoihrdemot lytdws e ,tfti, astai f ogoh eoase rrranbyne 'nhthnee e
plia tklrgd t o idoe ns,smtt h ne etie h,hregtrs nigtike,aoaenns lng
但请注意,至少它开始了解用空格分隔的单词。除了有时它插入两个空格。它也不知道逗号总是跟着一个空格。在300次迭代中,我们看到模型开始了解报价和期间:

“Tmont thithey” fomesscerliund
Keushey. Thom here
sheulke, anmerenith ol sivh I lalterthend Bleipile shuwy fil on aseterlome
coaniogennc Phe lism thond hon at. MeiDimorotion in ther thize."
这些单词现在也用空格分隔,模型开始在句子结尾处得到关于句点的想法。在迭代500:

we counter. He stutn co des. His stanted out one ofler that concossions and was
to gearang reay Jotrets and with fre colt otf paitt thin wall. Which das stimn
该模型现在学会拼写最短和最常见的单词,如“我们”,“他”,“他的”,“哪个”,“和”等。在迭代700,我们开始看到越来越多的英语出现的文字:

Aftair fall unsuch that the hall for Prince Velzonski’s that me of
her hearly, and behs to so arwage fiving were to it beloge, pavu say falling misfort
how, and Gogition is so overelical and ofter.
在迭代1200,我们现在看到使用引号和问号/感叹号。现在也学到了更长的词汇:

“Kite vouch!” he repeated by her
door. “But I would be done and quarts, feeling, then, son is people…”
直到最后我们开始通过大约2000迭代得到正确拼写的单词,引号,名称等:

“Why do what that day,” replied Natasha, and wishing to himself the fact the
princess, Princess Mary was easier, fed in had oftened him.
Pierre aking his soul came to the packs and drove up his father-in-law women.
出现的画面是模型首先发现一般的文字空间结构,然后迅速开始学习单词; 首先是简短的词,然后是最后的词。跨越多个单词(以及一般的长期依赖性)的主题和主题开始出现的时间要晚得多。

可视化RNN中的预测和“神经元”发射
另一个有趣的可视化是查看字符的预测分布。在下面的可视化中,我们从验证集(沿蓝色/绿色行显示)提供维基百科RNN模型字符数据,并在我们可视化(红色)的每个字符下,模型为下一个字符分配的前5个猜测。猜测由它们的概率着色(所以暗红色=判断为非常可能,白色=不太可能)。例如,请注意,存在大量字符,其中模型对下一个字母非常有信心(例如,模型在http:// www。序列期间对字符非常有信心)。

输入字符序列(蓝色/绿色)基于在RNN的隐藏表示中随机选择的神经元的发射而着色。把它想象为绿色=非常兴奋和蓝色=不是很兴奋(对于熟悉LSTM细节的人来说,这些是隐藏状态向量中的[-1,1]之间的值,这只是门控和tanh’d LSTM细胞州)。直观地,这是在RNN的“大脑”中读取输入序列时可视化某些神经元的发射率。不同的神经元可能正在寻找不同的模式; 下面我们将看看我发现并认为有趣或可解释的4种不同的(许多也不是):

在此图像中突出显示的神经元似乎对URL非常兴奋,并在URL之外关闭。LSTM很可能使用这个神经元来记住它是否在URL内。

当RNN位于[[]]降价环境内并在其外部关闭时,突出显示的神经元会非常兴奋。有趣的是,神经元在看到字符“[”后无法正常打开,它必须等待第二个“[”然后激活。这个计算模型是否已经看到一个或两个“[”的任务很可能是用不同的神经元完成的。

在这里,我们看到一个神经元在[[]]环境中看似线性变化。换句话说,它的激活是为RNN提供跨[[]]范围的时间对齐坐标系。RNN可以使用此信息或多或少地根据[[]]范围内的早期/晚期(可能是?)来制作不同的字符。

这是另一个具有非常局部行为的神经元:它相对安静但在“www”序列中的第一个“w”之后立即关闭。RNN可能正在使用这个神经元来计算它在“www”序列中的距离,以便它可以知道它是否应该发出另一个“w”,或者它是否应该启动URL。
当然,由于RNN的隐藏状态是巨大的,高维度的和大部分分布的表示,因此很多这些结论略显手工波动。这些可视化是使用自定义HTML / CSS / Javascript生成的,如果您想创建类似的东西,可以看到这里涉及的内容草图。

我们还可以通过排除最可能的预测来缩小这种可视化,并且仅可视化通过单元格的激活着色的文本。我们可以看到,除了大部分没有做任何可解释的细胞之外,其中大约5%的细胞已经学会了非常有趣且可解释的算法:

同样,美丽的是,我们不必在任何时候进行硬编码,如果你试图预测下一个角色,例如,有助于跟踪你当前是否在里面或者引用之外。我们刚刚对原始数据进行了LSTM培训,并确定这是一个有用的数量来跟踪。换句话说,它的一个细胞在训练期间逐渐调整自己成为引用检测单元,因为这有助于它更好地执行最终任务。这是深度学习模型(以及更普遍的端到端培训)的力量源自最简洁,最引人注目的例子之一。

源代码
我希望我已经说服你训练角色级语言模型是一个非常有趣的练习。您可以使用我在Github上发布的char-rnn代码(在MIT许可下)训练您自己的模型。它需要一个大型文本文件并训练一个字符级模型,然后您可以从中进行采样。此外,如果你有一个GPU或其他CPU训练将有助于减慢10倍。在任何情况下,如果您最终对某些数据进行培训并获得有趣的结果,请告诉我们!如果你迷失在Torch / Lua代码库中,请记住它只是这个100行要点的一个更奇特的版本。

简短的题外话。代码是用Torch 7编写的,最近成为我最喜欢的深度学习框架。我在过去的几个月里才开始与Torch / LUA合作,这并不容易(我花了很多时间在Github上挖掘原始的Torch代码,并在他们的gitter上提出问题以完成工作),但是一旦掌握了一些东西,它就会提供很大的灵活性和速度。我过去也曾与Caffe和Theano合作过,我相信Torch虽然并不完美,但它的抽象水平和哲学水平比其他水平更好。在我看来,有效框架的理想特征是:

具有许多功能的CPU / GPU透明Tensor库(切片,数组/矩阵运算等)
脚本语言(理想情况下是Python)中完全独立的代码库,可在Tensors上运行并实现所有深度学习内容(前向/后向,计算图等)
应该可以轻松地共享预训练模型(Caffe做得很好,其他人做不到),并且至关重要
没有编译步骤(或至少不像Theano目前所做的那样)。深度学习的趋势是朝着更大,更复杂的网络展开,这些网络在复杂的图形中被时间展开。重要的是这些不能长时间编译或开发时间大大受损。其次,通过编译,可以放弃可解释性和有效记录/调试的能力。如果有一个选项来编译图表,一旦它被开发以提高效率,那就没问题了。
进一步阅读
在该帖子结束之前,我还想在更广泛的背景下定位RNN,并提供当前研究方向的草图。RNN最近在深度学习领域产生了大量的嗡嗡声和兴奋。与Convolutional Networks类似,它们已经存在了几十年,但它们的全部潜力最近才开始得到广泛认可,这在很大程度上是由于我们不断增长的计算资源。这里是一些近期发展的简要草图(绝对不是完整的清单,很多这项工作都是从研究回溯到20世纪90年代,参见相关工作部分):

在NLP /语音领域,RNN将语音转录为文本,执行机器翻译,生成手写文本,当然,它们也被用作强大的语言模型(Sutskever等人) (Graves) (Mikolov等人)(在字符和单词的水平上)。目前,单词级模型似乎比字符级模型更好,但这肯定是暂时的。

计算机视觉。RNN也在计算机视觉中迅速普及。例如,我们在帧级视频分类,图像字幕(还包括我自己的工作和许多其他)中看到RNN ,视频字幕和最近的视觉问题回答。我个人最喜欢的计算机视觉论文中的RNN是视觉注意的循环模型,由于其高级方向(带有扫视的图像的顺序处理)和低级建模(REINFORCE学习规则,这是强化学习中政策梯度方法的一个特例,它允许训练执行非模型的模型)可微分计算(在这种情况下,在图像周围看一眼))。我相信,这种由原始感知的CNN和顶级RNN扫视策略组合而成的混合模型将在感知中变得无处不在,特别是对于更复杂的任务,除了在普通视图中对某些对象进行分类之外。

归纳推理,记忆和注意力。另一个极其激动人心的研究方向是针对解决香草复发网络的局限性。一个问题是RNN不是归纳的:它们非常好地记忆序列,但它们并不总是表现出令人信服的正确概念。方式(我会提供一些指示,使其更具体)。第二个问题是它们不必要地将它们的表示大小与每步的计算量相结合。例如,如果将隐藏状态向量的大小加倍,则由于矩阵乘法,每步的FLOPS量将翻两番。理想情况下,我们希望维护一个巨大的表示/内存(例如,包含所有维基百科或许多中间状态变量),同时保持每个时间步骤固定计算的能力。

向DeepMind的神经图灵机论文开发了第一个向这些方向发展的令人信服的例子。本文概述了一种模型的路径,这些模型可以在大型外部存储器阵列和较小的存储器寄存器(将其视为工作存储器)之间执行读/写操作,计算发生在这些寄存器中。至关重要的是,NTM论文还提供了非常有趣的内存寻址机制,这些机制是通过(软,完全可微)注意模型实现的。软关注的概念已经证明是一个强大的建模功能,并且还通过联合学习对齐和翻译机器翻译和内存网络的神经机器翻译for(toy)Question Answering。事实上,我甚至可以这么说

关注的概念是神经网络中最有趣的近期架构创新。

现在,我不想深入了解太多细节,但是内存寻址的软关注方案很方便,因为它使模型完全可以区分,但不幸的是,牺牲了效率,因为所有可以照顾的东西都是关注的(但是很温和) )。可以认为这是在C中声明一个指针,它不指向特定的地址,而是在整个内存中的所有地址上定义一个完整的分布,并且取消引用指针返回指向内容的加权和(这将是一个昂贵的操作!)。这促使多位作者交换软注意力模型以获得重点关注其中一个采样特定的存储器块(例如,对于某些存储器单元的读/写动作,而不是在某种程度上从所有单元读取/写入)。这种模式在哲学上更具吸引力,可扩展性和高效性,但不幸的是它也是不可微分的。然后,这要求使用强化学习文献(例如REINFORCE)中的技术,其中人们完全习惯于不可微分子相互作用的概念。这是非常持续的工作,但是已经探索了这些硬注意力模型,例如,使用堆叠增强的循环网络,强化学习神经图灵机和展示参与和推销的推断算法模式。

人。如果您想阅读RNN,我推荐Alex Graves,Ilya Sutskever和Tomas Mikolov的论文。有关REINFORCE以及更广泛的强化学习和政策梯度方法(REINFORCE是特殊情况)David Silver的课程,或Pieter Abbeel的课程之一。

代码。如果您想玩训练RNN,我会听到有关Thera的keras或段落的好消息,这篇帖子为Torch发布的代码,或者我刚才写的原始numpy代码的要点,它实现了一个高效,批量的LSTM前进并向后通过。您还可以查看我使用RNN / LSTM 标记图像的基于numpy的NeuralTalk,或者看看Jeff Donahue的Caffe实现。

结论
我们已经了解了RNN,它们是如何工作的,为什么它们已成为一个大问题,我们已经在几个有趣的数据集上训练了RNN字符级语言模型,我们已经看到了RNN的发展方向。您可以放心地期待RNN领域的大量创新,我相信它们将成为智能系统的普遍和关键组成部分。

最后,为了在这篇文章中添加一些元数据,我在这篇博文的源文件中训练了一个RNN。不幸的是,在大约46K字符处,我没有写出足够的数据来正确地输入RNN,但是返回的样本(用低温生成以获得更典型的样本)是:

I’ve the RNN with and works, but the computed with program of the
RNN with and the computed of the RNN with with and the code
是的,帖子是关于RNN以及它的工作情况,所以很明显这是有效的:)。下次见!

编辑(额外链接):

视频:

我在伦敦深度学习聚会(视频)上就这项工作发表了演讲。
讨论:

HN讨论
关于r / machinelearning的 Reddit讨论
关于r /编程的 Reddit讨论
回复:

Yoav Goldberg将这些RNN结果与n-gram最大似然(计数)基线进行了比较
@nylk训练了烹饪食谱的 char-rnn 。他们看起来很棒!
@MrChrisJohnson训练了关于Eminem歌词的char-rnn然后用机器人声音合成了一首说唱歌曲。搞笑:)
@samim在奥巴马演讲中训练了char-rnn 。他们看起来很有趣
若昂·费利佩训练有素的炭火RNN爱尔兰民间音乐和采样音乐
鲍勃·斯特姆(Bob Sturm)还用ABC表示法训练了音乐界的 char-rnn
RNN圣经机器人由马克西米
学习圣洁学习圣经
具有char-rnn设置并准备进入基于浏览器的虚拟机的Terminal.com快照(感谢@samim)
评论由Disqus提供
Andrej Karpathy博客
karpathy
karpathy
计算机科学家的冥想。

你可能感兴趣的:(神经网络)