回归与分类(问题描述)
回归问题
回归目标是用网络“代替”某函数,即输入自变量x,使得网络输出结果和函数输出的真实结果y尽可能“相似”
损失函数
最常见的就是平方误差损失,形式如下:
分类问题
不是问“多少”,而是问“哪一个”。比如“某个电子邮件是否属于垃圾邮件文件夹?”
对类别的编码
独热编码(one-hot encoding)。 独热编码是一个向量,它的分量和类别一样多。 类别对应的分量设置为1,其他所有分量设置为0。 比如,有{猫,鸡,狗}的分类问题,可以令(1,0,0)对应于“猫”、(0,1,0)对应于“鸡”、(0,0,1)对应于“狗”。
软类别与softmax
机器学习实践者即使只关心硬类别,却仍然使用软类别的模型。样本的“硬性”类别就指属于哪个类别;“软性”类别指属于每个类别的概率。
softmax函数能够将“未规范化的预测”(即输入经过网络的直接结果)变换为非负数并且总和为1,同时让模型保持可导的性质。其公式如下:
损失函数
采用最大似然估计的框架和信息论的相关知识,形式如下
式中n是数据个数,q是独热向量长度,是真实标签的第j维的值,是网络对第j类的输出概率值。由于真实标签是独热向量,所以只剩下一个数。
此损失函数又称为交叉熵损失,形式由来在这里省略,可以参考22.11. Information Theory — Dive into Deep Learning 1.0.3 documentation
多层感知机(神经网络)
特点
输出层和输入层之间有一个或多个隐藏层,并通过激活函数转换隐藏层的输出。这样整个网络就可以是非线性函数的表示。
摘抄于《动手学深度学习》
激活函数
一般来说,有了激活函数,就不可能再将我们的多层感知机退化成线性模型。常见的激活函数有ReLU函数,Sigmoid函数
反向传播(梯度计算)
神经网络参数的更新涉及到梯度的计算,使用各种库时,其实是采用了梯度的自动计算(自动微分),大大简化了深度学习算法的实现。 在库可以自动微分之前,即使是对复杂模型的微小调整也需要手工重新计算复杂的导数, 学术论文也不得不分配大量页面来推导更新规则。
这里,举一个简单的例子,展示库代码编写自动微分的基础原则。
网络的正向传播流程如下:
其中符合含义如下:输入向量x,隐藏激活向量h,网络输出向量o,样本标签y,隐藏层权重,输出层权重,损失函数
反向传播
该方法用了求导链式法则,其中涉及的计算有求函数偏导数,以及带入前向传播计算结果
针对上述所举的前向例子,其梯度计算公式应该是
在训练神经网络时,在初始化模型参数后, 我们交替使用前向传播和反向传播,利用反向传播给出的梯度来更新模型参数。 注意,反向传播重复利用前向传播中存储的中间值,以避免重复计算。 带来的影响之一是我们需要保留中间值,直到反向传播完成。 这也是训练比单纯的预测需要更多的内存(显存)的原因之一。 此外,这些中间值的大小与网络层的数量和批量的大小大致成正比。
代码实现
跑通《动手学深度学习》的一个小例子4.2. 多层感知机的从零开始实现 — 动手学深度学习 2.0.0 documentation
算法优化
暂退
在整个训练过程的每一次迭代中,标准暂退法包括在计算下一层之前将当前层中的一些节点置零。示意图如下:
自适应梯度
AdaGrad 及 Adam 等算法可自适应调节学习速率,加速收敛。这里不讨论算法公式更改的设计由来,因为,实际编程过程中,直接调用库即可。为了在别的领域里也可以实现此“自适应”,这里指出造成自适应的公式
摘抄于哈尔滨工业大学屈桢深老师的ppt