机器学习入门(二)—— 模型训练篇:监督学习

背景

随着 LLM 的快速发展,越来越多的工程师多多少少会接触到一些机器学习的相关知识。

本系列将会由浅入深的介绍,机器学习的入门知识。

感谢,李沐老师的斯坦福课程《实用机器学习》

主要还是站在巨人的肩膀上,快速了解这个方向的一些必要知识。
前言:上一篇,我们讲到了机器学习数据方面的知识,今天我们来聊一聊模型训练的重要学习方法:监督学习。

机器学习里常见算法:

一些基本概念:

  • 模型(Model):
    给定输入,输出预测。

Eg:内容理解:文章内容 -> 文章标签

  • 损失函数(Loss):

    模型预测出来的结果,与真实的结果,怎么去计算他们的差别。

    其值越小,代表模型预测结果越接近实际结果。在训练模型时,需要通过不断调整模型参数来最小化损失函数的值。

    常见的损失函数包括均方误差、交叉熵等。

  • 目标函数(Objective Function): 目标函数是数学中用来衡量模型优劣的一个函数,常出现在最优化问题中。

    它是描述"最优化问题"的核心,表示要优化的参数与目标之间的关系。 在机器学习中,目标函数通常用来帮助模型优化并找到最佳的模型参数,以使模型在给定数据集上达到最佳的性能,比如最小化误差、最大化准确率等。

  • 优化(Optimization): 简单来说就是调参。把模型里可以学习的参数,在使用中找到最佳值。

    优化目标函数,使训练集里算出的损失函数最小。

  • 过拟合(overfitting):

    模型在训练数据集上表现得过于优秀,以至于它几乎"记住"了训练数据的所有细节。即模型过于复杂,以至于它已经学习到了训练数据的一些特定的噪声和异常,而在新的、未见过的数据上的表现很差。(理解能力/泛化能力差)

举例:一个学生,死记硬背历年真题,考历年原题时满分,但考新试卷时分数不理想。

  • 欠拟合(underfitting):

模型不能在训练集上获得足够低的误差。即模型复杂度低,模型在训练集上表现较差,无法学习到数据背后的规律。

泛化误差\训练误差
Normal,很理想 有 Bug?看代码
过拟合(Overfitting)(训练集可能太细化) 欠拟合(underfitting)(没有理解信息)

因此,一般模型的复杂程度,要与数据的复杂程度相匹配。

简单的数据 => 简单的模型

复杂的数据 => 复杂的模型

以此,来解决相对泛化的误差。

  • 模型复杂程度:一般来说,越训练越复杂。

简单模型/复杂模型:

  • 数据复杂度:
    • 样本数量,以及样本的元素(20x20,100x100,1k x 1k)
    • 有无特殊结构,空间/时间。
    • 多样性大,数据复杂。

监督学习(Supervised Learning)

监督学习是工业界最常见 的学习方法。

确定标号,在已打标的数据基础上,训练出一个模型。这个模型的任务就是给数据预测标号。

不同场景下,监督学习模型的选择:

决策树(Decision Trees)

树形结构:可决策,可回归。

优势:

  1. 可解释性好,可回归。常常用于银行/贷款/保险等等领域,面对客诉,可找到决策的原因。
  2. 方便处理"数值"和"类别"上的特征。

劣势:

  1. 不稳定,因为是不断分裂产生的树。如果上层节点的数据里有噪音,对下层结构影响比较大。 解决办法:集成学习(后面会详细介绍)。
  2. 数据复杂时,容易产生复杂的树。造成过拟合(模型在训练数据上表现得过于优秀,以至于无法很好地泛化到未见过的测试数据或新的场景)。 解决办法:
    • 训练的时候,遇到过拟合,停下来,让叶子节点不继续分裂。
    • 不停,先生成完整的树,对树进行剪枝、正则化等策略。
  3. 树结构不太好并行,部署线上后,性能吃亏。

因为树结构不稳定,因此决策树进行了升级, 变成多棵树,也就是下面要介绍的"随机森林"。

*随机森林(Random Forest)

由众多决策树组成的一种集成学习方法,输出是对问题最佳答案的共识。随机森林可用于分类或回归。

森林很好理解,就是多棵决策树。

那么,"随机" 又是怎么随机的?

  1. "训练集"随机(类比到 MySQL,就是随机抽行,可重复,每棵树可能抽到同样的行)
  2. "特征"随机(类比到 MySQL,就是随机抽列,不可重复,每棵树不能一次抽同个特征列)

就是在抽取训练集/特征 的时候,随机的抽,让每棵树拿到的训练集&特征集合尽可能都不一样。

导致,每个树的预测结果也会产生差异。

比如:

  • 分类场景,随机抽整列特征,训练出多个决策树,进行投票。
  • 回归场景,对每个树的结果求和,取平均数。

*梯度提升决策树(GBDT,Gradient Boosting Decision Trees)

一种迭代的决策树算法,由多棵决策树组成。每棵树都试图纠正前一棵树的错误。 默认情况下,梯度提升决策树中没有随机化,而是用到了强预剪枝。

GBDT 的两个核心是"决策树"和"梯度提升":

  • 决策树:GBDT使用的是回归决策树,每个叶子节点都对应一个预测值。
  • 梯度提升:在每一轮迭代中,新的决策树的生成是为了减小上一轮迭代产生的预测误差。这个过程就像在函数的误差曲线上沿着负梯度方向下降,逐步逼近函数的最小值。

简单来说,梯度提升采用连续的方式构造树,每棵树都试图纠正前一棵树的错误。

GBDT 在许多实际问题中都有非常好的表现,包括搜索排名、CTR预估等等。

决策树-小结:

决策树/随机森林/梯度提升决策树,在能用的情况下,往往是工业界的第一选择。

首先,树比较简单,不用太多的调参。

其次,结果还不错,虽然不是最优解,但是能快速达到上线水平(比较重要)。

线性模型(Linear Methods)

基本算法

w 代表权重,x 代表特征,b 代表偏移。

其中 "权重w" 和 "偏移b" 是可以调整的参数。

那么怎么找到每个特征最佳的 权重w,以及 偏移b 呢?

目标函数(Objective Function)

  • 回归场景:

X 是训练样本,有 N 个。每一个 Xi 是一个长度为 P 的向量。

做转至NxP,变成一个矩阵(N 行 P 列)。

Y 代表真实数值,也是有 N 个。

目标:

减少平均 均方误差(MSE)指每个样本的平均平方损失。MSE是反映估计量与被估计量之间差异度的一种度量。

L:目标函数,w**,b** 是期望求解的最优值。X/Y是训练参数。可以学习参数的 w(权重) 和 b(偏移)

每一个样本上:Y是真实数值,<xi,w> + b 代表模型的预测,两者相减求绝对值,再求平方。

再把所有样本加起来,做求和, 再平均。

  • 分类场景:

输出变向量,向量的长度就是类别的个数。向量里的每一个值代表,对应每个类别的概率(置信度)。 值越高代表这个类别的概率越高,同理,越低代表这个类别的概率越低。

X 代表每个特征,wi 代表每个特征的预测全中,再加上偏移量 b。 这样就得到每个样本基于每个特征的概率的 O 向量。

Label y 代表真实的值,当某个样本确定是某第 i 个分类下时,为 1(有点像独热编码)

求平均均方误差:O向量 - 真实标签

预测时,属于分类就是每个特征概率最大的那个值。

这样带来的问题?

因为是对每个分类的预测结果都做平方误差,导致学习成本比较高。

相当于要求模型在正确分类的得分要接近 1,不正确的分类得分要趋近 0。

其实,只要让我们的模型关心正确的那个分类的得分足够大即可,其他分类不太关心

软最大化回归(Softmax Regression)

将 1 ~ m 个向量 O(存了每个特征的概率) 丢进 Softmax 这个操作子,得到一个 y^ ,y^还是一个向量。

y^ = 向量O算指数/所有O 向量的指数,导致所有 1 ~ m 个 所有 y^ 加起来 = 1。

y => 是真实的预测结果,类似独热编码,只有一个 1,其他都是 0。

对 y^和 y 做交叉熵,让模型使 H(y,y^) = - log y^ y 足够小 => 就能让模型预测正确的那个分类只够大。

*小批量随机梯度下降(SGD,Mini-batch Stochastic gradient descent)

一种优化神经网络模型的算法。它在每一次迭代时不是将整个训练集作为一个批次进行更新,而是将训练集分成若干个小批次(mini-batch),每次只更新一个小批次的数据。

这样做可以减少计算量,节省训练时间。

同时,它也可以在一定程度上避免梯度更新的方向产生过大的波动,从而使得训练过程更加稳定。

  • W 是模型的参数,把偏移 b(批量大小) 写进向量,Nt 就是学习率。
  • 随机取 W1,
  • 反复增加 t,直到模型收敛(收敛就是目标函数在某个样本里的平均损失不再下降,趋向平衡)。
    • 随机采样N个样本,这个样本的大小等于批量大小 b。
    • 新权重 Wt+1 = 旧权重 Wt - Nt 学习率 * 目标函数L的导数。

优势:

  • 大部分的机器学习问题都可以用 SGD 来求最优解(除了决策树)。

劣势:

  • 超参数 b,Nt 需要选择,比较难找。

核方法(Kernel Machines)

一种基于核函数的非线性机器学习方法。

在这种方法中,原始数据被映射到高维空间中,并且在高维空间中使用线性方法进行分类或回归。由于非线性特征空间的复杂性,可以使用核函数在原始空间中计算点积,从而大大简化了计算复杂度。

在机器学习任务中,包括支持向量机(SVM)和核岭回归(KRR)等方法都使用了核方法。

神经网络(Neural Networks)

神经网络更懂机器学习,往往比人工提取特征,效果要好。

但要比人工提取特征的数量和计算量,要高几个数量级(>1000倍)。

提供大量的数据,用随机梯度下降来不断学习。

多层感知机(MLP,Multiayer Perceptron)

刚介绍的:线性模型(全连接层)可以理解单层感知机。

多个全连接层+激活函数就变成了多层感知机(非线性模型)。

激活函数:是一个非线性的函数

对每个元素做 sigmoid(x) = 1/(1+(-x)的指数)=> 0~1 之间的一个数。

ReLu = max(x, 0) => 大于 0 为本身,否则为 0。

卷积神经网络(CNN,Convolutional Neural Networks)

CNN 的结构通常由多个卷积层、池化层(汇聚层)和全连接层构成。网络的输入层通常是一种原始图像或其他类型的信号,其特征会在网络的多个层中自动学习并逐步抽取。

为了解决:MLP 导致参数过多的训练问题。MLP 每一层都有输入和输出,输入和输出的权重都需要去学习和调参。成本很高。

本地性:输入 N x N => 窗口 K x K(k < N),学习时,不在和输入 N x N 相关,而是和窗口 K x K 相关。

卷积核:参数共享,K x K 的权重,被称为卷积的核(Kernel)。

  • 让模型的卷积参数不再依赖输入和输出的大小,而是基于窗口去学习。

汇聚层:Pooling Layer,增加鲁棒性。

汇聚层会在每次在 K x K 的窗口中计算一个平均值/最大值,

循环神经网络(RNN,Recurrent Neural Networks)

引子:在自然语言处理场景,MLP 解决不了可变的参数问题(因为需要固定输入和输出)。虽然可以用 One-Hot 来描述语句的词频,但是会丢失时序。所以引入了循环神经网络的概念。

RNN 在 MLP 的基础上,加了一个通道,这个通道记录了之前所有的会话信息。

多了 Ht-1 和 Ht,上一时刻的 Ht-1 加激活函数 => Ht

  • 忘掉输入,抑制 Xt,认为 Xt 不重要时(比如都是空格,介词等等,没有名词和动词)。
  • 忘掉过去,抑制 Ht-1,新的开始。(比如新句子和之前Ht-1无关,或者已经过去很长时间了)

Bi-RNN

双向 RNN,既从左往右看,也从右往左看(阿拉伯语)。

为了更好的理解上下文。

Deep RNN

类似 MLP

下一节,我们重点介绍下:变换器 (Trasformer)。

相关推荐
IT古董17 分钟前
【漫话机器学习系列】017.大O算法(Big-O Notation)
人工智能·机器学习
Jasmine_llq17 分钟前
《 火星人 》
算法·青少年编程·c#
闻缺陷则喜何志丹28 分钟前
【C++动态规划 图论】3243. 新增道路查询后的最短距离 I|1567
c++·算法·动态规划·力扣·图论·最短路·路径
海棠AI实验室1 小时前
AI的进阶之路:从机器学习到深度学习的演变(三)
人工智能·深度学习·机器学习
Lenyiin1 小时前
01.02、判定是否互为字符重排
算法·leetcode
鸽鸽程序猿1 小时前
【算法】【优选算法】宽搜(BFS)中队列的使用
算法·宽度优先·队列
Jackey_Song_Odd1 小时前
C语言 单向链表反转问题
c语言·数据结构·算法·链表
Watermelo6171 小时前
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
开发语言·前端·javascript·算法·数据挖掘·数据分析·ecmascript
乐之者v1 小时前
leetCode43.字符串相乘
java·数据结构·算法