神经网络和深度学习[1-2]
神经网络和深度学习[1-3]
神经网络和深度学习[1-4]
改善深层神经网络:超参数调试、正则化以及优化【2-1】
改善深层神经网络:超参数调试、正则化以及优化【2-2】
改善深层神经网络:超参数调试、正则化以及优化【2-3】
结构化机器学习项目 3
Ng的深度学习视频笔记,长期更新
1.1 为什么选择序列模型
像递归神经网络,RNNs 已经改变了语音识别,自然语言处理等其他领域。
如下图所示:
在语言识别方面,给出一个输入语音X和一个需要匹配的文本转录Y,X和Y都是序列数据。音乐生成是是另外一个序列数据的例子,其输入可以是空,整数,或者是一个你想去生成的音乐类型,或者是一些音乐片段,而Y则是一个序列。在情感分析中,X是一个序列,如给出“The is noting to like in the movie”,那么你认为通过这句话这个电影将会有多少明星?序列模型同样对DNA序列的分析非常有用,你的DNA由ATCG这四个碱基表示,通过分析,我们可以知道DNA序列的哪一部分表示一种蛋白质。在机器翻译中,给出一个句子,输出不同语言的句子。在视频行为识别中,给出视频中的某一帧,去识别其中的行为。
1.2 数学符号
如下图所示,给定一个输入,找出其中的人名,这个就是命名实体模型:
上图显示输出是人名的部分有1表示,不是人名的部分用0表示。这里用表示第i个输入例子中第t个元素,用表示第i个输出例子中第t个元素,表示第i个输入例子的长度,表示第i个输出例子的长度。
那么问题来了,为什么上面显示的Harry
就是人名呢,接下来将讨论如何表示句子中的一个独立的单词。
首先我们需要有一个词汇表,表示一个单词集合,这里有你将要使用的单词,比如大小为10000的词汇表,当然对于一般的商业应用,词汇表的大小在30到50000之间更加常见,100000是不常见的,一些大型网络公司将使用一百万的词汇库或者更大的。你可以通过查看训练集中前10000个出现的单词来得到词汇库或者通过那些告诉你在英语中最常见的10000个单词的在线词库来得到词汇库。然后通过独热编码来表示每一个单词。有一个问题,如果要编码的单词不再词汇库怎么办?这里的解决办法是创建一个新的token叫做Unknown Word去表示那些在词汇表中没有出现的单词。
1.3 循环神经网络模型
现在我们可以使用一个标准的神经网络来做上面的工作,如下图所示
但是这样做有两个主要的问题,第一个问题是在不同的例子中输入和输出可以是不同长度的。当然你可以通过添加0来讲这些长度扩展到最大的长度,但是这样看起来似乎不是一个好的表现。第二个问题可能更加的严重,不能通过文本的不同位置来共享学习到的特征。这个就像在卷积神经网络中看到的一样,你想把从图像一部分上学到的事情很快的扩展到图像的其他部分上,我们也希望在序列上有相同的影响。我们希望减少我们模型中参数的数量,上图显示的每个是一个10000大小的向量,这将是一个非常大的输入层,如果全部的输入大小(句子最大长度)是10000,那么第一层就会有一个巨大数量的参数,接下来要讲的循环神经网络就没有这些缺点。
循环神经网络如下图所示:
我们需要做的是,每给出,我么需要预测出,当然的信息也可以通过的输出来关联到预测的输入上。此时我们可以看到RNN的缺点是前面的输出不被后面的输入影响,比如的输出和没有关系。为什么是缺点呢,比如给出一个句子:He said,Teddy Roosevelt was a great President.
,为了知道单词Teddy
是否是一个人名,不仅是Teddy
前面的信息,其后面的信息也非常的重要。因为这个句子也可能是如下的形式:He said, "Teddy bears are on sale!"
。仅仅给出前面3个单词,并不能确定Teddy
是一个人名,第一个例子中是人名,但是第二个例子中就不是人名了,但是这两个句子的前三个单词是一样的。因此这个特定的神经网络结构的一个限制是,在特定时间序列的预测只能使用当前的输入和输入序列中较早得信息,而不是该序列后面的信息,我们将在后面的讲解中讨论这个问题,即双向递归神经网络(BRNN: bidirectional recurrent neural networks )。这个单向的神经网络架构足够我们结束这些关键的概念了。
下面这个图是一个比较清楚的版本:
我们令
那么对于有:
其中的激活函数g可以是不一样的,一般求解的激活函数是tanh/ReLU
,求解y的激活函数和y有关,如果是二分类问题,就可能使用sigmoid
,如果是多分类问题可能就使用softMax
。就比如上面的实体命名模型,因为y要么是0要么是1,那么第二个g就是sigmoid
,但是通常不这么做???
给出一般的形式:
将上面的第一个式子简化一下:
这里举个例子来理解,比如的维度是100,的维度是10000,那么的维度就是(100,100),的维度就是(100,10000),如下面图所示,其矩阵的形式一目了然:
同样将第二个式子的改写为
1.4 通过时间的反向传播
前面已经学习了RNN的基本结构,此节将讲RNN的反向传播。观察下面这个图:
这里由生成的每一个中用到的参数均为,再由生成的中用到的参数均为,这里我们需要一个损失函数,这里我们使用常见的log交叉熵来做:
如上图所示,将这些损失函数求和就是这个句子总的损失函数。红线所示部分是反向传播过程。
1.5 不同类型的循环神经网络
我们前面讲到实体命名模型中有,是many-to-many
类型,这里如果用在情感分类上,比如一句话要么是积极的要么是消极的,而不是输出一个序列,这样的模型就是many-to-one
类型,如下图所示:
再比如音乐生成就是one-to-many
类型,输入x可以为空,输出的结果是知道合成音乐作品中的最后一个音符,一般情况是生成的前一个输出通常会作为下一层的输入。前面提到的many-to-many
给出的时两个序列长度相同的情况,这里如果不相同呢,比如机器翻译,两个句子是可以不一样长的,如下图所示,【虽然我没有看懂右边这个图的含义,而且为什么不允许有重叠呢,为什么是先encoder,后decoder???】:
1.6 语言模型和序列生成
什么是语言模型呢?比如对于语音识别中得到的两个例子
我们知道第二个句子更有可能是一个符合的句子,语言识别系统通过使用一个语言模型来告诉我们哪一个的概率更大,比如使用概率公式
那么如何构建语言模型呢?使用RNN建立一个这样的模型,首先需要一个训练集,包含很多英文文本语料库,比如下面这个句子(从训练集中选出)
最后句子的结尾标志是EOS
,前面有提到当某个单词不在词汇表中的时候,使用UNK代替,那么我们求解语言模型p(Cats average 15 hours of sleep a day.EOS)
该语言模型等价,可以用链式规则展开与下面比较。
如下图显示的RNN模型:
其中第一个输入为句子开头,因此这里输入为0向量,输出为第一个单词的概率,即,注意下一层的输入结合语言模型等价形式理解,表示的是,…,直到最后输出表示,然后每个输出的损失函数以及整个句子的损失函数如下:
我觉得上面的式子不用加t额,应该是
1.7 对新序列采样
这节讲的是Sampling a sequence from a trained RNN,见下图:
主要的区别就是将上一层的输出作为下一层的输入,但是上面的是,下面的是,我不太清楚这个有什么具体的区别,难道是上面的输入不可能做到,现有的只能是样本???
上面的叫做words level RNN
,下面介绍Character-level Languange model
,这里词汇表由之前的Vocabulary=[a,aaron,...,zulu,<UNK>]
变为Vocabulary=[a,b,c,d...,,,;,',A,...,Z]
这样就不会出现没有的单词了,比如下面的句子对应的:
相对于word level language model
,这里的RNN层数明显变多,但是由于计算速度的提高,人们逐渐有之前的单词模型转向字符模型。
1.9 GRU单元
Gated Recurrent Unit是对RNN影藏层的一个修改,使它更好的体现远距离连接而且对梯度消失问题有帮助。重新来看t时间处的影藏单元如下图:
举个例子:
句子从左到右,GRU单元将有一个新的变量叫c,表示记忆单元,它将提供一些记忆,比如cat是单数还是复数,以至于当它达到句子的更远处时仍然判断句子的主题是单数还是复数。【这一部分我没看懂…】
哗啦哗啦讲了一大堆后如下图所示:
对照右边的公式看左图,首先是,然后进入tanh激活函数和sigmod激活函数,有如下两个公式:
然后进入到图中紫色方框,公式如下:
从这个公式中可以看出,如果的值是0的话,就不会更新,否则才更新。
最后是Softmax函数输出。
从上面的公式中能看出,如果非常接近于0的话,最终的结果和上一层是一样的,也就是说这样就会减弱梯度消失的问题,这样神经网络就可以走得很长。
1.10 LSTM
LSTM是一个更强大,更通用的GRU版本,如下对比图所示:
这里有几个不同之处,一个是和的关系,一个是的求解上,的求解上实质上是一样的。
LSTM单元如下图所示:
GRU的好处在于它是一个简单的模型,更容易建立一个大的网络,只有两个门参数,运行的更快,但是LSTM是一个更强大有效的模型,因为它有三个门参数。
1.11 双向神经网络
之前提到过,单向神经网络并不好,比如对实体命名而言,是需要后面的单词来决定当前单词的输出的,这里讲解BRNN,如下图所示:
紫色部分为正向传播,绿色部分为反向传播,输出的y如上所示,该网络一般与LSTM相结合。
1.12 深层循环神经网络
深层循环神经网络就是将多个例子在纵轴上延伸,如下图所示:
这部分的意义不是特别的懂,应该说都不是很懂…先放着吧,后期再慢慢理解…