背景
随着 LLM 的快速发展,越来越多的工程师多多少少会接触到一些机器学习的相关知识。
本系列将会由浅入深的介绍,机器学习的入门知识。
感谢,李沐老师的斯坦福课程《实用机器学习》 ,
主要还是站在巨人的肩膀上,快速了解这个方向的一些必要知识。
前言:上一篇,我们讲到了机器学习数据方面的知识,今天我们来聊一聊模型训练的重要学习方法:监督学习。
机器学习里常见算法:
一些基本概念:
- 模型(Model):
给定输入,输出预测。
Eg:内容理解:文章内容 -> 文章标签
-
损失函数(Loss):
模型预测出来的结果,与真实的结果,怎么去计算他们的差别。
其值越小,代表模型预测结果越接近实际结果。在训练模型时,需要通过不断调整模型参数来最小化损失函数的值。
常见的损失函数包括均方误差、交叉熵等。
-
目标函数(Objective Function): 目标函数是数学中用来衡量模型优劣的一个函数,常出现在最优化问题中。
它是描述"最优化问题"的核心,表示要优化的参数与目标之间的关系。 在机器学习中,目标函数通常用来帮助模型优化并找到最佳的模型参数,以使模型在给定数据集上达到最佳的性能,比如最小化误差、最大化准确率等。
-
优化(Optimization): 简单来说就是调参。把模型里可以学习的参数,在使用中找到最佳值。
优化目标函数,使训练集里算出的损失函数最小。
-
过拟合(overfitting):
模型在训练数据集上表现得过于优秀,以至于它几乎"记住"了训练数据的所有细节。即模型过于复杂,以至于它已经学习到了训练数据的一些特定的噪声和异常,而在新的、未见过的数据上的表现很差。(理解能力/泛化能力差)
举例:一个学生,死记硬背历年真题,考历年原题时满分,但考新试卷时分数不理想。
- 欠拟合(underfitting):
模型不能在训练集上获得足够低的误差。即模型复杂度低,模型在训练集上表现较差,无法学习到数据背后的规律。
泛化误差\训练误差 | 低 | 高 |
---|---|---|
低 | Normal,很理想 | 有 Bug?看代码 |
高 | 过拟合(Overfitting)(训练集可能太细化) | 欠拟合(underfitting)(没有理解信息) |
因此,一般模型的复杂程度,要与数据的复杂程度相匹配。
简单的数据 => 简单的模型
复杂的数据 => 复杂的模型
以此,来解决相对泛化的误差。
- 模型复杂程度:一般来说,越训练越复杂。
简单模型/复杂模型:
- 数据复杂度:
- 样本数量,以及样本的元素(20x20,100x100,1k x 1k)
- 有无特殊结构,空间/时间。
- 多样性大,数据复杂。
监督学习(Supervised Learning)
监督学习是工业界最常见 的学习方法。
确定标号,在已打标的数据基础上,训练出一个模型。这个模型的任务就是给数据预测标号。
不同场景下,监督学习模型的选择:
决策树(Decision Trees)
树形结构:可决策,可回归。
优势:
- 可解释性好,可回归。常常用于银行/贷款/保险等等领域,面对客诉,可找到决策的原因。
- 方便处理"数值"和"类别"上的特征。
劣势:
- 不稳定,因为是不断分裂产生的树。如果上层节点的数据里有噪音,对下层结构影响比较大。 解决办法:集成学习(后面会详细介绍)。
- 数据复杂时,容易产生复杂的树。造成过拟合(模型在训练数据上表现得过于优秀,以至于无法很好地泛化到未见过的测试数据或新的场景)。 解决办法:
- 训练的时候,遇到过拟合,停下来,让叶子节点不继续分裂。
- 不停,先生成完整的树,对树进行剪枝、正则化等策略。
- 树结构不太好并行,部署线上后,性能吃亏。
因为树结构不稳定,因此决策树进行了升级, 变成多棵树,也就是下面要介绍的"随机森林"。
*随机森林(Random Forest)
由众多决策树组成的一种集成学习方法,输出是对问题最佳答案的共识。随机森林可用于分类或回归。
森林很好理解,就是多棵决策树。
那么,"随机" 又是怎么随机的?
- "训练集"随机(类比到 MySQL,就是随机抽行,可重复,每棵树可能抽到同样的行)
- "特征"随机(类比到 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)。