深度学习基础笔记

基础

允许矩阵和向量相加,即 C = A + B C=A+B C=A+B,其中 C i , j = A i , j + b j C_{i,j}=A_{i,j}+b_j Ci,j=Ai,j+bj,省去了将向量b复制扩展成矩阵的步骤,这称为广播(broadcasting)
广播是一个很灵活的机制,看、写代码时可以把每个张量的维度写出来,方便看广播是在哪个维度上进行的。

协方差的绝对值如果很大则意味着变量值变化很大并且它们同时距离各自的均值很远。如果协方差是正的,那么两个变量都倾向于同时取得相对较大的值。如果协方差是负的,那么其中一个变量倾向于取得相对较大的值的同时,另一个变量倾向于取得相对较小的值。

范数

向量的范数将其映射为一个非负标量,反映向量的大小。
L 2 L_2 L2范数=各元素平方和的平方根,常记为 ∣ ∣ x ∣ ∣ ||x|| ∣∣x∣∣torch.norm(x)
L 1 L_1 L1范数=各元素绝对值之和。torch.abs(x).sum()

当零和非零元素之间的差异非常重要时,通常会使用L2范数。

最大范数(max norm) ∣ ∣ x ∣ ∣ ∞ = m a x ∣ x i ∣ ||x||_{\infty}=max|x_i| ∣∣x=maxxi,即向量中绝对值最大的元素值。

矩阵的Frobenius范数是其元素平方和的平方根,用于衡量矩阵的大小。

监督学习

在给定输入特征的情况下预测标签(可以是已知输入的,也可以是作为预测结果输出的)。

  • 回归(regression)问题:标签是任意数值。预测所依据的自变量称为特征
  • 分类(classification)问题:标签是类别。
    二元分类也叫 logistic regression,多元分类则是 softmax regression。
  • 序列学习:输入是连续的,例如通过前一帧的图像,对后一帧作出更好的预测。序列学习需要摄取输入序列或预测输出序列,或两者兼而有之。

损失函数

广义地讲,损失(loss)函数或成本(cost)函数是一样的,都是一个可优化的目标函数,量化目标的实际值与预测值之间的差距。
狭义地讲,损失函数是衡量一个单独样本其实际值与预测值之间的差距的,而成本函数是整个训练集所有样本损失函数之和。

梯度下降法

梯度(gradient):深度学习中指f对一个向量的求导,即一个包含所有偏导的向量,记为 ∇ x f ( x ) \nabla_{x}f(x) xf(x)

梯度下降法在每个步骤中,检查每个参数,看看如果仅对该参数进行少量变动,训练集损失会朝哪个方向移动。 然后,在可以减少损失的方向上优化参数。
新的参数为 x ′ = x − ϵ ∇ x f ( x ) x'=x-\epsilon\nabla_{x}f(x) x=xϵxf(x),其中 ϵ \epsilon ϵ是学习率,表示下降的步长。当二阶导为负时损失函数下降的比 ϵ \epsilon ϵ 多,反之则少。
学习率太小会导致更新慢,需要更多迭代,太大会难以收敛。

注意梯度下降的参数需要同步更新,即每一个更新的参数先存储到一个临时变量,最后统一更新。否则先更新的会影响到其他后更新的参数。

样本太多时可以用SGD。
SGD解决的问题:在大规模数据集上训练大模型计算代价太大。
SGD的做法:其核心是梯度是期望,期望可使用小规模的样本近似估计。因此每次只选取一个样本进行梯度下降。

另外,minibatch 梯度下降则是上面两种方法的折中:均匀抽出一小批量(minibatch)m,每次更新计算只用到 m 个样本。batch size太小不利于并行计算,太大则浪费资源。

归一化

由于每层的输入都受到前一层参数的影响,前一层参数的微小变化可能会导致后一层输入数据分布的大幅度改变,这种现象被称为“内部协变量偏移”(Internal Covariate Shift)
批量归一化从每一层选取一定批量(于批量梯度下降对应)计算均值和方差,可以减少梯度下降的时间,也有一定的正则化效果。

虽然批量归一化只对当前批次的数据进行归一化(对未选取的数据不进行归一化),但是它会保存每一批数据的均值和方差,以用来估计整个训练集的均值和方差。然后在测试集,使用这些估计的均值和方差对测试数据进行归一化。

过拟合

通过多项式拟合回归函数时,如果给的项数很多,可能会出现过拟合,此时造成过拟合的项的参数是一个学习到很小的数值,可以通过这个判断,并将学习后最终参数很小的项去掉以正则化。
解决方法:

  • 减少特征的数量
  • 减小参数(权重),即正则化

正则化

词典中正则化的释义是,If someone regularizes a situation or system, they make it officially acceptable or put it under a system of rules,在深度学习中正则化是指修改学习算法,使其降低泛化误差而非训练误差。

通过多项式拟合回归函数时,如果给的项数很多,可能会出现过拟合。如果某项特征的权重经过学习后是一个很小的数值,那么说明该特征对整个函数起的作用比较小。此时可以将该很小的权重项去掉以正则化。

  • 权重衰退(weight decay)
    权重衰退也叫 L 2 L^2 L2 正则化。
    通过给损失函数加上一个惩罚项,将原来的训练目标最小化训练标签上的预测损失,调整为最小化预测损失和惩罚项之和。
    具体地说,将损失函数改为 L o s s ( ) + λ 2 × ∣ ∣ w ∣ ∣ 2 Loss() + \frac{\lambda}{2} \times ||w||^2 Loss()+2λ×∣∣w2。其中 λ \lambda λ用来控制衰退的程度,经过求导可以发现权重衰退的作用是,每次更新权重时都让新的权重比不引入惩罚项时更小一点点。 λ \lambda λ 过小就丧失了意义,过大则可能欠拟合。在pytorch中一般用weight_decay表示。
  • 暂退法(dropout)
    将一些输出项随机置为 0,将其他的项扩大以保持数学期望不变。常作用在隐藏层输出上。实际上就是在向前传播的过程中,计算每一内部层的同时丢弃一些神经元。然后通过结合丢弃不同神经元的组合,来获得最终效果。
    例如,模型学习后通过检测鼻子来检测脸,丢弃鼻子信息的隐藏层神经元后,模型就必须学习另一种方法,例如通过嘴来检测脸。结合之后模型可以通过鼻子和嘴共同来检测脸,得到更好的效果。
  • 提前终止(early stopping)
    一般的,随着训练的加深,训练的损失函数会持续下降,但测试(或验证)的损失函数在降低后反而会升高,这是过拟合不可避免的问题。
    提前终止的方法就是利用验证集,在验证集的损失函数达到最低,而非训练集的损失函数达到最低时,结束训练。

误差指标

真阳性(TP)等指标的定义如下:
![[TPFPTNFN.png|500]]

相关的误差指标:

  • P r e c i s i o n = T P T P + F P Precision=\frac{TP}{TP+FP} Precision=TP+FPTP
    Precision(精度)反应的是所有预测为真的结果中,有多少是真实为真的
  • R e c a l l = T P T P + F N Recall=\frac{TP}{TP+FN} Recall=TP+FNTP
    Recall(召回率)反应的是所有真实为真的数据中,有多少被正确地检测了出来
    随着 Threshold 的提高,Precision 会提高,而 Recall 会降低。通常需要平衡二者,使其都不能太低。
    一种常见的评估指标是F1 score,它实际上计算的是 P 和 R 的调和平均数(harmonic mean),即 F 1   s c o r e = 1 1 2 ( 1 P + 1 R ) = 2 P R P + R F1\ score=\frac{1}{\frac{1}{2}(\frac{1}{P}+\frac{1}{R})} = 2\frac{PR}{P+R} F1 score=21(P1+R1)1=2P+RPR

在数据集中某一类的数量可能远大于其他类,因此简单的精度指标会引入偏差,此时就需要引入 AP:

  • AP(Average Precision)
    取所有 recall 情况下 precision 的平均值。
  • mAP
    把所有类别和所有 IoU 阈值下的 AP 平均以得到 mAP。

深度学习

神经网络

吴恩达课程上一个不错的简单示例:预测卖的衣服是否会成为爆款。
![[NeuronNet.jpg|500]]

第一列橙色是一些特征,第二列黑色是一些决定是否成为爆款的指标(人们能否承担价格,知名度等)。特征经过一层神经网络输出为这些评估指标,最终进行预测。
第一层也叫作隐藏层,在输入层和输出层之间可以加上若干个隐藏层,也就是所谓的多层感知机来实现从线性到非线性的转变。隐藏层不能使用线性函数,否则会等价于不使用隐藏层。因此隐藏层使用非线性函数,即激活函数(activation function)来确定神经元是否应该被激活。输入经过若干隐藏层最终得到输出这个过程就叫做前向传播

在前向传播的过程中存储每个计算结果 W, b, Z, A 等(Z=WX + b 是线性变换的结果,A 是对 Z 进行激活运算后的结果),以进行后向传播时求导使用。

第 i 层的权重矩阵 W 的 shape 是 (该层神经元数量,上层输出特征数量)。

[!tip] Idea
我在这里注意到的是,对于一个明确的问题,每一层神经网络的输入都是有针对性的,例如第一个神经元 affordability 就只由价格和运费决定,而非将所有参数全连接地输入到一层层网络。我猜这应该也是剪枝优化的原理。

关于激活函数,有一些建议:

  • 在进行二元分类时,使用 sigmoid。
  • 在处理回归问题时,不使用激活函数,或使用 ReLU(当预测值只能非负时)。

猜想一下,对于任何对预测值有限制的回归问题,都可以使用对应定制的 ReLU。比如若要求 y > 1 y>1 y>1,则用 m a x ( 1 , y ) max(1, y) max(1,y)作为 ReLU 激活函数。

上面的例子是一个前馈(feedforward)神经网络,如果在输出和模型本身加上反馈连接,就成为了循环(recurrent)神经网络

softmax 回归

多元分类问题就是 softmax 回归问题,采用独热编码(one-hot encoding)表示类别,独热编码是一个向量,其分量和类别一样多。例如要识别的分类为{猫,狗,鸡},对应的标签y就分别是(1, 0, 0), (0, 1, 0)和(0, 0, 1)。

作为输出,数据本身可能是任意的值,但我们想要将其视为概率,这就需要校准(calibration)来将其变为非负且总和为1,softmax函数完成了该功能。它首先做求幂变成非负,然后除以总和来规范化到0~1的范围。

决策树

是与神经网络完全不同的方法,只适合结构化的数据。每个节点判断某个特征,以进行分类或回归。
用纯度(Purity)来衡量划分的效果。如果划分的好,那么每一个子集都是某一类占大多数。如果每一个子集都是跟父节点一样的状态,那么就是不好的划分,也就是低纯度。
可以用 GINI 系数或 Entropy(熵) 来衡量纯度。熵的公式是 H ( p ) = − Σ p log ⁡ p H(p)=-\Sigma p\log p H(p)=Σplogp,其中 p 是该节点中目标数量占总数量的比值。

直觉地理解这个公式,在没有目标或全是目标(即p=0或1)的情况下,熵是0,即此时是十分有序的,最容易预测的。而当目标数量占所有数量一半时,熵达到最大值1。

在实际划分节点时,是根据 信息增益(information gain) 决定的,一种划分方法的 i n f o r m a t i o n g a i n = H ( p a r e n t ) − Σ f r a c t i o n i H ( p ) information gain=H(parent)-\Sigma fraction_i H(p) informationgain=H(parent)ΣfractioniH(p),其中H(parent)是这种划分方法共同的父结点的熵, f r a c t i o n i fraction_i fractioni是该节点数量占总数量的比值,H§是该节点的熵。

直觉地理解这个公式,信息增益表示的其实就是该划分方法和它的父结点状态相比,熵降低了多少。因此信息增益越大,说明划分方法越好。

独热(one-hot)编码

用于解决普通的决策树只能有二元离散值的问题,每个离散值都对应一位,因为永远有且只有一位是1,所以才叫 one-hot 编码。

微调

微调(fine tuning)的思路是,在已有的的大量的数据集上训练原模型,将其隐藏层的参数直接复制到现模型上(使用相同的隐藏层架构),因此现模型只需要学习隐藏层的参数即可,这就是迁移学习(transfer learning)。
注意原数据集和现数据集应该是相似的东西,且现数据集应该小于原数据集。实际上迁移学习就是一种利用大数据集训练结果的偷懒的方法,因此总结地说,微调通过使用在大数据上得到的预训练好的模型来初始化模型权重以提升精度。

端到端学习

端到端学习是从输入,经过大量神经网络直接得到输出。作为对比,传统的管道(pipeline)学习会从输入一步步得到各种输出。
例如语音识别从输入的音频先得到特征,再得到音素、单词,最后得到文字输出。端到端则从输入音频通过神经网络直接得到输出文本。

端到端学习的好处是,避免人类可能错误或不高效的先验的干扰。例如语音识别中非端到端的学习有学习音素,但这只是人类语言学中的概念,可能不加限制地学习任何可能的表示形式更利于训练。
不过通常来讲,端到端学习需要更多的数据。

卷积神经网络

CNN 经过卷积的输出图像的每个像素只依赖于其输入图像该像素周围的几个像素,这有两个优点:

  • 平移不变性(translation invariance):不论检测对象在图像中的哪里,神经网络的前面几层应该对相同的图像区域具有相似的反应。
  • 局部性:神经网络的前面几层应该只探索输入图像中的局部区域,而不过度在意图像中相隔较远区域的关系。最终可以聚合这些局部特征,以在整个图像级别进行预测。

CNN学习的就是每个卷积核的参数。

另外注意,具体讨论某一层时,深度可能指通道数;而宏观讨论 CNN 时,深度指的是隐藏层更多,而宽度指的是通道数更大。

卷积层

卷积层是对全连接层的简化,需要的参数更少。例如一个网络层有一个 shape 是 (20,) 的输入,它有两个神经元,第一个学习前10个特征,第二个学习后10个特征。

卷积层的输出有时被称为特征映射(feature map)。而在卷积神经网络中,某一层的任意元素x,其感受野(receptive field)是指每次卷积操作时,被卷积核盖住的部分(即用卷积核进行计算的部分),再加上所有影响该部分的之前神经元的感受野。
换句话说,感受野包括在前向传播期间可能影响 x 计算的所有元素(来自 x 的所有先前层)。

在卷积时可能会丢失边界信息,针对于此可以采用填充(padding)操作。
valid 卷积即不使用填充的卷积,same 卷积则是使用使得原图像大小不变的填充操作。

从另一个角度想,卷积也会减少输出的大小,而如果要输出较少的维度,就需要作大量的卷积计算,这时就可以用到步幅,来让卷积核每次移动不止一个像素。

卷积核的通道数应该和输入图像的通道数是一致的,并且经过卷积后输出图像的通道数应该等于卷积核的数量,因此 1x1 的卷积核通常被用于调整网络层的通道数量。
另外,经过卷积后输出图像的高宽为 n + 2 p − k s + 1 \frac{n+2p-k}{s} + 1 sn+2pk+1,其中 n 是之前的高宽,p 是 padding 的大小,k 是卷积核的高宽,s 是步幅。

池化(pooling)层

池化(也叫汇聚)层通常放在卷积层之后,它提取感受野中特征的主导部分,目的是降低卷积层对位置的敏感性。
与卷积核不同的是,池化层不包含可学习的参数,只在原输入上进行运算。池化层分为最大池化(max pooling)和平均池化(average pooling)。使用 max pooling 以及大于 1 的步幅,可减少空间维度。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值