Before all
今天是第一天学习ML,跟随着李宏毅老师的2021教学视频开始,今天主要是学习了ML的背景和基本原理以及最简单的ML模型构建和优化。
视频URL:https://speech.ee.ntu.edu.tw/~hylee/ml/2022-spring.php
关于机器学习的入门概念和理解
Machine learning ≈ Looking for Function
什么是机器学习,用通俗的概念就是寻找到一个可以输入的函数(输入内容可以是各式各样的例如音频,图像,文字)然后根据函数推测出和输出结果(输出结果也同样可以是各式各样的。)
Different types of Functions
根据上面的概念,函数的输出也可以分为下面2种:
Regression
根据输入输出数值标量。
Classification
根据输入,从设定好的多个选项中选择性输出。(例如下图的垃圾邮件判断。而多个选项可以参考上面的图中的围棋的例子,就是从19x19的选项中选择出一个正确的落子位置。)
Structured learning
所谓Structured learning其实就是当今的ML输出并不局限于简单的数字输出,或者对选项进行选择性的输出。ML还可以进行文章、图像、音乐与视频的生成,通俗的说就是让机器学会进行创造性的生成有结构的事物。
通过实例来逐步学习如何寻找函数-YouTube流量分析
1.函数目的
通过寻找到一个函数,对未来的播放量进行预测
2. 定义一个最简单的线性函数来构建模型
如下图,我们把x1设置为数据来源中每一天的已知播放量,而w与b则是未知量,分别叫做weight(权重)和bias(偏移)。w和b都是Hyperparameters(超参数),也就是需要我们人为设定的参数。y则是我们的模型预测出来的结果,在这里就是对次日的播放量的预测。
$$
y=b+wx_1
$$
3.定义损失函数Loss
在机器学习中, 损失函数就是指模型的输出 y与真实值 y^ 之间概率分布差异的量化, 损失函数越小,模型的鲁棒性(稳定性)就越好。
在本例中,Loss函数的输入就是我们的自定义超参数也就是bias和weight。
那么我们怎么判断我们输入的b和w好不好呢,就需要我们对输入的结果进行误差统计,现在我们先采用的是差值绝对值(MAE)的方法计算误差值,如下图所示,把模型在1月2号的数据输入到模型得到1月3号的预测值是5.4k我们记作y,然后真实的1月3号的播放量为7.5k我们记作y^,通过二者作差得绝对值我们就得到了一组的误差为2.1k,以此类推我们可以得到所有的误差。
那么现在我们有了当前数据中每天预测数值与实际数值的误差,现在我们把误差求均值就得到了我们需要的Loss,当Loss越小则代表我们输入的b和w越好。
4.求误差的2种方法
分别有MAE与MSE 2种方法。选择哪种方法都是看个人的需求,这里我只给出我作为只学了一天理论的小白的个人基础看法。
MAE得到的误差更加平稳中庸,MSE则更为极端毕竟用上了平方,好的结果则更好,坏的结果则更坏。
5.优化模型-通过梯度下降减少损失(gradient descent)
根据李老师的视频中关于梯度下降最简单的2点概念。
1.随机选择一个权重w0。
2.根据Loss与weight的在该权重w0下的微分(斜率)来调整w0,目的是为了让Loss更小。
那么现在我们的目的很明确,就是要想办法去往Loss下降的方向去调整w(weight),那么这个调整的范围是多少呢?
李老师说这取决于2件事情:
1.看L与w构造出的斜率,斜率越大就调整w的跨度大些,反之亦然。
2.还涉及到一个自定义参数——learning rate(η) 这个数值越大训练速度就越快,反之亦然。
根据这2件事情,我们可以得到下一次w1的值。公式如下
$$
w^1=w^0-η\frac{\partial L}{\partial w} \big|_{w=w^0}
$$
通过这个公式,反复更新w直到找到最合适的Loss。
Tips:这里方便理解,我自己举个例子,比如图上此时的Loss的斜率在w0是负数,然后我们可以自己设定η,η越大w1则越大则走的越远,训练速度也就越快,反之亦然。
5.1梯度下降存在的一些问题-表面问题 非核心
根据下图,如果梯度下降在Loss等于0就停止了那它其实并没有找到让Loss最小的那个w值(也就是负数的那个),那么对于这种现象,李老师给出了如图的2个点的定义。对于这种情况下实际停止的点我们叫做local minima,对于这种情况下理论停止的点我们叫做global minima。不过李老师说 这并不是梯度下降模型的核心缺陷问题,后续会讲。
5.2梯度下降的多参数情况
我们回到2中的公式定义
$$
y=b+wx_1
$$
我们在该公式并不止有w(weight)是需要我们自定义寻找的,还有b(bias)也是。那么对于多个参数的梯度下降其实和单一参数并没有区别,可以参考下图。
6.小总结
那么对于最简单的一个ML的步骤,可以分为如下3个步骤。
1.定义函数
2.定义损失函数
3.优化损失函数的输出
7.优化模型-根据预测结果与实际需求优化模型的数学函数
根据李老师视频中的图,我们可以发现这个播放量是有周期性的,每七日就有2天低谷期,那么我们之前的模型只是单一的用前一天的数据预测后一天的数据,也就是说周期只是一,是一个比较低能的模型只能预测一天。
为了能预测的更长远,我们需要对模型进行修改。我们可以预测7天,28天,N天。如图所示。
其中每天的w和b都会通过之前提到梯度下降来寻找到最优值,然后依次代入模型最后得出未来N+1天的播放量。
Tips 示例:
如果你有如下数据:
- x1=100 (第1天播放量)
- x2=150 (第2天播放量)
- x3=120 (第3天播放量)
- x4=130 (第4天播放量)
- x5=140 (第5天播放量)
- x6=110 (第6天播放量)
- x7=160 (第7天播放量)
以及相应的权重:
- w1=0.1
- w2=0.2
- w3=0.15
- w4=0.1
- w5=0.25
- w6=0.05
- w7=0.15
那么,预测结果 y会是:
$$
y = b + (w_1x_1 + w_2x_2 + w_3x_3 + w_4x_4 + w_5x_5 + w_6x_6 + w_7x_7)
$$
即:
$$
y = b + (0.1 \times 100 + 0.2 \times 150 + 0.15 \times 120 + 0.1 \times 130 + 0.25 \times 140 + 0.05 \times 110 + 0.15 \times 160)
$$
- **上限 i=7表示你考虑的是过去 **7天 或 7个时间步 的播放量数据,每个数据点都有一个对应的权重 wi。
- 这个加权求和模型试图通过这些过去的播放量数据来预测未来的播放量。每个 wi表示第 i天的播放量对最终预测的贡献程度。
最终的 y 代表的是 基于过去7天播放量的加权预测值。
8.线性模型太simple了,我们需要更曲线化的模型
1.线性模型的限制
- 线性模型只能表示线性关系,无法模拟复杂的非线性模式。
- 通过修改权重 w 和偏置 b,只会改变直线的斜率和截距,无法适应数据的复杂性。
- 现实中的数据关系常常是非线性的,比如某些范围内的正相关,超出范围后的反相关。
2. 模型偏差与解决方案
- 线性模型的局限性称为模型偏差 (Model Bias),与偏置 b不同。
- 需要设计更复杂且灵活的函数来描述真实数据。
- 红色曲线可以看作常数项和多个特定函数的组合,从而形成非线性模式。
3.蓝色函数与分段线性曲线
- 蓝色函数描述分段线性曲线的局部行为,如水平、斜坡和拐点。
- 红色曲线可以通过多个蓝色函数的组合来逼近。
- 增加蓝色函数的数量可以更精确地拟合复杂的分段线性曲线。
4.曲线逼近与模型灵活性
- 分段线性曲线能够逼近任何连续曲线。
- 任何复杂的非线性关系都可以通过足够的蓝色函数与常数项来逼近。
- 关键问题是如何具体构建这些函数。
5.Sigmoid 函数的应用
Sigmoid 函数可以作为蓝色函数的近似,表现为平滑的S型曲线。
数学表达式为
$$
y = \frac{c}{1 + e^{-(b + wx_1)}}=c*sigmoid(b+wx_1)
$$
,其中 c是调整参数。Sigmoid 函数能够将极大值和极小值控制在预期范围内,模拟非线性特性。
通过调整b,w,c可以得到不同的曲线
6.函数的组成与叠加
- 讨论如何利用基础函数组合更复杂的函数,
- 使用蓝色函数的参数 w,b,c 来生成红色曲线,
- 通过加总多个蓝色函数实现不同的分段线性曲线。
7.增强模型灵活性
解决线性模型的局限,通过引入未知参数扩展模型的表现力,
通过不同的 wi,bi,ci来组合更灵活的函数,逼近各种连续函数。
引入多变量特征进一步提升模型适应性。
8.多特征函数的实现
讲解多特征函数的计算过程,
蓝色函数与 Sigmoid 函数的关系及其对多特征的影响。
用矩阵运算表示多重特征的加权输入,简化计算过程。
9.矩阵与向量表示
将多特征函数的计算转化为矩阵形式,
使用矩阵 w、向量 x和偏置 b表达模型计算核心,
简化表达式,使公式更直观易懂。
$$
r=b+wx
$$
进一步的简化表示带上sigmoid
$$
a=σ(r)
$$
最后再乘上ci与加上b,得到最终表达式。
$$
y=c^T+a
$$
总图
10.表达方式统一与参数定义
图示化和线性代数方式表达同一函数,帮助理解。
引入未知参数(如 w,b,c)并重新定义符号与功能。
所有未知参数整合为长向量 θ,统一表示未知参数。
θ中的数值来自于各个未知的参数(b,c,w)
综上,现在完成了改写模型函数,重新定义了未知数。
现在开始继续定义损失函数。
11.定义损失函数与参数更新
利用 θ表示所有参数,简化损失函数 L(θ)的表示。
其实这个Loss定义和之前并无多大区别,核心的区别就在于替换了之前的标量输入参数b,w为现在的未知参数向量组θ。
- 计算每个参数对损失函数的梯度,并将其组合成梯度向量 g。
- 根据梯度向量,通过学习率更新参数,进行迭代优化。
我们之前提到的计算步长的是标量下的计算,Loss只对其中的一个未知变量求微分然后乘上learning rate得到步长。
但是现在我们是未知变量是一个向量组,所以我们的微分也应当对应为向量组,如下图。
随机生成一组未知向量组,然后减去步长,得到下次的未知向量组。
11.Batch、Loss 与参数更新概念
使用 Batch 计算 Loss,通过该梯度更新参数。(Batch的划分是随意的,看需求。)
定义 Epoch 与 Update 的区别:所有 Batch 完成一次更新称为 Epoch,每次更新Loss函数的参数称为 Update。
例如,若 N=10000,Batch Size = 10,Epoch 包含 1000 次 Update。
12.激活函数的选择与应用
不一定要选择光滑的曲线,如果有需求也可以选择硬直的曲线叫做 Hard Sigmoid 。
Hard Sigmoid 可视为两个 ReLU 函数的加和,讨论 ReLU 的特性与公式。
通过把多个ReLU函数加和可以得到hard sigmoid,如图。
无论是之前的soft sigmoid还是现在的hard sigmoid我们都叫做activation function(激活函数)
(下图的hard的i为什么是2i,是因为他是2个ReLU的加和)
对比 Sigmoid 和 ReLU 激活函数,指出 ReLU 常见于实验应用中。
从结果论出发(目前还没学到)ReLU 也就是hard sigmoid 比soft sigmoid好。下面是GPT的分析,自行查看吧。
Hard Sigmoid 和 Soft Sigmoid(标准Sigmoid) 各有特点,它们在不同场景中的优劣势取决于具体的应用需求和优化目标。以下是为什么 Hard Sigmoid 在某些情况下比 Soft Sigmoid 更好的原因:
- 计算效率
Soft Sigmoid: 标准 Sigmoid 函数定义为:
σ(x)=11+e−x\sigma(x) = \frac{1}{1 + e^{-x}}
它包含指数运算 e−xe^{-x},这是一个计算成本较高的非线性操作。
Hard Sigmoid: Hard Sigmoid 是 Soft Sigmoid 的近似形式,通常表示为:
HardSigmoid(x)=clip(0.2x+0.5,0,1)\text{HardSigmoid}(x) = \text{clip}(0.2x + 0.5, 0, 1)
其中
clip
将结果限制在 [0,1][0, 1] 范围内。 这只需要进行简单的线性运算 0.2x+0.50.2x + 0.5 和裁剪操作,而不需要复杂的指数计算。优势:
- 计算量更少,适用于计算资源有限的场景。
- 在深度学习中,尤其是嵌入式设备或实时任务中,Hard Sigmoid 可以显著提高模型的推理速度。
- 梯度消失问题
Soft Sigmoid: 在标准 Sigmoid 中,当 xx 非常大或非常小时,函数值趋近于 0 或 1,梯度趋近于 0(因为 Sigmoid 的导数是 σ(x)(1−σ(x))\sigma(x)(1-\sigma(x)),当 σ(x)\sigma(x) 接近 0 或 1 时,导数很小)。这会导致 梯度消失 问题,使得网络在训练中很难更新参数。
Hard Sigmoid: Hard Sigmoid 的梯度在大部分输入范围内是 恒定的线性梯度,除非在 [0,1][0, 1] 范围之外裁剪时梯度为零。因此,它相比 Soft Sigmoid,更不容易发生梯度消失问题。
优势:
- 使得训练过程中的参数更新更稳定,尤其在深层网络中。
- 对于需要快速收敛的任务,Hard Sigmoid 能加速训练。
- 避免数值不稳定
Soft Sigmoid: 在计算过程中,由于指数运算可能会出现数值不稳定的情况(比如 e−xe^{-x} 可能导致溢出或精度损失,尤其当 xx 的取值范围非常大时)。
Hard Sigmoid: 使用简单的线性函数和裁剪,不涉及指数运算,因此完全避免了数值不稳定的问题。
优势:
- 对于具有大范围输入值的数据,Hard Sigmoid 更稳健。
- 在低精度硬件(如量化计算)中,Hard Sigmoid 更易实现且更加可靠。
- 对稀疏表示的支持
Soft Sigmoid: Soft Sigmoid 的输出值在 [0,1][0, 1] 范围内连续分布,可能会导致某些特征难以被激活。
Hard Sigmoid: Hard Sigmoid 的线性区域更加明确,且裁剪操作使得大部分小值被直接裁剪为 0(稀疏化特性)。这种稀疏化特性在某些任务中(如特征选择或神经网络的稀疏化)有助于更好的泛化能力。
优势:
- 支持更稀疏的特征表示,有助于减少计算量和提高模型的效率。
- 在某些场景下(如正则化或特征选择任务)可能带来更好的性能。
- 适用于量化网络
- Hard Sigmoid 在量化神经网络(Quantized Neural Networks, QNNs)中特别常用,因为它的线性区域便于表示成低精度值,从而适配硬件加速。
- 而 Soft Sigmoid 由于包含指数运算,其非线性特性不适合量化实现。
Soft Sigmoid vs Hard Sigmoid 对比总结
特性 | Soft Sigmoid | Hard Sigmoid |
---|---|---|
计算复杂度 | 高(指数运算) | 低(简单线性+裁剪) |
梯度消失问题 | 严重(在极值处梯度趋近 0) | 不明显(线性部分梯度恒定) |
数值稳定性 | 可能有数值溢出或不稳定 | 稳定(无指数运算) |
稀疏特性 | 输出连续分布,无稀疏性 | 稀疏化特性明显(裁剪使部分值为 0) |
适合低计算资源场景 | 不适合 | 非常适合 |
适合量化网络 | 不适合 | 非常适合 |
什么时候使用 Hard Sigmoid 更好?
- 计算资源有限:在嵌入式设备、移动设备或实时任务中,Hard Sigmoid 的计算效率更高。
- 深层网络:在深度网络中,Hard Sigmoid 的梯度更稳定,不容易导致梯度消失。
- 需要稀疏特性:对于任务需要更稀疏的激活特征时(如神经网络正则化或特征选择任务)。
- 量化模型:如果模型需要量化(如 QNN),Hard Sigmoid 更适合硬件实现。
总结
Hard Sigmoid 比 Soft Sigmoid 更好,主要在于其 计算简单、梯度稳定、数值稳定性高,以及适合 资源受限或量化模型 的场景。而 Soft Sigmoid 适合需要更精确的非线性建模的场景,比如一些对非线性边界要求较高的任务。
9.额外文化常识
在过去80,90年代特别流行神经网络(neural network)以至于名声被弄臭了,然后paper带这个的都被毙了。
为了解决这个抽象的问题,现在人们把neuron换成了layer,而原来的neural network就被叫做了deep,综合后这套技术就成了现在的deep learning。