吴恩达深度学习视频笔记
1、结构化数据与非结构化数据
从上图可以看出,对于小规模的数据集,深度学习和机器学习它们的性能不一定谁好谁坏,只有在大规模上的数据集上时,深度学习才能体现出它更好的性能
损失函数是针对于单个样本的,而代价函数是针对一个batch的,我们都是通过代价函数来实现参数的更新。
下面是逻辑回归的代价函数计算,我们知道逻辑回归是一个二分类模型,它的最后一层的输出是经过sigmoid函数的,由于sigmoid的导数值最大时0.25,所以在进行梯度下降时容易梯度消失。并且它的损失函数,我们一般也不使用L2 loss,他会造成局部最优解,由于是二分类问题,所以我们一般使用bceLoss
经过思考后,可以再次对学习率进行理解,lr其实就是参数更新时,移动的步长
2、计算图
3、Python(Numpy)中的广播
从上图可以看出,numpy中的广播可以在水平和竖直方向分别进行广播,使得其与前面的向量维度一致。
注意,Python中的这个广播机制可能会造成一些不可预料的bug,例如
上图中a的维度是**(5,)**,这既不是一个行向量也不是一个列向量,因此,我们在定义矩阵时就不要使用这种方式。当然你可以通过np.reshape()函数来将其维度进行调整
而是在每次定义矩阵时都确定好它的维度
4、激活函数
1、sigmoid函数除了用于网络的输出层用于分类,其他层都再使用它了,因为梯度消失
2、tanh函数在性能上比sigmoid函数更优,首先它取值范围是[-1,1],并且它导数的最大值为1,但是仍然存在梯度消失的问题
3、ReLU函数
4、LeakyReLU函数与relu的区别是在自变量小于0时,它的导数值为0.2(一般情况下),而不是0
为什么要使用激活函数
从上图可知,如果不适用激活函数或者是使用线性激活函数,那么整个网络就只能学习到线性特征
注意,也不是所有层都不能使用线性激活,对于回归问题,我们可以在输出层使用线性激活,但是在隐藏层仍然不能使用线性激活函数
5、随机初始化
为什么网络的权重不可以全部初始化为0?
因为如果全部初始化为0后,通过对网络进行分析,那么每一层中的权重在更新后依然一样,这样就无法对数据特征进行有效学习。
为什么随机初始化需要保证权重的初始值非常小?
如果权重的初始值很大,那么在神经元激活之前,它的值就会非常大,通过对sigmoid函数进行分析,在进行反向传播时,它的导数值会非常小,容易造成梯度消失。
6、代码debug方法
在debug代码的时候,我们逐步通过检查矩阵的维度是否与自己预期的维度相同来判断是否出现错误。
7、超参数
学习率、迭代次数、隐藏层数L、隐藏单元数、激活函数、momentum值、mini-batch_size、正则化参数
8、Dropout正则化
假设节点随机失效,所以每个输出就相当训练一个子网络。
在测试(或者使用模型做预)的时候,去掉Dropout,使所有节点都有效。因为dropout相当于组合了N个网络,测试的时候去掉dropout,相当于N个网络的组合。N个网络权值共享,并且具有相同的网络层数(这样可以大大减小计算量)。我们每次dropout后,网络模型都可以看成是整个网络的子网络。
dropout的作用其实就相当于正则化,对于网络中某一个神经元,它的输入是上一层神经元的输出,由于上一层神经元可能会被随机dropout,所以该神经元不可能给上一层神经元太高的权重,这样其实就类似于正则化了。
测试阶段并不会使用dropout;
9、数据归一化
如上图所示,如果数据是二维的,当他们数据范围相差很大时,例如:1-1000和0-1,这样的话,他们对应的参数w1和w2的范围就会差距很大,在代价函数图像上,就类似于一个细长的碗,在梯度下降的过程中,就需要更小的学习率,从而使得训练速度变的缓慢。而将他们进行归一化后,他们取值都在0-1之间,这样代价函数图像就类似一个圆形的碗,很均匀,训练也会变得更快。
10、优化算法
指数加权平均
指数加权平均,作为原数据的估计值,不仅可以 1. 抚平短期波动,起到了平滑的作用,2. 还能够将长线趋势或周期趋势显现出来。
指数加权平均的偏差修正
上面红框中就是θ的指数加权平均并去除了偏差后的值
动量梯度下降法
如上图的第一个红框,当只使用梯度下井算法时,代价函数的波动就会比较大,而更具指数加权平均可以平滑波动的特点,最后代价函数的波动就没有那么大。
具体做法就是,对所有的参数使用指数加权平均。
RMSprop
在RMSprop中,我们不在使用VdwV_{d_w}Vdw,而是使用SdwS_{d_w}Sdw,并且梯度下降时参数的更新也不相同,如下:
Adam算法
Adam是将Momentum和RMSprop相结合的一种优化方法。
其中β1β_1β1是Momentum的参数,默认值是0.9,β2β_2β2是RMSprop的参数,默认值是0.999。
一般Adam里的参数是不需要进行调整的,我们只需要使用默认值即可
11、学习率衰减
12、BatchNormalization
批标准化一般应用在激活函数之前。
这里可能跟平常不一样,我们一般是直接对输入数据进行标准化,对于隐藏层而言,它的输入是上一层的激活值,但是我们并不是对激活值进行批标准化,而是在它之前。
训练输入和隐藏层单元的一个区别是:对于隐藏层,你也许并不想隐藏单元值必须是平均值0和方差1,因此BatchNormalization中有两个超参数γ和β,它的具体做法是:首先将 zzz 归一化为均值为0,方差为1,然后根据这两个参数进行缩放,当然这两参数也是需要学习的,也即当反向传播的过程中,模型不仅需要对w和b进行更新,同时也需要对β和γ进行更新,z=γz+βz~ = γz + βz=γz+β,这样可以确保所以的z都可以是你想赋予的任意值,也即可以使z符合任意的平均值和方差的分布
注意,对某一层进行批标准化时,是根据该层中隐藏单元的个数或者卷积神经网络中channel的个数,这也是可以理解的,我们要针对一个mini-batch中的所有样本进行标准化,就需要在每个样本中的每一个隐藏单元或者channel的数据进行标准化
covariate shift
协变量转化是指对于训练集上的数据分布,不能很好的应用的测试集。例如:训练集上训练出的参数θ,并不能很好的在测试集上进行应用。所以对于训练好的模型,如果训练集的数据一旦分布改变,那么它在测试集上的应用一定不会好。同样地,对于后几层的数据而言,如果前面几层的权重w和偏置b改变,那么一定会影响后面几层的输出。
那么,为什么需要进行批标准化处理呢?
它能够保证每一层中的数据都保持同一个数据分布(通过参数β和γ进行控制),这样不管数据如果变化,在每一个隐藏层中的数据分布依旧保持不变,那么前几层的数据也就不会影响到后几层的输出。
测试时的BatchNormalization
在训练时,批标准化处理是针对一个mini-batch的,即上图中均值和方差都是在一个mini-batch中计算的,而在训练时,我们并不能这样计算,因为如果测试集中只有一个样本,那么这种做法显然没有任何意义。其实在测试集中批标准化的均值和方差是通过指数加权平均来估算,是通过训练集中的每个mini-batch对应层的均值和方差进行植树加权平均来估计训练集的值。
13、softmax多分类
14、正交化
正交化 是指数据的每一个维度都互相正交,夹角为90度。如上图,可以想象,一个按钮如果既可以控制方向又可以控制速度,那么就很难以你想要的速度前进。
因此,对于深度学习中,我们要将正交化的思想融入其中,例如:电视太宽了,我只需要调整这个按钮;太高了,我只需要调整另一个按钮。根据不同的问题,诊断出系统的瓶颈在哪,并找到你可以用的一个特定的按钮,来进行调整
14、单一数字指标评估
例如:对于数据差异明显的二分类,precision,recall,error等,由于有多个指标可以评估,因此我们不能单纯的通过某一个指标来得出模型的好坏,可以利用F1-score来对指标进行综合,通过它来进行评估。
总之我们需要通过单一数字指标进行评估
15、满足指标和优化指标
当我们有n个指标时,我们无法对其进行精确的评估,这是我们可以考虑使用综合指标,也可以使用满足指标和优化指标,将其中一个指标作为优化指标,剩余作为满足指标,并给n-1个指标各设定一个阈值范围(s.t.),这时,只要有模型满足这n-1个指标范围,那我们就不再管他在这n-1个指标上到底有多好,而只考虑这个优化指标,根据它来进行评估哪个模型好哪个模型坏
16、训练、开发、测试集划分
训练集(training set):训练算法。
开发集(development set):调整参数、选择特征,以及对学习算法作出其它决定。
测试集(test set):开发集中选出的最优的模型在测试集上进行评估,测评泛化能力。不会据此改变学习算法或参数。
同时,最重要的一点是要保证开发集和测试集有相同的分布,如果他们的数据分布不同,结果当然显而易见。
划分比例
对于少量的数据集(100,1000,10000),我们会将其按60%:20%:20%的比例进行划分,
但是当数据集非常大(一百万)是,我们就需要在训练集中放入更多的数据,比如:98%:1%:1%
什么时候应该改变训练_开发_测试集
例如:当两个同时对猫图片进行分类的模型A和B,它们的错误率分别是3%和5%,但是对于A,它虽然错误率低,但是它会将一些色情图片作为猫而区分出来,这对公司和用户来说是不允许的,而B就没有这样的问题,即使他的错误率高。因此,对于模型来说,它们更倾向于选择模型A,而对于我们用户来说,我们更倾向于选择B。这时我们就需要对测评指标进行调整(即不能将错误率大小作为目标指标),或者对数据集进行调整
另一点是:如果模型训练-验证-测试的数据集都是高清的图片,而模型在真正应用时是模糊的图片,这时就需要对数据集做出调整。
17、偏差和方差
偏差指的是训练集上的错误率与最优错误率的偏差值。
方差指的是开发集与训练集上的错误率的差值,也即模型的泛化能力。这里理解起来可以想象成枪打靶子,集中与分散,距靶心的远近,四种情况,分别考虑。
解决高偏差和高方差问题
高偏差:
- 训练一个更复杂的模型(即增加模型的参数)
- 利用更长或者更好的优化算法
高方差:
- 更多的数据
- 正则化(L2,dropout,数据增强)
- 减少参数
18、如何在分布不同的数据上训练
例如:训练的图片都是高清的图片,而在模型应用上大多是模糊的图片,比如有200,000张高清,10,000张模糊图片
- 如果你随机将数据打乱,再按:205,000:2500:2500划分为训练,验证和测试集,这样的话,这三个数据集就都来自同一分布,这样做有很大的坏处,因为用户真正关心的是模型是否能区分模糊的图片,但事实上在验证集中大部分其实都是高清,而非模糊,这样的话,对于验证集的target来说,就是尽量能够区分高清的猫图片而非模糊的猫图片,因而达不到用户想要的目的
- 方法二是,对于训练集,它包含200,000张高清和5,000张模糊,而验证集和测试集都是模糊图片,各2500张,这样做最大的好处是模型现在的target变成了我们想要处理的目标,也就是说我们需要处理的是模糊图片而非高清图片,但这样的坏处其实也非常明显,训练集和验证集的数据分布并不相同,但是经过证明这样在长期会得到好的效果
因此,对于模型在训练和验证集上出现结果相差很大的情况,主要由两个原因导致:
- 一是模型只见过训练集的数据而没有见过验证集的数据
- 二是训练集和验证集的数据分布不同
那么,该如果对上述两种问题进行区分呢?
做法是从训练集中又划分出一个“训练-验证集”,因此他们都来自同一分布
如上图,第一列红框,模型在训练集上的错误率是1%,而在训练-验证集上的错误率是9%,在验证集上的错误率是10%,从整个数据上,我们就可以得出,模型存在方差问题,因为train-dev集和train集都来自同一分布,模型的泛化能力不强
第二列红框,模型在训练集和训练-验证集上的错误率是1%和1.5%,而在验证集上的错误率是10%,从这可以看出,训练集和验证集来自不同的数据分布,存在数据不匹配问题,因为模型在同一分布上的泛化能力很强
同理,下面的情况也就可以解释了
如何解决数据分布不同的问题
尝试去做错误分析,对训练集,验证集里面的数据进行分析,研究他们到底有什么不同,然后看能够收集更多 看起来像开发集的数据作训练,可以尝试利用人工数据合成,这样的确可以显著提升性能,但是这样合成数据时,可能只使用了可能性空间中的很小的一部分去拟合数据,从而造成合成的数据会过拟合的问题
19、迁移学习
多任务学习
经过实践证明,一个神经网络做多件事比让多个神经网络独自完成自己的任务的效果好。例如:对于一个识别一张图片是否包含车,行人,停车牌,数目的多任务,设计一个网络来完成这四个任务,比让四个网络独自分别完成自己的分类任务要好。
20、端到端学习
以语音识别为例,对于传统的学习方法,需要先提取出某个特征,然后在它的基础上学习其他特征,这样的,一个阶段一个阶段,最终得到文本信息。
而端到端学习是直接将语音输入到网络中,就可以得出最后的文本。
优点
网络自己学习特征。即“Let the data speak”,例如:对于语音识别,我们人类会提取出“音位”来作为特征并得出文本,“音位”其实是我们人类经过学习得到的一个重要经验,但对于机器来学,它会有自己的特征标识方式,如果强迫你的学习算法使用音位作为表示方式,那么整体表现就可能会变差。
21、计算机视觉
Padding
padding的出现主要解决了两个问题:
- 一是在经过卷积操作后,特征图的尺寸会变小
- 二是在卷积中,图片的边缘信息会被遗漏,因为边缘只会被卷积一次,而中间位置的像素点会被卷积多次
Valid卷积和Same卷积
valid卷积意味着no padding;same卷积意味着padding,输入和输出的尺寸保持一致
卷积核size为奇数的原因
Same卷积的n+2p−f+1=nn+2p-f+1=nn+2p−f+1=n==>p=(f−1)/2p=(f-1)/2p=(f−1)/2,因此,f为奇数时,它才能够自然地填充;
并且奇数大小的卷积有中心点,便于确定卷积核的位置
Stride
注意,上图中运算式向下取整,这意味着卷积核在移动的过程中如果超过了图像范围,则不再进行这一行的卷积,而转到下一行
三维卷积
实例
上图是一个卷积神经网络的一部分卷积过程,图中,清晰地给出了每一步卷积核的尺寸以及通道数,同时也给出了卷积后特征图的维度大小,在论文中就可以绘制这样的图片作为说明
Max Pooling
pooling层并没有需要学习的参数,只需要提前确定核的尺寸以及步长两个超参数即可
根据上图,我们可以发现越靠下,激活后的元素(特征图或全连接)的size越来越小,并且卷积层的参数量并不大,百分之90的参数都来自全连接层
卷积的好处
1、参数共享:一个卷积核作用于一张图片的各个部分,也即一张图片的各个部分共享一个卷积核
2、稀疏连接:输出特征图中的每个像素点都只来源于输入图片的一部分
正是这两点,神经网络才可以减少训练参数量,以便于我们使用更小的数据集,并且可以防止过拟合
22、经典网络
残差网络(ResNet)
首先介绍一下残差块(Residual block),它通过将浅层数据连接到深层数据中,根据此原理,使其能够训练非常非常深的网络。
ResNet网络就是通过将很多这样的残差块堆积在一起所形成的深度网络
23、1x1卷积
这里以谷歌Inception网络为例进行介绍
1x1卷积核的作用
1、放缩channel数目,实现升降维:通过控制卷积核的数量达到通道数大小的放缩。而池化层只能改变高度和宽度,无法改变通道数。
2、增加非线性:1×1卷积核的卷积过程相当于全连接层的计算过程,并且还加入了非线性激活函数,从而可以增加网络的非线性,使得网络可以表达更加复杂的特征。
3、减少参数:在Inception Network中,由于需要进行较多的卷积运算,计算量很大,可以通过引入1×1确保效果的同时减少计算量。
24、数据增强Data Augmentation
1、垂直镜像对称(Mirroring)
2、随机裁剪(Random Cropping)
旋转、局部扭曲…
3、色彩转换(Color Shifting):通过给RGB三个颜色通道增加或减少像素值
25、目标检测Object Detection
目标检测意味着系统不仅要对图片中的多个实体进行分类,而且需要对其进行定位,并用红框对其圈注。
下面先介绍Classification with Localization(即对只含有一个实体对象的图片进行分类和定位)
这个问题的主要思路是:模型不仅需要输出图片的类别,而且需要输出边框的中心点以及宽和高。
根据上图,在目标检测中,模型的输出是为上图第二个方框,它共包含了8个元素,第一个 PcP_cPc 表示该图片中是否包含实体对象,1表示有,0表示无,后面的 bx,by,bh,bwb_x, b_y, b_h, b_wbx,by,bh,bw 表示对象的中心点和宽高,剩下的元素表示图片的类别。这样,模型的损失函数为(上图第一个方框),分为两种情况,即PcP_cPc =1和PcP_cPc =0。
特征点检测
上图中为特征点检测的实例,例如:车的中心点和宽高;人脸部的64个特征点可以区分是在咧嘴,皱眉等;人体的32个特征点来判断人的姿势动作。
滑动窗口目标检测(Sliding window object detection)
根据上图第一个方框,在对图片进行分类时,网络的最后几层都是全连接层以实现对该张图片的分类。
但是我们在对图片进行目标检测时,由于我们不清楚实体对象的位置,就需要通过一个滑块来逐一检查,如果我们将每一个滑块都喂入第一个网络中,那么由于滑块会有重叠,这样就存在大量的重复运算。
那么就出现了第二个方框的网络模型,它将后面几层的全连接层都换成了卷积层,这样我们就可以对每一个滑块的分类进行确定,并且 最重要的是它并没有对滑块的重叠部分进行重复运算
Bounding box predictions
前面的滑动窗口目标检测最大的问题就是它不能精准地确定对象,因为它窗口的尺寸是固定的
上面式YOLO算法,它通过将一个图片划分为几个格子,然后利用前面将的目标分类和定位算法,确定出每个格子是否包含对象以及对象的中心点
确定边界框的编码值
对于每一个格子,我们都定义它的左上角为(0,0),右下角为(1,1),因此中心点以及宽高都表示对象占格子的比例,并且由于一个对象可能垮格子出现,因此,宽和高可能大于1,而中心点是介于0和1之间。
交并比函数(IOU)
交并比函数可以用来评价目标检测算法
交并比函数是模型得出的边界框与标签边界框,两个边界框交集与并集之比。一般设置0.5为阈值,当函数值大于0.5时,则为正确定位,当然也可以设置更高的阈值,这样就可以更精确的定位。
非最大值抑制
如上图,如果将图片分成19x19个格子,那么对包含汽车的格子都有可能会预测出它有汽车,也即最后可能会得出多个对象框
非最大值抑制做的就是清理这些检测结果,这样一辆车就只会检测一次,而不是多次。它是通过 PcP_cPc 的概率值,然后输出最大的分类结果,并抑制很接近但不是最大的其他预测结果
下面以检测汽车为例,即只检测图片中是否包含汽车
Anchor Boxes
前面的几个方法,他们在每个格子中都只能检测一个对象,如果要检测多个对象就需要使用Anchor Boxes方法,它的原理是:在一个格子定义多个anchor box,如下图,并在输出向量中输出多个分类结果
YOLO
YOLO算法将上面的几种算法进行了集成
YOLO的训练集
如上图,这是一个三分类的问题,并且它的anchor box的数目为2,因此它的输出向量为2*8= 16
YOLO的预测
- 1、Making predictions
- 2、非极大值抑制:(1)对每个格子都得出两个bounding box
(2)抛弃概率低的预测
(3)对每个类型(汽车,行人,摩托车)分别使用非极大值抑制来得出最后的预测结果(边界框)。
候选区域Region proposal
R-CNN:regions with convolutional networks
对于前面YOLO的图像中,有些格子中并没有包含实体对象,因此将它喂入模型只是徒增计算量,没有意义,R-CNN就可以忽略掉这些无意义的区域,挑选出候选区域,方法是运行图像分割算法,然后在里面找色块,给它加上边界框,并在其上跑分类器
如上图,模型在一张图片中挑出候选区域,这样就将一些不感兴趣区域忽略了,还有最重要的一点是:前面的YOLO处理的图片都是正方形的区域,R-CNN处理的图片就可以是任意宽高的方形区域
R-CNN的一个缺点是它的运行速度太慢,因为它可能会挑选出非常多个候选区域。Fast R-CNN通过滑动窗口的卷积来对其进行加速,这个思想与前面滑动窗口的思想一致。
Faster R-CNN是另一种改进方法,它通过卷积神经网络来得到候选区域,而不是传统的分割算法
26、人脸识别Face Recognation
One-shot学习
对于人脸识别,我们的一般思路是利用一个卷积神经网络对图片进行分类得出他是否是公司员工,但是有两个很重要的问题:
- 一是训练集中每个员工都只有一张图片,这样的话,网络就无法训练处一个robust很强(即很稳健)的模型,因为一个人在经过人脸检测系统时会有不同的姿势,角度等
- 二是如果公司新来一位员工,那么我们就需要对该模型重新进行训练,显然这是不合理的
那么,我们应该学习一个similarity函数,它能够判断两张图片是否是同一个人:
这样的话,当像数据库中添加一名员工的照片后,系统仍然能够识别。能够实现这个函数功能的有:Siamese network
Siamese network
如上图所示,网络将两张照片准换成两个向量,并用他们差的二范式来表示他们之间的距离,这样就可以判断两张照片是否是同一个人。
Triplet 损失
前面的Siamese网络可以将一张图片转换成对应的编码,要实现这个过程,最主要的就是利用Triplet损失函数,它表示:例如对于Anchor这名员工,网络不仅要识别他的一张图片,还要识别一张positive照片(即属于该员工的其他照片)和一张Negative照片(即不属于该员工的照片),那么模型的目标其实就是:
但是如果当F函数的输出都为0时,该不等式也是满足的,因此上面的不等式应该是小于0,也即小于等于0-α,这个α是一个需要提前确定的超参数,这样就可以阻止网络输出无用的结果。
这个α也叫margin。
Triplet损失函数
由于我们要使上述的那个不等式小于等于0,对于损失函数而言,我们要使一个函数值最小,就需要用一个与0相比的max函数,如果那个值大于0,那么我们就需要使得最小,如果小于0,我们就不需要它有多小,因为损失函数一直为0。
关于该网络,在训练时我们不能简单地从训练集的三个部分随机抽取样本,因为我们的目标是 ∣∣f(A)−f(P)∣∣2+α<=∣∣f(A)−f(N)∣∣2||f(A)-f(P)||^2 + α <= ||f(A)-f(N)||^2∣∣f(A)−f(P)∣∣2+α<=∣∣f(A)−f(N)∣∣2,如果随机抽取,那么两边的差值一定会很大,这样网络就不会学到有用的参数,因此我们在训练时要使得 ∣∣f(A)−f(P)∣∣2与∣∣f(A)−f(N)∣∣2||f(A)-f(P)||^2 与 ||f(A)-f(N)||^2∣∣f(A)−f(P)∣∣2与∣∣f(A)−f(N)∣∣2相近似,这样网络就会尽力学习特征使得损失函数更小。
人脸识别与二分类
Triplet损失是一个学习人脸识别卷积神经网络参数的好方法,当然还有其他的学习方法,下面介绍将人脸识别转化为二分类问题。
如上图,先将图片编码为向量,然后可以将这两个向量输入到一个逻辑回归网络中来做一个分类。根据上图中的公式,最后需要利用一个sigmoid来做0-1分类,公式中权重w后面跟的式子可以是向量差的绝对值,也可以是卡方向量。
这里介绍一下在实际应用中可以提高速度的方法:例如当一个人进行人脸识别时,由于网络需要输入两个图片,一个是人实体,一个数据库中图片,主要是为了得到他们的编码向量,那么在数据库中就可以只存储图片的编码而不需要存储图片,而只需要对人实体的影像图片未入网络,这样就可以提高运行速度。
27、风格转换
deep ConvNet
下面介绍一下一个卷积神经网络中不同层它们学习到什么特征,并且对于卷积神经网络,浅层网络中每一个神经元(即特征图中每一个像素点)只能看到对应上一层输出图片的一个图片块,而非整张图片,越到深层,一个神经单元就有可能看到整张图片的复杂信息。下面利用激活最大化来可视化隐层单元的图片,它的思想就是:找到那些使得单元激活最大化的一些图片,或者是图片块,换句话说,将你的训练集经过神经网络,然后弄明白哪一张图片最大限度地激活特定的单元。
如上图,它是第一层隐藏层的9个神经元所看到的图片区域,例如:第一个神经元看到的都是斜向右的边缘特征。
上面四张图片分别是各层次的9个神经单元看到的图片信息,可以看到,越往深层,一个神经单元所能看到图片的区域范围越大,所包含的信息也越复杂,例如:第四层第一个神经元看到的是狗的头像,基本是同一种类型,但是第五层最后一个神经元就可以分辨不同种类的狗。
风格迁移的代价函数
代价函数由两部分组成:一是与C之间的内容损失,二是与S的风格损失
内容代价函数
计算内容代价函数是利用一个卷积神经网络将两张图片编码成两个向量,并计算他们之间的相似度。
风格代价函数
风格style是由一个卷积层得到的特征图的各个通道之间的相关性决定的。
那么这里的相关性(如上图)是通过某卷积层得到的特征图,各个通道特征图点乘的和,得到的一个matrix。这样对于风格图片和生成的图片都得到了这样一个matrix,那么风格代价函数就是计算这两个matrix差的二范式
并且,研究证明如果计算所有层的style matrix结果会更好。
28、序列模型
RNN(循环神经网络)
以人名定位为例,模型首先将第一个单词喂入网络,判断它是否是人名,接着预测第二个单词,这时网络的输入不仅包含第二个单词向量,同时还包含第一个单词的隐藏层向量,来共同预测第二个单词,以此类推。对于第一个单词,当然也需要额外输入一个隐藏层值,一般以零向量作为额外输入。
RNN一般选用tanh来作为激活函数,它避免梯度消失和梯度爆炸的方法后面进行讲解。
RNN的反向传播
如上图,以名字定位为例,对于有t个单词的语句序列,那么输出y向量的长度也为t,并且是二分类问题,可以用逻辑回归计算损失,那么总体的损失该语句所有输出y的损失函数值的和,并反向对参数进行更新。
不同类型的循环神经网络
对于上面的名字定位问题,它的输入和输出都有多个,这样的结构成为多对多结构。
对于情感分类问题,它的输出就是一个数字,例如:1-5,这样的结构被称为多对一结构,下面是它的结构图:
根据上图,我们可以看出多对一的结构,我们不需要对每个输入单词输出对应的y,而是将隐藏层的结果直接传给下一个单词,只在最后一个单词进行输出。
音乐生成是一对多的结构:
对于多对多结构,它存在输入和输出的数目相同与不同两种情况,像机器翻译就是输入输出数目不同的例子,它的结构如下:
机器翻译存在encoder和decoder两个结构。
语言模型
语言模型是指对于一个语句序列,它出现的概率是多少
RNN构建语言模型
语言模型就是逐一预测下一个单词出现的概率。首先预测第一个单词出现的概率,然后根据第一个单词预测下一个单词出现的概率,以此类推,最后预测整句话出现的概率:P(y1y2y3)=P(y1)P(y2∣y1)P(y3∣y1y2)P(y_1y_2y_3) = P(y_1)P(y_2|y_1)P(y_3|y_1y_2)P(y1y2y3)=P(y1)P(y2∣y1)P(y3∣y1y2)
上图中,x<1>x^{<1>}x<1>为0向量,它来预测第一个词的出现概率,它的输出y<1>y^{<1>}y<1>是一个10000维的向量,表示每个词的出现概率,10000是字典中词的数量;接着向模型喂入x<2>x^{<2>}x<2>,它等于y<1>y^{<1>}y<1>,是第一个词的向量表示,也就是cats的词向量,它与a<1>a^{<1>}a<1>来共同预测第二个出现的概率,以此类推…。由于该模型类似于一个多分类问题,因此它的损失函数使用cross entropy函数。
RNN的梯度消失
对于语句中的长期依赖,由于梯度消失,前面的单词对于后面单词的影响非常小。
当然也会出现梯度爆炸的情况,他会使模型在训练时出现NaN,也就是数值溢出,针对该问题,主要的解决方案是梯度修剪
GRU(Gated Recurrent Unit)门控循环单元
对于普通RNN,我们以下面这样的门控结构来介绍,根据右式,可以很容易理解该结构
对于The cat, which already ate …, was full. 这句话,如果中间的从句很长的话,那么cat这个词对后面的was的影响将会非常小,模型在预测时也就很难判断是用was还是were了。GRU 就可以解决这样的长期依赖的问题。如下:
首先对右边的式子进行理解: 第一行中 C~<t>\widetilde{C}^{<t>}C
然后第二个式子是GRU最终的式子,这里的 Γu\Gamma_uΓu 叫做更新门,通过sigmoid函数计算,它是0-1间的数,但由于更多情况下它的值为0或者为1,所以通过它能够实现记忆细胞是否进行更新。1即为更新,0表示不更新,持续上一次的值。第三个式子就是GRU对记忆细胞进行更新的方式,非常容易理解。
例如:如左下角的方框,当读到cat时,模型判断它为单数,因此这里将 Γu\Gamma_uΓu 设为1,然后GRU就会一直记住 C<t>C^{<t>}C<t> 的值,然后继续向后读,中间从句并不需要更新它,一直保持这个值不变,直到要预测was这个单词时,GRU认为此时为单数,那么就用was,然后 C<t>C^{<t>}C<t> 可以忘记了,即可以对它进行更新了,将 Γu\Gamma_uΓu 设为1。
左上角的方框为GRU的门控图,通过上述对它的分析,可以很容易地对该结构进行理解。
GRU解决梯度消失的关键是第三个式子,当 C<t>C^{<t>}C<t> 不更新时, C<t>=(1−Γu)∗C<t−1>C^{<t>} = (1-\Gamma_u)* C^{<t-1>}C<t>=(1−Γu)∗C<t−1> ,由于 Γu\Gamma_uΓu 为sigmoid函数,并且不更新时,它的值为0,或者0.0000001,即 C<t>C^{<t>}C<t> 很好地保存了前面依赖的信息,从而解决了梯度消失的问题。
还有一个重要的点是:上面 C<t>C^{<t>}C<t> 其实是一个向量(比如说100维),所以 Γu\Gamma_uΓu 也为同维度的向量(100维),意思是指他可以告诉GRU记忆细胞中哪个维度(单词)需要更新,所以你可以对其中一些维度更新,另一些进行保存。 比如说在100维中,你需要一个维度来记忆cat是单数还是复数,其他的维度就对其他信息进行记忆。
下面对完整的GRU进行介绍:
它其实与上面介绍的式子非常相似,只是做了很小一部分调整。它是在 C~<t>\widetilde{C}^{<t>}C
LSTM(Long short term memory)
上图是GRU和LSTM在公式上的不同。
LSTM的门共有三个,更新门(update)、遗忘门(forget)和输出门(output)。并且第一行中 C~<t>\widetilde{C}^{<t>}C
从上图就可以看出,只要正确设置了更新门和遗忘门,LSTM就可以很好的解决长依赖问题。
双向神经网络Bidirectional RNN(BRNN)
如上图,建立双向的循环神经网络,可以使得中间某个输出不仅考虑过去的信息,还会考虑将来的信息,他是通过给前项和后项权重值最终得到预测值。
图中的RNN单元可以是普通的RNN,也可以是GRU,LSTM,不过以LSTM为基础的双向神经网络常用与实践中。
不过双向神经网络的缺点也是非常明显的,他需要输入完整的序列才能进行训练,例如语音识别,它需要等用户讲完之后才能开始进行测试,这是它的比较大的弊端。
Deep RNN
对于深层RNN网络结构,如上图,是一个三层的RNN。深层RNN不建议构建很多层,3层其实就很深了,因为在横向的时间维度上,它就已经有了很长的序列,如果更深的话,就会非常耗费计算资源。
但是对于上图,我们其实可以像这样建立深层的网络,他们在水平方向上不连接,这样的网络结构更常见一些。
同样地,里面的RNN单元我们也可以使用GRU,LSTM,双向RNN,双向LSTM等。
词汇表示
one-hot编码的缺点是:它吧每个词都孤立起来,这样使得算法对相关词的泛化能力不强,这是因为每个单词向量的内积都为0,所以算法并不能学习到他们之间的任何关系,例如:苹果和橙子,男人和女人。
我们应该使用特征化的表示:词嵌入
word embedding
如上图,这种词嵌入算法可以使相近的概念学习到的特征也比较类似。
词嵌入的迁移学习
- 1、从非常大的文本集中学习词嵌入(或者从网上下载预训练好的词嵌入模型)
- 2、将词嵌入前移到自己的新的只有少量数据集的任务中
- 3、利用自己的数据对词嵌入进行微调
词向量的类比
如上图,对于含义相似的单词,man,woman,king,queen,他们之间的差是非常相近的,如果要预测queen的词向量,可以通过上图中第三个方框的相似函数来计算。
余弦相似度
Word2Vec
skip-gram模型:使用中心词来预测目标词(即上下文的词)
从上面就可以看出,输入一个one-hot到网络,乘以一个权重矩阵w1(也就是词汇表,它刚开始是随机的值)得到该中心词的词向量,也就是得到了隐藏层的向量,接着再乘以一个权重矩阵w2,得到该中心词与词汇表中每个词的关系,经过softmax后得到概率。因此w1与w2是需要经过学习的参数。
skip-gram最大的问题在于在softmax计算时,分母存在大量的计算,非常耗时。负采样可以很好地解决效率问题。
负采样
负采样是通过选取词对,一对正采样,k对负采样,并且正采样是句子中相邻的两个词。因此,该问题其实就变成了一个二分类问题。
GloVe算法
情感分类
最简的情感分类方法是求平均的方法,即利用one-hot乘以词向量矩阵得到所有输入的词向量后求平均,并输入到softmax中进行多分类。这样适用于任意长短的评论,但是由于过于简单,所以在准确度上存在较大的问题。
那么,就可以使用RNN来做情感分类,因为它应用了更大的数据集来得到词嵌入,那么就可以更好的泛化,例如:如果absent没有出现在标记的训练集(即做情感分类的数据集,而不是词向量的训练集),它仍可以判断这是一个bad评论
Seq2Seq
beam search定向搜索
对于上面的解码器,将编码器生成的向量输入到解码器当中后,它会一个单词一个单词进行预测,也就是所谓的贪心算法,下一步只会找到最适合的单词,但这样就会存在问题,例如:如果要预测she is visiting…,但当预测she is后,she is going的概率是比she is visiting大的。
而beam search是一次预测出B(B>=2)个单词,编码器输出向量到解码器后,解码器预测最有可能是第一个位置的B个单词,然后分别通过他们预测第二个单词,如果词汇表共有10000个单词,那么最后就会得到B0000个单词对,从这里面根据概率再找B个最有可能的第二个单词,这样以此类推。
Attention model
长序列存在的问题
对于seq2seq模型,它通过对整个句子作编码,再解码,将其翻译成另一种语言,这对于短句子而言非常适用。但是一旦句子过长,它的准确性会越来越滴,因为它不能将非常长的句子的信息都详细存起来。下面的注意力模型翻译句子就会像人类一样,一次只看一部分,再翻译下一部分。
注意力机制的最主要思想是当预测下一个单词时,需要花多少注意力,也就是权重在输入的那些特征向量上,即下图中的 C<t>=Σα<t,t′>∗a<t′>C^{<t>}=\Sigma α^{<t,t'>}*a^{<t'>}C<t>=Σα<t,t′>∗a<t′>,等号右边的α即为注意力权重。
下面对计算过程简单介绍
从上图的方框3可以看出,attention的编码器是双向rnn结构,每个节点都有对应单词的特征向量 a前项a_{前项}a前项 和 a后项a_{后项}a后项 , 解码器是一个单向的RNN,它的每个输出是基于每个输入的特征向量乘上对应的注意力权重,即需要花多少注意力在那些特征向量上。从方框1和2可以看出,注意力权重 a<t,t′>a^{<t, t'>}a<t,t′> 是通过 e<t,t′>e^{<t, t'>}e<t,t′> 的softmax计算的,而 e<t,t′>e^{<t, t'>}e<t,t′> 的计算如框2所示,是根据 s<t−1>s^{<t-1>}s<t−1> 以及 a<t′>a^{<t'>}a<t′> 计算的,其中s<t−1>s^{<t-1>}s<t−1> 表示上一个节点隐藏层的值,也就是说该节点的需要放多少注意力在特征向量上主要有上次预测的节点决定。
吴恩达深度学习视频笔记相关推荐
- B站吴恩达深度学习视频笔记(1-14)——实战3:识别猫图
前言 还记得在前几节课中吴恩达老师讲述如何识别一张图片,以及电脑识别图片的原理吗?这篇笔记中就会用到之前笔记1-14除了机器学习框架以外几乎所有的知识,来完成入门阶段终极实战--识别猫图. 我们即将使 ...
- 吴恩达深度学习视频笔记(持续更新)
深度学习符号字典:http://www.ai-start.com/dl2017/html/notation.html 文章目录 第一章节:最简单的神经网络 逻辑回归Logistic Regressio ...
- Mini batch梯度下降法(吴恩达深度学习视频笔记)
深度学习并没有在大数据中表现很好,但是我们可以利用一个巨大的数据集来训练神经网络,而在巨大的数据集基础上进行训练速度很慢,因此进行优化算法能够很大程度地增加训练速度,提升效率. 本节,我们将谈谈Min ...
- 737 页《吴恩达深度学习核心笔记》发布,黄海广博士整理!
点击上方"AI有道",选择"置顶"公众号 重磅干货,第一时间送达 深度学习入门首推课程就是吴恩达的深度学习专项课程系列的 5 门课.该专项课程最大的特色就是内容 ...
- 深度学习入门首推资料--吴恩达深度学习全程笔记分享
本文首发于微信公众号"StrongerTang",可打开微信搜一搜,或扫描文末二维码,关注查看更多文章. 原文链接:(https://mp.weixin.qq.com/s?__bi ...
- 吴恩达深度学习课程笔记(初步认识神经网络)
吴恩达深度学习课程笔记1 课程主要内容 1.神经网络与深度学习介绍 2.Improving Deep Neural Networks:超参数调整,正则化,优化方法 3.结构化机器学习工程:比如如何分割 ...
- 免费分享全套吴恩达深度学习课程笔记以及编程作业集合
分享吴恩达深度学习全套 笔记 笔记来源于吴恩达老师课程中口述翻译,并包含板书.可以取代看视频,做到更快速学习. (部分目录) (部分目录) (板书) 编程作业 扫描二维码后台回复"0&quo ...
- 吴恩达深度学习课程笔记(四):卷积神经网络2 实例探究
吴恩达深度学习课程笔记(四):卷积神经网络2 实例探究 吴恩达深度学习课程笔记(四):卷积神经网络2 实例探究 2.1 为什么要进行实例探究 2.2 经典网络 LeNet-5 AlexNet VGG- ...
- 吴恩达深度学习课程笔记-3
吴恩达深度学习课程笔记-3 src="http://nbviewer.jupyter.org/github/HuaGuo1992/Blog/blob/master/%E5%90%B4%E6% ...
最新文章
- [转贴]超强悍!一位操盘手的惊人语录
- memset用法详解
- 一口气,米哈游连告B站7次
- 深入理解Objective-C:Category
- centos7如何安装samba-client_如何在基本图形模式下最小化全新安装CentOS 7?
- centos7 3行命令安装powershell
- 2 0 2 0 年 第 十 一 届 蓝 桥 杯 - 省赛 - Python大学组 - A. 门牌制作
- java 动态编译源代码
- 遭遇“烧钱瓶颈” 优酷成本结构堪忧
- .NET Core跨平台图形处理库ImageSharp
- 2数据库表增加一个字段_14个实用的数据库设计技巧!
- wince6下usb摄像头(UVC)使用指南
- android 传感器的学习
- Ceph 故障排查笔记 | 万字经验总结
- Node.js七天搞定微信公众号(又名:Koa2实现电影微信公众号前后端开发)- 问题汇总
- redux中导入createStore中间有条线,解决方案及redux的使用。(react)
- 【python知识】win10下如何用python将网页转成pdf文件
- 注塑机摆放间距多少合适_注塑机一般的说法比如多少多少g,对应的型号,拉杆间距,锁模力的对应表谁能给我张...
- Python软件编程等级考试一级——20220915
- 【目标检测·yolo系列】YOLOV3目标检测论文笔记(参考 同济子豪兄的解读)