本笔记是聆听李宏毅老师的在线课程总结而来,特别感谢李宏毅老师在我机器学习上的启发
机器学习基本概念(上)
机器学习:用机器找到对应的函数式(人流预测、图像处理、自动下围棋)通常胜任该任务的函数式人类无法完成。
专有名称介绍:
Regression(回归):输出是一个数值型的函数(通过一些数据预测连续值)
Classification(分类):输出已经人为划分好的类别(通过一些数据预测离散值,二分类/多分类)
Structured Learning(结构创造):机器输出/创造有结构的内容(文章/图片)
model/function(模型,函数式):一个函数式在机器学习中可以被称为模型
feature/weight/bias (特征/权重/偏差):输入的变量/线性模型中feature的系数/距离原点的截距或偏移
Loss(损失):评估一个model的预测值和真实值的差异的指标,最终得到误差(偏离程度)
Parameter(参数):机器学习系统自行训练的模型的变量
Optimization(最优化):得到模型性能最强的过程,也可以理解为求Loss最小值的过程
Gradient(梯度):模型偏导数的向量,梯度指向最高速的上升方向。
Gradient Decent(梯度下降法):通过计算并且减小梯度将Loss降至最低,它使用训练数据来计算损失相对于模型参数的梯度。
Error surface(误差曲面):模型在不同feature下的准确率水平绘制出的等高线图像
Learning rate(学习速率):自行设定的,决定单次参数的更新量
Hyperparameters(超参数):与参数相对,在训练中自行设定的参数,如 Learning_rate
Global minima/Local Minima(全局最小值/局部最小值):训练中梯度下降中的两种理想位置,全局最小值是最优的Feature组合,而局部最小值是在已知组合求梯度的情况下获取到的局部最优解。
Training(训练):通过写function,定义Loss,不断Optimization的过程最终得到model的过程叫做训练
Linear models(线性模型):一种通过Feature*weight+Bias拟合数据集建立线性关系并且预测未知数据的模型
预测某个不确定值的过程:
1. 基于领域知识写出一个带有不确定值的函数式(model)(很有可能不是对的,后续还需要不断修正)
例如 y=b+wx1 此处 y,x1为feature
w(直接与feature相乘的)为weight
b(直接加上的)为bias
2. 定义Loss(损失,一个function以model的一些参数为输入)
计算预测值和真实值之间的差距
通过损失函数带入数据的计算,最终我们可以得到该模型在不同feature下的准确率水平以便于模型的继续优化,我们可以将其以如下的三维图像(error surface)来向我们呈现(第三维以颜色呈现)
3. 解最佳化问题 (Optimization)
在该问题背景下,我们主要的目的是通过Gradient Decent求最小的Loss(minL),最小的loss的传入参数w和b我们称其为w*和b*(w star & b star)
为了便于理解,我们将只使用一个feature “w”
(1)第一步我们随机选择一个初始点(同样也可以通过方法选择较好的初始点)
(2)计算在该点(w的参数)的组合对Loss的微分(求Error surface中的该点的切线斜率)
step1: 确定接下来的方向
负 —— 增高w
正 —— 降低w
step2: 确定每一次移动的步长
#1 斜率大 —— 步长小
斜率小 —— 步长大
#2 设定 Hyperparameters , 如 learning rate 调控训练更新速率
人为设定的η越大,参数每次更新的速率就越大
(3)接下来会不断反复上一步的操作,求微分得到方向和速率并移动,直到最后停下。
在何时停下也是存在不同情况:
1.达到设定上限停止更新(上限也属于 Hyperparameters,可以自行设定)
2.微分值归零,达到最理想状况(wT)
归零位置分为两种情况:global minima 和 local minima
刚刚我们了解了单个参数情况下的Gradient Decent的优化样例。
我们现在来尝试一下两个参数情况下的Optimization问题
单参数和多参数的Optimization过程基本一致
(1)第一步我们随机选择两个初始值(w0和b0)(同样也可以通过方法选择较好的初始点)
(2)分别计算在该值(w和b的参数)对Loss的微分(求Error surface中的该点的切线斜率)
然后更新w与b,更新方向为下图中标黄的向量。也就是算出微分的值就可以决定更新的方向,把w跟b更新的方向结合起来,就是一个向量,就是下图中红色的箭头。
(3)接下来仍然也会会不断反复上一步的操作,求微分得到方向和速率,以此类推,直到找到一组合适的w和b。
类似于下图的model我们可以称其为Linear model,该种模型的特点是拟合曲线都是线性的。同时影响模型准确率的因素除了刚刚讲到的因故达到Local minima 而没有达到Global minima之外,还存在着第一步初始function输入的问题。我们应当尽可能的贴合实际情况来使function更加准确,这样在Training中才能有更多的更新可能性。但是我们同时也需要注意并不能书写的过于详细,这样可能会造成过拟合等问题,训练出的模型可能会出现较弱的泛化能力。
机器学习基本概念(下)
专有名称介绍:
Model Bias(模型偏差):模型无法模拟真实情况而造成的偏差 #与前文讲述的function中的bias(b)无关
Piecewise Linear(分段线性):将function划分为多个linear片段的数学模型。它通过使用一系列线性函数来逼近非线性关系,从而提供了在各个区间上逐段建模的能力。
Sigmoid Function/Hard Sigmoid(S型曲线函数/下文中形状”近似于”Sigmoid函数的图形)
Transpose(转置):一种操作,将矩阵或向量的行和列互换位置
Batch(批次):模型训练中的一次迭代(Gradient Update)中使用的样本集
Batch Size(批次大小):一个batch中的样本数,在训练中通常是固定的(这是一个Hyper Parameter)
Parameter Update(参数更新):在训练期间(通常是在梯度下降法的单次迭代中)调整模型参数的操作
Epoch(周期):在训练时,整个数据集的一次完整遍历。一个周期表示(N
/批次大小)次训练迭代
Rectified Liner Unit(ReLU,修正线性单元)一种激活函数,如果输入为负数或 0,则输出 0。如果输入为正数,则输出等于输入。
Activation Function(激活函数):一种函数(例如 ReLU 或 S 型函数),用于对上一层的所有输入求加权和,然后生成一个输出值(通常为非线性值),并将其传递给下一层
Layer(层):神经网络中的一组神经元,负责处理一组输入特征,或一组神经元的输出
Neuron(神经元):神经网络中的节点,通常会接收多个输入值并生成一个输出值。神经元通过将激活函数(非线性转换)应用于输入值的加权和来计算输出值
Neuron Network(神经网络):灵感来源于脑部结构的一种模型,由多个层构成(至少有一个是Hidden Layer),每个层都包含简单相连的单元或神经元(具有非线性关系)
Hidden Layer(隐藏层):神经网络中的合成层,介于输入层(即特征)和输出层(即预测)之间。神经网络包含一个或多个隐藏层。
Deep Learning(深度学习):一种利用多层神经网络学习模式和特征的机器学习法(建议看看下文例子)Deep在此之中指的是深度学习中的许多隐藏层
Overfitting(过拟合):创建的模型与训练数据过于匹配,以致于模型无法根据新数据做出正确的预测。表现于训练集准确率高,而测试集准确率低。
刚刚我们讲到了Linear model,因为它的feature、weight和bias的组合决定了它的拟合曲线是一条直线,这个模型的结构是非常简单的。这也导致了它无法适应大多数的状况,有很大的限制。在很多情况下,是无法仅仅使用w和b来操控一条直线描述状况的。这种情况我们称其为Model Bias
所以,为了解决这种情况,我们需要写出一个更复杂,更有弹性,存在更多未知参数的function
以下我们定义了一种如下图左上方的蓝色曲线
这个蓝色Function的特点是:
- 当输入的x小于或大于某个值时,Function都为一个定值
- 中间有个斜坡形状的线段
上图的曲线我们可以理解为它是由许多段线段组成的,他被称为Piecewise Linear 的 Curves,这种曲线可以用常数+蓝色function组成,最终Piecewise Linear Curves实现了复杂情况的拟合。
Piecewise Linear 的 Curves可以去逼近任何的连续的曲线。而每一个 Piecewise Linear 的 Curves,又都可以用一大堆蓝色的 Function 组合起来。也就是说,只要有足够的蓝色 Function 把它加起来,就可以变成任何连续的曲线。
所以在Model中,假设 x 跟 y 的关系非常地复杂, 那就想办法写一个如上面的思路驱动的带有未知数的 Function。这个函数曲线显然是有一定的表达难度的,但是庆幸的是:Sigmoid Function的曲线和其大体相似,我们可以通过调整Sigmoid函数的 b、w和c,最终制造出Hard Sigmoid。
众所周知,当我们改变Sigmoid函数的w,则函数的斜率会发生改变;当我们改变b时,函数会左右平移;当我们改变c时,函数的高度会改变。
所以只要有不同的 w 不同的 b 不同的 c,我们就可以制造出不同的 Sigmoid Function。把不同的 Sigmoid Function 叠加起来以后,就可以去逼近各种不同的Piecewise Linear 的 Function,然后 Piecewise Linear 的 Function,可以拿来近似各种不同的 Continuous 的 Function。
通过上面的知识铺垫,我们将会使用具有更多Features的新model来替代刚刚学到的Linear model。避免遇到Linear model 的 model bias 问题。
如上图,我们在原有的Linear Function基础上将其带入了Sigmoid函数中,我们可以选择每一段所使用的b、w、c,并且将所有段拼合成一个弹性更强的连续性的函数。在之前根据时间段划分的Linear Function基础上,我们也为每一段时间增加了可波动的由多个Sigmoid函数驱动的Continuous 的 Curve。
实际上,我们刚刚的工作也就是完成了从一个Feature到多个Feature之间的转变。
对Sigmoid Function介入的运算过程的详细理解:
我们如果将刚刚的内容通过图像的方式画出来,假如我们只保留三个时间段划分(j:1,2,3),同时这三个时间段划分所对应的Feature“x”为(x:1,2,3);我们并且通过“i”定义使用三个Sigmoid函数来描述(i:1,2,3)。我们接下来使用下图中的三个黑色圆形代表我们所定义且准备用来拟合的三个Sigmoid Function。我们可以分别将3个Feature代入到3个Sigmoid Function中,并且定义Sigmoid函数的“b”(bias)。我们得到了三个式子(r1/2/3)#在实际情况下可以自己选择Sigmoid Function的数量,如果你的Sigmoid数越多图像的弹性就会越高更加复杂,你所定义的Sigmoid Function数也是Hyperparameters的一种
我们如何了解x1/x2/x3和r1/r2/r3的关系呢?我们可以使用矩阵和向量相乘的方法简化这个运算。
然后,我们将刚刚求出的r1、r2、r3分别带入对应的Sigmoid Function,最终得出a1,a2,a3(如下图)
接下来,我们需要用决定函数图像高度的c(c1/c2/c3)来与Sigmoid函数求得的a(a1/a2/a3)相乘。并且将他们的乘积逐个相加最终加上bias(b),最终我们得到了y。
总结:x是输入,Feature是x这个向量;x 乘上矩阵w加上向量 b 得到向量 r,再把向量 r 透过 Sigmoid Function得到向量 a,再把向量 a 跟乘上 c 的 Transpose(转置) 加上 b 就得到 y。
Sigmoid Function–回到机器学习基本框架上
(1)定义model
在回到机器学习基本结构框架之前,我们先对我们的符号进行定义。我们可以先理解刚刚我们创建的式子是一个带有未知参数的Function。同时不同的元素的定义已经如下图写下,我们已知图中的x是Feature,W是权重组成的矩阵,绿色框的b为向量(列r式阶段分别相乘用bias),灰色框的b为数值(最终bias偏置),c为常数组成的向量(高度)。那么W、c、向量b、常数b 我们可以将其统称为Unknown Parameters。
我们可以将这些Unknown parameters全部拉直,最终形成右侧的长向量θ,这些数组来源于各个地方,我们统称为θ。
(2)定义Loss Function
在新模型的情况下,Loss的定义方法没有区别,也同样在这里Loss Function也是表达这一组参数值的优劣,但是在这里Loss Function由”L(θ)”表示。
同样在这里 Loss Function的计算逻辑也是计算预测值和真实值之间的差异。
(3)Optimization
在Sigmoid Function model上,Optmization的过程和之前也是一样的。即使我们换了新的模型,Optimization的过程并没有什么较大的差别。同样我们在这里也是使用Gradient Descent进行Optimization。我们的目标是选择到一组能使Loss最小的θ值。我们将这组θ值称为“θstar (θ*)”
step1:随机选择初始值“θ0”(同样也有更好的找初始值方法)
step2:对每一个未知的参数都去计算对L的微分
我们需要对每一个参数计算对L的微分,计算完成后形成的集合就是一个向量我们称之为Gradient(g)
step3:在我们算出Gradient之后,下一步就是update我们的parameter,这个更新的逻辑和上面两个参数情况下是一样的。都是使用刚刚选定的初始值(如上图θ10 (初始值)减去learning rate*刚刚对应微分操作的值,得到θ11)以此类推我们可以将所有的参数都进行更新,更新到Gradient变为零向量或是不想继续训练为止。
过去经常使用所有Data算出一个Loss。但是在当前实际操作之中,我们经常会遇到手中数据量较大的情况,通常在此情况下我们会将其分为多个Batch(通常使用随机分的方式),每个batch为一个批次,我们每次只使用一个batch来计算L,同时进行Gradient Descent,接着Update参数并且开始处理下一个batch,当我们把所有batch全部计算参数更新之后叫一次epoch,在参数更新中每一次计算batch更新参数叫做一次Update
模型变型
除了我们刚刚接触的Hard Sigmoid Model之外,我们还可以找到更多的模型。比如刚刚的Hard Sigmoid 我们可以把它看作两个Rectified Liner Unit(ReLU)修正线性单元的结合
对模型的继续修改(引入ReLU)
刚刚我们在x到a的过程中我们仅仅进行了x*w+b,在我们引入了ReLU函数后,我们可以将其通过Sigmoid和ReLU多次重复多做几次,其重复的次数也是一个hyper parameter,由于重复的过程中两个Model的w和b可以是不同的参数,这样我们增加了更多的参数。
在我们的神经网络中,我们将model中的Sigmoid或ReLU等函数称为Neuron(神经元)多个神经元连接到一起就是Neural Network(神经网络),同时在每一次的输入层和输出层之间包含着一些神经元,我们将其称为Hidden Layer(隐藏层),多个Hidden Layer 就组成了Deep(深度),以上的一整套技术我们就将其称为Deep Learning(深度学习)
值得注意的是,深度学习的层数也不能太多,太多会导致Overfitting(过拟合)也就是在训练集上表现的好但是在测试集上表现差。
本章完,感谢各位支持。@kenzify 2023.8.9
***,***,***,***,***