cs231n学习笔记【1】--- Lecture_10 --- RNN

写在前面

这节课讲的内容是RNN有关的知识内容,本来是直接要做assignment3的,后来看完英文介绍和我下下来的代码发现就像是做完形填空一样我要把代码填入预先设置好的位置。一下子蒙圈了,这怎么填???
问了同学后才知道,Syllabus都已经设计好了,先看讲义和视频,一点点公式啊什么的都有讲,再自己去写。所以第一篇笔记我就要直接先学习一下RNN,不想直接从头,这样很打击我的积极性,因为前面有很多知识点我其实已经很熟了。
如果后期我还有时间的话,我想我会把前面的cs231n的课程的学习笔记写下来的。

正文

从 "Vanilla" Neural Network 开始

cs231n学习笔记【1】--- Lecture_10 --- RNN_第1张图片

Vanilla是一种feed-forward network,很简单的,一个fixed structure 的input,然后经过几个hidden就output,进过发展,有了更多的类型的rnn网络,用于更多的业务场景。

cs231n学习笔记【1】--- Lecture_10 --- RNN_第2张图片

上面这张图中的第二个 one to many 就是用来做 Image Captioning 的,这的其实就是我想要学的东西,因为我最近刚把show and tell 跑通,过个几天想要参加下challenger.ai的image caption比赛,网上搜到mscoco在16年就做了英文的类似项目,第一名是google的show and tell。

cs231n学习笔记【1】--- Lecture_10 --- RNN_第3张图片

除了one to many 还可以有 many to one 来做视频里的情感分类。可以是一段剧情的对话最后分析出是什么样的情感。

cs231n学习笔记【1】--- Lecture_10 --- RNN_第4张图片

之前传出一个消息,google的专业翻译准确率高达百分之99,非常惊人的实力,其实用的也是RNN,泛化来讲就是上面的这种多对多的方式。但是肯定不是Input和output的个数一样多,很好理解。可以去看看google的论文关于seq2seq的。但其实下面有讲seq2seq不是这么简单的处理方式,是有个encoder+decoder的方式,也就是many to one 然后 one to many。

cs231n学习笔记【1】--- Lecture_10 --- RNN_第5张图片

每一帧的视频分类,这个我接触不多,不太了解具体用途。

总的来说,rnn可以分成这么几种用途,那么下面就要开始讲讲详细的rnn了。

cs231n学习笔记【1】--- Lecture_10 --- RNN_第6张图片

从一个旧的状态传递到一个新的状态,我们需要有一个系数矩阵W,之前的状态向量以及新的输入向量,通过公式的计算得到新的状态值。

从下面这个最简单的vanilla network入手。

cs231n学习笔记【1】--- Lecture_10 --- RNN_第7张图片

现在的f函数使用的是tanh,然后看公式的下角标也很清楚,因为是加了一个隐含层的关系,所以不同的系数矩阵看的也很明白。

然后隐含层可以不断地增多,就变成了RNN,在初始化时,每一层的W矩阵都是一样的,如下图。

cs231n学习笔记【1】--- Lecture_10 --- RNN_第8张图片

从上面的图我们可以很自然的推出下面我们需要计算loss了,计算每个层的loss,最后都相加起来成为最终的loss。

cs231n学习笔记【1】--- Lecture_10 --- RNN_第9张图片

然后就是提到了我之前有讲的seq2seq模型,显示encoder生成一个vector,然后这个vector放到后面的decoder去生成一个新的sequence,也就是别的语言。可以不是句子的层面,也可以是character的层面,也就是一个vector就代表了一个单词,但这样就不是seq2seq了。

cs231n学习笔记【1】--- Lecture_10 --- RNN_第10张图片

下面就讲讲一个简单的character层面的example。

cs231n学习笔记【1】--- Lecture_10 --- RNN_第11张图片
我们的训练数据就是简单的四个字母 [h,e,l,o]
cs231n学习笔记【1】--- Lecture_10 --- RNN_第12张图片
使用了一个隐含层的方式
cs231n学习笔记【1】--- Lecture_10 --- RNN_第13张图片
最后计算出来的结果选择下一个字母应该是什么字母,可以看到h的预测就是错的,其认为o的可能性更大。那么接下来就是需要softmax的时候了,如果对softmax不了解的同学可以去看看ufldl的 Softmax回归,这个简单来讲就是用于处理多分类问题。

下面的四张图片是一个test-example,先给定第一个字母,通过这个字母不断地生成下一个直到结束,不用去看数值,我听了视频后才知道,虽然h后面o的可能性大,但是这里假设就是e,然后e输入到第二个time-step。
cs231n学习笔记【1】--- Lecture_10 --- RNN_第14张图片
cs231n学习笔记【1】--- Lecture_10 --- RNN_第15张图片
cs231n学习笔记【1】--- Lecture_10 --- RNN_第16张图片
cs231n学习笔记【1】--- Lecture_10 --- RNN_第17张图片

上面的过程很好理解,接下来我们就要利用loss来backpropagation,修正整个网路,但是如果直接是全局在计算的话,会发现显存或内存不够,而且会计算的十分的久,因为训练集是十分巨大的。那么有什么办法呢?truncated,也就是分块计算,因为我们的sequence输入是有个时间顺序的,假设我们设置一个chunk是100,那么我们跑了100个字母,后计算这100个的backpropagation,然后再跑100,现在有了200了,但是我们计算的是后100的backpropagation,如此反复。

cs231n学习笔记【1】--- Lecture_10 --- RNN_第18张图片
cs231n学习笔记【1】--- Lecture_10 --- RNN_第19张图片

后面的内容我发现不用讲了,剩下就是介绍他们在不同数据集上的实验,以及最后因为梯度爆炸和梯度消散谈起了LSTM和GRU,这两个神经元的设计我以后可能会写文章来讲,但不是现在。1997年就有的东西,在20年后的今天被大范围广泛利用了。

看完这么多最主要的是学习一下 min-char-rnn.py 这个代码,顺便给大家安利一个详解代码的地址 karpathy'blog

你可能感兴趣的:(cs231n学习笔记【1】--- Lecture_10 --- RNN)