本文是对《深度卷积网络 原理与实践》的整理
基本概念
对数据集合的切分
- 对数据集不同的切分:
集合名称 | 训练集 | 验证集 | 测试集 |
---|---|---|---|
功能 | 找到参数 | 找到超参数 | 评估性能 |
比例 | 80%(90%) | 10% (5%) | 10%(5%) |
但是在实际运用中,我们的模型在测试集上效果可能还是不理想,可能也会把测试集作为训练集。因此,一些研究中已不再使用验证集。此时有点类似交叉验证(cross-validation)。
不过,由于深度网络的训练往往较慢,所以交叉验证应用的比较少。
一个训练的过程:
以1000个数据,批大小为10。
- 读入1000个数据
- 将数据划分为训练集(900)和测试集(100),固定下来。
- 开始第一个epoch。将训练集的900个数全部打乱,但保持数据和真实标签的一一对应。
- 开始第一个batch,即打乱后的前10个数据送入网络
- 正向传播。将结果与期望值比较计算损失 L O S S LOSS LOSS。
- 反向传播。更新网络参数 w i j w_{ij} wij
- 回到第4步,将第2个batch送入训练。重复直到所有900个训练数据全部跑了一遍
- 将测试集送入网络,正向传播。将结果与期望值比较,计算损失。
- 根据模型最后在训练集上的表现,做一些调整,如
调整学习率
,停止训练
,停止训练并修改超参数
。 - 开始第二个epoch,将训练集的900个数据再次打乱。重复步骤3
学习的种类
有监督学习:回归、分类、标签、排序、Seq2Seq
- 回归:从输入X给出一个数字Y。
- 例子:从人物照片预测人的年龄。从股票走势预测明天的涨跌幅。
- 一般Y是连续的。
- 分类:从输入X给出它属于哪一个类别,例如:
- 例子:人脸识别,手写数字识别,听歌识曲、AlphaGo的策略网络
- 一般Y是离散的。因而损失函数一般为交叉熵损失(cross-entropy)
- 一般给出的是属于不同类别的概率,不同类别相加的概率和为1。因而会用到后文提到的SoftMax层。
- 与回归的区别:不同于回归的一点是,如果两个模型一个预测一个35岁的人的年龄为18岁,另一个预测的为37岁,我们可以根据差值判断两个模型的优劣。然而,如果两个模型在预测手写字母A的时候,一个给出了B,一个给出了C,则无法判断两个模型的优劣。(有些时候这种判断依据值得商榷。)
- 标签(tagging)
- 它与分类的区别在于一个物体可以有多个不同的标签。因而每一个类别概率和可以大于1。
- 排序(Ranking)
- 它与回归的区别在于,它先回归到分数,然后按照分数的顺序给出排序结果。排序不关注具体的分数,只关注最终的排序结果。
- 序列变换(Seq2Seq): 将一段序列转化为另一段序列。
- 例子:翻译、语音识别、聊天机器人。
- 一般使用RNN(循环神经网络),如其中的LSTM(长短期记忆模型)
无监督学习:聚类、降维、生成模型、GAN、自编码、推荐
- 聚类(clustering):将数据集的样本自动划分为几簇(cluster),每簇内的样本有类似之处。
- 降维(dimensionality reduction):将数据投射到地位空间,如自然语言处理中的word2Vec方法。
- 生成模型(generative model):
- 自编码(auto-encoding)
- 生成对抗网络(GAN):只需输入大量无标签的图像,模型就能自动生成类似的图像。
- 推荐(recommendation):目前常见的实现方法:
- 协同过滤:如果计算出用户A和用户B的风格相似,则向用户A推荐用户B喜欢的东西
- 关联规则:如果计算出购买了X的用户往往会购买Y,那么可向购买了X的用户推荐Y
半监督学习
先人工标记少量标签,然后从少量标签训练网络。再人工筛选和修改其中的标签,重复这个过程。因为机器的准确率会逐步提升,所以需要人工修改标签的数据就会变少。
训练中的问题:
欠拟合(under-fitting)
- 出现原因:
- 网络容量不足,可以增加网络的广度和深度;
- 网络有可能陷入了局部的极值或者网络的拟合速度不够。这可以通过
调整学习率
、选取合适的初始化方法
、选取和是的网络架构
等方法解决。 - 数据本身噪声过大
- 非凸问题,模型容易陷入局部极小值。但是因为我们都是小批量更新数据,而每个数据里都会引入一定的噪声,所以网络并不容易陷入局部极值点。实际问题中比较常见的问题是鞍点(解决方法见梯度下降)。
过拟合(over-fitting)
- 出现原因:数据中包含噪声点
- 解决办法:
- 在网络中引入正则化(详见神经网络的正则化) 如
L1,L2正则化
,Dropout正则化
、集合
、多任务学习
、参数共享
、标签平滑(Label Smoothing)
、噪声标签(Noise Label)
- 检查数据是否覆盖了全部的类别,例如训练数据里苹果都是红色的,容易导致最后的模型无法识别绿色的苹果。
- 数据增强
- 在网络中引入正则化(详见神经网络的正则化) 如
在训练数据上的性能 | 在新数据上的性能 | |
---|---|---|
最佳情况:泛化能力高 | 好 | 好 |
过拟合 | 好 | 差 |
欠拟合 | 差 | 差 |
一个比较自然的问题:有没有可能在训练数据上性能不好,反而在新数据上的性能变好了?
有可能!如果在训练的时候采用了数据增强、Dropout、PReLU等方法。但在正常情况下不太容易发生。
梯度下降的分类:
具体的动图演示:动图演示
- momentum
- Adagrad
- Adam
神经网络的正则化
L1,L2正则化
因为过拟合产生的一个原因在于神经元数量可能过多,因此需要减少神经元之间的连接。一个做法就是用正则化,通过将权重 w = 0 w=0 w=0来达到减少连接。
- L2正则化: L O S S L 2 = L O S S + λ ∑ w w 2 LOSS_{L2}=LOSS+\lambda \sum_{w} w^2 LOSSL2=LOSS+λ∑ww2
- 此时损失函数为 L O S S L 2 = L O S S + λ ∑ w w 2 LOSS_{L2}=LOSS+\lambda \sum_{w} w^2 LOSSL2=LOSS+λ∑ww2,加上后面这项的目的是让网络试图两所有权重w都靠近0。
- λ \lambda λ越大,越希望w为0。因为如果 λ = 0 \lambda=0 λ=0,则跟之前的损失函数一致,即没有受到任何的正则化惩罚。一般来说 λ = 0.0001 \lambda=0.0001 λ=0.0001
- 此时权重更新公式为: w i n e w = w i − ∂ L O S S ∂ w i − η ⋅ ( 2 λ w i ) = w i ⋅ ( 1 − 2 η λ ) − η ⋅ ∂ L O S S ∂ w i w_i^{new}=w_i- \frac{\partial LOSS}{\partial w_i}-\eta \cdot (2\lambda w_{i})=w_i \cdot (1- 2 \eta \lambda) - \eta \cdot \frac{\partial LOSS}{\partial w_i} winew=wi−∂wi∂LOSS−η⋅(2λwi)=w