date | version | comments |
---|---|---|
2019/9/25 | V0.1 | Init |
文章目录
正交化
表示在机器学习模型建立的整个流程中,我们需要根据不同部分反映的问题,去做相应的调整,从而更加容易地判断出是在哪一个部分出现了问题,并做相应的解决措施。
正交化或正交性是一种系统设计属性,其确保修改算法的指令或部分不会对系统的其他部分产生或传播副作用。 相互独立地验证使得算法变得更简单,减少了测试和开发的时间。
当在监督学习模型中,以下的4个假设需要真实且是相互正交的:
- 系统在训练集上表现的好
否则,使用更大的神经网络、更好的优化算法 - 系统在开发集上表现的好
否则,使用正则化、更大的训练集 - 系统在测试集上表现的好
否则,使用更大的开发集 - 在真实的系统环境中表现的好
否则,修改开发测试集、修改代价函数
单一数字评估指标
在调整超参数后,通常结果会发生一些变化,但是往往变化的不止一个值。可能有好几个值都发生了变化,那么制定一个单一数字去评估结果的好坏是比较好的。比如一个问题中有准确率(Precision)和查全率(Recall)两个参数,通常可能是两个模型A模型准确率好,B模型的查全率高,并且没有两个参数的偏向。那么可以制定一个
F
1
F_1
F1参数来表示:
P
r
e
c
i
s
i
o
n
=
T
r
u
e
p
o
s
i
t
i
v
e
N
u
m
b
e
r
o
f
p
r
e
d
i
c
t
e
d
p
o
s
i
t
i
v
e
×
100
%
=
T
r
u
e
p
o
s
i
t
i
v
e
T
r
u
e
p
o
s
i
t
i
v
e
+
F
a
l
s
e
p
o
s
i
t
i
v
e
R
e
c
a
l
l
=
T
r
u
e
p
o
s
i
t
i
v
e
N
u
m
b
e
r
o
f
a
c
t
u
a
l
l
y
p
o
s
i
t
i
v
e
×
100
%
=
T
r
u
e
p
o
s
i
t
i
v
e
T
r
u
e
p
o
s
i
t
i
v
e
+
F
a
l
s
e
n
e
g
a
t
i
v
e
F
1
=
2
1
P
r
e
c
i
s
i
o
n
+
1
R
e
c
a
l
l
Precision = \dfrac{True\ positive}{Number\ of\ predicted\ positive} \times 100\%= \dfrac{True\ positive}{True\ positive + False\ positive}\\ Recall = \dfrac{True\ positive}{Number\ of\ actually\ positive} \times 100\%= \dfrac{True\ positive}{True\ positive + False\ negative}\\F_1 = \dfrac {2} {\dfrac{1}{Precision}+\dfrac{1}{Recall}}
Precision=Number of predicted positiveTrue positive×100%=True positive+False positiveTrue positiveRecall=Number of actually positiveTrue positive×100%=True positive+False negativeTrue positiveF1=Precision1+Recall12
但是对于某些特定的模型,对某个参数非常重视,就主要以那个参数的提高为准就好了。
- 惩罚方式:
对于某一个模型,我们觉得有一种误识别是非常严重的,比如本来是一张色情图片,但是输出为猫。原来的误差描述为: E r r o r = 1 m d e v ∑ i = 1 m d e v I { y p r e d ( i ) ≠ y ( i ) } Error = \dfrac{1}{m_{dev}}\sum\limits_{i=1}^{m_{dev}}I\{y^{(i)}_{pred}\neq y^{(i)}\} Error=mdev1i=1∑mdevI{ypred(i)=y(i)}加入权值, w ( i ) = { 1 如 果 x ( i ) 不 是 色 情 图 片 10 或 100 如 果 x ( i ) 是 色 情 图 片 w^{(i)}=\left\{ \begin{array}{l} 1\qquad \qquad \qquad 如果x^{(i)}不是色情图片\\ 10或100\qquad \qquad如果x^{(i)}是色情图片 \end{array} \right. w(i)={1如果x(i)不是色情图片10或100如果x(i)是色情图片这样就表示为了: E r r o r = 1 ∑ m d e v ∑ i = 1 m d e v w ( i ) I { y p r e d ( i ) ≠ y ( i ) } Error = \dfrac{1}{\sum m_{dev}}\sum\limits_{i=1}^{m_{dev}} w^{(i)}I\{y^{(i)}_{pred}\neq y^{(i)}\} Error=∑mdev1i=1∑mdevw(i)I{ypred(i)=y(i)}
那么就能有效地把特定的错误识别出来,但是测试集上的是否要加惩罚的标签需要人工去打。
人类表现误差(Human level error)
bayes误差:简单理解就是把数据发挥到最大极限时候的误差,任何事情都不是100%的,只有不断接近100%。bayes误差就是不可改善的误差,但是这样的值往往比较难获得。使用人类表现误差代替,比方,在识别图片的应用上,人可能看不清分辨率比较差的图片无法分辨,也就是人看图片识别的正确率不是100%,人最高的准确率假设为99.7%,那么认为机器进行到99.7%的准确率的时候已经没有上升的空间了。(因为没人为这些数据做“正确”的标签)
假设有A模型/B模型的表现为:
A | B | |
---|---|---|
humen-level error | 1% | 7.5% |
training error | 8% | 8% |
dev error | 10% | 10% |
对于A模型,人类误差只有1%,训练集的误差为8%,dev集的误差为10%,显然训练集还有7%的上升空间,应该想办法提高训练集的准确率。对于B模型,人类误差7.5%,训练集的8%已经相差无几了,应该着手想办法减小dev集的误差,减小方差。
如果一个模型,距离超越人类实现还有比较大的距离,应该着手减小偏差,减小训练集的误差,如果已经和专家的识别正确率没差别了,那就多想办法减小方差(dev集)。
改善模型的方法
高偏差问题:
- 训练更大的网路
- 训练更长时间、训练更好的优化算法(Momentum、RMSprop、Adam)
- 寻找更好的网络架构(RNN、CNN)、寻找更好的超参数
高方差问题:
- 更多数据
- 正则化(L2,dropout,数据增广)
- 寻找更好的网络架构(RNN、CNN)、寻找更好的超参数
误差分析
如果训练了一个模型准确率90%(bayes误差为0%),也就是说还有10%的上升空间,但是我们需要去判断应该在哪个方面去提高准确率是最好的。这个时候就需要去人工判断那些出现判断错误的原因是什么(首先处理dev集的问题),通常可能有的原因:标签错误,图片有滤镜…等等方面。
在dev集中去找,并且一张一张地找为什么错了,并且用个表格记录下来,然后看是那个方面影响大,这样可以制定一个可以最大程度改善结果的方向。
对于错误标签的问题,首先需要处理的是dev集的错误标签,但是对于训练集的标签,需要分情况的,神经网络对于随机误差有一定的鲁棒性的,如果只是随机的问题,就不需要去修改训练集的标签,因为训练集的数量通常很大,需要很多时间去处理,但是收货并不大。但是如果是系统误差(如有人把豹子都打成了猫),就需要去处理了。
不同分布上的训练和测试
在深度学习的时代,因为需求的数据量非常大,现在很多的团队,使用的训练数据都是和开发集和测试集来自不同的分布。
下面是一些处理训练集和测试集存在差异的最佳的做法。
我们可以从网上获取大量的高清晰的猫的图片去做分类,如200000张,但是只能获取少量利用手机拍摄的不清晰的图片,如10000张。但是我们系统的目的是应用到手机上做分类。
也就是说,我们的训练集和开发集、测试集来自于不同的分布。
Method1:
将两组数据合并到一起,总共得到21万张图片样本。将这些样本随机分配到训练、开发、测试集中。
- 好处:三个集合中的数据均来自于同一分布;
- 坏处:我们设立开发集的目的是瞄准目标,而现在我们的目标绝大部分是为了去优化网上获取的高清晰度的照片,而不是我们真正的目标。
这不是一个好方法,推荐方法二。
Method2:
训练集均是来自网上下载的20万张高清图片,当然也可以加上5000张手机非高清图片;对于开发和测试集都是手机非高清图片。
不同分布上的偏差和方差
迁移学习(transfer learning)
迁移学习类似使用tf.slim使用预训练(pre-trained)的模型进行优化(fine tuning)的过程,就是使用一个类似已经训练好的模型,去掉最后一层的参数,随机初始化然后训练另外一个模型,比如,做放射图片识别时候,往往没有很多的图片数据,但是其他的图片数据是有的,就可以用一个图片识别的模型,去掉最后一层,然后来做训练,先让这些图片去训练一些低维度的特征出来,然后这些使用这些特征去识别放射图片。(类似我们先学习什么是点,线,面解决了一个数学问题,当我们要解决一个类似的数学问题时候,我们不需要重新学习什么是点、线、面,可以直接用已经学习得到的点、线、面的知识解决新的问题。)
可以使用这种方式的条件为:
- 两个模型的输入是一样的(因为只重新训练了最后一层);
- A模型的数据远比B模型的数据多,所以可以用pre-trained的A模型去fine tuning B模型;
- A模型预训练的参数对B模型是有效的,使用预训练的语音识别做图片识别就没有意义。
多任务学习(Multi-task learning)
所谓多任务学习就是在一个模型中训练多个结论,使用一个例子,在开发自动驾驶中,需要识别行人,前方车辆,指示牌等。可以分别训练三个模型来进行识别,也可以直接使用一个多任务学习模型来处理这个事情。在输出的 y = [ y 1 , y 2 , y 3 ] T y=[y_{1},y_{2},y_{3}]^T y=[y1,y2,y3]T分别对应了行人,前方车辆,指示牌,0-没有,1-有。这样,输出就不像前面是one-hot的那样了,可能是 [ 1 , 1 , 0 ] [1,1,0] [1,1,0]或者 [ 0 , 0 , 1 ] [0,0,1] [0,0,1]甚至部分没有标签的 [ 1 , 0 , ? ] [1,0,?] [1,0,?],这里的损失函数定义需要变化一下: J = ∑ i = 1 t a s k s L ( y ^ i , y i ) J = \sum \limits_{i=1}^{tasks}{L(\hat y_i,y_i)} J=i=1∑tasksL(y^i,yi)如果epoch size = m时候, J = 1 m ∑ j = 1 m ∑ i = 1 t a s k s L ( y ^ i { j } , y i { j } ) J =\frac1m\sum \limits_{j=1}^{m} \sum \limits_{i=1}^{tasks}{L(\hat y_i^{\{j\}},y_i^{\{j\}})} J=m1j=1∑mi=1∑tasksL(y^i{j},yi{j})有的部分标签没有打,那么在计算损失函数这部分就不计算 J = 1 m ∑ j = 1 m ∑ i = 1 t a s k s L ( y ^ i { j } , y i { j } ) ,only when yi=1 or 0 J =\frac1m\sum \limits_{j=1}^{m} \sum \limits_{i=1}^{tasks}{L(\hat y_i^{\{j\}},y_i^{\{j\}})} \text{,only when yi=1 or 0} J=m1j=1∑mi=1∑tasksL(y^i{j},yi{j}),only when yi=1 or 0
端到端学习(end to end learning)
所谓的端到端学习就是给算法喂数据,然后等输出就好了,也就是深度学习的概念。相对比的就是机器学习的特征,需要人工去设计/找特征。
上图中,上面就是ML的方式,需要去设计特征,而下方的端到端学习就不需要额外设计特征了。
端到端学习的优缺点:
优点:
- 可以让数据说话,按照他自己的方式去学习如何输出正确的值
- 少了很多人工设计,ML非常依赖特征,有时候特征不正确就不能得到好的模型
缺点:
- 需要大量数据
- 有时候人工设计的很巧妙的特征也被去除了
吴恩达Coursera深度学习课程 DeepLearning.ai 提炼笔记(3-1)-- 机器学习策略(1),https://blog.csdn.net/Koala_Tree/article/details/78270272 ↩︎