机器学习入门总结和各类常用神经网络汇总(第二篇)

(七)GAN(generative adversarial network)生成式对抗网络

GAN的核心为,让一个简单的随机的分布,经过网络的计算后生成一个有规律的分布。例如一张图片或者一段声音。

这个网络主要分成两个部分:generator、discriminator。他们两个的工作分别为,一个用于生产图片,另一个用来判断生产出来的图片够不够真实。

GAN是很难训练出来的,首先generator和discriminator需要相互匹配,其中有一个出问题了,网络就无法训练起来。第二点,网络有可能缺少多样性。输出一张图片看似还不错,但是多输出几张,发现他们都长得一样。就需要另外的方法来解决多样性的问题。

(1)conditional generation 有条件的生成

例如:输入一段文字的描述,输出一张对应要求的图片。

这里与前面的不同,这里可能需要对图片进行标注,打上label。那如果我们仅仅是打上标签作为输入,然后去生成一张图片,网络极有可能就是忽略掉你输入的条件,随便生成一张图片给你。这就需要label和图片同时满足要求才算通过。这里就要设计一个更加严格的discriminator。

(2)Cycle GAN

有时候我们的需求是:给真实的人物生成动漫形象。这里的动漫形象那要求和真实的人长得还挺像的。

那如果用前面所提到的方法似乎都行不通,生成的图片肯定是随机生成,无法达到要求的。那么cycle gan的解决方案就是,我要生成出来的动漫形象还能还原出原来的人的样子。这样生成出来的动漫形象就不会跑偏了。


(八)自监督学习 self-suppervised learning

这里面都是些神经网络中的巨无霸了,这些网络都是极其巨大的。例如:ELMO(94M), BERT(340M), GPT-2(1542M), Megatron(8B), T5(11B), GPT-3(10 times larger than Turing NLG)

他的特点就是,没有label,给一堆数据给神经网络,让他自己学会一些东西。

(1)BERT怎么训练呢?

Bert是用来处理文本的一个巨大的神经网络。我们以它为例子,分析自监督学习的训练方式。

它的输入和输出都是同样的内容,但唯一不一样的是,输入会随机地将某一个字遮住,BERT会先对输入进行一个编码,然后接入到Linear Layer来猜测遮住的部分是什么内容。

(2)这样的网络训练出来有什么用呢?

可以用作是其他网络的数据预处理。

举个例子:可以用于做电影正面或者负面评论的分析统计;可以用于做自然语言的语义分析等

很多时候用了BERT确实会让准确率进行提高,但是现在也很难解释这个现象。

(3)为什么BERT是有效的呢?

图中有一个有趣的现象,最后一行,用通过104种语言训练出来的BERT,用中英文做微调,结果在中文的测试上比用中文训练,中文测试还要好。这又该如何解释呢?难道它直接把中英文都学会了吗?

(4)GPT和BERT的区别

BERT是基于Transformer的Encoder构建的,而GPT是基于Transformer的Decoder构建的。这就导致GPT类似于传统的语言模型,即一次只输出一个单词进行序列预测,也就是下一词预测。因为Decoder部分与RNN思想还是比较类似的,尤其是其中Masked attention部分,能够屏蔽来自未来的信息,因此GPT是单向的模型,无法考虑语境的下文。

BERT基于Encoder,可以很好地考虑上下文信息,这样预训练任务就从下一词预测自然而然地转换成了结合了前后语义的单词预测。因此BERT改变了预训练的方式,即采用MLM和NSP两种任务进行训练。因为Encoder得到的是每个输入单词对应的向量,因此将单词缺失位置对应的输出向量投入一个线性分类器即可预测。

GPT进行的是单向语言模型的训练,而Bert想要构造一个深层双向语言模型,以你为在直觉上深层的双向模型大概率会由于传统的“前向”模型(比如GPT)或者“前向 拼接 后向”的模型(比如ELMO),而且能更好地同时考虑上下文的信息进行预测,从而学到更好的预训练语言模型。

可参考:
【1】https://zhuanlan.zhihu.com/p/125139937?from_voters_page=true
【2】https://www.sohu.com/a/336262203_129720
【3】https://zhuanlan.zhihu.com/p/264989685


(九)自编码器 auto-encoder

根据BERT这样的神经网络我们得到了启发,我们在每次进行真正的训练前对数据进行pre-train,然后再做下流任务(downstream task)会不会有更好的表现呢?

那么它想要解决的问题就是:如何对数据进行编码?

做法就是,将高维度的信息通过编码器生成一段低维度的向量,再将这段向量反向解码为高纬度的信息,但是信息有些许丢失。这听起来和cycle gan似乎是一样的原理。

(1)有什么用呢?

可以用于对数据进行标注,也可以用于声音合成,还可以用于论文摘要生成。


(十)机器的可解释性(explainable machine learning)

因为我们知道机器学习回答正确,并不代表着人工智能。极有可能是人工智障!

(1)为什么我们需要可解释性的机器学习?

举一个简单的例子,法院的判刑是需要相关的法律法规和理论的支持的,不能是法官说判多少年就判多少年。再者,在医疗诊断中,我们得知道得出该诊断的理由是什么?而不是说医生说啥就是啥。

当我们知道了机器学习的可解释性后,即使机器出了问题我们也能知道该怎么去修改。但是我们也不能削足适履。

削:用刀切。适:适应,符合。履:鞋子。指鞋小脚大,把脚削去一块去适应鞋子的大小。比喻不合理地迁就现有条件,或不顾具体条件地生搬硬套。也作“削趾适履”。

(2)有什么样的解释方法?

大体上有两种解释方法:局部解释和全局解释

  • Local Expalination:为什么你认为他是一只猫?
  • Global Expalination: 你认为一只猫是长什么样的?
(3)Local Expalination怎么做的呢?

用一个小方块去挡住图片中的内容,然后观察预测出的概率值。这样就能看出,神经网络是根据那一部分来判断出这是一只猫的。

或者可以使用:Saliency Map等。
关于其他的网络,可以把中间层的输出拿出来看一下究竟是怎么样的。

可以参考:
【1】https://mathpretty.com/10683.html
【2】https://www.cnblogs.com/chouxianyu/p/14687810.html
【3】https://zhuanlan.zhihu.com/p/447305919

(4)Global Expalination

用已经训练好的模型构造x,逼近输入,例如构造一张包含某些pattern的图像。但可能会出现得到的x不是你想要的x,而是一堆噪声,解决方法为:

●加入限制。例如,数字分类器(digit classifier),损失函数可加入条件函数,限制其为数字。

●加入生成器(generator),将构造的图像还原成原图,再用分类器分类,判断构造的图像是否为真。


(十一)模型攻击(model attack)

举个例子,在人脸识别的时候,可能我们在摄像头上贴一个具有特殊噪音的透明薄膜,人脸识别就有可能会沦陷。如果这种情况出现在自动驾驶中,这将是极其危险的。

这样的图片肉眼完全看不出差别。

(1)白盒攻击

白盒攻击指的是,在知道模型结构和参数的情况下,设计方法进行攻击。常用的方法仍然是梯度下降。此时我们的神经网络参数是固定的,我们要调整的是样本输入x,通过梯度下降来找到最合适的样本x。同时假样本必须满足最大距离限制。

(2) 黑盒攻击

构建一个类似的模型,称为proxy model。然后对这个proxy model进行白盒攻击。效果往往是不错的。

模型是很容易被攻击的甚至还有改变一个像素点的攻击。称之为:One pixel attack。还有Universal adversarial attack。

常用的方法如下

  • FGSM (https://arxiv.org/abs/1412.6572)
  • Basic iterative method (https://arxiv.org/abs/1607.02533)
  • L-BFGS (https://arxiv.org/abs/1312.6199)
  • Deepfool (https://arxiv.org/abs/1511.04599)
  • JSMA (https://arxiv.org/abs/1511.07528)
  • C&W (https://arxiv.org/abs/1608.04644)
  • Elastic net attack (https://arxiv.org/abs/1709.04114)
  • Spatially Transformed (https://arxiv.org/abs/1801.02612)
  • One Pixel Attack (https://arxiv.org/abs/1710.08864)
(3)那么该如何防御呢?
  • 被动防御:可以通过smoothing的方法,让原图变得模糊,这样就会破坏掉里面的攻击像素,但是随之而来的副作用就是降低模型的准确率。

  • 主动防御:训练一个具有鲁棒性的模型,可以在训练数据里面加入一些攻击算法造成干扰。

可参考:
【1】https://blog.csdn.net/qq_37233260/article/details/119397686
【2】https://blog.csdn.net/u013510838/article/details/108495755


(十二)领域自适应 (domain adaption)

问题的提出是,可能我们的训练集和测试集有一些差距,我们的模型表现就会变差。那么我们有什么办法能够做到让这两个分布互相适应呢?

领域自适应方法分类
基于样本的方法 Instance-based method:
• 改变源域标签数据的样本权重
• 与目标域数据相近的源域数据有更高的权重

基于特征的方法 Feature-based method:
• 将源域与目标域数据映射到共通的特征空间

提取源域和目标域的共通特征
• 部分特征是和数据域相关的
• 其它特征是数据域之间共通的

基于伪标签的方法 Pseudo-label-based method:
• 以目标域数据中可信度高的预测结果作为伪标
签来训练模型

伪标签
• 目标域中可信度高的预测通常是对的
• 可信度比较高的样本可以作为伪标签对模型进行自训练

可参考:
【1】https://blog.csdn.net/SHU15121856/article/details/106874558/
【2】https://pabebezz.github.io/article/2d45afe4/
【3】https://blog.csdn.net/lihe4151021/article/details/123763606


(十三)强化学习

基础知识:
【1】https://www.jianshu.com/p/c5bfa73abcaf
【2】https://www.jianshu.com/p/e93eb8b70f35

和深度学习机器学习有很大的区别,而且强化学习最近被认为是最有可能接近强人工智能的方法。但是强化学习的问题依旧是很难训练。

他的loss function也很奇特,通过reward来获得分数。让loss越大越好。也就是说得分越高越好。

(1)模仿学习

一般只有在游戏中才有reward,而在真实世界不是都有reward。而人定的reward不一定是好的,为了解决这个问题,用模仿学习

每次行为之后不产生reward,使人类与环境进行互动来示范,让机器模仿人类的行为

行为克隆可能遇到的问题
1、存在人类没遇到过的问题而机器遇到了,即这个行为不存在在训练资料里面
2、机器将会复制每一个行为,即使是无关紧要的行为,但是如果机器的能力是有限的,它可能选择性的学习行为,可能学到不好的行为而放弃好的行为

reward function是学出来的
反向增强学习的原则是:老师的行为总是最棒的


(十四)神经网络的压缩(model compression)

我们的神经网络可能会部署在不能的设备上,然而不同的设备的算力是不同的。那么怎么才能让bert在智能手表上运行呢?

常用方法有:

  • 模型剪枝: network pruning
  • 知识蒸馏: knowledge distillation
  • 参数量化: parameter quantization
  • 建筑设计: architecture design
  • 动态计算: dynamic computation
(1)模型剪枝: network pruning

网络通常是过度参数化的(存在显著的冗余权值或神经元)

我们将不太重要的权重剔除,但是会造成一个实际的问题是,网络结构遭到破坏,神经网络速度难以得到提升。并且准确率会有一定程度的下降。

可以通过取出神经元的数量,能够有效的提升计算的速度。

通过对剪枝后的神经网络进行使用不同的初始化参数重新训练。一个使用的是随机初始化参数,零一个使用的是原来的初始化参数,两者的差别很大。或许,权重的初始化,比网络的大小要重要一些。再次证明,网络剪枝要比重新训练一个小网络更好。

(2)知识蒸馏: knowledge distillation

首先,训练好一个大的网络,然后再设计一个小一点的网络。然后让大的网络是老师,小的网络叫做学生。小的网络把大的网络当成是正确答案,让他去不断地接近大的网络。这就是知识蒸馏。

(3)参数量化: parameter quantization

一些基础的方法:权重聚类,使用聚类中心来表示一个类的值。使用更少的位来存储一个参数。使用多的参数用比较少的位来表示,使用多的参数用较多的位来表示较少使用的参数。比如哈夫曼编码。

第二种方法是:Binary Weight(二元权值)
仅使用±1来表示权值。

(4)建筑设计: architecture design

调整网络结构,来生成较少的参数。例如CNN就有两种方法减少参数。较为可行

原来的卷积核的通道数和输入的通道数是一致的,卷积核的数量代表了输出的通道数。为减少参数,可以使用:Depthwise Separable Convolution(切除分离卷积)

第一步:让卷积核变成单层的,一个卷积核负责一个通道,这样参数变少

第二步:使用更小的卷积核(1x1)逐个像素点进行卷积,这样参数的数量也会变得更少。

(5)动态计算: dynamic computation

方式1:训练很多个network模型,根据需求选择不同的network模型。
方式2:动态深度,训练一个network模型,但是将每一个Hidden Layer 上加一个Classifier:

方式3:动态宽度:让神经网络瘦身

方式4:让计算基于样本的复杂度

他们都是可以交叉使用的。

可参考:
【1】https://www.it610.com/article/1558231458504577024.htm


(十五)机器终身学习(life long learning)

终身学习的概念是说,机器能够完成了任务1,但是在一段时间后来了任务2。这时候训练机器学会任务2。但是发现他已经忘记了任务1该怎么处理。但是机器是有能力同时处理好两个任务的。

这听起来和迁移学习(Transfer Learning)有点像,Transfer Learning: 虽然也涉及两个任务,但是它关心的是第一个任务上学到的模型在第二个任务上的应用,而不关心它是否仍能解决任务1。而终身学习:涉及两个任务而且仍然关心是否还能解决任务1。

(1)为什么会出现遗忘呢?

是因为不同任务的loss收敛的位置不一样。

(2)如何解决?

所以解决办法的思想是:一些模型中重要的参数改变很小,而不重要的参数可以改变较大。

对于这个式子的后一项,不同参数的b是不一样的,对于重要的参数,b值偏大,使新的参数和原始参数比较接近,而对于不重要的参数,b值偏小甚至为0,不在意新的参数与原始参数是否接近。

或者是借鉴惯性的思路,让这次任务的权重改变受到上一个任务权重方向的影响。偏向共同作用的方向。但是需要用额外的内存来存下上个任务的梯度大小。

另外的解决方案:

(3)progressive neural networks

任务1的参数就不要动它了,直接用于任务2,再增加神经网络来解决任务2,这个适用于任务少的情况下。

(4)packnet

先开一个比较大的network,每个任务只用部分的参数

(5)curriculum learning

学习顺序不同,可能学习效果也不同



(十六)元学习(meta learning)

这里就是彻底地玄学内容了,各位炼丹师,各位老中医加油吧!我已经挂了。

元学习的目标就是让机器学会自己构建神经网络。meta learning 中,我们用F来表示学习模型(learning algorithm),模型的输入不是一张图片,而是一个训练资料(training examples),输出不是一个标签,而是一个classifier function,得到这个classifier之后,将测试的数据输入,再输出标签。而F是人定义的(hand-crafted),f是从数据学习到的。

(1)步骤

step1:思考在一个学习模型中,哪些是需要被学习出来的(learnable compoments)
比如说,对于一个深度学习模型,模型的结构、初始参数以及学习率...这些之前都是人为决定的超参数,但是在meta learning 中,这些都可以被定为是需要被学习到的参数φ(learnable compoments)。

step2:为learning algorithm定义loss function
指的是一个学习模型。定义的loss function来衡量learning algorithm的好坏。

在meta learning中,Loss是由训练任务(training tasks)来学习到的。假设我们要学习一个二元分类器,那么就需要准备二元分类的任务来进行模型训练,每个任务(training task)里面都有训练数据和测试数据。

step3:找到φ使得L(φ)最小

可参考:
【1】https://zhuanlan.zhihu.com/p/492065966

你可能感兴趣的:(机器学习入门总结和各类常用神经网络汇总(第二篇))