【深度学习】吴恩达-笔记 Softmax layer、优化神经网络、贝叶斯最优错误率、改变错误率指标、迁移学习

Softmax layer(多分类)

Softmax 将logistic回归推广到了两种分类以上

对于输出层L,Z^{[L]} = W^{[L]}A^{[L-1]} + b^{[L]} , (4,1)

softmax函数

a^{[L]} = \frac{e^{Z^{[L]}}}{\sum_{j = 1}^{3}t_{i}}   (4,1)         

t = e^{(Z^{[L]})} 

a^{[L]}_{i} = \frac{t_{i}}{\sum_{j = 1}^{3}t_{i}},计算得到输出层每个单元的a值,即每个分类的概率

 

 Softmax损失函数

a^{[L]} =\hat{y}^{}     a^{[L](1)} =\hat{y}^{(1)} 

L(\hat{y}^{(i)},y) = -\sum_{j = 1}^{4}y_{j}log\hat{y}_{j}

J(w^{1},b^{1}...,w^{l},b^{l}) = \frac{1}{m}\sum_{i = 1}^{m}L(\hat{y}^{(i)},y) 

  • softmax回归适用于分类问题。它使用softmax运算输出类别的概率分布。
  • softmax回归是一个单层神经网络,输出个数等于分类问题中的类别个数。
  • 交叉熵适合衡量两个概率分布的差异。

优化神经网络 

  • 收集更多数据
  • 收集更多多样的训练集
  • 用梯度下降训练算法时间更长
  • 用Adam代替梯度下降
  • 尝试更大的网络
  • 尝试更小的网络
  • 尝试Dropout
  • 添加L2正则化项
  • 网络结构调整(激活函数、隐藏单元、隐藏层)
  • 用评估指标衡量 

https://blog.csdn.net/m0_51933492/article/details/126540695?spm=1001.2014.3001.5502

  • 选择同一分布的交叉验证集和测试集去容纳将来在现实中获取的重要数据,将对模型有用的数据随机分配到开发集和测试集上
  • 在同一分布中设立开发集(交叉验证集)和测试集
  • 将更高比例的数据划分到训练集中,测试集目的是评估最终的成本偏差只需要远远小于总体数据量的30%

改变错误率指标(减少分类错误)

将分类错误的惩罚权重加大10倍

Error = \frac{1}{m_{dev}}\sum_{i = 1}^{m_{dev}}\omega ^{(i)}L(y_{pred}^{(i)}\neq y^{i})

w^{(i)} = \left\{\begin{matrix} 1 & if& x^{(i)}& True& \\ 10& if& x^{(i)}& False& \end{matrix}\right.

如果数据评估指标在开发集和测试集上都拟合良好,但在现实应用表现不好,在开发集和测试集二者或单个上改变你的数据评估指标以便符合实际应用需求。

贝叶斯最优错误率(可以近似认为是人类完成任务的最优错误率)

人类擅长处理复杂的自然感知任务,贝叶斯最优错误率一般认为是理论上机器可能达到的最优错误率,也是人类完成任务的最优错误率,当你的算法工作的比人类糟糕,你应该要:

  • 得到更多来自于人类的标签数据
  • 人工分析错误增加洞察力,当人做这件事时是怎么做对的?
  • 对于偏差/方差的进一步分析

贝叶斯错误率与训练集的错误率之间的差值为可避免的偏差,而训练集的错误率和验证集上的错误率的差值为方差,比较训练集的错误率与贝叶斯错误率、验证集错误率的偏差和方差,确定专注减少偏差还是方差对算法调优更有效

如果算法的目标是代替贝叶斯错误率,当接近人类水平时进展会越来越难,下图中人类水平的错误率应该是(d)有经验的教授

  •  对于数据噪点很多的问题(背景音模糊的语音识别),估计贝叶斯错误率对避免可避免偏差和方差有很大意义
  • 对于贝叶斯错误率几乎为0的算法,可以将训练集得到的数值与0%比较(不再与人类完成任务的最优错误率比较)
  • 看看训练错误率和贝叶斯错误率估计值之间的距离,知道可避免偏差有多大
  • 在看开发错误率和训练错误率之间的距离知道方差问题有多大,应该做多少努力,让算法表现能够从训练集推广到开发集,算法是没有在开发集上训练的

 有监督学习的两个基本假定

  • 在训练集上表现很好
  • 在训练集上表现很好的同时也可以很好地适用于开发集/测试集

迁移学习

  • 将某个领域或任务上学习到的知识或模式应用到不同但相关的领域或问题中
  • 迁移学习是指将原来用于解决任务A的网络结构和权值迁移到任务B中,并且在任务B中也能得到较好的结果的一种训练方法。迁移学习之所以能够实现的原理是由于卷积神经网络在浅层学习的特征具有通用性。在样本不足的情况下,可以使用迁移学习,将这些通用特征学习从其他已经训练好的网络中迁移过来,从而节省训练时间,并且得到较好的识别结果。
  • 使用迁移学习Finetune,也叫微调、finetuning,是深度学习中的一个重要概念。inetune利用别人已经训练好的网络,针对自己的任务再进行调整。

将A迁移到B上

  • 当任务A和任务B 有相同的输入X
  • 任务A的数据比任务B多
  • 来自A的低水平特征对于学习B有用

基于模型的迁移:

就是说构建参数共享的模型。这个主要就是在神经网络里面用的特别多,因为神经网络的结构可以直接进行迁移。比如说神经网络最经典的finetune就是模型参数迁移的很好的体现。

 A.为什么需要已经训练好的网络?在实际的应用中,我们通常不会针对一个新任务,就去从头开始训练一个神经网络。这样的操作显然是非常耗时的。尤其是,我们的训练数据不可能像ImageNet那么大,可以训练出泛化能力足够强的深度神经网络。即使有如此之多的训练数据,我们从头开始训练,其代价也是不可承受的。那么怎么办呢?迁移学习告诉我们,利用之前已经训练好的模型,将它很好地迁移到自己的任务上即可。

B.为什么需要finetune?因为别人训练好的模型,可能并不是完全适用于我们自己的任务。可能别人的训练数据和我们的数据之间不服从同一个分布;可能别人的网络能做比我们的任务更多的事情;可能别人的网络比较复杂,我们的任务比较简单。举一个例子来说,假如我们想训练一个猫狗图像二分类的神经网络,那么很有参考价值的就是在CIFAR-100上训练好的神经网络。但是CIFAR-100有100个类别,我们只需要2个类别。此时,就需要针对我们自己的任务,固定原始网络的相关层,修改网络的输出层,以使结果更符合我们的需要。

C. Finetune的优势:不需要针对新任务从头开始训练网络,节省了时间成本;预训练好的模型通常都是在大数据集上进行的,无形中扩充了我们的训练数据,使得模型更鲁棒、泛化能力更好;Finetune实现简单,使得我们只关注自己的任务即可。在实际应用中,通常几乎没有人会针对自己的新任务从头开始训练一个神经网络。Finetune是一个理想的选择。

深度网络的finetune可以帮助我们节省训练时间,提高学习精度。但是finetune有它的先天不足:它无法处理训练数据和测试数据分布不同的情况。而这一现象在实际应用中比比皆是。因为finetune的基本假设也是训练数据和测试数据服从相同的数据分布。这在迁移学习中也是不成立的。因此,我们需要更进一步,针对深度网络开发出更好的方法使之更好地完成迁移学习任务。以数据分布自适应方法为参考,许多深度学习方法都开发出了自适应层

(Adaptation Layer)来完成源域和目标域数据的自适应。自适应能够使得源域和目标域的数据分布更加接近,从而使得网络的效果更好。从上述的分析我们可以得出,深度网络的自适应主要完成两部分的工作:一是哪些层可以自适应,这决定了网络的学习程度;二是采用什么样的自适应方法(度量准则),这决定了网络的泛化能力。

设计深度迁移网络的基本准则:决定自适应层,然后在这些层加入自适应度量,最后对网络进行finetune

基于关系的迁移:

这个方法用的比较少,这个主要就是说挖掘和利用关系进行类比迁移。比如老师上课、学生听课就可以类比为公司开会的场景。这个就是一种关系的迁移。这种方法比较关注源域和目标域的样本之间的关系。

如果你要做一个计算机视觉的应用,相比于从头训练权重,或者说从随机初始化权重开始,不如你下载别人已训练好的网络结构的权重,你通常能够进展的相当快。用这个作为预训练,然后转换到你感兴趣的任务上。计算机视觉的研究社区,非常喜欢把许多数据集上传到网上,比如ImageNet、MS COCO或者Pascal类型的数据集。你可以下载花费了别人几周甚至几个月而做出来的开源的权重参数,把它当作一个很好的初始化用在自己的神经网络上。用迁移学习把公共的数据集的知识迁移到你自己的问题上。如下图,假如说你要建立一个猫的检测器用来检测你自己的宠物猫,Tigger、Misty或者Neither,忽略两只猫同时出现在一种图的情况。你现在可能没有Tigger和Misty的大量图像,所以你的训练集会很小。此时可以从网上下载一些神经网络的开源实现,不仅把代码下载下来也要把权重(weights)下载下来。有许多训练好的网络你都可以下载,例如ImageNet,它有1000个不同的类别,因此这个网络会有一个Softmax单元,它可以输出1000个可能类别之一。你可以去掉这个Softmax层,创建你自己的Softmax单元用来输出Tigger、Misty、Neither三个类别。就网络而言,建议你把所有的层都看作是冻结的(frozen)。你冻结的网络中包含所有层的参数,你只需要训练和你的Softmax层有关的参数。这个Softmax层有三个可能的输出。通过使用其他人预训练的权重,你很可能得到很好的性能,即使只有一个小的数据集。幸运的是,大多数深度学习框架都支持这种操作,事实上,取决于用的框架。如果你的数据越多,你可以冻结越少的层,训练越多的层。这个理念就是,如果你有一个更大的训练集,也许有足够多的数据,那么不要单单训练一个Softmax单元,而是考虑训练中等大小的网络,包含你最终要用的网络的后面几层。最后,如果你有大量数据,你应该做的就是用开源的网络和它的权重把整个当作初始化然后训练整个网络。
(4条消息) 深度学习中的迁移学习介绍_fengbingchun的博客-CSDN博客_深度学习迁移学习

猜你喜欢

转载自blog.csdn.net/m0_51933492/article/details/126613606