李宏毅机器学习课程笔记
基本概念
-
机器学习:让机器找函数(模型)
-
regression(回归):函数输出一个数值
classfication(分类):给定类别,输出分类
structured learning(结构学习):自动创建有结构的事物(图片、文章等)
-
我们定义一个带未知参数的函数 (模型):y = b + wx
x:feature,特征
w:weight,权重
b:bias,偏置
-
Loss,损失值,评价一组输出值的好坏
label:真实值
Loss = L(b, w),与所有函数(模型)参数有关
- 若选取参数为 L(2k, 1)
- 代入公式 y = 2k + w
- 将真实数据代入x,得到预测值,与label比较(作差)
- 求所有比较结果的平均绝对误差(MAE) / 平均方差(MSE) 等作为损失函数
Loss的取值分布如下图(颜色越红,值越大):
可以看出,紫色区域的Loss取值较小,说明与真实情况差距较小,是比较好的参数选择区域
机器学习的目标就是找一个函数(模型)参数的取值,使得Loss最小,也就是与真实数据的差距最小
该图又叫 Error Surface
-
hyperparameter,超参数,需要自己修改、调整的参数
-
optimization(最优化问题),在机器学习中就是找到组函数(模型)参数取值,使我们的Loss最小
-
方法之一:Gradient Descent 梯度下降法
- 随机选取初始值(或评估选取一个较好的初始值)
- 计算当前值在函数中的微分(梯度)
- update(更新)当前值,更新步长为,η为learning rate(学习率,超参数之一,用来设定当前学习也就是调整参数的快慢),回到第二步
结束条件可以是:
- 设定最大学习次数的超参数
- 到达更新步长也就是梯度为0的地方
- 找到了满足要求的解
问题:
-
全局最优(global minima)与局部最优(local minima)问题
但是实际在深度学习中,真正痛点不是局部最优问题
-
机器学习步骤
- 定义带未知参数的函数
- 人为定义的待训练函数来自于对学习任务的理解(domain knowledge)
- 根据训练数据定义损失函数
- 根据训练数据求解函数参数的最优解
基本模型
Model Bias 模型限制:
由于模型自身的限制,无法更准确的描述实际的情况
可作为带未知参数的待训练函数的基本数学模型。
Linear model,线性模型
可以通过以下函数进行描述:
线性模型只能描述一些简单的线性相关场景
Piecewise Linear Curves,分段线性曲线
该模型可以通过一个常数 + 多个下图中橙色框中的蓝色函数 (以下统称“蓝色函数”) 的和进行描述:
蓝色函数是一个中间区域倾斜、两边为常数的分段函数,它的左半边常数部分通常为。
如图中例子所示,红色目标曲线使用蓝色函数的描述方式为:
- 添加一个常数项(函数0),使函数起点()与红色目标曲线一致
- 添加函数1描述红色目标函数的第一个直线段,函数1的中间部分与第一个直线段斜率相同。由于加上了函数0,总函数起始点被平移到红色目标曲线起始点,到第一个转折点 () 结束。第一个转折点之后,函数1保持当前值不变(常量),使得下一个函数的起始点被平移到第一个转折点
- 添加函数2,由于函数2在第一个转折点 () 左边常量部分为0,不影响对红色目标函数部分的描述,同时会以第一个转折点 () 为起始点,函数2的中间部分与红色目标函数的第二个直线段斜率一致,到第二个转折点 () 结束,之后保持当前值不变,使得下一个函数的起始点又被平移到第二个转折点
- 与添加函数2类型,添加函数3,从第二个转折点 () 开始,函数3的中间部分与红色目标函数的第三个直线段斜率一致,到第三个转折点 () 结束,同时把下一次添加的函数的起始点移到了第三个转折点位置
- 以此类推,描述完红色目标函数所有的直线段
小结:
在分段线性曲线中的每一个直线段都在相同的位置上对应一个中间区域斜率相同的蓝色函数,这样多个蓝色函数求和,可以描述出分段线性曲线的基本走向。再总体加上一个常量补偿使其上下平移到相同的起点,即可描述该分段线性曲线。
一般曲线
可以在在曲线上取点,用这些点来描述曲线,这样就转化为了分段线性曲线,可以通过多个蓝色函数来描述。理论上,当取点足够细密,就可以无限逼近真实函数。
描述高阶曲线模型
sigmoid 函数
Sigmoid 函数(虚线)是上面提到的蓝色函数的一种逼近(两种函数近似相同),可用多个sigmoid函数来逼近任意函数。
所以上面的蓝色函数也叫 Hard Sigmoid 函数。
通过调整 Sigmoid 函数的参数c、b、w来调整该函数的形状:
-
w:调整斜率
-
b:左右平移
-
c:调整高度
使用sigmoid描述任意高阶曲线模型
机器学习的第一个步骤就是定义一个带未知参数的函数模型。通过前面的学习,我们可以通过sigmoid函数来富有弹性的描述一个高阶曲线,且描述能力较强,进而可以满足我们大多机器学习场景的模型描述。
下面我们来具体看一下如何用sigmoid函数来描述任意高阶曲线模型。
通过 Sigmoid 函数描述目标函数,我们可以写作:
当 feature 有多个的时候(有多个因变量),目标函数可以写作:
我们假设取值1、2、3,取值1、2、3,则我们可以这样描述该函数:
-
图示表达为:
sigmoid 运算通常会用以下符号表示:
-
线性代数表达方式
部分,,每一个取值的结果设为,则可写作:
进而可以写作矩阵形式:
进而写成矩阵表达式:
的转置乘上通过 sigmoid 的向量,乘积向量求向量和,最后加上,得到:
最终函数的线性代数表示方法为:
其中,
- :feature,已知
- b、、、:待求解的模型参数,我们将所有未知参数拉直为一维向量,并按顺序合并为一个大的一维向量,统称:
- :实际函数值(目标值)
其他激活函数
这里提到一个新的名字——激活函数。
包括上面讲的蓝色函数(hard sigmoid)、sigmoid函数在内,我们给它们起了一个名字——activation function(激活函数)。激活函数还有很多种,接下来我们对一些常见的激活函数进行介绍。
-
ReLU
两个ReLU函数即可表示一个hard sigmoid函数:
所以也可以通过多个ReLU函数来描述高阶曲线模型。
多层函数拟合
上面我们讲到,可以通过多个激活函数相加来拟合高阶曲线模型,我们还可以通过级联的方式,使用多层的激活函数进行拟合,如下,
是sigmoid函数的简写,我们可以看到,使用多层函数拟合就是前一个激活函数的输出(注意,此处没有乘以并整体加上作为补偿的参数b)作为下一层sigmoid函数的输入,实现一个网络结构,通过该网络结构去描述高阶曲线模型。
我们为每一个作为网络结构中的单一节点的激活函数起一个响亮的名字——神经元(Neuron),而整个网络起名为神经网络(Neural Network)。每一层我们叫它隐藏层(hidden layer),包含多个隐藏层的神经网络模型我们叫它深度学习模型(Deep Learning)。
问题
-
过度拟合 overfitting
神经网络是越深越好吗?不是,我们不是为了更好的拟合当前已有的数据,而是为了预测未来的数据,让模型有更好的泛化能力。当网络越来越深,拟合能力越来越强,对当前数据的拟合效果越来越好,但对当前数据的过度拟合,对未来数据的预测能力反而可能会下降。
定义损失函数
损失函数定义
与前面的基本概念与简单的例子一致,是所有未知参数取某组值的情况下,代用某组feature值时与真实label 的差距。
求解模型参数最优解
模型最优化问题,也就是求解一组可以让损失函数最小的模型参数:
求解步骤如下:
-
求解损失函数L在每一个模型参数下的偏导数在取时的取值,所有偏导数的值组成的向量,我们称之为梯度gradient,简写为:
该式也可简写为:
是向量微分算符,在高数中也代表梯度算符。
-
更新模型参数向量:原模型参数向量 - 梯度向量 * 学习率 得到新的模型参数向量
在实际使用训练数据求解最优模型参数的过程中,我们会将完整的数据随机分成多个batch,分别对每组batch求解loss并更新模型参数。
如:先选batch1进行一次更新(一次update),再选batch2,再选batch3……所有batch都训练完一遍,叫训练完一个epoch。接着再从batch1开始训练第二轮,由此这样轮回往复,充分发挥每一组数据。