Andrew Ng_Neural Networks and Deep Learning(待更新)

Andrew Ng's Coursera Course: Neural Networks and Deep Learning

  • 课程1:神经网络和深度学习
    • 第一周:介绍
    • 第二周:神经网络编程基础
    • 第三周:浅层神经网络
    • 第四周:深层神经网络
  • 课程2:改善深度神经网络:超参数调节、正则化、优化
    • 第一周:介绍
    • 第二周:优化算法
    • 第三周:超参数调节、批量标准化/正规化、框架
  • 课程3:结构化机器学习项目
    • 第一周:策略一
    • 第二周:策略二
  • 课程4:卷积神经网络
    • 第一周:卷积神经网络
    • 第二周:深度卷积神经网络——实例探究
    • 第三周:目标检测
    • 第四周:特殊应用:人脸识别、数据风格转换
  • 课程5:序列化模型
    • 第一周:循环序列模型
    • 第二周:自然语言处理与词嵌入
    • 第三周:序列模型和注意力机制
    • 第四周:变形金刚
原创笔记,尊重作者,拒绝转载,参考:吴恩达的神经网络和深度学习课程

课程1:神经网络和深度学习

第一周:介绍

  • 深度学习进步的三大推动力:数据、计算能力、算法
  • 数据分为:结构化数据非结构化数据,接近于人类独有的一些特质的数据一般是非结构化数据,如图像、音频、文字等。
  • 衡量标准验证集/测试集表示了你学习的目标,当这些指标不能满足实际需求时,需要改变
  • 贝叶斯误差是学习网络误差的最小下界,由此根据网络在训练集、验证集上的表现来判断网络是否出现过拟合或者欠拟合,在某些领域一般认为最好的人类误差为贝叶斯误差,但是一旦神经网络的表现优于人类时,神经网络的优化速度会变慢。
  • 偏差和方差分别表征了网络的性能,高偏差表示网络过于简单,有欠拟合的问题;高方差表示网络过于复杂,有过拟合的问题
  • 欠拟合的可选解决方案:使用更加复杂的网络
  • 过拟合的可选解决方案:使用更多的数据、正则化

第二周:神经网络编程基础

  • 逻辑回归
    • 逻辑回归是一种二分类算法,可以看成只有一层,并且只有一个神经元的神经网络,使用sigmoid函数为激活函数,它将线性拟合的值压缩到0-1之间,表示取某个值的概率。
    • 逻辑回归的损失函数为 L = y ∗ l o g y ^ + ( 1 − y ) ∗ l o g ( 1 − y ^ ) L=y*log\hat{y}+(1-y)*log(1-\hat{y}) L=ylogy^+(1y)log(1y^),各个样本的损失函数的平均值即为代价函数
    • 损失函数和代价函数的区别:损失函数针对某个样本,而代价函数针对整个样本
    • 逻辑回归通常不使用随机初始化,因为没有必要,使用随机初始化和直接全部初始化为0关系不大
  • 梯度下降算法是一种最小化目标函数的算法,目标函数通常是代价函数
    • 求解导数/偏导数时,常常使用链式法则,具体在多层神经网络中即体现为反向传播算法,所以本质上还是没有脱离梯度下降算法的范畴:通过梯度来更新参数,以使得代价函数最小
  • 向量化对于机器学习、深度学习中十分重要,它大大提高了算法的运行速度,降低了算法迭代的时间。对于多层神经网路来说,几行代码就可以完成所有样本的所有前向传播。
  • 正规化/标准化/归一化
    • 正规化包括两个方面:使所有样本各个特征向量维度上均值为0,使各个样本各个特征向量方差为1
    • 正规化可以提高某些使用范式的算法精度,因为它消除了某些尺度较大的特征向量维度的对目标函数的决定性作用
    • 正规化可使梯度下降系列算法收敛得更快:在等高线图中,梯度在是等高线切线的垂线上,如果不试用正规化,目标函数/代价函数的等高线椭圆的离心率可能很大,此时收敛曲线可能很曲折,导致收敛时间过长。相反使用正规化之后,各个特性维度在同一个量级上,此时收敛曲线比较直接,收敛速度加快。

第三周:浅层神经网络

  • 每一个神经元的计算包括两个部分,第一部分为:线性计算;第二部分使用将线性计算结果代入激活函数
  • 激活函数的选择有比较多,大部分比sigmoid好
    • sigmoid函数,tanh函数,Relu函数,Leaky Relu函数
    • 激活函数的导数很大程度上决定了最终参数的导数,因此也就决定了收敛速度,如果导数很小很小,则会大大延长收敛速度
    • sigmoid函数导数: a ( 1 − a ) a(1-a) a(1a);tanh函数导数: 1 − a 2 1-a^2 1a2;Relu函数导数为分段常数
    • 激活函数为非线性函数,主要的作用是通过不同的非线性函数叠加,构成复杂的输入输出映射关系,并不断调整参数,使其接近于实际的真实映射
    • 使用线性的激活函数或者不使用激活函数会使得神经网路中所有的神经元等同于一个神经元,输入输出永远都是线性映射关系
  • 在神经网络中使用梯度下降算法需要记住几个公式,虽然这些公式在实际应用神经网络中不会用到,框架都替我们实现了,但是记住这些公式总归没有坏处,甚至你可以去自己推导:$$

第四周:深层神经网络

  • 为什么要使用深层神经网络?浅层神经网络有时候很难表征出复杂的非结构化的对象的特征,通过多层的叠加之后,神经网络能够将这些简单的特征进行组合,进而获得更加复杂的特征,进而提高神经网络的性能。比如一层神经网络可能只能分辨出图像边沿,更多层的神经网络可能可以将之前的特征组合成各个面部器官,最后深度神经网络可能可以将各个器官组成一张人脸,最终达到人脸识别的效果。
  • 深层神经网络于浅层神经网络区别主要在于网络的规模,具体体现在:网络的层数和神经元的数目
  • 神经网络中有参数和超参数,参数是目标函数/代价函数中的参数,而超参数是神经网络中其他可以调节的参数,超参数影响着神经网络的性能,比如梯度下降算法中的学习速率、神经网络的层数、每层的神经元数目、梯度下降算法的迭代次数、激活函数的选择等等

课程2:改善深度神经网络:超参数调节、正则化、优化

第一周:介绍

  • 训练集、验证集、测试集
    • 在大数据时代,7/3或者6/2/2的数据集分配已经不适用了,当数据集的规模很大的时候,验证集和测试集通常不需要那么多,大概10k-100k即可
    • 训练集用于神经网络的训练,验证集用于筛选合适的超参数并用来决定early stopping,测试集用于衡量神经网络的性能
  • 偏差和方差
    • 高偏差表现为训练集误差很大,验证集误差也很大,模型出现欠拟合一般是模型过于简单或者模型错误造成的,此时增大训练集可能意义不大,一般扩大神经网络的规模可以解决
    • 高方差表现为训练集误差很小,验证集误差很大,模型的泛化能力不理想,模型出现过拟合,一般是由于模型过于复杂造成,此时可以使用正则化或者增大训练集的规模的方法解决问题
    • 高偏差&高方差表现为训练集误差很大,验证集误差也很大,但是比训练集误差还要大一档。可以理解为,在某些地方出现过拟合,某些地方出现欠拟合。
  • 正则化是一种解决过拟合的方法,(添加正则化项)主要思路是在代价函数中添加一项正则项/惩罚项,使得在最小化代价函数的时候,同时是得参数尽可能地小,以减小模型得复杂度。
    • 在逻辑回归中,我们一般只惩罚 w w w参数,不惩罚 b b b参数,当然你也可以惩罚b参数,但因为w参数一般具有很高得维度,b是实数,所以效果差不多
    • 惩罚项使用范数(不是数据库里面的范式哦)的形式,一般常使用的是第一范数(绝对值之和)和第二范数(平方和开平方)
    • 值得一提的是,在引入正则化项的同时也引入了一个新的超参数——正则化参数 λ \lambda λ
    • 对于正则化防止过拟合的理解有两种一是它使得各层的参数w趋向于0,因此好像很多的神经元的作用消失了,从而使神经网络的复杂性降低,但是它又都保留了特征向量各个维度的作用;二是在某些激活函数靠近原点的地方线性关系是最强的,而远离原点的地方非线性关系较强,因而缩小参数w使得神经网络的线性增强,神经网络的复杂性降低,同样的它又保留了所有特征向量维度的作用
  • 随机失活法正则化
    • 随机失活法的思想是:每层每个神经元都有一定概率被丢弃,即不考虑该神经元的作用,从而减小神经网络的复杂程度
    • 反向随机失活法的实现是:用一个概率p丢弃过的新矩阵d乘以a(对应位置相乘),使得a中某些位置的值为0,为了保持期望值不变,最后使a除以丢弃概率p
    • 值得一提的是,只有在训练神经网络的时候,才使用反向随机失活法,在测试阶段(也就是在验证集和测试集上)不使用反向随机失活,因为我们不希望我们的输出结果是随机的。并且对于每个样本,每层的d矩阵都可能使不同的。
    • 随机失活只是一种思想,反向随机失活是一种它的一种实现方法
    • 为什么随机失活法有用呢?使用随机失活之后,后层神经元实际上不能够完全依赖于前层某些神经元,因为在训练过程中它可能会失活,这样减少了神经元之间的依赖,迫使神经网络去学习更具有鲁棒性的特征
  • 其他正则化方法
    • 数据增强,在原数据集基础上人工扩充数据
    • 早停法:提早停止训练神经网络,因为一开始初始化的参数可能很小,在迭代多次之后,参数增大,导致出现过拟合现象,早停法即是在合适的迭代次数位置停止训练。早停法有个缺点:它同时对训练误差和验证集误差有影响,即提早停止训练可能是训练误差过大,而不那么提早停止训练则可能导致出现过拟合现象。合适的做法是采用正交化的方式来处理每一个问题
  • 梯度消失和梯度爆炸
    • 梯度消失和梯度爆炸一般出现在深度神经网络中,一般我们初始化参数都很小,而激活函数的导数(以sigmoid函数为例,导数最大值为1/4)最大值都小于1的话,此时根据链式法则,越靠近输入层,神经网络参数的导数/偏导会出现按照指数下降的现象,即梯度消失现象,导致训练速度极慢。同理可以知道梯度爆炸是什么现象了,即梯度指数增长
    • 解决方案:一个解决方案是从初始化权重入手 , R e l u : n p . s q u i r t ( 2 / n [ l − 1 ] ) Relu: np.squirt({2}/{n^{[l-1]}}) Relu:np.squirt(2/n[l1]) t a n h ( ) / s i g m o i d : n p . s q u i r t ( 1 / n [ l − 1 ] ) tanh()/sigmoid:np.squirt({1}/{n^{[l-1]}}) tanh()/sigmoid:np.squirt(1/n[l1])
  • 梯度检验
    • 梯度检验即使用数学逼近的方法逼近实际的梯度,来检测我们写的梯度是否计算出错 ∣ ∣ θ ^ − θ ∣ ∣ 2 ∣ ∣ θ ^ ∣ ∣ 2 + ∣ θ ∣ ∣ 2 \frac{||\hat{\theta}-\theta||_2}{||\hat{\theta}||_2+|\theta||_2} θ^2+θ2θ^θ2
    • 梯度检验不能和随机失活一起使用,因为随机失活会导致梯度随机
    • 梯度检验通常不在训练时使用,只在一开始调试的时候使用,确认正确之后,关闭梯度检验,因为梯度检验会导致训练时间过长,延长整个项目的迭代速度
    • 如果发现某个参数误差很大,要学会定位错误位置。在使用框架时,一般不需要自己手动计算梯度,所以梯度检验似乎用处没有那么大了

第二周:优化算法

  • 梯度下降系列算法:都是使用梯度来寻找目标函数/代价函数的最小值
    • (批量)梯度下降算法:一次使用训练集中所有样本,在数据规模很大时,训练速度满,收敛的比较准确
    • 小批量梯度下降算法:将训练集中样本分为若干份,一次迭代中依次使用分好后的样本进行前向后向传播算法,训练速度加快。收敛得不那么准确,在准确值波动较大(使用学习速率衰减算法来解决)。梯度下降算法和随机梯度下降算法时小批量梯度下降算法的特例
    • 随机梯度下降算法:依次前向后向传播算法只使用一个样本,是比较极端的算法,在准确值附近波动很大
  • 指数加权平均/指数加权移动平均(是为了后面的优化算法打基础)
    • 指数加权平均在拟合数据时,采用加权的思想,即对过去时刻和现在时刻的状态采用线性加权平均,而指数加权的意思是,如果将所有时刻的拟合值表达式代入到其中某个时刻的状态拟合表达式中时,各个加权系数其实是以指数的形式出现
    • 对过去时刻的加权越大,相当于平均的时间越长,拟合的曲线越平缓、滞后;对过去时刻加权值越小,则曲线波动越大
    • 偏差校正:考虑到我们对0时刻的值初始化为0,这样会导致在初始时刻处的曲线拟合效果不好,因此就有了偏差校正:对每个拟合值都除以 ( 1 − β t ) (1-\beta^t) (1βt)
  • 动量梯度下降算法
    • 属于对梯度下降算法优化后的优化算法,将指数加权平均算法应用到梯度的更新中,提高了梯度下降算法的收敛速率
    • 好处一:抵消了无用的梯度方向上的分量,加强了有用的梯度方向上的分量,加快了收敛速度
    • 好处二:在高维空间中,局部最优点比较少(需要所有的维度在该点上向相同方向的凸/凹),比较影响梯度下降算法收敛速率的是梯度很小的点(参数更新很慢)和鞍点,普通的梯度下降算法很容易找到收敛到上述一些伪最优解,而由于动量梯度下降算法可能突破上述的伪最优解
    • w : = w − α ∗ ( β V + ( 1 − β ) d w ) 1 − β t w :=w-\alpha*\frac{(\beta V+(1-\beta)dw)}{1-\beta ^{t}} w:=wα1βt(βV+(1β)dw),对于b同理
    • β \beta β一般取0.9
  • 均方根传播
    • 均方根传播算法与动量梯度下降算法类似,它同样是缩小了梯度较大方向的变化,从而缓和了收敛曲线,此时我们可以增大学习速率来加快收敛速度
    • 均方根名字的由来是:在指数加权平均式子中使用了梯度的平方,而在更新参数的式子中除以该指数加权平均式子。这样使得梯度较大的参数更新变缓和,而对于梯度较小的参数削减得没那么厉害。
    • 为了防止除以0的发生,在根式下面会添加一个超参数 ϵ \epsilon ϵ,一般取 1 0 − 8 10^{-8} 108
    • w : = w − α ∗ d w β S + ( 1 − β ) d w 2 + ϵ w:=w-\alpha*\frac{dw}{\sqrt{\beta S+(1-\beta)dw^2+\epsilon}} w:=wαβS+(1β)dw2+ϵ dw,对于b同理
    • β \beta β一般取0.99
  • 亚当算法(好别扭还是用Adam算法吧==)
    • Adam算法是动量梯度下降算法和均方根算法的结合
    • Adam算法在参数更新的式子中使用动量梯度下降算法中的指数加权平均式替代梯度,并除以均方根传播算法中的指数加权平均式
    • w : = w − α ∗ β 1 V + ( 1 − β 1 ) d w ( 1 − β 1 t ) β 2 + ( 1 − β 2 ) d w 2 + ϵ w := w-\alpha*\frac{\beta_1V+(1-\beta_1)dw}{(1-\beta_1^t)\sqrt{\beta_2+(1-\beta_2)dw^2+\epsilon}} w:=wα(1β1t)β2+(1β2)dw2+ϵ β1V+(1β1)dw,对于b同理
  • 学习率衰减
    • 在上面讲到过,使用小批量梯度下降算法时或者使用随机梯度下降算法,目标函数/代价函数并不会准确地收敛到准确值,而是会在准确值附近摆动。我们讲到过解决方案是使用学习率下降的方法,即在刚开始实施梯度下降系列算法时,学习率较大,而在即将收敛时学习率较小,使其收敛到准确值附近。
    • 衰减的算法有很多,比如 α = 1 1 + d e c a y R a t e ∗ e p o c h N u m ∗ α 0 \alpha=\frac{1}{1+decayRate*epochNum}*\alpha_{0} α=1+decayRateepochNum1α0
    • 值得一提的是,批量、迭代、epoch
  • 局部最优解、鞍点、停滞区
    • 在动量梯度下降算法中我们讲到局部最优解一般不常见,而更多的是鞍点,不够好的算法可能在鞍点处来回震荡而可能无法逃离鞍点,从而得到伪最优解。

第三周:超参数调节、批量标准化/正规化、框架

  • 超参数调节
    • 不是所有超参数的优先级都是一样的,一般优先级最高是学习率,其次是批量下降算法每份样本大小、学习率衰减速率、神经网络层数、隐藏层神经元个数。在Adam算法中一般不调节 β 1 、 β 2 、 ϵ \beta_1、\beta_2、\epsilon β1β2ϵ
    • 调节过程可采用固定间距采样或者随机采样,并且可以采用由糙到细的策略
    • 超参数的尺度上一般不能选择均匀采样,因为我们不是很关心超参数的数值大小,而是超参数的倍数关系(比如在学习率中,不能从0到1之间均匀采样,因为每个地方结果对其的灵敏度不一样,而是在靠近0的地方应多采样,在靠近1的地方应少采样,因此使用对数轴最合适)
    • 在GPU/CPU资源不够多时,你需要细致地观察代价函数/其他指标变化,以随时准备调整超参数,以获得最好的模型;在资源很多时,可以同时开始多个模型的训练,最终观察各个曲线以选取最好的模型
  • 批量标准化/正规化/归一化
    • 前面讲到过标准化,它是一种加快梯度下降算法收敛速率的方法,在这里,使用批量标准化还能使对超参数的选择更加稳定,加快训练深度神经网络
    • 一般来说,对于深层神经网络单纯对输入特征向量使用正规化无法起到很大的加速训练的作用,因为可能中间层某些激活值仍然尺度相差很远,所以理所当然地就想到能不能对所有中间层都做类似于标准化的操作呢?这就是批量标准化的思想
    • 在实践中,我们标准化的一般是z而不是a,并且是对某个批量进行标准化而不是整个训练集,我们使用 z ~ = γ z n o r m + β \tilde z=\gamma z_{norm}+\beta z~=γznorm+β,因为我们不总是想让z的均值为0,方差为1,只要各个维度的尺度相同即可达到加速训练的效果,而有时候,我们需要该向量不总是在0附近,我们可能需要更多的非线性特性来构成足够复杂的输入和输出映射(此处又引入了两个参数而不是超参数,它们直接出现在目标函数/代价函数中,并且在实施梯度下降系列算法中被更新)
    • 有一点需要提一下,在计算过程中,实际上参数b起不到任何作用,偏置的作用被 β \beta β给替代了,所以完全可以不管b。并且批量归一化完全可以适用于前面讲的各种优化算法
    • 批量归一化为什么有效?一个直观和浅显的原因前面已经提到过了,但是这里还有一些深层次的原因:批量归一化将z进行归一化,并且使其均值和方差始终为 γ \gamma γ β \beta β,它限制了前层的更新影响后层数值分布的情况,使得神经网络中每一层受稍微独立于其他层,这使得整个网络更加坚实,有助于整个网络的学习
    • 批量归一化还有个小副作用:有一定的正则化的作用,在归一化(因为不是在整个训练集上)和重新分配均值和方差时加入了噪声,从而和随机失活类似:向每个神经元中添加噪声,这迫使后层不过分依赖前层某些单元,因此又微小的正则化作用(噪声不是很大),但是我们不会因为出现过拟合而特地使用批量归一化来消减过拟合,而是把它当作加速训练方法来使用
  • softmax回归
    • 在多分类中,可以使用softmax。softmax激活函数在神经网络的最后一层,它将线性数值归一化到0-1之间,来表示某一类别的概率。它的输入是一个向量,输出也是一个向量
    • 没有隐藏层的前提下,softmax只能获得线性的决策边界,对于逻辑回归也同理
    • softmax是相对于hardmax而言的,即softmax输出每一类的概率,而hardmax只在最大可能性的类的位置输出1,其他位置输出0
    • 实际上,对于二分类的softmax回归和逻辑回归是等价的(自己去证明,很简单)
    • 当在神经网络的最后一层使用softmax激活函数,应该怎么训练神经网络呢?或者说梯度下降系列算法的目标函数/代价函数要怎么变?损失函数: L = − Σ j = 0 C y j l o g y j ^ L=-\Sigma^C_{j=0} y_jlog\hat{y_j} L=Σj=0Cyjlogyj^,代价函数形式不变, d J d z [ L ] = y ^ − y \frac{dJ}{dz^{[L]}}=\hat{y}-y dz[L]dJ=y^y
  • 深度学习框架:tensorflow、Caffe、Keras、Torch、Theano、MXNet、paddlepaddle、Deeplearning4j
  • tensorflow

课程3:结构化机器学习项目

第一周:策略一

  • 可选的策略:更多的数据、更长的训练时间、使用Adam算法、更大规模的网络、随机失活、L2正则化、不同的激活函数、隐藏层单元···
  • 正交化:我们希望在遇到某个问题时提出的解决方案不会对神经网络的其他性能造成影响,即我们希望每种调节方法相互独立影响神经网络
    • 训练集误差大:更大规模的神经网络、用更好的优化算法
    • 验证集误差大:正则化、扩大训练集的规模
    • 测试集误差大:扩大验证集的规模
    • 实际应用误差大:修改验证集、修改代价函数
  • 使用单一的数字评估指标(以A、B分类为例)
    • 精确率:所有判定为A类人中,真的是A类人的比重,它表明了神经网络”精确程度“的问题,但是有些情况不好:癌症诊断中,患癌症的概率本来就很低,就算神经网络把所有人都认为是”未患癌症“,它的精确率也很高,但显然该神经网络不是很好
    • 召回率:所有A类人中,找出的被判处为A类人的比重,它表明了神经网络”覆盖率“的问题,在某些”宁错杀,不放过“的例子中,要求召回率较高,比如(在铁轨检测中,我们希望把所有的错误都拎出来,但是正确的判成错误的就没事)
    • 分析精确率和召回率,精确率:判定为A和神经网络有关,真的是A也和神经网络有关;召回率:所有A类人和真实世界的统计规律有关,被判为A类人和神经网络有关;
    • F1值:它是准确率和召回率的调和平均数,同时综合了准确率和召回率 F 1 = 2 1 / P + 1 / R F_1=\frac{2}{1/P+1/R} F1=1/P+1/R2
  • 满足指标还是优化指标
    • 有时候,我们无法将所有的指标合为单一的数字指标(也没有必要),此时可以设立满足指标和优化指标
    • 比如,将模型F1值设为优化指标,而将运行时间设为满足指标,此时可以做的一件事是:在满足某些硬性指标的同时,优化模型的性能
  • 训练集、验证集、测试集
    • 在课程二第一周中我们提到过这三个数据集,当时讨论了高偏差、高误差和三者的关系,以及大数据情况下应该如何设立这三个数据集的问题,现在将讨论一些更加深入的东西
    • 验证集表示神经网络的靶心,而测试集则表示神经网络实际的靶心,如果出现验证集和测试集分布不一致,那么可能出现测试集上神经网络的性能很差,解决这一问题的方案是将数据集充分混合之后再份验证集和测试集,使得二者符合同一分布
    • 训练集
    • 在数据规模很庞大的时候,一般很难出现过拟合的问题,所有有时人们不分出测试集,而只有训练集和验证集。但是这绝不是我们所推荐的方式,这里提到只是表明有人这样做
    • 有时候我们对于某些情况很敏感,如在分类时把色情图片当作猫咪图片推送给用户,这种情况是绝对不允许的,通过将色情图片再代价函数中拥有更高的权重来让神经网络对色情图片更加敏感,即重新定义新的指标。另一个例子,可能在之前训练好的模型中A模型优于B模型,但是在实际应用中,可能用户提供的输入分布不同,导致实际应用中B模型的效果反而优于A模型,这就是指标和验证集设立得不合理的表现
  • 贝叶斯最优误差、人类水平误差、训练误差、验证误差
    • 贝叶斯最优误差表现了从X到Y的最优映射/实际映射
    • 很多时候比如在图像识别中,人类水平误差可以大致认为是贝叶斯误差(后面讨论大部分时候把这个当作默认情况),此处人类水平误差应该认为是人类能达到的最小的误差
    • 很多时候,当训练误差大于人类水平误差时,人可以设计出很多工具/方法来帮助神经网络训练,比如:打更多标签数据给神经网络、分析人类学习的过程、分析偏差和方差···但是当误差小于人类水平误差时,这些工具可能就会失效
    • 人类水平误差和训练误差之间的差值表现为可避免偏差,即神经网络可以提升的空间,此时通过使用上面的一些工具/方法可以提升神经网络性能
    • 此处,我们认识偏差和方差有了不同的理解:之前认为贝叶斯最优误差为0,但是很多情况下贝叶斯误差并不是为0,这里将这个观点提出来了

第二周:策略二

  • 误差分析
    • 如果你的神经网络模型在某个方面表现不佳(如猫狗分类中经常把小型犬分为猫咪),那么误差分析应该能够告诉你:是否要对神经网络针对这个问题进行改进?或者说向这个方向改进的价值有多少
    • 在验证集(疑问:为什么不是测试集?)中取一些错误估计的样本,如果发现只有少量的错误是由上述的问题引起的(表示你的模型在这个方面表现得不错),那么就算你在这个方面做了很多的工作和改进,可能对神经网络的性能起不到很大的优化,表明收到性能上限的限制
    • 误差有时来自于错误标注的数据,但是在训练集规模比较大时,神经网络对于训练集中的随机错误标注的鲁棒性较强,一般来说不用进行修改,但是对于系统性的错误标注鲁棒性就没那么强了(比如标注员常常把白色长毛小狗标注为猫咪),那么训练出的模型可能在这个方面会有缺陷
    • 在验证集和测试集中的错误标注数据可以采用误差分析的方法,判断是否有必要在这个方面下功夫
    • 有时,为了提高分析的效率,可以同时对多个方面(小狗、其他猫科动物、图片过于模糊、验证集中的错误标注)进行误差分析,找到最值得改进的方向再继续进行模型迭代,会节省大量的时间
    • 有几个点需要注意:一是验证集和测试集的操作要统一,瞄准靶心和实际靶心要一致;二是一般要同时修改 错判成猫、错判成不是猫,不然算法就不是公平的(第二点两个数量级不同,做起来很难,所以一般不做)
  • 快速搭建系统,迅速迭代它
  • 不同的数据
    • 对于数据来说,一种棘手的情况是:大量的和实际情况不是完全相符的数据,少量非常能够反应实际情况的数据,此时如果将二者完全采用随机混合的方式,此时验证集和测试集并不能完全反应实际需求,导致神经网络实际应用效果不佳。更好的方法是:将很有价值的数据分配给验证集和测试集,即目标一定要明确,而训练集可以分配少量有价值数据或者只分配不那么有价值的数据,这里保持了一个原则:验证集和测试集保持相同分布,而训练集和验证集/测试集分布可以稍微不同
    • 对于训练集和验证集/测试集不同分布的情况下,偏差和方差的分析出现了不同的看法:一般当训练误差不大,而验证误差较大时,我们认为是高方差问题,这样的分析在训练集和验证集/测试集同分布的前提下是合理的,但是如果分布不同,则我们无法知道,这多出的误差是因为过拟合还是因为神经网络没有见过验证集中的数据(即不同分布引起),此时引出了一个概念:训练-验证集,训练-验证集和训练集同分布,不用来训练神经网络,而是用来判断到底是神经网络泛化能力不行,还是因为分布不同而引起误差增大。如果训练-验证集同样误差较大,那么是过拟合的问题,如果训练-验证集误差较小,那么是分布不同的问题(称为数据不匹配问题)
    • 数据不匹配问题没有很系统的解决方法,一般通过人为分析训练集和验证集的不同可以洞察到一些端倪,比如在语音识别中,针对汽车内的语音识别,在验证集中有很多的汽车噪声,而训练集由于数据有限,大部分为普通的人类音频数据,此时我们可以考虑人为在训练集中添加汽车噪声(人工合成数据),但是为了不让神经网络过拟合汽车噪声,我们需要足够多/足够随机到大部分汽车噪声空间的汽车噪声
    • 学到这里我们应该会分析这样的情况:已知人类水平误差、训练误差、训练-验证误差、验证误差、测试误差问题,来判断是偏差问题、方差问题、数据不匹配问题、验证集过拟合问题
  • 迁移学习
    • 迁移学习和之前不同数据的情况类似
    • 在面对相似的问题,如猫狗识别和X光扫描图像识别中,其实都是对于图像的识别,但是往往对于猫狗识别,我们有大量的数据,可以训练出很好的模型,而对于X光扫描图像中,数据少得可怜。介于猫狗识别中可能某些学习到得特征(低层次特征如:边缘检测、曲线检测等)是可以被重用到其他图像识别上得应用,所以诞生了迁移学习
    • 删除训练好的神经网络模型的输出层以及参数,并重新组建新的输出层,并随机初始化参数。使用X光扫描图像数据来重新训练最后一层(即在训练是只更新最后一层的参数),如果有足够多的数据,当然你也可以重新训练所有层(此时之前的训练叫做预训练,之后使用X光扫描数据来训练的过程叫做微调),但是经验来讲,如果数据集不是很大,那么只训练输出层或者最后几层。为什么叫做迁移学习呢?因为你把之前训练好的模型学习到的知识迁移到之后你要训练的模型上面来
    • 迁移学习使用条件:A、B两个问题大体类似,A问题拥有海量数据,B问题数据量较小,A问题训练好的模型对B问题有很大帮助,反之则没有什么帮助
  • 多任务学习
    • 多任务学习的思想与迁移学习类似,都是公用低层次特性,但是迁移学习是串行的,而此处的多任务学习是并行的
    • 一个问题中有多个带训练模型,而各个模型之间同样存在公用的低层次特性,并且各个模型的数据量大体相同(如果相差很大,则可能学到很多其他模型的东西)
    • 多任务学习的使用条件:多个任务公用低层特征,通常要求每个任务的数据量规模相似即其他任务的数据量之和规模远大于你目前专注的任务,使用一个足够大的神经网络使得神经网络在各个任务上都发挥不错
    • 多任务学习得替代是分别给每个任务训练神经网络,多任务学习在计算机视觉中(比如物体检测)用得较多,但是总体平均来讲使用频率比迁移学习低
  • 端到端学习
    • 使用一个神经网络完成从X到Y的映射,这样有好有坏
    • 当拥有大规模数据时,端到端学习效果很好,但是数据规模不是很大时,端到端学习性能可能不如分步流水线系统。如人脸识别:与其直接从图像到身份识别(你可能没有这么多直接从图像到身份识别的数据),先找人脸再做身份识别会使得系统更加简单高效。再比如人手骨X光图像到儿童发育情况:于其直接从图像到发育期情况,先分割骨头长度,再根据骨长做发育预测比较好
    • 优势和缺点:端到端学习避免了人类的成见,神经网络可能从更加有效的方向学习,而非像分步流水系统一样按照人类的思路进行学习。比如再语音识别中:分布流水系统主要从音位的角度学习,而端到端的学习完全避开了这样的限制,在大规模数据时,端到端学习可能性能能够超过人类,而在小规模数据时,人类的辅助设计可能会使得神经网络性能更好,因为人类的知识也”迁移“给神经网络模型,比如再无人驾驶中,涉及路径规划、控制等

课程4:卷积神经网络

第一周:卷积神经网络

  • 计算机视觉
    • 图像识别、目标检测、图像风格迁移
    • 在将图像作为神经网络的输入时,如果使用之前学过的神经网络,那么参数矩阵将会很大很大,此时训练该神经网络需要超大规模的数据来防止过拟合(即神经网络很复杂,需要大量数据),并且训练过程中占用的内存是难以承受的
  • 卷积运算——边缘检测实例
    • 垂直边缘检测、水平边缘检测:对于图像中和滤波器相同大小的矩阵进行乘积和运算,并将结果堆叠起来得到输出结果,当滤波器沿行方向变化时,采用的时垂直边缘检测,当滤波器沿列方向变化时,采用的时水平边缘检测。
    • 以垂直边缘检测为例可以这样理解上述过程:当滤波器大小内的数值在行方向上变化不大时,数值相互会相互抵消,而当在行方向上出现变化,即垂直一列左右像素点值相差较大时,此时乘积和与零相差较远,并且根据乘积和的符号可以区分变化方向,如亮->暗或者暗->亮
    • 为什么在神经网络中使用卷积?一是参数共享,通过之前的边缘检测的例子可以发现,特征检测如果适合于图像的某些区域,那么它有可能也适用于其他区域,我们认为这些参数是公用的。二是稀疏连接,观察卷积运算和滤波器可以看到,实际上输出矩阵的某个位置的值只取决于原矩阵的某些区域和滤波器,而与其他区域无关,相当于我们认为某个区域待提取的特征往往之和该区域附近有关,而无需考虑离该区域很远的区域的值。这些操作我个人认为降低了神经网络的复杂度,去除了冗余参数,让我们使用更小规模的数据集并且防止过拟合
    • 滤波器中各个位置的值实际上是可以作为参数出现在代价函数中,并且通过不断实施正向/反向传播算法以及各种优化算法来更新
    • 多通道卷积:卷积运算时,输入矩阵有多少个通道,滤波器就有多少个通道,并且一个滤波器对应输出矩阵中一个通道
    • 注意此处的卷积没有进行行方向、列方向反转,有些人上述的操作称作互相关
  • 填充
    • 分析上面的卷积过程不难发现两个问题:在进行完卷积运算之后,输出图像的尺寸变小了,并且边缘的图像值进行卷积运算的次数相对较少,填充就是为了解决这个问题而产生的
    • valid卷积意味着不填充、same卷积意味着输出和输入尺寸相同
    • 一般使用边数为奇数的滤波器
  • 卷积步长
    • 即每次卷积运算之后,滤波器向后跳的像素点个数
    • 此时输出矩阵的高度为(向下取整,因为如果出现不够的情况,则不进行计算。同理对于矩阵宽度) n H [ l ] = n H [ l − 1 ] + 2 p [ l ] − f [ l ] s [ l ] + 1 n_{H}^{[l]}=\frac{n_{H}^{[l-1]}+2p^{[l]}-f^{[l]}}{s^{[l]}} + 1 nH[l]=s[l]nH[l1]+2p[l]f[l]+1
  • 单层卷积神经网络
    • 实际上卷积层中各个参数和之前课程中的神经网络存在很明确的对应关系,计算过程只是从实数到矩阵,乘积到卷积。如权重对应滤波器,仍然有偏置单元,仍然有激活函数,但是在卷积层中,其参数个数一般很少,前一层只有通道个数会影响下一层参数个数
    • 单层卷积神经网络实际上只有卷积层,如下图,其中各个层的矩阵大小如何对应和计算是很重要的,对于理解卷积层及其操作大有脾益
多通道矩阵1
多个尺寸相同的滤波器
多通道矩阵2
  • 深度卷积神经网络
    • 很多超参数:填充数、卷积步长、滤波器
    • 卷积层:前面大量介绍了
    • 池化层:池化主要是为了减小模型大小、提高计算速度、提高模型的鲁棒性。其中有 最大池化和平均池化,池化不需要学习参数,即使用反向传播算法时,没有需要更新的参数。只有超参数,并且池化一般padding为0,即不使用padding。值得一提的是,池化并不会改变输入输出矩阵的通道数,它是对每个通道独立处理和输出
    • 全连接层:全连接层一般在靠近输出的地方,最后输出层根据二/多分类来选择逻辑回归还是softmax回归
    • 完整的卷积神经网络实例(与经典卷积神经网络leNet-5类似),当卷积神经网络向输出移动的时候,多通道矩阵的尺寸通常会降低,而通道数会增加,在全连接层每层神经元个数也会逐渐减少。通常池化层跟在一个/多个卷积层后面,并且一般不把池化层看出单独的一层,因为池化层没有需要训练的参数
输入
conv1
pool1
conv2
pool2
FC3
FC4
softmax/逻辑回归

第二周:深度卷积神经网络——实例探究

  • 写在前面:本节只记录思路和特点,经典论文要去看,学会找论文、找开源代码,再现经典
  • 经典的卷积神经网络
    • leNet-5,输入使用灰度值图像,使用了平均池化以及sigmoid/tanh激活函数,输出层使用softmax回归,其他与上面的神经网络架构类似,采用了conv+pool的策略,池化后使用了非线性函数处理。有6万+个参数,属于规模较小的卷积神经网络,随着神经网络的加深,矩阵尺寸减小,通道数增多。注意:论文较老,中间有些细节方法现在不用了,精读第二段,泛读第二段
    • AlexNet,输入-->(conv-->pool)*2-->sameconv*3-->pool-->fc*2-->softmax,使用Relu激活函数,有6000万+个参数
    • VGG-16Net,输入-->(conv*2-->pool)*2-->(conv*3-->pool)*3-->fc*2-->softmax,简化了神经网络结构(很有规律)
  • 残差网络,对非常深的神经网络发挥了它独有的作用,前面学到过:深度神经网络容易出现梯度消失和梯度爆炸的问题,并且没有非常好的解决方案,并且当神经网络的深度增大到一定程度时,神经网络的训练难度增加,此时理论上神经网络规模越大越好,但是实际上训练误差会增大
    • 残差块是残差网络的组成单元,第l层的激活值直接加到第l+2层中激活函数中的自变量中,这条路径与主路径不同,属于浅层到深层的捷径,这样的连接称为跳跃连接。值得注意的是,此处直接相加可能会有向量维度不匹配的问题,解决方案则是要么输出时让二者维度相同,要么用一个转换矩阵点乘在l层激活值向量,当然这个矩阵可以是参数或者固定的,这里重要的是残差块的思想
    • 为什么残差网络有用,在使用L2正则化时,参数会被压缩到趋于0,此时该层的激活值几乎取决于浅层的激活值,在使用Relu激活函数时,该层激活值几乎等于浅层激活值,相当于把深层神经网络的深度降低了,此时残差网络的真正深度还是没变,但是训练网络时变得更加简单了,因而可能提高深度神经网络的性能
  • 1x1卷积不能改变输入矩阵和输出矩阵的尺寸,但是可以调节输出矩阵的通道数,并且增加了一个非线性化过程
  • 盗梦空间,开个玩笑:),实际上是inception,该神经网络论文甚至引用了盗梦空间······
    • 有时候我们很难决定滤波器的尺寸,不清楚什么时候用池化,或者1x1卷积,这时最好的办法是把它们全加到神经网络的同一层,将它们的输出结果堆叠起来,即通道数堆叠,但是让神经网络来决定哪个更有必要
    • 计算成本:直接使用上述操作计算成本可能过高,还记得1x1卷积的作用吗?来让我们决定通道数,这样我们先降低通道数,再计算,可以达到这样的效果:计算成本降低 1 10 \frac{1}{10} 101,但是输出的矩阵尺寸和通道数和直接使用上述操作完全一样,值得一提的是,我们称1x1卷积层为瓶颈层,仅仅是因为看起来像,并且可能会有疑问,我们简化了计算成本,会不会导致神经网络性能下降,实际上(大佬说的),只要合理涉及瓶颈层,我们可以达到同时减小计算成本又不损害神经网络性能的效果
    • inception块,我们差不多应该能够自己得出inception的结构了!使用第一点中的思想,加上使用瓶颈层来随时调节计算成本和调节输出矩阵的通道数
  • 使用开源资源再现,自己去github上找去
  • 迁移学习
    • 迁移学习在课程2第二周讲到过,基本思想是:对于相似的问题,如果我们需要解决的问题数据集过少或者我们想直接利用别人训练好的模型以缩减训练时间,那么我们可利用其他人训练好的神经网络中已经学到的知识,将其迁移到自己的网络中,此时我们只需要训练浅层神经网络模型即可
    • 冻结操作,即根据自己数据集规模的大小选择冻结一部分预训练模型中的参数,将部分模型直接作为输入输出的映射的操作,当然,如果你的数据集很大,那可以不冻结而自己重新初始化所有参数,然后所有层都自己重新训练
  • 数据增强,当数据不够时,下面的技巧可以扩大你的数据集,增强神经网络的鲁棒性,这里也能添加一些超参数
    • 镜像对称、随机修剪、 旋转、剪切、局部扭曲
    • 色彩转换:PCA颜色增强,即根据图像的RGB属性多少分布来决定对如何对图像进行色彩变换
  • 计算机视觉现状
    • 图像识别相对目标检测来说数据集更多,图像识别只要求识别图像是什么,而目标检测要求找到每一个目标,并且识别出目标的身份,在拥有较少数据的时候,人类的手工操作发挥的作用相对更大,或者说,人类已有的知识可以“迁移到”神经网络模型中
    • 打比赛和实际生产还是有区别的,打比赛你可以不用特别注重运行时间和计算成本的问题,所以你可以采用一些诸如:训练多个模型取平均值、将图像多次变化并识别将结果取平均值
    • 初学者可以:使用已出现模型架构、使用开源代码、使用预训练模型

第三周:目标检测

  • 目标定位
    • 从图像分类到目标定位到目标检测,图像分类是之前的内容,即将图像分类为某一种预先设定好的内容,但是只适用于一张图像对应一个类别的情况;目标定位在图像分类的基础上要求找出目标的位置,即输出边界框,但仍然只是针对一张图像一个类别;目标检测的目标是:找出图像中的所有目标类别,并输出各个类别的边界框。
    • 目标定位在之前学过的神经网络上改变神经元的输出层,即输出是否包含类别,等同于是否类别为背景,如果为背景,则之后的输出维度都没有意义;如果不为背景则输出边界框,包括:边框中心位置、高度比以及宽度比,同时输出属于哪种类别,比如在三分类中,输出一共需要8个维度。
    • 代价函数:由于改变了输出,所以相应地需要改变代价函数,此处使用平方误差的方式,但是根据类别是否为背景做微调整:实际为背景时,只计算第一个维度;实际不为背景时,计算所有维度(实际上可以对边界框使用平方误差的形式,而对类别使用逻辑误差的形式)
  • 特征点检测,对于某些情况下如人脸识别中,我们可以采用特征点来替代边界框,用来做其他的事情如识别人脸表情(拍照特效等)
  • 目标检测
    • 滑动窗口,首先可以训练识别某类别的神经网络,训练时的输入图像大小即为窗口大小,在预测时,使用滑动窗口截取输入图像(可以多次用不同的窗口),并对每个窗口截取的图像进行识别,来做识别和定位。该方法有很多明显的问题:一是每一次滑动都需要使用前向传播算法,计算成本很大,二是细粒度(即步长等)会影响性能。
    • 滑动窗口的卷积实现,该方法针对计算成本的问题而提出,具体操作是:直接将整个图像作为输入而不是被滑动窗口裁剪过后的图像,原因是其实在计算每一个窗口时,很多计算都是重复的,一次前向传播计算所有结果其实是公用了某些计算结果,因而减少计算成本,并且将全连接层转变为卷积层,在输出时可以直接输出每个裁剪图像位置的预测值。值得一提的是,本方法中将全连接层转化为卷积层的操作在数学上是等价的,即每个值对应前面每个维度的线性组合然后从非线性函数输出,这样的作法让我们针对直接输入全部图像时,输出更加直观。但是缺点是,边界框位置不够准确(OverFeat),这个缺点是继承了直接使用滑动窗口方法的,这个缺点被YOLO算法解决
  • 你只看一次算法,==挺别扭的,还是叫YOLO算法吧
    • 精准化边界框,我们分析滑动窗口系列方法为什么会出现边界框不精确的原因是:窗口大小是固定的、有限的,最好的解决方法即是让神经网络自己去学习窗口大小,即使用目标定位的方法。但是考虑到目标定位的缺陷,我们将图像分割成小区域,对每个小区域做目标定位,在做反向传播时,仅仅通过目标中心点而将其分配到某个小区域内,通过设计神经网络结构可以使输出恰好对应每个小区域预测值,这样实现了整个图像中多个目标的识别与定位。值得一提的是,此处高度比和宽度比不再是不大于1,并且使用滑动窗口的卷积实现,降低了计算成本。问题:仔细分析可以知道,一般来说,神经网络对于目标的非中心位置学到的知识应该是把其当作为背景,只有足够靠近/类似/包含该类别时才会认为它属于某类别,但是卷积神经网络对每个框都计算了预测值,很有可能出现的问题是:在相近的不同小区域内都输出不同边界框和概率的同一类别
    • 交并比,用来评价两个边界框重合度,即认为如果预测为同一类且交并比很大,则认为这些框可能是对于同一物体的不同框,一般认为0.5以上说明重合度较大,此时采用非极大值抑制的方法选择最好的框
    • 非极大值抑制,上面讲了,该方法用来解决同一个物体多个框的问题,思路是:找预测概率最大的框,交并比大于某阈值时,认为这些框是同一物体的不同框,则取预测概率最大的框,并抑制/去除其他框,然后不断循环
    • 锚框上面可以看到,我们使用了分割图像以便使用目标定位方法来精准化框,但是可以知道,除非细化到一个像素大小,不然我们无法保证一个小区域内只有一个目标(目标中心点),所以为了减少该现象的产生,我们使用锚框与交并比来缓解。思路是:当同一个小区域内出现多个不同了类别的目标时,将预测的边界框与锚框进行交运比运算,从而将类别进行进一步分类,即将一个类别不仅仅分配到一个小区域内,并且分配到一个交并比最大的锚框。虽然锚框是用来缓解多个目标在同一个小区域的问题,但是锚框还有一个优点:让神经网络更加具有针对性(根据锚框)。在选择锚框方面,可以选择手动选择锚框,或者使用K-Means聚类算法来选择最具有代表性的锚框
    • YOLO整个过程:训练,每个小区域都有不同锚框的值,即不同的锚框对应不同的类别;做预测,输入图像后每个小区域都会输出不同锚框下的估计值,去除估计概率很小(哪个类别都不属于)的那些框;非极大值抑制,对每个类别都执行非极大值抑制,选择预测该类概率最大的框,然后抑制和该框交并比较大的框,然后循环
  • 其他目标检测网络:候选区域网络RPN
    • 基于区域的卷积神经网络R-CNN、Fast-RCNN(使用基于卷积的滑动窗口)、Faster-RCNN(使用卷积神经网络获得候选区域),基本思想是:只在某些可能出现类别的区域内做预测,找出这些区域的方法是图像分割算法。两步走:候选区域、分类。值得一提的是:算法不会直接信任先前给出的边界框
    • 图像分割算法

第四周:特殊应用:人脸识别、数据风格转换

  • 人脸识别
    • 人脸验证需要用户输入图像以及ID,系统判断该图像是否对应该ID,而人脸识别则是输入图像,输出ID或者识别失败,实际上人脸验证是人脸识别的一种特例,人脸验证涉及两个结果:
    • 一次学习,一般来说,我们数据库中每个人对应很少的图像/一张图像,则如果要训练出识别/分类某个人身份的神经网络将会很难(数据太少了),并且当有新的身份识别需求时,该神经网络需要重新训练,所以与其要求神经网络识别每一个人,我们要求神经网络判别两张图像的相似性会更加符合实际情况
    • 相似函数,上述我们知道,我们需要神经网络去学习一个相似函数,此处如果相似函数值越大表示两张图像相差越大,反之相差越小
  • 连体/Siamese/孪生网络(DeepFace论文)思想是:有两个网络,并且网络的权重相同,在输出层舍弃掉softmax层,而用128位/ f ( x ) f(x) f(x)来编码该图像(个人理解是用该128位来表示图像),当两个图像输入得出的该128位编码值相差很小时认为为同一个人,此处还有一个问题:如何定义梯度下降系列算法的目标函数/代价函数
  • 三元组损失函数,使用三元指的是锚A、真P、假N种图片,为了确保神经网络具有一定的鲁棒性,此处引入了超参数 α \alpha α,这里可以知道这里的训练集是以三元组为基本单位的,并且在选择三元组时需要一定的技巧,而不能直接随机选取N,因为如果随机选的话,A和N的相似性很小,A和P相似性很大,则很轻易就能够满足损失函数值为0,这样神经网络学习不到很有价值的东西,所以好的思路是:尽可能选择AN相似度和AP相似度差不多的三元组(FaceNet论文),可以看到三元组损失函数还是挺复杂的,三元组损失函数为 L ( A , P , N ) = m a x ( ∣ ∣ f ( A ) − f ( P ) ∣ ∣ 2 − ∣ ∣ f ( A ) − f ( N ) ∣ ∣ 2 + α , 0 ) L(A,P,N)=max(||f(A)-f(P)||^2-||f(A)-f(N)||^2+\alpha,0) L(A,P,N)=max(f(A)f(P)2f(A)f(N)2+α,0)
  • 将人脸验证转化为二分类问题,这样不需要用到三元组损失函数,思路是:使用孪生网络同时接收两张图象,即训练集是图像对而非三元组,在输出层使用逻辑回归,训练集图像对为1表示为同一个人,为0表示不是同一个人。值得一提的是,在做预测或者实际应用时,在模型训练好的前提下可以预先计算数据库中的图像输出“编码向量”,这样提升了实时性
  • 神经风格迁移
    • 首先需要明白的是,在卷积神经网络各层中分别提取出了什么样子的特征,这一点对于神经风格迁移很重要,并且这一点在前面讲述普通的神经网络时提到过,越浅的层学到的特征越简单,较深的层将前面层的特征相互组合,从而得到更加“高级”的特征如人脸、左下角的圆形等
    • 在神经风格迁移中,我们需要图片C的内容,需要图片S的风格,然后输出结合二者的图片G,很容易想到,新的卷积神经网络的代价函数和三者都有关系,即总代价函数由内容代价函数和风格代价函数组成。同时如何理解内容、风格对于神经风格迁移也很重要,即卷积神经网络的可视化()
    • 卷积神经网络的可视化,我们需要找出每一层最大化神经元激活值的色块或者图片,这表明这些色块/图片最容易被该神经元选择保留/放大到下一层,以进行进一步合成更高级的特征,越到深层最大激活的色块/图片就越复杂
    • 代价函数,上面已经提到过代价函数了,这里将代价函数的形式写明白,这里又引入了两个超参数,但是实际上一个超参数也可以(作者写的两个) J ( G ) = α J C o n t e n t ( C , G ) + β J S t y l e ( S , G ) J(G)=\alpha J_{Content}(C, G)+\beta J_{Style}(S, G) J(G)=αJContent(C,G)+βJStyle(S,G)
    • 内容代价函数,只与C和G有关,使用在某一层的激活值进行运算,个人理解:选择过浅的层则太过于突出细节,而过深的层则过于关注特定的物体,所以选择中间的层进行内容代价函数的定义: J C o n t e n t = 1 2 ∣ ∣ a [ l ] ( C ) − a [ l ] ( G ) ∣ ∣ 2 J_{Content}=\frac{1}{2}||a^{[l](C)}-a^{[l](G)}||^2 JContent=21a[l](C)a[l](G)2
    • 风格代价函数,只与S和G有关,我们将风格定义为不同通道之间激活值的相关系数,每一层的风格矩阵是大小为通道数的方阵,每两个通道之间的风格定义为对应相乘和,此处归一化常数其实不重要,因为风格代价函数之前还有超参数,并且这里在代价风格函数中我们需要所有高级、低级的风格
      J C o n t e n t = Σ l λ [ l ] 1 ( 2 n H [ l ] n W [ l ] n c [ l ] ) 2 ∣ ∣ G [ l ] ( C ) − G [ l ] ( G ) ∣ ∣ 2 J_{Content}=\Sigma_l \lambda^{[l]} \frac{1}{({2n_H^{[l]}n_W^{[l]}n_c^{[l]})}^2}||G^{[l](C)}-G^{[l](G)}||^2 JContent=Σlλ[l](2nH[l]nW[l]nc[l])21G[l](C)G[l](G)2
    • 神经风格迁移过程:随机初始化图像G,然后使用代价函数梯度值和先前的像素值更新像素值
  • 从2D到1D/3D的推广,基本过程与图像处理类似,同样的核的通道数与输入相同,输出通道数取决于核的个数等等

课程5:序列化模型

第一周:循环序列模型

  • 循环神经网络模型能够解决什么问题?解决序列化输入输出的问题,如:语音识别、音乐生成、情感分析、DNA分析、机器翻译、视频行为识别、命名实体识别,注意到输入输出序列长度可以不一致,甚至只有输入/输出为序列
  • 普通循环神经网络模型
    • 独热编码方式,又称为一位有效编码,在自然语言处理中,我们使用独热编码方式来对每个单词编码,编码方式是:将数值编码为列向量,只有一位为1,其他位为0,因此称为独热编码,1在列向量中的位置为该数值大小,列向量的大小为整个字典的大小。为什么使用独热编码呢?个人理解是:利于损失函数的定义
    • 为什么不使用普通神经网络解决序列化问题:一是序列输入和输出的长度不固定,需要选择最大序列长并进行填充空缺;二是没有实现参数共享,在某些位置学到的特征无法共享到序列的其他位置,这类似于我们希望卷积层中某滤波器学到的特征能够适用于图像矩阵的其他位置,并且参数共享能够减少参数的个数,防止模型过于复杂
    • 循环神经网络的前向传播过程为:输出序列某位置的值取决于(线性+非线性)上时刻的激活值和该时刻的输入序列值,值得一提的是,这里每个时刻的参数都是共享相同/共享的(想起Siamese网络用于图像识别),并且可以看到,循环神经网络只考虑了该时刻之前的序列,或许使用双向循环神经网络在某些情况能够发挥更好的效果
    • 反向传播算法中首先定义损失函数、代价函数:使用交叉熵损失函数,然后对整个时间内求算数平均值。值得一提的是,当序列长度过长时,可能出现梯度消失/梯度爆炸的问题(一般来说梯度消失更加常见),导致当序列跨度很大时,(如在NLP中)
    • 注意:在循环神经网络中,在不涉及输出时,我们通常使用的激活函数是tanh,在涉及输出时,使用softmax或者sigmoid
  • 其他循环神经网络
    • 输入序列长和输出序列长不同,一对一,一对多,多对一,多对多
    • 多层循环神经网络
    • 使用其他单元(如GRU、LSTM单元)代替普通RNN单元
    • 基于词汇和基于字符的循环神经网络
  • 语言模型,以语音识别为例,语言模型的目的是输出字典中每个词、未知词以及句子结尾的概率,然后找出最有可能的句子
  • 序列采样,即根据字典中每个词的概率来进行采样,当输出句子结尾或者手动截断之后输出整个序列
  • 梯度消失问题,前面讲到,当循环神经网络处理长序列问题时,网络容易出现梯度消失的问题,换言之,模型更新缓慢,并且靠前的序列很难影响靠后的序列输出,不擅长捕捉大跨度序列中的信息,解决方案时门控循环单元和长短期记忆单元
    • GRU门控循环单元,作为普通循环神经网络隐藏层单元的替补方案,能够使得网络更好地捕捉深层连接,并且帮助解决梯度消失的问题。门控循环单元的基本思想是:引入记忆单元、候选记忆单元、更新门,记忆单元用于记忆/传播,候选记忆单元用于计算本时刻特征,通过计算更新门的大小,更新门可以用于选择何时更新记忆单元(通过加权前时刻记忆单元和候选记忆单元实现),此处每个时刻的激活值和记忆单元值相等。值得一提的是:上述只是简化的门控循环单元,更加复杂的GRU可能还包括其他门(相关门表示候选记忆单元和前时刻的记忆单元之间的相关性)······
    • LSTM长短期记忆,长短期记忆单元和门控循环单元需要解决的问题是相同的,这里长短期记忆单元和门控循环单元的区别在于:激活值和记忆单元值不一定相同,长短期记忆单元引入了遗忘门、输出门、更新门,并且使用遗忘门、更新门、候选记忆单元、前时刻记忆单元来获得本时刻记忆单元,激活值由输出门和本时刻记忆单元得到。其中具体的计算细节都是类似的,并且可以看到:在使用长短期记忆单元的循环神经网络中,有一条专门的路径用于传播前层信息。门控循环单元更像长短期记忆单元的简化
  • 双向神经网络,前文提到过:用于同时捕捉靠前和靠后序列值的信息,因此前向传播分为两个部分(是两条路径而非通用同一条路径),但是缺点是需要整个输入序列才能进行输出
  • 深度循环神经网络,前面我们提到的循环神经网络实际上只有一层,可以这样理解:从某时刻输入到该时刻输出,走一遭发现只有一层,只不过不同时刻序列值共享参数,所以每个激活值取决于:上时刻该层激活值、该时刻上层激活值。注意:每一层不同时刻共享参数,但是不同层不共享参数。实际上速度循环神经网络与普通神经网络来比要浅得多,因为序列长度本身就很长,但是可以在较深的地方取消与前时刻激活值的关系从而加深网络,即没有水平上的连接,只有垂直方向的连接

第二周:自然语言处理与词嵌入

  • 词表示方法:在此之前,词都是使用独热编码来表示,这样的表示方法是一种稀疏的表示方法,所有的独热编码之间都是正交的,无法表示各个词之间的联系,如:男女、爸妈等,在一些实际应用中存在一些毛病/泛化:我想要一杯橙汁、我想要一杯苹果__。词嵌入的思想是:用特征向量/词嵌入表示词的特征,相关联的词之间的词嵌入向量之间存在联系。这样:即使只有很少的训练集,模型还是能处理一些“陌生”的词。
  • 词嵌入属于迁移学习方法:将从大量文本中学习到的词表示方法,应用到只有很小训练集的深度学习任务中。词嵌入学习的目标是获得词嵌入矩阵,用于转化独热编码到词嵌入
  • 应用词嵌入的一般方法:①从大量的文本语料库中学习词嵌入(矩阵)/直接下载学习好的词嵌入(矩阵)②将学习好的词嵌入迁移到只有较少训练集的新任务中,用词嵌入来表示词,一般来说,会降低表示词的向量维度。③可选(训练集小):使用新数据继续微调学习好的词嵌入
  • 词嵌入和人脸识别:在使用Siamese网络做人脸识别时,提到了使用网络最后一层的输出作为人脸的编码,此处和将使用词嵌入类似(encoding和embedding)
  • 前面提到词嵌入中一个重要的特质是:能够表示各个词之间的联系。比如: e m a n − e w o m a n ≈ e k i n g − e q u e e n e_{man}-e_{woman}\approx e_{king}-e_{queen} emanewomanekingequeen,如果在多维空间中可视化为:向量重合/平行,由此可以定义相似函数(区别于人脸识别中的相似函数),如:余弦相似函数(夹角的cosine值)。 值得一提的是:此处只是体现词嵌入能够表示各个词之间的联系,而并非在训练任务中使用验证的方法
  • 词嵌入学习:前面提到了学习目标是得到词嵌入矩阵。词嵌入学习算法实际上是从复杂的算法开始的,然后逐渐开始简化到如今。可以想到,既然词嵌入表示了各个词的特征以及相互的联系,那么词嵌入学习算法/模型的训练集也应该能够表示这些关系。不同的词嵌入学习模型的不同主要体现在文本/目标对的选择、模型结构等方面。
  • 神经网络模型,其中词嵌入矩阵、神经元中的权重和偏置都是参数。使用文本/目标对,并且文本的选择有很多:左右的几个词、上一个词、相邻的词
  • 跳字模型,同样使用文本/目标对来进行训练,直接使用一层softmax来用文本预测目标 。其中文本/目标对如何采样?如果使用随机采样,那么采样结果将会偏向the、of等词,所以一般采用其他启发式算法。基本模型存在一定的问题,softmax分母计算量太大,可以使用分层softmax(类似于哈夫曼树)来解决。负采样算法,用来根据文本词寻找目标词。k次从单词表中随机抽出的词和句子中的文本组成的文本对标记为0,而1次从句子中抽取的词组成文本词对标记为1。训练时使用的时sigmoid激活函数,根据选择的词的不同,每次训练输出层需要计算1+k次sigmoid激活函数,这使得计算量降低。k的选择方案是,大数据集时,k选择较小。其中负样本采样的过程是均匀采样和频率采样的折衷。
  • 全局向量算法,基于不同词之间在特定规则下(周围五个词之类等)的出现次数,定义了不同的目标函数,目标函数的基本形式为平方损失函数,同时引入了权重函数为了避免log0的问题,以及解决the、of词与不常见有用词的问题。
  • 情感分类,解决的问题是,如何将句子和情感联系起来。
  • 神经网络模型,平均后使用softmax输出。这种方法没有考虑词的顺序问题,导致无法处理否定词+褒义词的情况。
  • RNN模型,在最后使用softmax输出
  • 消除偏见,由于统计原因,学习获得的词嵌入存在偏见/歧视,比如性别偏见、种族偏见等。
  • 消除偏见的思想是:①定义偏见方向,使用奇异值分解结合 e m a n − e w o m a n e_{man}-e_{woman} emanewoman e m a l e − e f e m a l e e_{male}-e_{female} emaleefemale等得到的向量。②中立化,将所有的其他词(如doctor等,除去father、mother等)映射到偏见为0的其他维度上。③等同化,将其他中性词到,非中性词的距离调整成相同,如babysitter到gradmother和gradfather的距离调整成相同。

第三周:序列模型和注意力机制

  • 序列到序列模型:编码和解码部分,应用:机器翻译、图像描述
  • 语言模型和序列到序列模型(条件语言模型)的区别
  • 选取最有可能的序列,而不是采样
  • 束搜索:
  • 长度归一化,使用log,并且使用长度归一化消除偏向于更短的句子
  • 集束宽度的选择
  • 集束搜索误差分析:分析误差主要来源于技术搜索算法、RNN模型
  • 机器翻译评估指标:双语评估替补值,同样需要解决偏向于短序列的问题
  • A method for utomatic evaluztion of machine translation
  • 注意力模型:提出的动机
  • 触发词检测:使用RNN模型进行触发词检测时,存在的问题是,在标签中

第四周:变形金刚

  • 变形金刚的基本思想是:结合注意力机制和卷积神经网络机制。
    • 其中卷积神经网络相较于循环神经网络来说,能够并行处理输入,而循环神经网络中每个输入处理都是一个瓶颈;
    • 注意力机制包含两个方面:自注意力和多头注意力
  • 自注意力:自注意力机制首先引入了三个新量,分别代表查询q、键k、值v,三个值通过三个不同的权重和输入得到,他们的作用是:q代表向某个词询问的问题,键值k和q相乘后使用softmax机制得到的值在和每个词的值v相乘得到每个词和某个词问题的相干度,各个词的相干度相加即可得到某个词的自注意力表示(区别于词嵌入表示等表示方法),这样的表示方法能够表示更多每个词更多的信息
  • 多头注意力:多头注意力机制简单来说就是自注意力机制的循环。每次计算自注意力表示被称为一个头,将每个头连接在一起乘上权重得到多头注意力
  • 变形金刚网络:包含两大部分,一是编码器,二是解码器。其中编码器将输出作为解码器中多头注意力的键和值,而查询由带遮罩的多头注意力块产生,送入下一个多头注意力块中;为了考虑序列的语序问题,变形金刚网络中使用了位置编码;此外还加入了批量正规化和残差块的思想。

你可能感兴趣的:(神经网络,深度学习,人工智能)