目录
特征工程的作用:
数据特征决定了模型的上限;
预处理和特征提取是最核心的;
算法与参数选择决定了如何逼近这个上限。
1、深度学习
在机器学习中,如何选特征很难。在深度学习中,解决的核心是怎么样去提特征!
深度学习是一种机器学习技术,通过构建和训练深度神经网络来实现对数据的学习和理解。深度学习在各个领域中有广泛的应用,深度学习应用:
-
图像识别和分类:深度学习在图像识别和分类任务中取得了巨大成功。例如,可以使用卷积神经网络(CNN)进行图像分类、目标检测和人脸识别等任务。
-
自然语言处理:深度学习在自然语言处理领域有很多应用,如文本分类、语言生成、机器翻译和情感分析等。递归神经网络(RNN)和长短时记忆网络(LSTM)等模型被广泛应用于处理序列数据。
-
语音识别:深度学习在语音识别和语音转文字任务中也表现出色。利用循环神经网络(RNN)和卷积神经网络(CNN)等结构,可以准确地将语音信号转化为文本。
-
推荐系统:深度学习广泛应用于推荐系统中,帮助用户发现个性化的推荐内容。深度学习模型可以根据用户的行为和偏好,预测用户可能感兴趣的商品、新闻或音乐等。
-
医学影像分析:深度学习在医学影像分析中有很大潜力,可以用于肿瘤检测、疾病诊断和医学图像分割等任务,帮助医生进行更准确的诊断。
-
机器人技术:深度学习在机器人领域的应用越来越广泛,可以用于视觉导航、物体抓取、动作控制和人机交互等任务,使机器人能够更智能地感知和理解环境。
-
金融风控:深度学习在金融领域可以应用于欺诈检测、信用评估和投资策略等任务,提高风险管理和决策的准确性。
IM GENET(大型数据集)(李菲菲创)。数据规模越大,深度学习的效果越明显!
2、图像分类
计算机视觉:
图像分类任务(假如我们有一系列的标签:狗,猫,汽车,飞机。。。) 猫
图像表示:计算机眼中的图像(一张图片被表示为三维数组的形式,每个像素的值从0到255(值越小,该点越暗;值越大,越亮)) ,例如:300*100*3 。
计算机视觉面临的挑战:
照射角度、形状改变、部分遮蔽、背景混入
机器学习常规套路:(深度学习也一样)
1.收集数据并给定标签;
2.训练一个分类器;
3.测试,评估。
3、K近邻算法
数据:两类点 方块和三角
绿色的点属于方块还是三角呢?
k = 3 还是 k = 5 ?结果一样吗?
k近邻计算流程:
1.计算已知类别数据集中的点与当前点的距离;
2.按照距离依次排序;
3.选取与当前点距离最小的k个点;
4.确定前k个点所在类别的出现概率;
5.返回前k个点出现频率最高的类别作为当前点预测分类。
k近邻分析:
KNN算法本身简单有效,是一种 lazy—learning 算法。
分类器不需要使用训练集进行训练,训练时间复杂度为0。
KNN分类的计算复杂度和训练集中的文档数目成正比,也就是说,如果训练集中文档总数为n,那么KNN的分类时间复杂度为O(n).
K值的选择,距离度量和分类决策规则是该算法的三个基本要素。
数据库样例:CIFAR-10(可以自己在网上搜索下载)
为什么K 近邻不能用来图像分类?
背景主导是一个最大的问题,我们关注的却是主体(主要成分);
如何才能让机器学习到哪些是重要的成分呢?
4、神经网络基础
① 线性函数(得分函数)
1、从输入— — > 输出的映射
这个猫由每一个像素点决定的,这里有32*32*3=3072个像素点。不同的像素点对于它是猫是促进的作用,有些是抑制的作用。所以每一个像素点对应的权重w是不一样的。3072个像素点对应3072个权重参数。
2、数学表示
x代表像素点,32*32*3=3072*1。可以理解为把每一个像素点拉长了,总共有3072个格(像素点)。权重参数w 为1*3072个。它们相乘=1*1(一个点或者一个值)。
比如我们要做一个十分类任务,当前这个点要分别计算它属于十个类别各自的得分值,把所有像素点都考虑进去。w1表示它属于猫类别的得分,w2表示它属于狗类别的得分。...w10...。最后w就是10*3072(10代表十个不同的类别,十个结果)最后相乘完=10*1,表示它得到10个类别各自的得分(比如猫400分,狗300分)。b为偏置项,微调(上下进行浮动),w起决定性作用。各自类别,各自微调。b的10*1,十个数。
3、计算方法
把猫当做四个像素点,做三分类,分别得到得分值。3*4(3代表类别个数,4代表猫有四个像素点,每个像素点要对应一个权重值)。计算:0.2*56 +(-0.5)*231 + 0.1*24 + 2.0*2 + 1.1 = -96.8(猫类别的得分)。权重参数中,数值越大影响越重要,正值代表促进,负值代表抑制。
那么这个 3*4 的矩阵是怎么来的呢?它是一步一步优化而来的,一开始可以是随机构建的,值也是随机值。如上图做的不好,结果错误。x (输入数据)是不变的,需要变的是w,神经网络在整个生命周期过程中,就在做一件事,什么样的w能更适合于咱们的数据去做当前的任务,就怎么样去改变这个w。因为w里面的值,会对结果产生决定性的影响。开始随机选择一些值,接下来在迭代的过程中,要想一种优化方法,不断地去改进w这个参数。
决策边界
权重参数是控制着整个决策边界的走势的,偏置参数只是做一个微调。
② 损失函数:
如何衡量分类的结果呢?
结果的得分值有着明显的差异,我们需要明确的指导模型的当前效果,有多好或是多差!
损失函数如何定义:
首先得到一个结果,损失函数是我们得到结果之后才能做一个评估。刚才是看如何得到结果。上图就是三个类别(猫、汽车、青蛙)。当前第一个数据来了,猫:3.2,汽车5.1,青蛙-1.7.这件事做的不好,不好了就要计算上图的式子,计算当前它属于其他错误类别(Sj)- 正确类别(Syi)得分再 + 1。计算错误类别比正确类别高了多少,损失函数越低越好。为什么加1,相当于加了一个△,比如,car=3.15,时,3.15-3.2= -0.05<0,认为正确类别比错误类别高,就认为它没有损失,但是还是存在问题。如果+1 ,就可以区分开,(容忍程度)正确类别至少要比错误类别高1以上,才是没有损失的。
有损失函数后,还需要对损失函数进行一个改进。不光有w,还有一个正则化,如上图。模型A和模型B,结果的得分一样,但是A只考虑了局部,B考虑了全部。A就相当于过拟合了。
前面的一块为data loss ,数据在当前函数当中得到的一个损失,正则化惩罚项表示当前这一组模型由于它的权重参数所带来的损失(和数据没关系,只关注权重参数w)。w1的平方+w2的平方+...+w10的平方.前面再乘上一个,越大代表不希望过拟合。
Softmax分类器:
第一步,得到每个类别的得分值。比如输入一只猫,得到这只猫属于各个类别的得分值。第一步进行 exp ,放大它们得分值之间的差异,做一个exp的映射。随后再做一个归一化处理,转化成概率。有这个概率值,怎么样进行损失的计算呢?用一个log函数去做的,只考虑属于正确类别的概率值。输入一个猫,希望他是猫的越满意(越接近1越好),按照损坏函数来说,越接近1的,越没有损失。越接近0,做的越烂,损失越大。
前向传播:
首先有一个得分函数,有一个x输入数据输进来之后,有一组权重参数之后,能得到一个得分值。有这个得分值之后,基于这个得分值和真实标签值去计算一个损失,计算完损失之后,再把R(W)加上。
反向传播计算方法:
链式法则
梯度是一步一步传的(也可以一大块一大块的算)
梯度下降
引入:当我们得到了一个目标函数后,如何进行求解?直接求解?(并不一定可解,线性回归可以当做是一个特例)
常规套路:机器学习的套路就是我交给机器一堆数据,然后告诉它什么样的学习方式是对的(目标函数),然后让他朝着这个方向去做
如何优化:一口吃不成个胖子,我们要静悄悄的一步步的完成迭代(每次优化一点点,累积起来就是个大成绩了)
反向传播:
加法门单元:均等分配
MAX 门单元:给最大的
乘法门单元:互换的感觉
从后往前,逐层的去计算。{(xw1)w2 } w3 = f,再反向传播中,要先看 w3 对 f 做了多大的贡献;然后再看 w2 做了多大贡献,再看 w1 对后面做了多大贡献。链式法则:
③ 神经网络整体架构
什么叫做层次? 神经网络一层一层来办事的。
神经元(数据的量或者叫矩阵的大小)。比如现在有一组数据,这组数据有三个特征:x1(age),x2(体重),x3(身高)。input 红色的圈代表输入数据特征有多少个的。
全连接,隐层1 当中,把原始输入的三个特征转换成现在的四个特征。把输入的特征转换成它能更认识的一些信息。如隐层1 当中第一个圈(age*0.1+w*0.3+h*0.3)它没有具体的意思,只是一个数值(在计算机眼中更容易分辨,是一个更好的特征)。神经网络通过反向传播算出来最好的组合方式。如何由 1*3 变到 1*4 ,由 x * w1[3,4] 权重参数矩阵。由隐层1到隐层2,再乘一个 w2[4*4] 的矩阵。最后到 output,中间连一个 w3[4*1] 的矩阵。
最后预测结果的好坏和 w1,w2,w3 有关。什么样的权重参数是适合当前任务的。求解。
非线性:加在了每一步进行矩阵计算之后,x 与 w1 组合完之后,进行非线性变换,然后再和 w2组合,以此类推。如下图:
神经元个数对结果的影响:神经元越多,最后得到的过拟合程度越大,在训练集上得到的效果可能越好。
正则化的作用
惩罚力度对结果的影响:
越小的的值,越符合训练集的一个结果。因为我们计算Loss的时候,训练集loss+R(W)=最终惩罚力度。惩罚力度比较小,整体的模型还是奇形怪状的,看起来不太合适。还是会过拟合。
神经元
参数个数对结果的影响:(越多效果越好,但是有过拟合的风险)
④ 激活函数
激活函数(Activation Function)是神经网络中的一种非线性函数,用于引入非线性特性,提高模型的表示能力和学习能力。激活函数将输入信号进行非线性变换,输出一个新的值作为神经元的激活状态。
常见的激活函数有以下几种:
-
Sigmoid 函数:Sigmoid 函数将输入映射到 (0, 1) 范围内,它具有平滑的 S 形曲线。公式为:f(x) = 1 / (1 + exp(-x))。Sigmoid 函数在过去被广泛使用,但在深度神经网络中逐渐被其他激活函数取代,因为它存在梯度消失的问题。
-
Tanh 函数:Tanh 函数将输入映射到 (-1, 1) 范围内,类似于 Sigmoid 函数,但在原点附近更为平缓。公式为:f(x) = (exp(x) - exp(-x)) / (exp(x) + exp(-x))。Tanh 函数也存在梯度消失的问题,但相对于 Sigmoid 函数,它的输出有均值为零的特性。
-
ReLU 函数:ReLU(Rectified Linear Unit)函数将负值映射为零,正值保持不变,可以简单地表示为 f(x) = max(0, x)。ReLU 函数在实践中广泛使用,它解决了梯度消失问题,且计算速度快。但它的一个缺点是在负值区间的梯度为零,可能导致神经元的死亡。
-
Leaky ReLU 函数:Leaky ReLU 函数是对 ReLU 函数的改进,当输入为负时引入一个小的斜率(一般为 0.01),可表示为 f(x) = max(0.01x, x)。这样可以解决 ReLU 函数中负值区间的梯度为零的问题。
-
Softmax 函数:Softmax 函数常用于多分类问题中,在输出层将多个神经元的原始分数转化为归一化的概率分布。Softmax 函数将每个神经元的原始分数通过指数化和归一化操作,确保所有输出的和为 1,使其可以表示概率分布。
除了上述常见的激活函数,还有一些其他的变体和改进版本,如 PReLU、ELU、SELU 等,它们在不同场景下可能具有更好的性能和鲁棒性。在选择激活函数时,需要根据任务的特性和数据集的情况进行选择,以及考虑梯度消失、梯度爆炸、运算速度等因素。
数据预处理
拿到了数据之后,不能直接的输入到神经网络当中,要稍微做一些改变。比如:做一个标准化的操作。 不同的预处理结果会使得模型的效果发生很大的差异!
参数初始化
参数初始化同样非常重要!
通常我们都使用随机策略来进行参数初始化
⑤ 过拟合
过拟合是神经网络非常头疼的一个大问题!以下为避免过拟合的基本方法:
-
数据集扩充:增加训练数据的数量可以有效减少过拟合。可以使用数据增强技术如旋转、翻转、缩放等操作来生成更多的训练样本,以提高模型的泛化能力。
-
正则化(Regularization):正则化通过在损失函数中添加一个惩罚项,限制模型参数的大小,避免模型过于复杂而导致过拟合。常见的正则化方法包括L1正则化和L2正则化。
-
早停(Early Stopping):训练过程中监控验证集的性能,当验证集性能不再提升时停止训练,避免过拟合。早停可以通过设置一个合适的阈值或者监控验证集误差的变化来实现。
-
Dropout:常用的正则化技术,通过在训练过程中随机丢弃一部分神经元的输出,以减少神经元之间的依赖关系,防止过拟合。训练过程中每一层,每一次随机选择固定比例的一部分进行丢弃。
-
模型复杂度控制:过拟合通常是由于模型过于复杂而导致的,可以通过减少网络的层数、神经元的个数或者使用更浅的模型结构来降低过拟合风险。
-
批归一化(Batch Normalization):批归一化可以加速神经网络的收敛,并且对于一定程度上减少过拟合也有帮助。它通过规范化每一层的输入数据的分布,使得网络对于参数初始化不敏感。
-
交叉验证(Cross Validation):交叉验证可以更好地评估模型的性能,并且帮助选择最佳的超参数配置。通过将数据集划分为多个折叠集合,在每次训练时使用其中一部分作为验证集进行评估。
5、卷积神经网络(CNN)
主要应用于计算机视觉(CV)中,卷积神经网络与传统神经网络的区别:
传统网络输入784个像素点(只是一列特征),CNN 输入的就是 28*28*1 的一张图像(三维)。现在的数据,不是一列、向量、特征;而是一个长方体矩阵,是一个三维的 h*w*c 。
① 卷积层
卷积做了什么事?
对不同的区域,提取不同的特征。把一张图像分成好多不同的部分,不同的地方区别进行处理。在做卷积的过程中,先将图像进行分割,分割成很多小块,每一块不是一个像素点,而是由多个像素点组成。如:1 这一块,是一个5*5的,对于当前的区域,选出来它的特征值。如何得到这组权重值?用一组权重参数来获得的。
要找的还是最好的这组权重参数矩阵,使得特征提取完之后效果最好。对于每一个小区域,计算它们的特征值应该是多少的。
32*32*3 中,3 为图像颜色通道(RGB),每个通道都要单独计算。最后将结果相加!
首先,卷积操作是一种特殊的线性运算,它对输入图像进行滤波操作来提取局部特征。卷积操作使用一个卷积核(也称为滤波器或特征提取器)对输入图像进行逐个像素的计算,得到一个输出特征图。
其次,卷积操作可以帮助CNN获取局部特征。由于卷积核的大小通常比输入图像小得多,因此卷积核只能处理图像的局部区域,这就意味着卷积神经网络可以提取局部特征。在卷积层中,每个卷积核可以学习到不同的特征,例如边缘、纹理和形状等。
最后,卷积操作还可以减少卷积神经网络中的参数数量。由于卷积核的大小比整个输入图像小得多,因此这种局部连接方式比全连接方式需要更少的参数和计算量。这样使得卷积神经网络可以训练更深的模型,并且可以处理更大的输入图像。
卷积层涉及参数:
步长太大,特征提取不丰富。
滑动窗口步长(常用为1,但需要提取的特征多,速度较慢)、卷积核尺寸( 越小,越细力度地提取特征值,一般为 3*3 )、边缘填充(+pad1,如上上上图):弥补了一些边界信息缺失、边界信息特征提取不充分的问题,使边界特征被充分地利用、卷积核个数(最后在算的过程中要得到多少个特征图,如10个特征图,就是十个卷积核个数)
32 怎么算到 28,又怎么算到 24 的。
例子:
② 池化层
池化层通常紧随在卷积层之后。池化层的作用是对输入特征图进行下采样,以减少参数数量、计算复杂度,并且提取出更加抽象的特征。只会变长和宽,通道数不会变。
池化层一般有两种类型:最大池化(Max Pooling)和平均池化(Average Pooling)。
最大池化层选取每个池化窗口内的最大值作为输出值,从而实现特征的降维和突出主要特征。最大池化能保留图像中最显著的特征,对于物体的位置、大小和旋转等变化有一定的鲁棒性。
平均池化层则计算每个池化窗口内特征的平均值作为输出值,主要用于减少特征图的维度,降低模型的计算复杂度,同时保留图像的整体特征。(现在用的少,不如最大池化)
无论是最大池化还是平均池化,池化层都具备以下特点:
-
减小特征图的尺寸:池化层通过选择池化窗口大小和步幅来进行下采样,从而减小特征图的尺寸。
-
提取主要特征:池化层在保留主要特征的同时,对于输入特征的微小变换具有一定的不变性。这样可以使得模型对于输入图像的平移、缩放和旋转等变化具有一定的鲁棒性。
-
减少参数数量:池化层减小了输出特征的维度,从而降低了下一层的参数数量,有助于减少过拟合和提升计算效率。
通过在卷积神经网络中引入池化层,可以逐渐降低特征图的维度,提取出更加重要和抽象的特征,从而为后续的全连接层或者分类器提供更好的输入。
经典网络—Resnet
ResNet(Residual Network)是一种深度残差网络,由Kaiming He等人于2015年提出。它是一个非常重要且有效的深度学习模型架构,可以解决深度神经网络中的梯度消失问题,并允许训练更深的网络。
ResNet通过引入残差连接(Residual Connection)来解决梯度消失问题。传统的网络结构中,每一层的输入都直接传递给下一层进行处理,而在ResNet中,每一层的输入还会通过残差连接直接跳过若干层,与后续层的输出进行求和。这样的跳跃连接可以让梯度更容易地回传到较早的层,从而避免了深层网络中梯度逐渐减弱导致的性能下降。
ResNet的核心思想是:通过残差连接,网络层能够学习到相对于输入的增量信息,即残差。这样,网络可以更加方便地学习恒等映射,即将输入直接传递给输出,同时可以选择性地学习到具有较高层次抽象特征的信息。
ResNet的具体结构主要基于卷积神经网络,其中引入了“残差块”(Residual Block)作为基本的构建单元。每个残差块包含多个卷积层和批归一化(Batch Normalization),并通过跳跃连接将输入特征与输出特征相加。此外,为了降低特征图的尺寸,ResNet还使用了步幅为2的卷积层和池化层。
ResNet在图像识别、目标检测和语义分割等计算机视觉任务中取得了显著的成果。它的创新性在于通过残差连接解决了深度网络训练中的梯度消失问题,使得模型可以更深、更准确地学习到特征表示。
感受野
感受野(Receptive Field)是指在神经网络中,输出的某个特征图上的像素点对应于输入图像中的区域大小。感受野用于描述输入图像中的每个像素点对网络输出的影响范围。
在卷积神经网络中,每个卷积层的感受野是指输入图像上一个像素点对应于该卷积层输出的特征图上的区域大小。感受野的大小由卷积核的大小和步幅决定,具体计算方法如下:
- 对于第一层卷积层,感受野的大小等于卷积核的大小。
- 对于后续的卷积层,感受野的大小可以通过下述公式计算得到: 当前层感受野大小 = 上一层感受野大小 + (当前层卷积核大小 - 1)* 上一层步幅
感受野的大小决定了特征提取的上下文信息范围。较小的感受野更关注局部细节,而较大的感受野能够捕捉到更广阔的上下文语境。随着网络层数的增加,感受野会逐渐扩大,使得神经网络能够提取更抽象、全局的特征。
对于图像分类任务,较浅层的卷积层主要负责提取低级的图像特征,如边缘、纹理等。随着网络的加深和感受野的增大,逐渐能够捕捉到更高级的语义信息,如物体形状、结构等。因此,感受野在神经网络中起着重要的作用,影响着网络对图像不同层次特征的感知能力。
6、递归神经网络(RNN)
递归神经网络(Recursive Neural Network,RNN)是一种神经网络结构,用于处理序列数据或具有树形结构的数据。与传统的前馈神经网络不同,RNN具有循环连接,允许信息在网络中进行传递和共享。
RNN的核心思想是在网络中引入反馈连接,使得网络的输出不仅依赖于当前输入,还依赖于过去的状态。这种反馈机制使得RNN可以对序列数据进行建模,捕捉到数据中的时序关系和上下文信息。
在RNN中,每个时间步都有一个隐藏状态(hidden state)作为中间记忆,用来存储过去的信息。在每个时间步,网络接收当前的输入和上一个时间步的隐藏状态,并产生新的隐藏状态和输出。这样,信息可以在网络中循环传播,通过时间的推移,网络可以捕捉到序列数据的长期依赖关系。
RNN可以应用于各种序列建模任务,例如自然语言处理(NLP)中的语言模型、机器翻译、情感分析等。它还可以用于处理具有树形结构的数据,如句法分析和语义解析等任务。
尽管RNN的基本结构简单且有效,但它也存在一些问题。其中一个主要问题是“梯度消失”或“梯度爆炸”,即在反向传播过程中,梯度可能会指数级地衰减或增长,导致训练困难。为了解决这个问题,出现了一些改进的RNN结构,如长短时记忆网络(LSTM)和门控循环单元(GRU),它们通过引入门控机制来控制信息的流动,有效地缓解了梯度消失和梯度爆炸的问题。
总结:递归神经网络是一种处理序列数据和树形结构数据的神经网络模型,通过循环连接和隐藏状态的传递,能够捕捉到数据中的时序关系和上下文信息。
7、贝叶斯
解决的问题:
正向概率:假设袋子里面有N个白球,M个黑球,你伸手进去摸一把,摸出黑球的概率是多大
逆向概率:如果我们事先不知道袋子里面黑白球的比例,而是闭着眼睛摸出一个(或者好几个)球,观察这些取出来的球的颜色后,那么我们可以就此对袋子里面的黑白球的比例做出什么样的推测。