开发者学堂课程【深度学习与自动驾驶:自动驾驶中的循环神经网络(2)】学习笔记与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/533/detail/7158
自动驾驶中的循环神经网络(2)
内容介绍:
一、Optimization is Hard
二、Reflections on Backpropagation
三、Unrolling a Recurrent Neural Network
一、Optimization is Hard
1、Optimization is Hard:Vanishing Gradients
问题:在实际中你怎么知道,当你梯度消失问题时?
这个梯度消失可能是梯度上的导数趋于0,这发生在激活函数爆炸的时候,像很高的初始值,与很低的初始值,对于很高的初始值这是比较容易的,你的网络几近崩溃,它会产生很大的数值。
你可以通过限制激活函数来解决很多问题,而很小的初始值,导致梯度消失则很难被察觉到,有许多研究试图弄明白,如何发现这些问题,如果你不够谨慎,很多时候会发现,这并不难做到,40%或50%的网络神经,神经元无效了,对于relu,他们是无效的relu,他们根本没有激活,你如何察觉到那些,这是学习的一部分,如果它从未被激活过,你会察觉到异常,通过让它在整个训练集里运行,那里面有很多技巧,但是这才是问题所在,你尝试着学习,然后你去看损失函数,它没有收敛到一个合理的值,摇摆不定或者收敛得很慢,这预示着有什么东西出错了,这可能是损失函数不好导致的,或者是你已经找到最优解了或者是梯度消失,这就是它为何是一门艺术。
2、Optimization is Hard: Saddle Point
Hard to break symmetry
至少有一部分神经元需要被激活,否则初始化就做的很失败。
二、Reflections on Backpropagation
1、Pause to reflect: Backpropagation and gradient descent is the mechanism of machine intelligence. Can it lead to human-level reasoning" ?
2、Some alternatives:
(1)Genetic Algorithms
(2)Particle Swarm Optimization
(3)Ant Colony Optimization
3、Q1: What other ways can we optimize
the weights of a neural network?
4、Q2: What other ways can we optimize
(evolve) the design of the network?
反向传播的简易性,以及反向传播的强大之处,这种局部将损失函数反向传播到梯度的步骤,正是神经网络学习的方式,这真的是唯一,能够高效地训练一个神经网络,学习一个函数调整权重和偏置的方式,大量的权重和偏置以及参数,只是通过这个来优化,它反向传播误差,你有监督的基准数据,问题是这个过程拟合调整高度非线性函数的参数来最小化单个目标的过程,是否是你实现智能的方式,是否人类水平的智能,这是需要思考的事,需要思考,对于实现驾驶的目的,这种方法的局限性是什么,什么没有发生,神经网络的设计架构没有被调整,任何边、层都没有发展,还有其他的优化方法,不高效,但非常有趣和给人启发,比如这是一个使用柔软的立方体,这是已经不是进化机器人的领域,这里演化出机器人的动力学,借助遗传算法,这些机器人被教会,这是仿真出来的,走路和游泳,这一个正在游,好处是那个高度非线性的空间同样,控制着这个奇形怪状的机器人的运动,有很大的自由度,这与神经网络相似,实际上人们应用了遗传算法,蚁群优化算法,各种自然启发式算法用于自动调整权重与偏置,但是这些方法目前似于并没有那么好,这是一个很酷的想法,使用自然型的演化算法来演化出,神经网络中已经自然启发出来的东西,但是仍有一些需要考虑的。
Back to Recurrent Neural Networks (RNNs)
关于反向传播的是,尽管很简单,这个过程是否能够产生一般智能推理。
三、Unrolling a Recurrent Neural Network
1、Input (x): (example: word of a sentence)
2、Hidden state (s): function of previous hidden state and new input
3、Output (o): (example: predict next word
in the sentence)
接下来是递归神经网络,在左侧有一个输入x,输入的权重是U,有一个隐藏状态,隐藏层s有权重,在边上将隐藏状态彼此连接,然后是更多的权重v,在输出o上,这是一个很简单的网络,有输出,有隐藏状态,这个网络的记忆,还有输出,但事实是这个环是隐藏状态彼此连接的,意味着与产生一个单独的输入不同,这个网络接收任意个数的输入,它只是一直接收x,每次一个产生一个x的序列,在一段时间后根据你所感兴趣的序列的持续时间,你可以认为这个网络处于展开状态,你可以展开这个神经网络输入都位于底部,xt-1,xt,xt+1,输出都位于顶部。Ot-1,ot,ot+1,它变得像一个普通的神经网络,它变得展开任意的次数参数,有权重,有偏置。
4、Parameters U, V, W are shared across time
Similar to CNNs: this reduces the # of parameters we need to optimize
And it allow us to process arbitrary temporal size" of input
Process is the same for any input / output mapping:
类似于卷积神经网络,正如卷积神经网络确保空间一致性的假设,循环神经网络假设,参数中的时序一致性分享这些参数,这个w,u,v在每个时间步长中是一样的,你正在学习相同的参数,无论序列持续时间,它允许你查看任意长度的序列,并且没有参数的爆炸性增长,这个过程与之前重复的完全一致,基于不同的变种,根据输入和输出,个到多,多到一,多到许。
5、Backpropagation Through Time (BPTT)
(Fancy name for regular backpropagation on an unrolled RNN)
反向传播过程与普通的神经网络完全一致,基于时间的反向传播是一个很奇特的名字bptt,但是它仅仅是一个展开的循环神经网络中的反向传播,误差是在输出上计算的,梯度被计算,被反向传播并在输入上计算的,但遭受相同的,梯度消失的,问题在于这些网络可以为任意长,如果在任意一个点,梯度变成很小的数,零,神经成为饱和状态,这个梯度被称作饱和的,这个梯度使得所有之前的层变为零,因此很容易遇到问题。
6、Gradients Can Explode or Vanish
这是用 python,用伪代码来看这个问题,你有一个相同的 w,记住你有时会分享权重和所有参数,因此,如果权重是 whh,如果这样的权重,他们有一个负值,来导致梯度值降为0,从而传播通过剩余的部分,这就是反向传播的伪代码,穿过rnn,whh。
7、Gradients Can Explode or Vanish
(Geometric Interpretation)
Error surface for single hidden unit RNN
反向传播,伴随着梯度的爆发与消失,例如,rnn的单隐层的误差曲面, 梯度的可视化,权重的值,偏置的值,误差的值,误差变化可以很平缓也可以剧烈,这些都会导致你的权重变化过于慢,或过于快,这是几何的解释。
8、RNN Variants: Bidirectional RNNS
Example:
Filling in missing words
Deeper =
more learning capacity
but needs lots of training data
其它的变量,他们是rnn的吗?它不仅仅是单流向的,也可以是双流向的,它可以有正向的边和反向的边,所需要的是类似于填充缺失,无论数据是什么,填充数据中缺失的元素,无论是图像,单词还是音频,一般而言,正如神经网络,它越深越好,这里的深指的是层数,在单一的时间实例中,展示在图片的右边,在时域上,堆积节点,每层都有自己的一组权重,自己的一组偏置,这些东西很棒,但是它们需要大量数据。
9、Long- Term Dependency
当你以这种方法增加额外的层,问题在于循环神经网络,理论上应该可以学习各种序列,但事实是它们不善于记住,一段时间前发生的事情,以及长期的从属物,这是一个很简单的例子,考虑这样一个故事Bob正在吃一个苹果,这个苹果是由循环神经网络生成的,你的循环神经网络可以学习生成苹果,因为它在许多句子中都见过Bob和吃,所以它可以生成苹果这个词,至于一个更长的句字,比如Bob喜欢吃苹果,他很饿并且决定吃点东西,因此他现在正在吃一个苹果,你必须维持,关于Bob和苹果的状态,通过一些语义不连续的句子,这种长期的记忆,并不是记忆由于各种影响除了梯度消失是很难传播,发生了一段时间的重要咨询,来维持生成苹果的语境,或者给一些发生了很久的概念分类。
10、Long Short Term Memory (LSTM) Networks
当人们在这些年来谈论到循环神经网络,他们总是谈论lstms,长短期记忆网络,因此所有引人注目的,在时间数列,音频,视频上的结果,它们都是需要lstms。
香草rnns,在图片的首部,每个单元都很简单,里面有一些隐藏的单元,有输入,也有输出,在这里,使用tanh作为一个激活函数,这是另一个流行的s型激活函数,lstms是更复杂的,或者可以说他们看起来更复杂,但是在一些方面,他们理解起来更加直观,每一单元都有一堆的门,将会穿过这些门,黄色表示的是不同的神经网络层,sigma和tanh,是不同类型的激活函数,tanh是一种激活函数,它将输入的范围压缩在-1至1的范围内,sigmoid函数,将输入压缩在0至1的范围内,这两种函数为不同的目的服务,这其中有一些逐点的运算,加法,乘法以及它们的连接,数据由层到层进行传输,图中箭头所示,这里有串联,同时在输出上还有一个复制的操作,复制,每个单元的输出被复制到下一个单元,以及总输出,试着把它解释得,
11、LSTM: Pick What to Forget and What To Remember
Bob and Alice are having lunch. Bob likes apples. Alice likes oranges.
She is eating an orange.
Conveyer belt for previous state and new data:
(1)Decide what to forget (state)
(2)Decide what to remember (state)
(3)Decide what to output (if anything)
这里有传送带,内横穿每个单元内部,所有传送带都需要完成三个步骤,第一个sigmoid函数来决定,遗忘什么以及忽略什么,它负责接收输入,新的输入xt,接收先前单元的状态,先前单元输出,先前的时间步骤,并且决定我是否要把这些保存下来,以及我是否要把这些整合到我的记忆里,这让你可以,对于你所要学习的信息进行选择,比如这里有一个句子bob和alice在吃午饭,bob喜欢吃苹果,alice喜欢吃橘子,bob和alice在吃午餐,bob喜欢苹果,如果你现在说你有一个隐藏的状态,对所谈论人物的性别信息进行跟踪,你或许会说的第一句话里包含了男性和女性,在第二个句字中只有男性,第三个句子中只有女性,如果这样,你想生成一个有关于谁在吃什么的句子,你就会知道,你跟踪性别信息,为了生成精确的内容,对应于正确的人,你需要遗忘一些事物,比如说那一刻忘掉bob的存在,你还需要忘掉bob喜欢苹果,但是你必须记住,alice喜欢橘子。所以你应该选择性地记住和遗忘某些事物,概括的说这就是长短期记忆,你决定遗忘什么和记住什么,并且决定单完格的输出,
12、LSTM Conveyer Belt
State run through the cell
3 sigmoid layers output deciding which information is let through (~1) and which is not (~O)
有状态贯穿单元,这个传送带过往的状态比如性别,这个状态是你所要保持跟踪的,并且贯穿单元,这里有三个sigmoid层,输出一个1,一个0至1之间的数字,如果你希望信息通过就输出1,如果你不希望信息通过就输出0。
13、LSTM Conveyer Belt
Step 1: Decide what to forget / ignore
传送带会保持这个状态,首先sigmoid函数是可以决定遗忘哪些以及忽略哪些,这是第一点,将先前时间步骤和当前时间步骤下网络的输入,并且决定,我要遗忘或者是忽略这些。
Step 2: Decide which state values to update (w/sigmoid) and what values to update with (w/ tanh)
并且决定更新状态的哪个部分,针对这一信息需要更新记忆的哪个部分,以及在更新的过程中要插入哪些值。
Step 3: Perform the forgetting and the state uodate
第三步就是,要进行实际的更新,以及进行实际的遗忘,这就是选择sigmoid函数的原因,你将输入与它相乘,输出为0,则遗忘为1,则让信息通过。
Step 4: Produce output with tanh [-1, 1] deciding the values and sigmoid [0, 1] deciding the filtering
最后,在单元格内生成一个输出,如果它是翻译,输入为西班牙语,产生一个英语输出,接下来同样的输出,被复制到下一单元格。
14、Application: Machine Translation
能用这个办法做什么?研究一下机器翻译。
问题:对于状态的表达方式是什么?它是类似于浮点数?还是类似于向量?或是什么其他具体的方式?
状态是一种激活函数,乘以它的权重,它是sigmoid函数或者tanh函数的输出,有很多的神经元发送了,一个-1至1或者0至1之间的数字,这整个就是一个状态,将它称为状态这只是一种简化,但是关键点在于有许多数字会不断地被权重,和偏重修改,这些数字保持着状态,同时这些数字的修改,由它们的权重所控制,如果所有这些都完成了,递归神经网络所产生的结果,就会与理想结果进行比较,误差会被反向传播给权重,机器翻译是一种很普遍的的应用,所有这一切都是一样的,所有这些所谈论的网络都有相似的构造,你有一些输入,无论是什么语言,可能是德语,我习惯把所有都想成德语,输出,输入是一种语言,一组字符,组成了一个某种语言的词语,这里有被传输的状态,当句子结束的时候,与收集输入不同,你开始产生输出,你可以产生英语的输出。
14、Application: Handwriting Generation from Text
在机器翻译上有很多很棒的工作,这是谷歌的翻译主要使用的,相同的原理都是利用lstm,产生手写字符,任意风格的手写字符,它可以控制书写的过程,输入是文本,输出是手写体,使用的是相同的,具有一定层数的网络,输入是需要的文本,输出是你所控制风格的手写体。
15、Application: Character-Level Text Generation
字符级的文本生成,人生的意义,是文字识别和古人繁衍后代的传统,相同的过程,一次输入一个字符,输入层有对输入字符进行编码,这里有隐藏状态,隐藏层记录激活状态,也就是每个激活函数的输出,每次的输出,都是对下一个字符的最佳预测,在很多应用中,你希望忽略输出,直到输入一个完整的句子,然后再接收输出,但实际上网络会不断地生成文本,无论有没有输入,因此你的输入是在增加引导循环神经网络,你可以回答。
16、Application: Image Question Answering
关于一张图像的问题,你有一个输入,你几乎可以任意将特征堆在一起,如图片所示,将一张图片作为输入,将图片输进一个卷积神经网络,然后接收问题,有个术语叫词嵌入,是用来增广,单词的表征含义,提出的问题是“有多少本书”,你希望输入词嵌入以及图片,来产生,对问题的最佳估计,对于问题“猫的颜色是什么?”可能是灰色或者黑色,这是不同类型的 lstm,产生的答案,类似的,数图片中的椅子,你可以输入一张有椅子的图片,并输入问题“有多少张椅子?”它能够提供答案“三”这是一件非常困难的任务,在任意的图片上询间,你需要同时理解,你在一个网络,同时做自然语言处理,以及计算机视觉。