从机器学习到深度学习(从机器学习到深度学习)
从机器学习到深度学习(从机器学习到深度学习)枯燥无味的概率论在生活中却可以解释很多有趣的事情。篮球巨星蔡徐坤投了三次篮,一次未中,求他下一次命中的概率。你想说是0%?贝叶斯告诉你答案是0.2,相比于0是不是显得更加合理? 上图中H2和H3都将数据成功分类,但是明显H3做得更好一些。可以简单的认为SVM(支持向量机)拥有找出泛化能力最好的一条决策边界。SVM它与LR的区别在于损失函数的定义,通过最大间隔的约束,使得决策边界尽可能的远离支持向量点,所以决策边界就只与支持向量点有关 进而可以引入核函数将低维不可分的特征映射到高维。一套几乎完美的理论赢得了不少人的吹捧。 以简单的lr举例:在一维特征空间,线性回归是通过学习一条直线,使得这条直线尽可能拟合所有已有的看到的点y(观测数据),并希望未看到的数据(测试数据)也尽可能落在这条线上(泛化性能)。这里说直线可能不太正确,如果只有一个特征是一条直线,两个特征是一个平面,三个特征就是在四维空
如今机器学习、深度学习、人工智能这些词耳熟能详,但大多数人对它的理解确是模棱两可,本文是我总结出来的一些个人理解。鲁迅先生说过:多一行公式,就少10个读者。所以我尽量避免枯燥无味的数学公式。由于水平有限,可能存在一些理解上的不正确,但希望通过它,能让大家对于机器学习以及深度学习有一个大致的宏观了解。
一、机器学习(Machine Learning)
理论上来讲,只要我们知晓发生一件事情的所有条件,我们就能够通过函数的形式去预测这件事情。千篇一律的列子:房价,如果我们事先知道房子的面积、地段、是否是学区房、楼层等等信息我们就有办法去预测房屋的价格。
在机器学习中我们把面积这些信息称为:特征,把预测结果的函数称为:模型,而房价的预测就是我们的:结果,(真实房价-预测结果)²所有样本的求和:损失函数。
我们的目标就是寻找一个最优的函数,使得损失函数的值尽可能的低。这样我们就可以通过特征去预估房价
1.基于数学推导模拟函数:lr、SVM等
以简单的lr举例:在一维特征空间,线性回归是通过学习一条直线,使得这条直线尽可能拟合所有已有的看到的点y(观测数据),并希望未看到的数据(测试数据)也尽可能落在这条线上(泛化性能)。这里说直线可能不太正确,如果只有一个特征是一条直线,两个特征是一个平面,三个特征就是在四维空间线性可分,以此类推。
线性回归房价预测
举例说明:假设房价:y,只与房屋面积:x有关,成线性关系(这里人为的约束了函数模板y=wx 真实情况也可能是y=wx²)
真实值:y
预测值:h
初始化超参数w=1
初始化超参数学习率l=1
函数模型:h=wx
损失函数: ∑ (y-h)²
∑:为求和符号,即将每个样本的损失累加
对w求导:d=∑2x²w-∑2xy
将x y w值代入公式得到常量d
对w进行梯度更新:w=w-l*d
重复以上步骤,等待损失函数收敛得到最优模型。
2分类任务决策边界
上图中H2和H3都将数据成功分类,但是明显H3做得更好一些。可以简单的认为SVM(支持向量机)拥有找出泛化能力最好的一条决策边界。SVM它与LR的区别在于损失函数的定义,通过最大间隔的约束,使得决策边界尽可能的远离支持向量点,所以决策边界就只与支持向量点有关 进而可以引入核函数将低维不可分的特征映射到高维。一套几乎完美的理论赢得了不少人的吹捧。
2.统计学理论去统计概率:
枯燥无味的概率论在生活中却可以解释很多有趣的事情。篮球巨星蔡徐坤投了三次篮,一次未中,求他下一次命中的概率。你想说是0%?贝叶斯告诉你答案是0.2,相比于0是不是显得更加合理?
篮球巨星
tf-idf(关键词统计)、朴素贝叶斯、HMM、CRF由简到深,这都是一些常见的统计学模型。即便当今深度学习大行其道,但是如:LSTM CRF等模型在命名识别体任务上也是有自己出色的表现和优势。
3.树 模型融合
通过信息熵、基尼系数等构建树的分叉节点从而生成一棵树,拟合上一个模型训练数据的残差构建第二颗树,通过树的加权融合生成最终模型。(模型的融合也分多种)
GBDT中的一颗树结构
常见的模型:随机森林、GBDT、xgboost等。
3.机器学习存在什么样的优势和弊端呢?
优点:像是lr、SVM之类普遍的机器学习算法,是有严格的数学推导证明他的可实践性质,可解释性强,是可以在认知上理解的。并且只要特征工程做得够好,模型的表现也是可圈可点。
缺点:人为的赋予模型函数模板,降低模型去理解数据之间更深层次的关系,需要进行更深层次的数据挖掘。举一个简单的列子 在一些机器学习比赛中几乎所有人都会对:“购物时间的年月日”这一特征做处理。因为人们总是在周末的时间进行购物,这时候就需要特征工程去构造新特征,将年月日转化为"周一至周日"的特征,不然模型很难去挖掘到这一信息。
当然以上只是一个很简单的例子,数据分析师会通过观察数据,想出千奇百怪的trick。所以一个任务是否work,往往是看数据是否处理干净,特征工程做得够不够好。跑模型的时间远低于特征工程时间
二、深度学习(Deep Learning)
1.神经网络
人脑可能有1000多亿个神经元,每个神经元都可能在几个方向上互相连接着,这么大量的神经元及连接就形成了一个超级大型的网络。我们就是因为这些网络而存在各种各样的思想和意识 。
深度学习利用"分段线性函数可以拟合任意连续函数 "(多个神经元)这一特点,让模型能够学会自己去挖掘特征之间的关系。相比于传统机器学习它能学到的就更多了。
两层神经网络
神经元:以上每一个黄色的圆就是神经元,两个神经元通过一个线性的lr相连,加上relu、sigmoid等激活函数给予非线性变化。
神经网络可能没有我们想象的那么神秘,它不过是多个线性回归的组合,用更多的神经元、更深的层去模拟函数罢了,他所谓的可解释性差指的是:对于不同的任务,我们究竟该用多少神经元,多深的层去做,这往往取决于经验、与不断的尝试。并不是越深的神经网络就越好,过多的参数以及过于深的层很容易引起:模型训练缓慢、梯度消失、梯度爆炸、过拟合等问题。
2.CV(计算机视觉)
计算机视觉本质上也是基本的神经网络 但是我们如何将一张图片转化为特征喂给模型?毫无疑问的答案是:像素。
但是一张图片有那么多个像素,每个像素作为一个特征,模型会不会太大了?所以CV里面一些比较核心的操作就是:卷积、池化一些列压缩特征的方法。而卷积的本质其实就是最简单的加权求和,通过不断的平移卷积核得到图像特征。采用多个不同大小的卷积核,就可以提取到图像上不同的特征。
卷积计算
卷积的本质其实就是最简单的加权求和,通过不断的平移卷积核得到图像特征。
图像有一个非常明显的特点:临近的几个像素点它表达的大概率上是同一个事物,所以通过卷积核提取特征在CV上效果是十分卓越的。
卷积提取的图像特征
人们往往不能理解,通过对像素的提取得到一个更加小的图片,那么这张小的图片究竟代表着什么?想象一下在我们的生活中,就算遮掩住一张图片的部分,我们其实也是可以认出来这张图片究竟是猫,还是狗。人类辨别事物的方可能与你想象的不大相同。
2.nlp(自然语言处理)
图像是计算机对现实的抽象,而自然语言是人类对现实世界的抽象。nlp可以解决许多语言问题如:聊天机器人、恶意评论多标签分类、机器翻译等。
如果用普通的神经网络去实现一个阅读理解问题,将一个个词作为特征输入模型。但是这样却忽略了语言的一个重要特性:语义顺序。比如:“我喜欢你”和“你喜欢我”模型会将两句话理解为一个意思。
所以我们不能像普通神经网络一样,将所有的词作为第一层神经网络的输入,而应该变更为每一层输入一个词,来保证语义顺序。但这样也造就了一个问题,神经网络层太深,需要学习的参数太多。于是RNN(循环神经网络)孕育而生。
RNN-循环神经网络
通过循环共享一个神经元,将上一个神经元的输出通过非线性变化和本次输入词进行拼接作为输入,来达到在更新少量参数的情况下模拟语义顺序。
自然语言的一个痛点是语言的的长距离依赖问题,过长的语句在反向传播的过程容易导致梯度消失的问题,RNN的变种:LSTM、GRU采用门控信号的形式告诉模型应该记住那些信息和应该遗忘那些信息。但这并不能从根源上避免梯度消失问题,lstm在超过200的序列长度上表现就会成断崖式下降。这种数学上的遗忘和我们人类的遗忘看起来是十分相似的。
LSTM
4.Bert
聊到了自然语言处理,就不得不说说颠覆nlp领域的模型Bert。出道即巅峰,它在机器阅读理解顶级水平测试SQuAD1.1中表现出惊人的成绩:全部两个衡量指标上全面超越人类!并且还在11种不同NLP测试中创出最佳成绩。
Bert是基于微调的预训练模型,Google使用维基百科等数据集在1024块TPU下训练了三天,得到预训练模型参数,后续只需要在此基础上针对特定任务微调,并且他也能够很好的兼容下游任务,推翻了必须为不同任务设计不同的模型。
2020glue榜单
上图是最新的glue得分榜,百度的ERNIE在2019年底历史性的将分数提到了90分,但是无论是阿里的StructBert 谷歌的T5,他们都是在Bert的基础上进行了改进,替换预训练任务、改变模型的深宽度、对bert的mask机制做出改进、更大的训练集等等等等。所以Bert模型的思想显得格外重要。
将分为五个部分 介绍Bert模型
•TransFormer
•Bert的预训练任务
•下游任务对接
•对比Emlo预训练模型
•总结
(1).TransFormer
Bert使用了Transformer.GPU Is All You Need一文中提出,采用自注意力机制的Transformer提取能力远超过了LSTM。从黑盒的角度可以简单的把它理解为是一种特征提取器。
TransFormer
对上图一些名词做简单介绍
•input Embedding Positional Encoding:将句子转化为字向量进行输入,由于自注意力机制没有位置相关性,引入位置编码。这里的位置编码采用固定的余弦公式,实验证明有效,但是合理性值得考量。
•self-head-Attention-自注意力机制:简单的可以理解为提取词与词之间的关系,返回新的词向量。对输入的数据进行Q、K、V三个变量的数据计算,同时学习三个矩阵,入参向量,得到相等数量的向量,目的是得到输入之间的注意力关系,由于计算过程比较复杂在这里就不做过多的展开。
•Multi-head-Attention-多头注意力机制:多头注意力机制是由多个自注意力机制组成,经过一个Embedding得到输出。其实和卷积神经网络里多个卷积核去提取特征是同一个道理。
•Add&Norm-归一化输入和残差:归一化操作是为了消除奇异样本,导致的不良影响。残差则是解决梯度衰减引起的性能问题
•Feed-Forward:简单的全连接层得到输出:两次线性变化加上一个relu激活函数,将值映射到(-1 1)区间,这里的relu可以说是给整个模型提供非线性变化的关键.
以上介绍属于TransFormer的左半部分,称为TransFormer-Encoder 而右半部份为TransFormer-Decoder。两者的区别和不同之处在于Encoder是基于全部输入进行计算,也就是双向的,可以理解句子的上下文信息。而Bert使用的就是Encoder.像是GPT网络采用了Decoder 使用遮罩的模式让预测的时候只有单词前的输入信息。
自编码-mask预测
小故事:GPT2.0的时候,OpenAI对外宣称GPT2.0效果过于强大,可能会对人类产生威胁,不愿意将它开源。那么人们就疑惑了:“你OpenAI不开源了,那你到底o不open呢?“最终GPT2.0开源,其实相比于GPT1.0也就是更深的层,更多的训练数据,依旧采用单向预测。
其实在这里需要补充说明的是,并不是说GPT采用单向预测的做法就是不对的。这是一种叫做自回归(AR)的语言模型。
右自回归
左自回归
可以看到要么从前往后,要么从后往前预测。这种自回归的机制虽然不能同时使用前后文去预测,但是他的优势在于他有一种生成的理念。而Bert采用mask机制通过上下文去预测中间词,这叫做自动编码(AE)语言模型。所以这也是为什么GPT在生成类任务表现良好,而Bert却是个雷区。在xlnet模型中就提出了一种方法结合两种语言模型的优势。
(2).Bert的两个预训练任务(pre-train)
Masked LM
采用15%随机的形式将我们要预测的词进行Mask替换,同时为了避免下游任务没有Mask输入的尴尬场景做出了替换单词
•80%Mask替换•10%随机token替换•10%不变
Next Sentence Prediction(NSP)
通过当前句子预测其下一个句子,这个任务饱受学术界的争议,很多人认为这是一个没有意义的任务,所以之后基于Bert改进的任务有一些做了此任务的替换。
(3).Bert的下游任务
bert分类下游任务
Bert接下游任务只需要对输入和输出做一些调整就可以兼容不同的任务,如问答质量评估,本质上是一个二分类,输入sentenceA和sentenceB 取[cls]位置的输出,过一个Dense层,然后对整个模型进行梯度更新就可以了。
(4).对比
架构对比
Bert对比elmo 同样是基于上下文进行预训练任务,一个采用lstm一个采用TransFormer 但是两个模型有本质的不同。
1.首先基于两个LSTM的正逆向输出拼接去理解上下文 这种拼接的形式效果远不如TransFormer Postion-Encoding。
2.elmo是类似于feature-base的模型,基于上下文特征动态的训练出基于单词特征、词法特征、语法特征3个embedding进行权重拼接,然后给下游任务作为词嵌入工具,这其实和word2vec是类似的,区别在于动态和静态,动态给与了emlo理解一词多义的能力。而bert是一种fine-tuning的模型,也就是在下游任务进行相关任务的时候会对bert模型的参数进行微调。这种微调的模式效果是十分出色的,并且对下游任务的兼容也做得非常的好。
(5).总结
优点:强大的特征提取能力,基于微调的训练模式降低了训练样本的要求,对nlp任务进行了大统一。
缺点:像是刚才提到的,预训练任务的合理性考证,mask机制的随机性可能导致一个词被拆成两个字,以及模型的厚重性对部署的要求很大。Postion-Encoding是否合理?Bert真的需要这么多参数么?Bert的每一层为什么学到了语义或者语法?这其实是我们不能解释的,只能说这样效果很好,这也正是深度学习的无奈。
本文只是对Bert做了一个简单的介绍和对比,很多细节上的东西明没有做太多描述 并且可能存在一些理解上的不正确,如果想要更加深入的了解Bert可以参考Google论文:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
三、强化学习(Reinforcement Learning)
无论是机器学习也好还是深度学习,都是数据决定上限,而模型则是去逼近这个上线,但是给我的感觉这是量变,不是质变。而强化学习通过状态、行为、环境奖励自我学习,是一种另外的思路。像是我们熟知的 AlphaGo 都是在质的级别上超越了人类。有兴趣的同学可以之后深入研究一下,相信又是另一番天地。