吴恩达深度学习笔记

B站看的视频,课太长了,180多节,但搬运的没有作业练习,最好找个能练习的
 
1,假设模型时,以前(2011版机器学习)用西塔代表参数组成的向量,现在用w代表参数组成的向量,b代表西塔0,x还是特征与样本组成的矩阵。
目的还是求系数w,进而确定模型。
比较一个样本的预测结果与实际结果的函数,是损失函数。很多样本的损失函数的平均值,就是代价函数。
2,神经网络的特点就是,每一层的每一个单元,里面都有两个式子,左边是模型的,有自己的系数和b,右边是激活函数的。
神经网络的激活函数,sigmod 只有二分法才用,但tanh 所有场合都比他优越,常用的默认激活函数是ReLU,不知道用哪个就用它。还有个leak ReLU。
3,为什么需要激活函数呢?因为如果没有激活函数(这也叫线性激活函数),那无论神经网络有多少层,多个线性函数的组合还是线性函数,它一直做的只是计算线性函数那就不如直接去掉隐藏层了,所以要引入非线性函数(激活函数)。
4,正向传播是神经网络从左到右算出最终的预测值。反向传播是从右到左,从输出开始,对左边的参数求导,目的是为了梯度下降。
5,神经网络参数的随机初始化不能是零,是比较小的数。
6,自己调试时,核对神经网络每一层的矩阵维数,可以有效排查bug。
7,神经网络正则化的方法:dropout,随机删除网络中的神经单元。
8,梯度消失梯度爆炸,是指训练深度神经网络时,导数或坡度有时会变得非常大或非常小。解决思路是初始化参数那个方向。
9,梯度检验用来确保反向传播正确实施。
10,加速梯度下降的方法:mini batch,momentum,root mean square prop,adam 。
11,加速模型训练的方法:衰减学习率
12,前面讲的内容包含有很多参数,如何选择参数的初始化值呢?用随机+合适的scale搜索合适的参数,而batch normalization算法使搜索参数变得很容易。
13,逻辑回归只应用于二分法,而应对多个分类,用softmax回归。
 
14,卷积。在图像识别中,识别边缘需要用到 f*f 的矩阵作为过滤器
拿原图的像素矩阵 n*n,与过滤器矩阵做卷积运算,就能得到识别出的边缘。其中卷积运算的过程,就是把过滤器矩阵依次放在原图像素矩阵上,使对应值先相乘再相加,结果值组成 (n-f+1) * (n-f+1)的新矩阵。
过滤器的参数有不同的设置方法,如果每个参数都通过反向传播不断调试并确定,那这个过滤器就可以识别处复杂的边缘。
卷积过程会有两个问题:原图像素多次卷积后变小;原图边缘的像素信息丢失。解决办法就是每次卷积前先扩展原图的像素,这个行为叫padding,使用padding的卷积过程叫same(新矩阵为 (n+2p-f+1) * (n+2p-f+1),也就是卷积后像素不变,p的值取决于f,f通常为奇数),不用的叫valid(原图卷积后会变小)
15,卷积的步长之前是1,如果是s,那么新矩阵为  ( (n+2p-f)/s+1) * ((n+2p-f)/s+1),若除以s不是整数就向下取整。
16,三通道的图,卷积过程为:原图为 n*n*通道数3,过滤器为 f*f*通道数3,这俩通道数必须相同,新矩阵为  (n-f+1) * (n-f+1) ,新矩阵中每一个元素都是所有通道的过滤器大小的元素之和(比如3*3=9,4个通道共36个数,他们的和就是新矩阵的一个元素),无论原图通道和过滤器通道有多少,只能得到一个新矩阵,如果有多个过滤器,则得到多个新矩阵堆叠在一起,类似长方体,大小为 (n-f+1) * (n-f+1) * 使用的过滤器个数。
17,过滤器每次的个数随意,图片经过过滤器得到新矩阵,这是一个隐藏层的计算过程,经历多个层的计算后,会得到一个最终的新矩阵,比如它是7*7*40,然后把它展开成一个长长的向量,再把向量代入到逻辑回归或softmax回归,输出这个图片是不是预期的内容,比如图片里是不是有猫。
18,一个卷积神经网络通常有三层,卷积层,池化层,全连接层。
最大池化max pooling就是通过最大化运算,选取过滤器(hyper parameter 是过滤器大小filter 和步长stride )中的最大值,组成新的小矩阵。卷积是把原图各元素先乘再加,最大池化是只取最大。
平均池化是只取过滤器中的平均值。
随着隐藏层的深入,矩阵的宽和高会不断缩小,通道数不断增大。
池化层在学术上可以和卷积层并称为一层,因为它没有权重,也可以被当作单独一个隐藏层。
超级参数的选择可以参考别人文献的架构。
19,和普通的全连接相比,卷积的优势是参数共享和稀疏连接,这两招可以减少参数,从而能用更小的训练集训练它,从而预防过拟合。
20,神经网络例子
经典神经网络:LeNet5,AlexNet,VGG Net。
残差网络Resdual Network :就是普通的隐藏层之间(隔得远)增加捷径short cut或远跳连接skip connection ,连接覆盖的几个层,成为残差块residual block。对于普通神经网络,深度越深,理论上错误率越来越低,但实际上是越难训练,所以错误率会先降再升,而残差网络会解决这个问题。代价就是,相当于被跳过的隐藏层没用了。
1*1卷积层给神经网络添加了一个非线性函数,从而保持输入层中的信道数量不变或减少信道数量,或增加。
inception 网络替我来决定过滤器的大小和要不要加卷积层或池化层。他就是应用各种过滤器,然后把输出连接起来。面对计算成本问题,可以通过1*1网络构建瓶颈层,从而降低计算成本。只要瓶颈层构建的合理,就不会降低网络性能。
21,网上有别人训练好的权重参数和代码,代码是单独的,训练好的权重参数单独写在一个文件里,而只下载代码,则需要自己找训练集训练参数然后写到文件里。训练好模型应用的流程就是一张新图片,进入代码,经过权重参数,在最后的softmax函数输出属于哪一类图。网上他们开源的的权重参数已经经过长时间的训练和调优,性能很多,把他们都下载下来,只要修改最后的softmax函数改变要判断的类型即可,比如有个识别1000种狗的模型,你要迁移到识别三种猫。除了改softmax,还要把前面的隐藏层全部冻结,这样就不会更改人家之前的权重参数,如果自己的数据越多,就可以冻结的越少,因为可以自己训练。
 
22,目标定位是在图片分类的基础上,增加四个数字输出作为框,一个数字输出pc作为判断是否只有背景。
还是在图片分类的基础上再加个概念叫特征点,特征点检测是只检测图片中几个特征点(x,y坐标 ),然后分类时判断图片满足哪类的特征点,从而认出这个人,但这些特征点的训练集需要人工标注去训练,权重练好了模型才能自己处理新图片。
目标检测是在图片上以某个固定步幅滑动窗口,输入给卷机网络处理,扫描完整张图片,如果框里有目标物体,卷机网络输出1,没有输出0。这就需要训练时先把样本用窗口标注出来。可以用卷积实现。
滑动窗口无法准确框住对象怎么办?YOLO(you only look once)算法用的方法是把图片划成很多格子,对每个格子做目标定位,观察每个格子,如果有对象,将其中点分配给所在格子,即使对象横跨多个格子,也会被分到其中一个格子。
23,如何判断目标检测算法运行良好呢?用交并比计算检测正确的面积占窗口识别面积的比例,如果大于0.5或0.7等等,说明算法还不错。
24,非最大抑值(non-max suppression),在窗口密集的情况下,目标会被检测出多次,这个方法可以只显示概率最高的窗口(也就输出概率最大的分类结果,但抑制很接近,但不是最大的其他预测结果)
25,anchor box用来处理一个窗口中有多个对象。
region proposals候选区域
26,人脸识别,可以采用similarity 函数对比两张图片,如果相似度低于某个值,说明图片中是同一个人。实现这个功能的网络叫Siamese network ,原理是图片进入卷积网络经过最后的编码函数输出为一个128维编码,两个图片的编码距离小就说明是同一个人。
人脸识别卷积网络,参数训练的方法:Triplet loss。
27,神经风格迁移neural style transfer 
这个算法的实现是:以原图和结果图为参数组成代价函数,再以风格图和结果图为参数组成代价函数,两个代价函数之和组成最终的代价函数,使用梯度下降最小化他,就能得到模型参数。
 
28,序列化模型sequence model 
每个训练样本都有自己的长度,每个训练样本的输出也有自己的长度。
one hot方法通过字典定位一个训练样本中的每个单词,输出每个单词的向量,输出长度就是向量个数。
29,循环神经网络:一个训练样本中的每个单词,都输入到一个隐藏层,然后输出这个单词的向量。每个单词输入到隐藏层的权重参数为W_ax,激活值由权重参数W_aa决定,输出结果由W_ya决定。前一个单词的隐藏层产生的激活值会影响后一个单词的隐藏层。每一层都计算预期y与实际y之间的损失函数,所有层的损失函数之和就是最终的损失函数。
所以循环神经网络在某一时刻的预测仅使用了序列中之前的输入信息,并没有使用序列中后面的输入信息。
循环神经网络的激活值的激活函数经常选用tanh,输出结果y的激活函数由输出类型决定,二分类问题用sigmoid 激活函数,k分类问题用softmax。
循环神经网络的反向传播就是把正向传播所有箭头反过来,叫做backpropagation through time
30,前面讲的是1个输入对应1个输出的循环神经网络结构,此外还有多对1,多对多(其中也有输入长度和输出长度不一致的),1对多。

 

31,语言模型language model 会告诉你某个特定的句子,它出现的概率是多少。语言模型衍生出两个系统,语音识别和机器翻译。语言模型的基本工作,就是把一个输入的文本序列搞成P(y^1,y^2……y^ty)形式,然后估计句子中各个单词出现的可能性。
建立循环神经网络时,每一层的激活函数a都会在当前时刻以上一个单词的正确答案(训练时会用正确的,处理新数据时就用前一个预测的输出,也不管他是不是真的对)为输入和条件概率计算整个字典中出现某个单词(比如字典有1万个单词,这个单词是个1万维向量,除了单词所在位置值,其他维都是0)的概率(乘法公式),找概率最大的通过softmax把他作为输出y^几。最后定义损失函数,就可以训练了
32,训练一个模型之后,想要了解这个模型学到了什么,一个非正式的方法就是对这个模型进行新序列采样:就是训练好的模型的softmax函数的第一个序列的输出是各种词的概率,随机选一个词作为y^1的输出,后面就不用管了,它会自己传递,直到采样到结束符或长度达到了设定的长度就结束。
33,循环神经网络的梯度消失问题:随着训练层数的增加,导数可能指数级地增大,如果遇到了梯度爆炸,用梯度修减gradient clipping 解决,导数也可能指数级地减小,遇到梯度消失。GRU gated recurrent unit 门控循环单元,它改善了循环神经网络的隐藏层,使其能更好地捕捉深层连接,并改善了梯度消失问题
GRU会在处理一次任务时,产生一个新变量c,代表记忆细胞memory cell,它存储T时刻的激活值a,然后经过函数计算可以更新c值,后面GRU的门会决定每当进行到下一个时刻是否更新c
34,长短期记忆Long short term memory ,它比GRU捕捉深层连接的效果更好,也是单元。他有更新门,遗忘门,输出门,当前时刻的门的值不仅取决于上一个时刻的激活值a和当前时刻的输入x,也取决于上一个记忆细胞的值,然后偷窥孔连接peephole connection 就可以结合三个门来做计算。
35,上面介绍了除RNN标准单元以外的其他两种单元,下面介绍两种RNN模型。
双向循环神经网络,这个模型可以让你在序列的某点处不仅可以获取之前的信息,还可以获取未来的信息。实现方式就是每个RNN单元都有两个,一个管顺序,一个管逆序。NLP就是使用LSTM单元的双向RNN,但需要获取完整的句子。
深层循环神经网络,就是把RNN的一层变多层,多层堆叠在一起,原来的神经网络每一层都有一组激活值a,前面讲的RNN都是一层a,现在也堆成多层。如下图

 

36,接下来讲GRU、LSTM在NLP中的应用。
词嵌入word embedding ,这是词语表达的一种方式,可以让算法自动理解类似的词比如男人女人、国王王后等。具体实现就是在前面31单词向量的基础上,给每个单词建立特征,特征可能有几百个,这几百个特征的值就组成了这个单词的特征向量。把这几百个特征通过T-SNE二维化,就能看出类似聚类的二维效果,这样就可以通过一个单词的特征向量,看出它跟其他单词有没有相似之处了。这就叫嵌入,就是把一个单词嵌入到了一个几百维的空间中。
37,词嵌入还能实现类比推理的功能,具体就是在前面36的特征向量基础上,让不同单词的特征向量相减,在结果向量中有关联的特征所在维的值会很大,而无关联的特征所在维的值约等于0,这样只看结果向量,就可以实现这一组单词和那一组单词的类比推理。
实际应用中,会用词嵌入学习算法来学习每个单词的特征值,用余弦相似度测量两个词嵌入向量间的相似度,
38,那词嵌入学习算法怎么学习出每个单词的每个特征的值呢?将嵌入矩阵随机初始化,然后用梯度下降法学习出矩阵中的各个参数。
使用词嵌入预测下一个词的过程如下图

总之,就是训练出词嵌入矩阵E,或者用别人训练好的,然后用单词的向量,乘矩阵E,得到这个单词的词嵌入值,多个单词的词嵌入值组成新的多维一列向量,这个向量进入softmax函数,通过概率对比找到概率最大的单词。
此外,还有更简单高效的词嵌入算法:
1,word2vec。
2,Skip gram模型把上下文映射到了目标词上,这是词嵌入算法一个不错的应用,但缺点是softmax函数计算很慢。
3,negative sampling 可以做到和skip gram类似的效果,但更采用了更高效的学习算法。
39,情绪分类,做法如下

还是按前面38的操作算出每个单词的词嵌入值,然后把这些值放入RNN,RNN最后一步计算一个特征表示,就能知道这句话是什么情绪了。
 
40,NLP讲完了,接下来讲机器翻译和语音识别。
之前讲的语言模型(前面31)是从零向量开始,之后每一个y都是下一个的输入x,而机器翻译不是从零向量开始,是先用encoder网络计算出一系列向量来表示这个输入的句子,然后decoder网络就能以这个句子开始,用跟语言模型类似的方式预测输出,这也叫条件语言模型。所以语言模型输出的是任意单词的概率,而机器翻译输出的是最有可能的翻译的概率。如下图所示

41,单词的词典有那么多单词,在要输出翻译时,不可能计算每一个单词的翻译概率,而且我们不想要随机翻译的词,只想要最好的,集束搜索算法beam search 就是干这个的。
集束搜索按照集束宽度的设定,再根据概率先拿出(拿的过程还是前面40里的编码解码过程)多个词作为翻译的第一个词的候选,然后给每个候选词算概率最大的下一个词,如果集束宽度是10,那现在就有10个句子,目前每个句子两个单词,一次加一个单词不断进行,最终就会获得10个翻译的句子。
42,当翻译出错时,如何判断是RNN的错,还是Beam search算法的错?
RNN实际上是个编码器和解码器,它会计算P(y|x),那就对比beam search的P(y|x)和去掉beam search的原始RNN计算的P(y|x),让他俩的概率分别和正确的概率比,他们谁的预测结果是错误翻译的选择概率大于正确翻译的选择概率,那就说明他错了。
43,翻译的句子常有多个正确结果,如何选择最好的呢?用blue score
44,注意力模型attention model ,他的做法是,基于前面35的双向循环神经网络和LSTM,在翻译时每生成一个单词,就会计算在生成这个单词时,应该放多少注意力给每个输入块
45,语音识别是在不同的时间和频率上看声波大小,然后使用注意力模型把频率和声波大小预测为字符,组成单词和句子。
 
 
posted @ 2023-10-15 23:39  zhaot1993  阅读(108)  评论(0编辑  收藏  举报