第十期机器学习基础 01深度学习基础
一:机器学习和深度学习对比
(一)传统机器学习
什么是传统机器学习?传统机器学习是指一系列能够从数据中学习规律,并根据这些规律进行预测和决策的算法。
它通常包括以下几种类型的算法:
线性回归和逻辑回归:用于解决回归和分类问题----可以认为:逻辑回归是在线性回归基础上加上sigmod方法,进行0/1分类
决策树和随机森林:用于构建预测模型,进行后续分类---Kd近邻树
支持向量机(SVM):用于分类和回归分析。
聚类算法:如K-means,用于将数据分成不同的组。
朴素贝叶斯:基于贝叶斯定理的分类算法。
这些算法大多数需要人工特征工程,也就是说,需要人类专家根据对领域知识的理解来提取特征,然后再将这些特征输入到机器学习算法中。
(二)深度学习
深度学习是基于人工神经网络,通过模仿人脑的结构和功能,通过多层次的神经元网络来处理和分析数据。深度学习之所以“深”,是因为它的网络层数非常多,通常包括数十甚至数百层。
深度学习有几个显著的特点:
- 自动特征提取:深度学习能够自动从数据中提取特征,而不需要人工干预。这是因为它的多层结构可以逐层提取数据的高级特征。
- 处理非结构化数据:深度学习特别擅长处理图片、语音和文本等非结构化数据,这是传统机器学习难以做到的。
- 大数据和高计算力需求:深度学习模型需要大量的数据和强大的计算资源,这也是为什么深度学习在大数据时代得以迅速发展的原因。
(三)传统机器学习与深度学习的区别
两者都是从数据中学习规律,并利用这些规律进行预测和决策,但是有着如下区别:
- 特征工程:传统机器学习依赖人工特征工程,而深度学习通过多层神经网络自动提取特征。
- 数据需求:传统机器学习可以在较少的数据下工作,而深度学习需要大量数据来训练模型。
- 计算需求:深度学习需要更强大的计算能力,通常需要使用GPU来加速计算。
- 应用场景:传统机器学习主要应用于结构化数据,如表格数据;深度学习则在处理图片、语音和自然语言处理等非结构化数据方面表现优异。
选取场景:
- 如果你的数据量不大,而且是结构化数据,传统机器学习可能会是一个更好的选择。
- 如果你有大量的非结构化数据,如图像或语音,深度学习可能会表现得更好。
二:深度学习基础
(一)MLP全链接神经网络(经典)
MLP本身并不是超级强大,但你会发现它们几乎集成在任何其他架构中(令人惊讶的是,甚至在transformer中)。MLP基本上是一个线性层序列或完全连接的层。主要有以下特征:
- 全连接:在全连接的多层感知机中,每个神经元都与前一层的所有神经元相连,因此它对输入数据的特征提取是全局性的。
- 参数多:每个连接都有一个单独的权重,参数较多,容易导致过拟合。
- 无平移不变性:由于全连接的结构,MLP难以学习到平移不变性,对于图像等具有平移不变性的数据,需要大量数据来进行训练。(平移不变性----图像中目标无论是被平移,被旋转,还是被缩放,甚至是不同的光照条件、视角,都可以被成功地识别出来)
总之,MLP需要大量的参数,对于图像等具有平移不变性的数据,需要更多的数据(因为难学习到平移不变性),并且不适用于序列建模。
(二)补充:激活函数
1.常见的激活函数包括:sigmoid、tanh、Relu、Leaky Relu
- sigmoid:
值域在0和1之间
函数具有非常好的对称性
函数对输入超过一定范围就会不敏感,梯度消失;
反向传播幂运算计算量大
Sigmoid函数的输出不不是Zero-centered的
- tanh
tanh函数和sigmoid神经元⼀样,也具有软饱和性。
但是和sigmoid神经元不同的是,它解决了zero-centered的输出问题,因此,在实际操作中,tanh非线性函数比sigmoid非线性函数更受欢迎。
然而,gradient vanishing的问题和幂运算的问题仍然存在。
因为tanh的输出均值比sigmoid更接近0,SGD会更更接近natural gradient(一种二次优化技术),从而降低所需的迭代次数。
但是在二分类中(0,1)还是用sigmoid更好,因为范围在(0,1)之间。
sigmoid与tanh缺点:
sigmoid函数和tanh函数两者共同的缺点是,在特别大或者特别小的情况下,导数的梯度或者函数的斜率会变得特别小,最后斜率就会接近于0,导致降低梯度下降的速度
- Relu和Leaky Relu
ReLU函数是大多数神经网络的默认激活函数。因此在不知道选择哪种函数作为激活函数时,可以优先选择ReLU函数。
对于Relu:
只要是正值的情况下,导数恒等于1,当是负值的时候,导数恒等于0。从实际上来说,当使用的导数时,=0的导数是没有定义的。但是当编程实现的时候,取值刚好等于0.00000001,这个值相当小,所以,在实践中,不需要担心这个值,是等于0的时候,假设一个导数是1或者0效果都可以。
对于Leaky ReLu:
当是负值时,这个函数的值不是等于0,而是轻微的倾斜,这个函数通常比Relu激活函数效果要好,尽管在实际中Leaky ReLu使用的并不多。
Relu的优点:
(1)ReLU函数的左侧导数为0,右侧导数恒为1,这就避免了“梯度消失“的发生
(2)计算速度非常快,只需要判断输入是否大于0,收敛速度远快于sigmoid和tanh
Relu缺点:
(1)恒为1的导数容易导致“梯度爆炸“,但设定合适的阈值可以解决这个问题(更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内)
(2)Dead ReLU Problem:如果左侧横为0的导数有可能导致把神经元学死,不过设置合适的步长(学习率)也可以有效避免这个问题的发生。
(3)偏移现象:输出值具有偏移现象(输出均值恒大于零),但是使用合理的Leaky Relu,可以使得左边的值小于0
2.重点---为什么需要激活函数
激活函数对模型学习、理解非常复杂和非线性的函数具有重要作用:激活函数可以引入非线性因素。
如果不使用激活函数,则输出信号仅是一个简单的线性函数。线性函数一个一级多项式,线性方程的复杂度有限,从数据中学习复杂函数映射的能力很小。
举例:y = 2x + 3 是一个线性函数,它的图像是一条斜率为 2 的直线;y = x^2 + 1 是一个非线性函数,它的图像是一条开口向上的抛物线。非线性是自然界和人类社会的普遍特征,非线性函数比线性函数更能揭示变量之间的真实关系。因此,在一些情况下,我们必须用非线性函数来描述现象,从而揭示规律。----区别可以认为:线性函数梯度导数是常数,网络将不能很好地训练和从数据中捕获复杂的模式。非线性则不是
没有激活函数,神经网络将无法学习和模拟其他复杂类型的数据,例如图像、视频、音频、语音等。激活函数可以把当前特征空间通过一定的线性映射转换到另一个空间,让数据能够更好的被分类。
3.基本所有的激活函数都是非线性函数。那么神经网络为什么需要这些非线性激活函数呢?
正常的神经网络结构见下:
𝑔[1]和𝑔[2]为非线性激活函数,我们现在将其改为线性激活函数(也称恒等激活函数):
将式4.1带入式4.2:
可以看出,假设我们使用线性激活函数,那么神经网络的输出其实就是输入特征的线性组合。这种情况下,隐藏层就失去了存在的意义。
如果不用非线性激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合,这种情况就是最原始的感知机(Perceptron)。
没有非线性激活函数的每层都相当于矩阵相乘。就算你叠加了若干层之后,无非还是个矩阵相乘罢了。如果使用的话,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。
4.激活函数如何导致梯度爆炸/消失
上面的激活函数都是目前使用较多的,分析他们的导数曲线,可以看到:sigmoid(0-0.25)、tanh(0-1)、relu(0/1)因为sigmoid和tanh导数都是小于1,深层神经网络连乘会导致梯度消失问题,但是tanh的范围更大,所以梯度消失速度更慢。而Relu导数左侧为0右侧为1,这就避免了“梯度消失“的发生(不可能所有神经单元都为0)。
梯度爆炸在我们选取了上面合适的激活函数后不会出现,一般出现的原因是在深层网络和权值初始化值太大,通过合适的初始化权重方式进行避免。
(三)CNN卷积神经网络---人类的视觉总是会关注视线内特征最明显的点
https://mp.weixin.qq.com/s?__biz=MzU0NjgzMDIxMQ==&mid=2247620943&idx=4&sn=757e70b57f52769681da189d049b2096&chksm=fa654bb83484395dd8fbc297a6e6b4200219d5361f1e3a66bdd7be7ca88a420db81d21dd015d&scene=27
•输入层:输入图像等信息
•卷积层:用来提取图像的底层特征
•池化层:防止过拟合,将数据维度减小
•全连接层:汇总卷积层和池化层得到的图像的底层特征和信息
•输出层:根据全连接层的信息得到概率最大的结果
是一种具有局部连接、权重共享等特性的深层前馈神经网络,主要有以下特征:
- 局部连接:在卷积层(假设是第 n 层)中的每一个神经元都只和前一层(第 n − 1 层)中某个局部窗口内的神经元相连,构成一个局部连接网络。
- 权重共享:(卷积核扫码整张图时,每个位置的扫描都是用的相同的权重),一个卷积核只捕捉输入数据中的一种特定的局部特征(因此,如果要提取多种特征就需要使用多个不同的卷积核)。
- 空间或时间上的次采样,池化层。
由于它们的局部性(计算被捆绑在输入数据的局部部分),它们很容易并行化(对GPU很好),迄今为止,卷积神经网络在视觉识别方面取得了成功,但在序列建模方面并不十分成功。
(四)RNN循环神经网络
人类的阅读习惯不会从头开始思考每个出现单词的含义,而是透过前面单词的信息来理解当前单词的含义。基于这种行为,循环神经网络 (RNN) 应运而生。
RNN 由若干重复单元组成,下面为计算时便于理解记忆而产开的结构:
简单说,x 为输入层,o 为输出层,s 为隐含层,而 t 指第几次的计算;V、W、U为权重(在 RNN 中,每一层都共享参数U、V、W,降低了网络中需要学习的参数,提高学习效率。)。x_t表示 t 时刻的输入, s_t表示 t 时刻的隐状态, o_t 表示 t 时刻的输出。
(五)CNN和RNN对比
1.相同点
- 神经网络结构: 两者都是深度神经网络,包含大量的神经元和层级结构。
- 权重共享: 在训练过程中,两者都使用权重共享的概念。通过在不同的位置或时间步共享相同的权重参数,从而减少参数数量和提高模型的泛化能力。
- 端到端学习: 两者都支持端到端的学习,即从原始输入数据到最终输出的直接学习。---不像tranform需要两个网络分别encode和decode
2.不同点
- 数据类型
CNN主要用于处理网格结构的数据,如图像,它通过卷积操作有效地捕捉图像中的空间结构信息。
RNN专门设计用于处理序列数据,如时间序列数据或自然语言文本,RNN 具有记忆单元,可以在时间步之间传递信息。
- 局部连接和权重共享
CNN: 通过卷积操作实现局部连接和权重共享,这有助于捕捉图像中的局部特征。
RNN: 通过循环结构实现权重共享,允许网络在处理序列数据时考虑先前的信息。
- 结构设计
CNN: 主要包括卷积层、池化层和全连接层,用于提取和学习图像中的特征。
RNN: 包括循环层,每个时间步都会更新隐藏状态,以便处理序列数据的时序关系。
- 并行性
CNN: 具有较好的并行性,因为卷积操作可以同时应用于不同的区域。
RNN: 由于时序依赖关系,循环操作通常难以实现高度的并行性。
总的来说,CNN 适用于处理空间结构的数据,而 RNN 适用于处理时序关系的数据。在某些任务中,这两者也可以结合使用,形成更复杂的神经网络结构,例如将 CNN 和 RNN 组合用于图像描述生成:
- 组合方式
CNN 特征提取,用于 RNN 语句生成图片标注。
RNN 特征提取用于 CNN 进行内容分类、视频分类。
CNN 特征提取用于对话问答、图片问答。
3.梯度对比https://zhuanlan.zhihu.com/p/406217426
- CNN:求梯度,可以看到导致梯度消失/爆炸的原因,主要是每一层激活函数求的偏导数连乘导致(也可以是W权重导致的,通过合适的初始化方法避免)
补充一下:链式法则
- RNN:求梯度,可以看到导致梯度消失/爆炸的原因,在RNN求导结果中,导致梯度消失的部分远远比CNN多,下面的式子中,导数由三部分组成,其中有两部分都与梯度消失有关,如果序列过长,会更多。而CNN中,永远只有一项。
当然通过relu激活函数可以避免梯度消失/爆炸,不过现在主流都是用LSTM或者GRU解决RNN的梯度消失问题,所以Relu就用得很少了。
RNN网络,在时间上是串联关系,离当前时间越远的隐藏层的输出,对当前隐藏层的输出的影响越小。RNN无法根据不同词本身的重要性来对当前的输出产生影响 。
(六)LSTM长短时记忆网络
在RNN网络结构中,由于使用Logistic或者Tanh函数,所以很容易导致梯度消失的问题,即在相隔很远的时刻时,前者对后者的影响几乎不存在了,LSTM的机制正是为了解决这种长期依赖问题。
RRN网络,记住了所有的信息,并没有区分哪些是有用信息,有哪些是无用信息,哪些是辅助信息。这就需要一种网络,能够根据词的重要性有选择性的进行丢弃和记忆。丢弃无效信息、记住有效信息的好处是:输入序列就可以变长,不容易出现梯度消失使得有效信息即使离当前输入距离较远,也能够产生较大的影响力。实现长期记忆
LSTM网络通过精妙的门控制将短期记忆与长期记忆结合起来,并且一定程度上解决了梯度消失的问题。LSTM之所以能够记住长期的记忆,不容易出现梯度消失问题,因为LSTM的Cell是一个具备选择性记忆功能的记忆单元
LSTM相较于RNN,多了输入控制器、输出控制器和忘记控制器,以及全局记忆。
假设全局记忆为故事主线,原本的RNN体系为主线剧情。
如果分线剧情对主线剧情非常重要,输入控制器就会将该分线剧情写入主线。
如果分线剧情对主线剧情有影响,忘记控制器会忘记之前的部分主线剧情,按比例替换成现在的新剧情。
故主线剧情的更新取决于输入和忘记控制器。
- 全局记忆(隐藏态):C_t即为主线,递归神经网络对于输入数据的“记忆”,用C_t表示神经元在t时刻过后的“记忆”,这个向量涵盖了在t+1时刻前神经网络对于所有输入信息的“概括总结”。
- 遗忘门:也就是第一个sigmod函数,sigmoid 函数会将任意输入压缩到 (0,1) 的区间上。遗忘门输入新的输入和上一时刻的输出,通过sigmoid 函数后,如果向量某个分量在通过sigmoid层后变为0,那么显然单元状态在对位相乘后对应的分量也会变成0,即“遗忘”了这个分量上的信息;如果向量某个分量在通过sigmoid层后变为1,即单元状态会“保留完整记忆”。遗忘门输出为(0,1)---也可以按比例遗忘保留全局记忆
- 输入门:也就是第二个sigmod函数和tanh函数。首先,用tanh层将现在的输入向量中的有效信息提取出来,在选择信息后,使用左侧的sigmoid函数来控制将信息并入“主线”全局记忆。
- 输出门:而就是第三个sigmod函数。模型的输出,首先是通过sigmoid层来得到一个初始输出,然后使用tanh将值缩放到-1到1间(对先前信息的压缩处理),再与sigmoid得到的输出逐对相乘,从而得到模型的输出h_t。决定了多大程度的输出长期记忆cell中的信息。
1.GRU 提供与 LSTM 相似的性能,但复杂性更低(权重更少):它合并了单元状态和隐藏状态, 还将遗忘门和输入门组合成一个“更新门”。
2.LSTM/GRU的缺点:
LSTM对于基本的序列建模问题非常有效,但它们的应用范围仍然有限:
- 不能被并行化,也就是说它们不能被缩放。
- 即使它们能够保持信息的顺序,它们也无法推断出它们正在处理的数据的全局上下文(部分被遗忘了,并且受到长度限制)。背景很重要。以机器翻译为例(这个任务基本上给了我们transformer),被翻译的句子的上下文和顺序一样重要。
到目前为止,我们已经看到,先前的神经网络要么不适合序列建模,要么不可并行化,要么不稳定,要么受上下文长度的限制,这些都是序列神经结构的主要特征。现在我们有了正确的背景知识,让我们后面深入了解transformer架构。