雷哥的博客


  • 首页

  • 分类

  • 归档

  • 标签

第五门课-第一周

发表于 2018-11-27 | 分类于 深度学习 , 吴恩达课程总结

[习题练习]
Building+a+Recurrent+Neural+Network+-+Step+by+Step,主要讲是一步一步构建RNN基础网络和LSTM网络,理解运作原
dinosaurus-island(character-level language model,练习使用基础RNN模型或者LSTM模型,学习一些文本,然后生成新的文)
Improvise-music with an LSTM network,主要使用LSTM网络生成音

循环神经网络基础

RNN背景

  • 什么是序列问题?
    比如语音识别,输入是一段音频,要求输出是一段文字Y。或者情感分析,输入评论,要求输出几颗星等。本质输入都是一段序列内容,其实就是X->Y的映射问题
  • 序列问题特点?
    可以看见,有些序列问题X,Y长度一致,有些不一致…
  • 为什么不用标准神经网络处理序列问题:
    • 输入输出不定长
    • 序列上一些位置已经学到的文本信息内容不能在其他位置共享
      • 比如如果神经网络已经学习到了在位置 1 出现的 Harry 可能是人名的一部分,那么如果 Harry 出现在其他位置,比如$x^{< t >}$时,它也能够自动识别其为人名的一部分的话,这就很棒了。这可能类似于你在卷积神经网络中看到的,你希望将部分图片里学到的内容快速推广到图片的其他部分,而我们希望对序列数据也有相似的效果。和你在卷积网络中学到的类似,用一个更好的表达方式也能够让你减少模型中参数的数量
      • RNN传递一个激活值到下一个时间步中进行计算,所以能够解决这个问题,适用于序列问题
  • 注意项:
    • $a^{<0>}$通常使用零向量作为零时刻的伪激活值
    • 注意多种不同的参数$W_{ax},W_{aa},W_{ya}$

前向后向计算

  • RNN cell
  • 前向传播

    • t时刻:
      $a^{< t >}=g_1(W_{aa}a^{t-1} + W_{ax}x^{t} + b_a)$
      $\hat y^{t} = g_2(W_{ya}a^{< t >} + b_y)$
    • 激活函数通常使用tanh,y输出激活函数视情况而定
  • 后向传播

    • 对于一个元素的损失函数:
      $L^{< t >}(\hat y^{< t >},y^{t}) = -y^{< t >}log\hat y^{< t >} - (1-y^{< t >})log(1-\hat y^{< t >})$
    • 整体序列的损失函数,就是将各时间步的损失值函数相加
      $L(\hat y,y) = \sum_{t-1}^{T_x}L^{< t >}(\hat y^{< t >},y^{t})$
    • 同样也是使用bp算法求偏导,进行后向计算,不用的是RNN会有多个输出$\hat y$

不同类型的RNN

  • 输入输出长度分类:
    • many-to-many:机器翻译
    • many-to-one:情感分类
    • one-to-one:小型标准神经网络
    • one-to-many:音乐作曲

语言模型和序列生成

  • 语言模型:语言模型就是它会告诉你某个特定的句子它出现的概率是多少

    • 语言模型做的最基本工作就是输入一个句子,准确地说是一个文本序列,然后语言模型会估计某个句子序列中各个单词出现的可能性。
  • RNN模型基础结构

    • 将每个单词都转换成对应的one-hot向量,也就是词典中的索引,其中也要注意EOS(结尾符),UNK(未知单词),标点符号
    • 每一层$\hat y$的输出,都是预测该层输入词在字典中出现的概率
    • 最后的输出是每层条件概率的乘积

对新序列采样

  • 作用:一个序列模型之后,要想了解到这个模型学到了什么,一种非正式的方法就是对新序列采样
  • 方法:序列模型模拟了任意特定单词序列的概率,我们要做的就是对这些概率分布进行采样来生成一个新的单词序列
  • 如何结束:1.字典中有EOS,2.时间步的多少
  • 基于词汇和字符的模型,各有优缺点

RNN中的梯度问题

  • 梯度消失:
    • 网络的输出$\hat y$得到的梯度很难传播回去,很难影响靠前层的权重,很难影响前面层(编号 5 所示的层)的计算
    • 基础RNN也同样存在这个问题:前一层名词的单复数和难影响到厚层的动词单复数,很难传递(也是因为输出很难传到前层)
    • 如何解决:看后面的GRU和LSTM
  • 梯度爆炸:
    • 比较容易发现,比如看见很多NaN,或者不是数字的情况,意味着数值溢出
    • 解决方法:梯度修剪,就是观察你的梯度向量,如果它大于某个阈 值,缩放梯度向量,保证它不会太大,这就是通过一些最大值来修剪的方法,并且具有好的鲁棒性

GRU(门控制单元)

基础

  • 新增变量:记忆细胞cell
    • 计算逻辑:如下图3标记中,$\hat C^{< t >} = tanh(W_c[C^{< t-1 >}, x^{< t >}] + b_c)$
    • 作用:提供了记忆的能力,比如说一只猫是单数还是复数,所以当它看到之后的句子的时候,它仍能够判断句子的主语是单数还是复数
  • 新增变量:门控制变量
    • 计算逻辑:如下图3标记中,$\Gamma _u^{< t >} = tanh(W_u[C^{< t-1 >}, x^{< t >}] + b_u)$
    • 作用:决定什么更新记忆细胞,是由sigmoid激活,如果为1,才更新C值,所以前面层次的值就可以一直保持到后面
  • 记忆细胞更新逻辑:
    如下图5标记中,逻辑门为1才更新C值(或者接近1值,新值C的权重更大)
    $C^{< t >} = \Gamma _u\hat C^{< t >} + (1-\Gamma _u) C^{< t-1 >}$

  • 如何有效控制梯度消失问题
    因为 sigmoid的值,现在因为门很容易取到 0 值,只要这个值是一个很大的负数, $\Gamma_u$值很容易为0,这种情况,就会变成$C^{< t >}=C^{< t-1 >}$,所以记忆细胞的值很好的被维持了。这就是缓解梯度消失的关键

其他

  • 同时记忆细胞c可以是多维向量,这样可以记忆很多的内容
  • 通过完成的GRU还会有一个相关门:这个相关门告诉你计算出的候选值$\hat C$和$C^{< t-1 >}$有多大的相关性
  • $\Gamma _r^{< t >} = tanh(W_r[C^{< t-1 >}, x^{< t >}] + b_r)$

LSTM(Long short term memory)

基础

  • LSTM-cell
  • 遗忘门($\Gamma_f$),让记忆细胞去选择更新新的候选值还是遗忘旧的值
    $C^{< t >} = \Gamma_u\hat C^{< t >} + (1-\Gamma_f) C^{< t-1 >}$
  • 输出门($\Gamma_o$), $a^{< t >} = \Gamma_o*tanh(c^{< t >})$
  • LSTM重要公式及前向传播:

  • 反向传播:就是BP算法,由后向前,对每一个参数求偏导数,对门$\Gamma$,参数W,偏置b,以及最后的隐藏状态,记忆细胞,输入x

  • GRU与LSTM
    都能够捕获更加深层的神经网络,GRU的优点是比LSTM简单一点的模型,只有两个门,在计算上也运行得更快。但LSTM在历史上是更优的选择

双向RNN

  • 背景:有些场景不仅需要参考过去,还应该参考未来
  • 缺点:总数需要一段完整的内容
    • NLP一般就比较适合,应该经常能够获得完整的文章
    • 语音翻译等就不是很适合了,因为要获得已经完整的一段话语通常不是很现实

第四门课-第四周

发表于 2018-11-26 | 分类于 深度学习 , 吴恩达课程总结

习题代码:Face-Recognition and Neural-Style-Transfer

人脸识别(Siamese网络)

  • 一般分为验证和识别两步

  • One-shot learning

    • 背景:人脸识别的train是很少的图片,并且一般只给你一张图片你就得识别出来,并不是想普通的图片识别一样,有很多的样本。比如新加入的新同事,之前并没有样本
    • 方法:和图片库已有的少量图片做相似度比较
    • 如何实现:可以使用Siamese network
  • Siamese network

    • 将图片映射为n维向量,将$f(x^{(1)})$看做是$x^{(a)}$的编码,然后通过比较不同图片的编码的差别来区分是否是同一个人
    • 那么怎么判断输出的图片编码好与差呢?可以使用下面的三元组(Triplet)损失函数达到目的
  • Triplet损失

    • 定义:需要Anchor图片,Postive图片,Negative图片,简写为A,P,N
    • 避免网络输出无用,有一个$\alpha$超参数,控制A,P和A,N之间的差距
      $||f(A)-f(P)||^2 - ||f(A)-f(N)||^2 + \alpha <= 0$
    • Loss function
      如果目标已经ok,那么值为0,可以看见各种场景只需要找到合适的损失函数,然后下面的步骤都类似(用梯度下降等方法求出极值)
      L(A,P,N)=max($||f(A)-f(P)||^2 - ||f(A)-f(N)||^2 + \alpha$, 0)
    • 训练数据需要注意的地方
      • 需要注意训练集的对一个人需要多张照片,至少要满足Anchor,Posistion
      • 尽量选择d(A,P)$\approx$d(A,N),这样能够学习到更多内容,如果差别太大,很容易判断,不能学习到有效数据
    • 算法步骤:
      • 目的,学习到一种好的编码映射f(x)
      • 1.定义好A,P,N数据集
      • 2.用梯度下降最小化我们之前定义的代价函数J
        • 这样做的效果就是用反向传播来学习到一种编码方式,如果是同一个人,那么d就很小,如果是不同的人,那么d就会很大

面部识别与二分类(Siamese变种)

  • 原始Siamese网络是直接计算编码的L2距离,这里可以将编码经过激活函数,比如sigmoid的处理,来实现分类的目的
  • $\hat y = sigmoid(\sum_{(k=1)}^{128}w_i|f(x^{(i)})_k - f(x^{(j)})_k|+b)$,当然$|f(x^{(i)})_k - f(x^{(j)})_k|$这一部分还可以替换为其他的相似度计算方法,比如$\chi$平方相似度
  • 还注意下它的输入为成对图片的输入,比如两张同一个人的照片,输出为1。两种不同人的照片,输出就为0

神经风格转换

  • 什么是神经风格转换
  • 什么是深度卷积网络(需要直观感受到不同层次的网络提取的特征,深层和前层是如何计算的)
    • 相关概念
      • 一个神经元就表示一个filter的及输出,在输出中就表示一个通道,也代表一个特征,经常会有多个通道,就是多种filter,代表不同的特征
      • 神经单元激活最大化,比如激活函数是sigmoid,我理解只有在边界两端的值,才能有更明确的分类结果,相应的特征表现也最好
    • 各层的特征
      • 第一层:主要表现对一些线条,边缘或者特点的颜色等低维特征比较感兴趣
      • 第二层:通常能够看到图片更大的区域,能够检测到更复杂的模型
      • 后面的第三层,第四层….等就能够检测到更具体的事物了

神经风格迁移系统的(Cost function)

要构造一个神经风格迁移系统,我们需要给生成的图像定义一个代价函数

  • J(G)=$\alpha J_{content}(C,G) + \beta J_{stype}(S,G)$
  • 内容代价函数:就是计算原始图片和生成图片的某一层的激活值的相似度
    • 选取一个预训练模型,比如是VGG卷积模型
    • 选取中间层l,一般不会太深,也不好太浅
    • 计算一对一对的训练数据(一张原始图片,一张生成图片),分别计算在l层的激活值,然后对比他们的相似度(可以用L2范数)
    • $J_{content}(C,G)=\frac{1}{2}||a^{[l][C]}-a^{[l][G]}||^2$
  • 下面是风格代价函数的介绍
  • What you should remember:
    • Neural Style Transfer is an algorithm that given a content image C and a style image S can generate an artistic image
    • It uses representations (hidden layer activations) based on a pretrained ConvNet.
    • The content cost function is computed using one hidden layer’s activations.
    • The style cost function for one layer is computed using the Gram matrix of that layer’s activations. The overall style cost function is obtained using several hidden layers.
    • Optimizing the total cost function results in synthesizing new images.

风格代价函数(style cost function)

  • 定义:现在你选择了某一层𝑙,比如这一层去为图片的风格定义一个 深度测量,现在我们要做的就是将图片的风格定义为𝑙层中各个通道之间激活项的相关系数
  • 理解CNN中的神经元
    • 一个神经元就表示一个filter的及输出,在输出中就表示一个通道,也代表一个特征
      • 这个红色的通道(编号1)对应(编号 3),它能找出图片中的特定位置是否含有这些垂直的纹理
      • 而第二 个通道也就是黄色的通道(编号 2),对应这个神经元(编号 4)
  • 理解相关系数
    • 定义:相关系数这个概念为你提供了一种去测量这些不同的特征的方法,比如这些垂直纹理,这些橙色或是其他的特征去测量它们在图片中的各个位置同时出现或不同时出现的频率
    • 意义:通过测量,你能得知在生成的
      图像中垂直纹理和橙色同时出现或者不同时出现的频率,这样你将能够测量生成的图像的风格与输入的风格图像的相似程度
  • 风格矩阵(Gram matrix)(Correlation between filters):
    • 通过对k和k’通道中中所有的数值(注意是激活值,不是各个filter的值)进行计算就得到了𝐺矩阵,也就是风格矩阵
    • 如果不相关,那么$G^{[l]}_{KK’}$会比较小,否则就会很大 code:
    • 分别计算出G和S图片的矩阵,然后带入下面的cost function这将得到这两个矩阵之间的误差
  • Cost function
    • 直观感受:就是对两张图片分别计算不同通道的输出的相关性G1,G2(上面的风格矩阵)(Gram matrix就展示的不同激活值(filter输出)之间相似度,有点像协方差),然后再优化使这两张图片的不同通道的值差距减小,即类似于$\sum(G1-G2)$,cost越小,表示两越相近
    • 一般只计算其中一层的cost,当然可以对每层都这样计算cost,然后相加,但要复杂一些
    • 这是两个矩阵间一个基 本的 Frobenius 范数

CNN同样适合于一维到三维

CNN同样适合于一维和三维数据,但对一维数据(和时间序列相关的)的处理,更常见的使用RNN

  • 一维
    比如心电图信息处理等,它的卷积核更像是一维的滑动窗口一样
  • 三维
    比如在CT图像上,一张图片就是人体的一个切面,当然这种情况它的卷积核也是三维的,并且也可以有通道数

第四门课-第三周

发表于 2018-11-22 | 分类于 深度学习 , 吴恩达课程总结

习题代码地址(主要是YOLO实现)

目标定位

  • 定义:
    在分类问题输出y的基础上增加物体位置的输出:$b_x,b_y,b_w,b_h$及中心坐标及宽高
  • Loss函数的定义:
    输出为以y向量,采用平方误差的策略,$L(\hat y,y)=(\hat {y_1}-y_1)^2 + (\hat {y_2}-y_2)^2 + (\hat {y_3}-y_3)^2 + … +(\hat {y_8}-y_8)^2$

特征点检测(Landmark detection)

  • 神经网络可以通过输出图片上的特征点的(x,y)坐标来实现对目标特征的识别,例如人脸检测或者snapchar上的头带皇冠的功能:
    • 人脸检测:对人脸进行64个特征点的检测,总共输出129维的向量,$y_1$表示又没有人脸,然后是64个坐标($x_i,y_i$)
    • Snapchat:也是通过检测头的上部特征点
    • 或者是人的姿势,也是一些特征点

目标检测(Object detection)

  • Sliding window detection
    一般会获取三次不同大小的窗口,然后循环图片进行检测
  • 计算成本
    计算成本比较大,步幅大一点能够缩小成本,但是效果不好。步幅小一点检测效果当然会很好,但是计算成本会很大

卷积的滑动窗口实现

  • 需要将全连接进行卷积改造
  • 实现要点:
    • 如果按照原始方法,进行四次切割,然后将14x14的图片给CNN,那边就是跑四次CNN,并且中间会有很多重复计算
    • 所以用卷积进行替换,将16x16整张图进行卷积操作
      • 最后输出的2x2x4网络,需要理解:每一个1x1x4的网络就是类比的原始方法切分后的图片的输出,所以这里会有2x2就是4种切分方式的输出(可以一步一步卷积过程来理解2x2为什么代表之前的四次切分)
  • 其他28x28举例:
    最终是8x8x4 的输出,原始的表示切割了64次,每一次切割后输出都是4种分类

YOLO算法

  • 背景:卷积滑动窗口也不能输出最精准的边界框
  • 算法:
    • 使用卷积滑动,所以效率比较高
    • 将图片分为3x3,或者19x19,找到对象的中心点所属于的小窗口。然后计算出相对于小窗口的宽带和高度,其中宽带和高度可能会大于1

交并比

  • 背景:如何判断对象检测算法运作良好呢
  • 一般如果Iou大于0.5就算比较理想

非极大值抑制

  • 背景:你的算法可能对同一个对象做出多次 检测,所以算法不是对某个对象检测出一次,而是检测出多次
    比如下面这个图,多个小方框都会说自己内部可能有对象

  • 定义:非最大值意味着你只输出概率最大的分类结果,但抑制很接 近,但不是最大的其他预测结果,所以这方法叫做非极大值抑制

  • 找到一个最大的$P_c$,非极大值抑制就会逐一审视 剩下的矩形,所有和这个最大的边框有很高交并比(IoU),高度重叠的其他边界框,那么这些输出 就会被抑制

  • 算法步骤:

    • 1.得到标记所有边框界,去掉这些边框界中$P_c$很小的,比如0.6,表示出现对象的概率很低
    • 2.找到剩下的边框界中最大的$P_c$,然后去掉和$P_c$重合度最高,也就是IoU比较大的一些边框界
    • 3.在剩下的边框界中重复2步骤,直到每一个边框界都被处理过

Anchor Boxes

  • 背景:对象检测中存在的一个问题是每个格子只能检测出一个对象,如果你想让一个格子检测出多个对象,可以使用Anchor Boxes
  • 思路:而 anchor box的思路是,这样子,预先定义两个不同形状的 anchor box,或者 anchor box 形状,你要做的是把预测结果和这两个 anchor box 关联起来
  • 算法:输出为16维的向量,分别对应2个archor,然后找到和哪个archor的IoU最高,就和谁关联(每个archor会表示对应到哪个对象)

YOLO算法(集成)

  • Train
  • Prediction
    方框1得到右边3的输出,方框2得到右边4的输出,最后得到了每个grid(3x3)都得到了一个16维的向量
  • Non-max supressed output
    • 现在得到了每个grid(3x3)都得到了一个16维的向量,先去掉$P_c$比较低的网格,因为这基本代表无对象(下图1->下图2过程)
    • 对剩下的网格,对每一种类别都使用Non-max supressed方法来确定每个网格对类别的预测
      • 例如:如果你有三个对象检测类别,你希望检测行人,汽车和摩托车,那么你要做的是, 对于每个类别单独运行非极大值抑制,处理预测结果所属类别的边界框,用非极大值抑制来 处理行人类别,用非极大值抑制处理车子类别,然后对摩托车类别进行非极大值抑制,运行 三次来得到最终的预测结果。所以算法的输出最好能够检测出图像里所有的车子,还有所有 的行人(编号 3 所示)
      • 对于每个类别单独运行非极大值抑制

候选区域

  • 背景:CNN会对每个区域都进行计算,是它其中一个缺点,它在显然没有任何对象的区域浪费时间
  • R-CNN:带区域的卷积网络,或者说带区域的 CNN。 这个算法尝试选出一些区域,在这些区域上运行卷积网络分类器是有意义的,不对每个区域进行计算
  • 基本的 R-CNN 算法是使用某种算法求出候选区域, 然后对每个候选区域运行一下分类器,每个区域会输出一个标签,有没有车子?有没有行人?有没有摩托车?并输出一个边界框,这样你就能在确实存在对象的区域得到一个精确的边界框。R-CNN 算法不会直接信任输入的边界框

改进算法

  • Fast R-CNN
    最初的算法是逐一对区域分类的,所以 Fast R-CNN用的是滑动窗法的一个卷积实现,和之前学习的”卷积的滑动窗口实现”类似
  • Faster R-CNN
    • 使用的是卷积神经网络,而不是更传统的分割算法来获得候选区域色块,来解决得到候选区域的聚类步骤仍然非常缓慢
    • 吴恩达老师认为:我觉得候选区域是一个有趣的想法,但这个方法需要两步,首先得到候选区域,然后再分类,相比之下,能够一步做完,类似于YOLO或者你只看一次(You only look once)这个算法,在我看来,是长远而言更有希望的方向,我认为大多数 Faster R-CNN 的算法实现还是比 YOLO 算法慢很多

第四门课-第二周

发表于 2018-11-14 | 分类于 深度学习 , 吴恩达课程总结

习题代码

LeNet5
  • 它是针对灰色图片训练的
  • 架构:CONV-POOL-CONV-POOL-FC-FC-SOFTMAX
  • CONV使用5x5 filter,POOL使用2x2,padding都为0,图片宽高在逐渐减小,信道数在逐渐增大
  • 还有一种模型多卷积,一个池化,多卷积,一个池化…现在也经常使用
  • 经典LeNet5使用了非常复杂的计算方式,每个过滤器都采用和输入模块一样的通道数量,现在一般不会这么做了
  • 使用的是sigmod,不是ReLU
AlexNet
  • 之前在语音方面已经得到了很大的进展,这是这篇论文,让人们觉得深度学习能够对CV有很大帮助
  • AlexNet是更大的网络,大约6000万个参数,而LeNet5大约6万个参数
  • AlexNet能够处理非常相似的基本构造模块(没有理解)?
  • 比LeNet表现另一个原因是使用了ReLu激活函数
  • Multiple GPUs:Alex用了非常复杂的方法使这些层拆分到两个不同的GPU上
  • LRN(Local Response Normalization):选取一个位置,贯穿整个通道,得到256个数字,并进行归一化。局部归一化的动机是,对于13x13的图像中的每个位置来说,我们可能并不需要太多的高激活神经元。也没有理解
  • 网络特点:卷积核除了第一个,全部采用same卷积
VGG-16
  • 和LeNet比,它非常规整
  • 简化了神经网络的结构,卷积层采用same卷积,信道数翻倍。池化层宽带高度都减半(每次池化后宽高缩小一倍,每次卷积后通道数也增加一倍)
  • 16代表包含有16个卷积层和全连接层,确实是很大的网络。但是非常规整,都是几个卷积后跟着一个压缩图像大小的池化层,这一点很吸引人。信道数64-128-256-512…可能认为已经足够大了,就没有再翻倍了
  • 缺点是需要训练的特征数量非常巨大
  • 还有VGG-19,是更庞大的网络,但效果其实和VGG-16差不多
ResNets

可参看习题

  • 解决问题(注意和梯度优化算法指数加权平均的区别)
    网络越深,越容易出现梯度消失问题,因为在反向传播算法就是梯度的时候,和各个层级的系数相关,相乘,所以很容易出现接近于0去情况,所以一开始就很快出现梯度消失问题,导致学习(learning speed)非常慢,性能很差(图上可以看见,越是前面的层级问题越严重)
  • 网络结构:

    • a[l+2]=g(z[l+2]+a[l]),其中a[l]就是残差块,是插在非线性变换前
    • 对于一个普通网络来说深度越深优化算法越难训练,训练误差越来越多。但ResNet表现比较好
    • 因为这种方式有助于解决梯度消失和梯度爆炸的问题,让我们训练更深的网络的同时,又能保证性能
  • 为什么能work?

    • a[l+2]=g(z[l+2]+a[l])=g(w[l+2]∗a[l+1]+b[l+2]+a[l])可见,当使用L2正则化或者其他方法,导致权重w会不断衰减(个人理解就容易出现梯度消失问题),我们直接让w[l+2]=0并且b[l+2]=0,有了残差块,所以a[l+2]=g(a[l])=al中x>0),这样来解决更容易出现的提交消失问题
    • 残差网络学习这种恒等函数非常容易
    • z[l+2]+a[l]由于这里有向量的加减法,所以这两个层的维度必须想办法相对,比较简单的方式是使用same卷积
    • 网络结构:经常多个卷积接一个池化,CONV-CONV-CONV-POOL-CONV-CONV-CONV-POOL……FC-FC-SOFTMAX,无论网络如何,都会进行矩阵维度调整
    • ResNet还提到了使用1*1的卷积,会在后面讲解
Inception(GoogleNet)
  • 网络中的网络已经1x1卷积

    • 改变通道数
  • Incption模块

    • 作用:避免人工确定卷积层中的过滤器类型,或者确定是否需要创建卷积层或池化层
    • 各种大小filter,pool相组合。缺点是计算复杂
    • 1x1卷积(瓶颈层),降低通道数,降低计算复杂性(使用瓶颈层来缩小网络) 使用瓶颈层来缩小网络
  • Inception网络

    • Inception module
    • Inception网络就是将这些模块都组合到一起
    • 隐藏层和中间层也能进行预测,确保了他们也参加特征计算,并且能够防止网络过拟合
      • 看途中的分支(编号2,就是通过隐藏层,编号3做的sotmax预测)
    • 当然也有一些比较新的Inception论文,比如Inception V2,V3等,但都是基于这个搭积木的思想
  • 如果构建自己的CV网络

    • 使用开源的实现方案:使用别人已经训练好的网络结构及权重,通常能够进展得相当快,用这个作为预训练,然后转换到你感兴趣的任务上
    • 如何迁移?主要根据你自己的数据量大小
      • Train数据很少,你只需要训练替换后的你自己的softmax层相关参数,而冻结其他层的所有参数
        • 其他有个技巧,就是把softmax的输入直接存入硬盘
      • 有一定的数据量,冻结的层数就少一点
      • 大量数据,不进行冻结,只是使用这些参数作为初始化参数
  • 数据扩充

    • 镜像对称
    • 随机裁剪(Rotation,Shearing,Local warping)
    • 旋转
    • 彩色转换,就是给R,G,B通道上加上不同的失真值(注意PCA对其影响)
    • 可以用CPU多线程进行数据扩充,然后用GPU训练

第四门课-第一周

发表于 2018-10-14 | 分类于 深度学习 , 吴恩达课程总结

第一周 卷积神经网络

边缘检测
  • 浅层特征可能是是垂直检测,水平检测等初级特征,后面层可能是人眼等高级特征,最后是整个人形等
  • 理解垂直边缘过滤核:
    $
    \begin{cases}
    1-0–1\
    1-0–1\
    1-0–1\
    \end{cases}
    $
    • (1)(3)列正负相互抵消,只能在差异相差很大的不同区域可能保留比较大的特征值,比如在黑白过渡区域等
更多边缘检测过滤核
  • Sobel过滤器
    • 增加了中间的一行元素的权重,这样使得结果的鲁棒性更会高一些
    • $\begin{cases}
      1-0–1\
      2-0–2\
      1-0–1\
      \end{cases}
      $
  • Scharr过滤器(CV中经常使用)
    • $\begin{cases}
      3-0–3\
      10-0–10\
      3-0–3\
      \end{cases}
      $
Padding
  • 解决问题:
    • 每次做卷积的时候,他的图像都会缩小,多做几次卷积就输出的图像会很小
    • 图像边缘的像素,只有一个卷积核会计算到,这样一来角落或者图像边缘的信息发挥的作用就会很小
  • 通常Padding设置:
    • Valid(无padding),normal,same(使输出和输入尺寸一致)
    • 一般考虑到对称性和中心点位置,padding值一般使用奇数值
卷积步长(Strided)
三维卷积
  • 多filter=通道数=特征数=深度(多种叫法)
单层卷积网络
  • 类似神经网络(x->z->(ReLU+b)->a…),可以看出,图像无论多大,卷积核参数都是不变的(这样一定程度能避免过拟合)
池化层
  • 可以理解为卷积核,但是没有参数,比如max pooling,min pooling
  • max pooling理解:
    • 提取最大的数字,可以理解为最突出的特征提取出来,同时如果该局部图像不存在此特征,提取出的值依然很小
    • 4x4就可以看做是特征的集合,最后提取出的9可能就表示然人眼…
    • 超参数(f,s),一般设置(f=2,s=3)或(f=3,s=2),一般很少会用到Padding,只有超参数并没有其他的参数,没有什么需要学习的,可以理解为只是一个静态属性
卷积网络示例
  • 一般分类:
    • 卷积层+池化层 为一层
    • 或者不考虑无参数,无权重的池化层,一层卷积层就为一层
  • 常见模式:
    CONV-POOL-CONV-POOL-FC-FC-FC-SOFTMAX
  • 特点:
    • nh​,nw​会逐渐减小,但是信道会增加
    • 激活值也是逐渐减小,但是不能让减小太快,否则会影响网络性能
    • parameters数量不随输入图片的大小而改变,只能卷积核和全连接层有关系(其中parametr数(208=5x5x8+8)(416=5x5x16+16)不和具体输入图像相关)
    • CV研究的工作就是研究如何整合卷积层,池化层,全连接层
    • 网络架构(类似LetNet5) 过程参数变化情况:
      其中parametr数(208=5x5x8+8)(416=5x5x16+16)不和具体输入图像相关
卷积优点
  • 减小参数
  • 稀疏连接

第三门课-第二周

发表于 2018-10-10 | 分类于 深度学习 , 吴恩达课程总结

进行误差分析:

  • 通过人工check,找出标记错误的样本和总数的百分比,选出比较较大的错误类型进行分析,通常能够帮你找到优化的灵感
  • 深度学习算法对训练集中的随机错误是相对健壮的,如果数据够随机,那么不用花太多时间去修正它们
  • 但是如果这些错误比较理解大,严重影响到你再开发集上的评估能力,那才真有必要去修正下标注
  • Dev/Test集的分布一定要一致,如果需要更改标注,也是一样。训练集倒可以不一致
  • 最后,深度学习工作者一般很少去人工干预,但是建议也看下误差的影响面

快速搭建你的第一个系统:

  • 如果面对的是新应用,这个时候你的目标是得到一个可用的系统,所以可以快速搭建你的系统,然后进行误差分析,找到后面的方向
  • 如果你是老司机,那么可以参考已有的学术论文,已有的架构等构建你的网络

训练集和测试集不同分布:

  • 如果关系App中的图片,即使App的数据很少,也不建议train:webapp,dev/test:app。而建议把一部分收集到的真实数据放入训练集使用train:webapp+app, dev/test:app
  • 例如音频数据训练集有500,000条数据,收集到的真实数据是20,000条,那么组合方式有:
    $\begin{cases}
    train:500,000+10,000\
    dev:5000\
    test:5000\
    \end{cases}
    $ 或者是:
    $\begin{cases}
    train:500,000\
    dev:10,000\
    test:10,000\
    \end{cases}
    $

Train/dev数据不同分布带来的偏差和方差问题

  • 问题现象:如果Train/dev数据不同分布,那么如果发现实际dev loss比train大,那么到底是数据不同分布导致?还是方差问题导致呢?
  • 解决方案:建设一个Train-dev数据集,此数据集合Train数据同分布,来排除是否是方差的问题的问题:
    $\begin{cases}
    Bias:Human level,Train\
    Variance:Train,Train-dev\
    Datamatch:Train-dev,dev\
    \end{cases}
    $
  • 这个时候就有三类问题:1.bias 2.variance 3.数据不同分布,对分布不同问题,没有很好的办法,但有一些建议如下:
    • 人工合成,让你的训练集数据分布接近你的Dev集(比如图像合成)
      • 问题:可能出现数据集局部过拟合
    • 所以如果是数据分布问题导致,一般分析步骤:
      • 仔细观察下Train/dev/test数据特点
      • 想办法收集更多想dev/test的数据

迁移学习

  • 预训练(pre-training):如果你数据比较多,进行全部参数的重新训练,这时你在用图像识别数据去预先初始化,就叫做预训练,或者预训练神经网络权重
  • 微调(fine tuning):如果以后更新所有权重,然后在其他地方训练,有时这个过程也叫微调
  • 如果没有这么多的数据,也可以选择只替换输出层,或者最后两层等
  • 为什么可以这样迁移?
    • 有很多低层次的特征,比如说边缘检测,曲线检测,阳性对象检测等,图像都可以共用的
    • 学到了这些低层次的特征,就能够进一步学习到线条,点,曲面这些知识
  • 适用场景:迁移后的场景,你没有这么多的数据
  • A->B条件:
    • A和B都要有同样的输入,比如都是图像,都是语音等
    • B的数据远小于A
    • 如果觉得A的低层次的特征能够帮助到B

多任务学习(Multi-task learning)

  • 什么叫多任务学习?
    • 一个输入会有多个输出flag:比如CV中,自驾驾驶领域,对一个图片的识别既要判断图片是否有交通灯,又要判断行人,车辆等
  • 多任务学习的条件及意义
    • 类比迁移学习,如果多任务中有共用的低层次的特征,就能够大大提升你的性能,并且比单独每个任务都训练独立的网络效果好很多
    • 类比迁移学习,你多个任务叠加的数据量要比单个任务数据量大很多
    • 要求神经网络足够大,如果过小,那么不见得会比但任务学习有好的性能
  • 应用情况
    • 实际应用中,迁移学习的使用频率比多任务会大很多,可能多任务在CV领域应用得比较多

端到端学习:

  • 什么是端到端学习?
    • 比如说语音识别,从音频输入->特征提取->…->找到音位->…->构成听写文本,中间有多个阶段。端到端学习就是直接x->y的映射,这里就是音频输入->构成听写文本
  • 使用条件:
    • 数据量(x->y)直接映射的数据量足够大
  • 优点:
    • 组件少,中间过程省时省力
  • 缺点:
    • 很多场景x->y直接映射的数据量很少,不好收集
    • 可能会排除了中间很多人为设计的有用的组件,觉得学习算法的指数来源主要有数据和人工设计的东西
  • 例子:
    • 人脸识别的系统,并没有直接使用x->y(门禁照片->身份确认)的识别,因为端到端的直接数据并没有这么多数据集。所以拆分为两步:1.识别人脸照片,2.照片和身份的对应。这种方式是因为拆分后的两步都有大量的数据集
    • X射线评估孩子年龄,直接的数据x->(x摄像图像->孩子年龄)也没有这么多数据,也需要拆分
    • 机器翻译:端到端方法就使用很广泛,因为存在大量的数据,比如英文->法文….

吴恩达课程习题

发表于 2018-09-27 | 分类于 深度学习 , 吴恩达课程习题

习题托管于github,包括学习心得总结

2-ImprovingDeepNeuralNetworks
第二门课 简单神经网络实现

4.1-ConvolutionNeuralNetworks
第四门课-第一周 主要是CNN简单实现

4.2-ConvolutionNeuralNetworks
第四门课-第二周 主要是Keras的介绍和简单ResNet的实现

4.3-YOLO
第四门课-第三周 主要是YOLO算法的的实现

4.4-YOLO
第四门课-第四周 主要是人脸识别和NST算法的的简单实现

5.1.1-Building+a+Recurrent+Neural+Network+-+Step+by+Step
5.1.2-RNN-dinosaurus-island
5.1.3-LSTN-Improvise-music
第五门课-第一周

  • Building+a+Recurrent+Neural+Network+-+Step+by+Step
    • 主要讲是一步一步构建RNN基础网络和LSTM网络,理解运作原理
  • dinosaurus-island(character-level language model)
    • 此练习使用基础RNN模型或者LSTM模型,学习一些文本,然后生成新的文本。比如恐龙名字,然后生成新的名字。比如莎士比亚诗词,然后可以生成新的类莎士比亚风格的诗词,都是利用了RNN模型对长文本序列模型的记忆能力。同时想到是否可以创造新个歌曲,机器人写文章等….I
  • Improvise-music with an LSTM network
    • 此练习主要使用LSTM网络生成音乐,原理和上一练习中生成恐龙名字类似,输入不同的序列数据,学习到参数后,然后生成序列段(将一段音乐分割为snippets,每一个snippet继续切分为30个时间步,然后进行训练)

5.2-Operations-on-word- vectors
5.3.1:Machine-Translation
5.3.2:Trigger-word-detection
第五门课-第三周

  • Machine-Translation
    • 主要练习的注意力模型,将人工理解(Tuesday 09 Oct 1993)的日期翻译为机器理解的日期(1993-10-09)
  • Trigger-word-detection
    • 触发字检测,首先通过生谱图将声音转换为特征向量,然后通过CNN,RNN进行预测判断Trigger word

第三门课-第一周

发表于 2018-09-22 | 分类于 深度学习 , 吴恩达课程总结

第一周

  • 正交化思想

    • 各个变量不相互依赖
    • chain of assumptions in ML:
      training -> dev -> test -> real world
      逐渐向能够拟合real world靠近
    • early stoping不建议使用了,会停止测试集继续拟合,还对开发机有优化,同时影响两个按钮
  • 单一数字评估指标
    准确率,召回率两个指标,往往不好判断。所以F1 Score=$\frac{2}{\frac{1}{P} + \frac{1}{R}}$来看整体的情况
  • 满足和优化指标

    • 优化指标:是需要不断优化的
    • 满足指标:只需要达到一定的门槛值就行了
  • 训练/开发/测试集划分

    • 训练集:用训练集训练不同的模型
    • 开发集:用开发集来评估不同的思路,然后选择一个,不断迭代去改善开发集的性能
    • 用测试集去评估,目的是评估你最终的成本偏差
    • 设立开发集及评估指标,真的就定义了你要瞄准的目标。当然需要在同一分布中设立开发集和测试集
    • 开发集和测试集的数据量大小:
      • 之前数据量都很小的时候,经常是6/2/2,8/2
      • 现在大数据时代,需要看总体数据量大小,比如10000的开发集,测试集就已经够了
  • 什么时候改变开发,测试集指标

    • 第一步为设立目标,第二步为瞄准和射击目标,建议尽快设立一个明确的目标,可以让你的团队高效迭代,改善性能
    • 如果当前指标和数据,和你真正关心必须做好的事情关心不大,那就应该更改你的指标或者你的开发测试集,让它们能更好地反映你的算法需要处理好的数据
  • Bayes optimal error

    • 贝叶斯错最优错误率一般认为是理论上可能达到的最优错误率,也就是说没有任何一个办法能够超越一定的准确度,通常比人类的表现还要好
    • 现象:ML在你超越人类表现之前,进展都会很快,而超越后就会慢下来了
    • 人类对图像,听写音频,或阅读语言等比较擅长,那么就让其做自己擅长的事情,比如人工标注
  • 可避免偏差/方差
    Humans(≈bayes) 1% 7.5%
    Training error 8% 8%
    Dev error 10% 10%
    1%的时候,考虑避免偏差去优化。而7.5%的时候考虑避免方差去优化
  • 理解人的表现&超越人的表现

    • (human->bayes)通过人类水平的估计做出对贝叶斯错误的估计
    • (train-bayes|human:bias)然后通过比较和贝叶斯错误估计的差别来评估偏差
    • (dev-train:variance)通过dev和train的差距来判断可优化方差的距离
    • 如果已经超过了人类的表现,那么后面的优化会比较缓慢
  • Bias/Variance改进方法:

    • Bias:
      • 规模更大的模型
      • 更优惠的算法,比如momentum,RMSProp,adam
      • 新的神经网络的架构,或者更好的超参数等
      • 改变激活函数,或者隐层数量,单位数据等
      • 尝试其他模型,其他架构,如CNN,RNN等
    • Variance:
      • 收集更多的数据
      • 正则化,L2,Dropout等
      • 不同神经网络,超参数等

第二门课-第三周

发表于 2018-09-17 | 分类于 深度学习 , 吴恩达课程总结

3.1调试处理

  • 建议重要性
    • 学习步长α
    • β(Momentum),hide units,mini-batch size
    • layouts,α的衰减率
    • β1​,β2​,ϵ(Adam)
  • 传统ml一般使用grid精确化的选参方法。dl进行随机选择(因为不确定哪些参数重要),采用由粗精确到细的方法,范围逐渐变小

3.2为超参数选择合适的范围

  • 比如说隐藏层层数,可以在坐标轴上2,3,4…选择
  • 对数标尺:$[10^a,10^b]$->(a,b)的均值的选择,例如$\beta$(0.9, 0.999)->$1-\beta$(0.1,0.001)即($10^{-1},10^{-3}$)
  • 需要根据不同表达式来判断各个超参数的敏感度,比如表达式$\frac{1}{1-\beta}$在$\beta$快接近0的时候,就很敏感

3.3超参数训练的实践

  • 资源条件允许,进行多参数共同调整训练
  • 资源不充足,只能一次训练过程中不断进行参数的调整

3.4&3.5&3.6&3.7BN算法思想及应用

  • BatchNorm
  • 整体思想就是将每一层的输入都作为新的输入,标准化,使本层能更好更快的迭代
  • 加入γ,βscale,shift参数是为了再标准化后一定程度上能保持之前学习到的属性,同时可以去掉每一层的b参数(因为0均值的数,对后面添加的任意值都无意义)
  • 它削弱了前层参数的作用与后层参数的作用之间的联系,它使得网络每层都可以自己学习,稍稍独立于其它层,这有助于加速整个网络的学习

3.8&3.9Softmax回归

  • softmax与之前的Sigmoid,Relu不同是因为输入为一个n维向量,输出也为n维向量,并且输出是各个C类的概率
  • 计算方法:
  • 直观理解:多个线性边界函数进行划分
  • 和hardmax做比较,hardmax是输入一向量,输出为(0,1)的向量组,1为最大概率
  • Loss Fun:L(y^​,y)=-∑j=1c​yj​logyj​^​ —> L(y^​,y)=-logy^​c​ : 就是你的训练集中的真实类别,然后试图使该类别相应的概率尽可能地高
  • 应用到神经网络中:其实就是用你的Softmax激活函数来得到a[l]或者说y

3.10深度学习框架

3.11Tensorflow

  • Tensorflow is a programming framework used in deep learning
  • The two main object classes in tensorflow are Tensors and Operators.
  • When you code in tensorflow you have to take the following steps:

    • Create a graph containing Tensors (Variables, Placeholders …) and Operations (tf.matmul, tf.add, …)
    • Create a session
    • Initialize the session
    • Run the session to execute the graph
  • You can execute the graph multiple times as you’ve seen in model()
  • The backpropagation and optimization is automatically done when running the session on the “optimizer” object

Writing and running programs in TensorFlow has the following steps:

  • Create Tensors (variables) that are not yet executed/evaluated.
  • Write operations between those Tensors.
  • Initialize your Tensors.
  • Create a Session.
  • Run the Session. This will run the operations you’d written above.

computation graph

第二门课-第二周

发表于 2018-09-10 | 分类于 深度学习 , 吴恩达课程总结

第二周

第二周主要学习如何优化算法,优化算法能够让你快速训练模型,主要分三类:

  • Mini-batch
  • 指数加权平均(Momentum,RMSprop,Adam)
  • 学习率衰减

2.1 Mini-batch梯度下降&理解

  • 迭代中的cost一定是逐渐减小
  • 三种梯度下降方法(Batch,随机梯度,Mini-Batch),cost图如下:
    • 蓝色为常用Batch方式,梯度不会抖动,缺点是每次迭代是全部样本比较慢,一次迭代只改变一次梯度
    • 紫色为随机梯度,每次一个样本,这种方式cost的计算抖动比较大,在最优点附近也是抖动,并不会停留在此
    • 绿色为Mini-batch方式:
      • 也会出现抖动,因为Cost的计算是随意加入的样本,而每次epom样本都在变化。
      • 它也不一定会在很小范围内收敛或者波动,这种情况就可以考虑减小学习率了
      • Mini-batch size选择,一般选择2n,64–512比较常见
    • 三种方式如何选择,主要还是看样本量,一般随机梯度不会选,如果样本量\<2000,选择Batch,否则选择Mini-batch

2.3 指数加权平均数 & 理解

  • 也叫做移动平均值,就是计算局部范围的平均值:$v_t=\beta v_{t-1}+(1-\beta)\theta_{t-1}$(公式1),其中$\frac 1{(1-\beta)}$代表的所要计算的平均范围(这结论数学推导可查阅资料),比如计算温度的指数加权平均>值 $\theta=0.9$,那么$\frac 1{(1-\beta)}=10$,表示计算的10的平均温度

2.5 指数加权平均的偏差修正

  • 蓝色是没有添加指数加权平均的各个离散点,红色为$\beta=0.9$的加权平均值曲线,绿色为$\beta=0.98$加权平均值曲线,紫色为$\beta=0.98$并且进行修正后的加权平均值曲线

  • 上图可以看见绿色和紫色的区别是在初始阶段,通过公式(1)计算得到的$v_0,v_1$和实际值差别是比较大的,造成了前面几个数不太准确,方法:使用$\frac{v_t}{1-\beta_t}$而不是直接用$v_t$进行评估,可以看见初期比较准确,然后后期$\beta_t$很小,所以$\frac{v_t}{1-\beta_t}\approx{v_t}$

2.6 动态梯度下降

  • 目的:想让在x方向上梯度变化大一点,但是在纵轴方向,来回抖动,想要修正y方向上的抖动。方案:在x,y轴分别使用2.5中的指数加权平均法,对y轴的正负抖动进行抵扣平均,达到y轴抖动较小目的:
    $v_{dw}=\beta v_{dw-1}+(1-\beta)d_{dw-1}$
    W=W-$\alpha v_{dw}$
    $v_{db}=\beta v_{db-1}+(1-\beta)d_{db-1}$
    b=b-$\alpha v_{db}$
  • 假设W,b分别表示x,y轴。看下面计算公式,其中学习率$\alpha$也是有影响的,会在下面介绍

2.7 RMSprop

  • RMSprop是微分平方加权平均:
    $S_{dw}=\beta S_{dw-1}+(1-\beta)d_{dw-1}^2$ 1式
    W=W-$\alpha \frac{dw}{\sqrt S_{dw} + \epsilon}$ 2式($\epsilon$避免非0,一般$10^{-8}$)
    $v_{db}=\beta v_{db-1}+(1-\beta)d_{db-1}^2$
    和动态梯度下降区别:
    • 并不是正负抵消,这些计算的是微分平方加权平均,然后计算梯度变化的时候除以平方根
    • 原理(我理解就是将大值调小,小值调大):
      • 如果dw大,那么1式结果$S_{dw}$也会比较大,但2式结果W就会小
      • 如果dw小,那么1式结果$S_{dw}$也会比较小,但2式结果W就会大
  • RMSprop我理解就是将大值调小,小值调大,个人觉得Momentum(平均后正负抵消)更有效

2.8 Adam优化算法

  • Momentum与RMSprop的结合
  • 其中有多个超参数及默认值α,β1​(0.9),β2​(0.98),ϵ(10−8)

2.9 学习率衰减

  • 如果学习率α一直是一个值,在使用Mini-batch方法的时候,就会在收敛值附件波动,根本原因就是在收敛期α过大,变化过多的原因
  • 动态变化α值,开始α希望较大,收敛时α逐渐变小,类似于绿色曲线,在收敛值较小范围波动

2.10 局部最优问题

  • 担忧深度学习优化算法总是困在极差的局部最优
  • 通常梯度为0的点并不是局部最优点,实际上成本函数的零梯度点,即鞍点
  • 普通优化算法一般都是沿着蓝色点坡度向下,比较难走出平稳期。为什么Momentum,RMSprop和Adam能尽早往下坡出平稳期?
1…4567
雷哥

雷哥

不积跬步无以至千里

66 日志
18 分类
16 标签
GitHub
© 2019 雷哥
由 Hexo 强力驱动
主题 - NexT.Gemini