【李宏毅机器学习2021】(一)机器学习和深度学习介绍

学习内容链接 李宏毅机器学习2021

很早以前我们就希望机器能跟人一样聪明,AI 是我们想要达成的目标,机器学习达成这一目标的手段,让机器通过学习能变得跟人一样聪明。

深度学习是机器学习的其中一种方法。

image-20240306203656185

机器学习和深度学习介绍

机器学习介绍

Machine Learning 概括来说就是 Looking for Function,即让机器具备找一个函数的能力

image-20240306204547324

这些函数显然非常复杂,要依靠机器自动找出该函数。

下面讲简单的说明如何找到一个函数。

首先,假设现在有一个 set(这个 set 也就是后文中的带有未知参数的函数),包含了很多 function,这个 function set 叫做 Model。然后需要有训练数据,告诉机器输入数据应该对应什么样的输出数据。假设有一个方法(也就是后文的损失函数)能让机器判断一个 function 是好的还是不好的,举例来说,在下图例子中 \(f_1\) 比较拟合训练数据,显然更好。

image-20240306205340278

这个 function set 有无穷多的 function,一个一个判断 function 好不好太花时间了,我们需要一个有效率的算法能从中找出最好的 function,写作 \(f^*\)。之后我们期待往 \(f^*\) 输入测试数据,能得到正确的输出,也就是机器有没有举一反三的能力。

image-20240306210236733

综上,机器学习可以简单地分为三步:找 function set、定义一个能让机器判断函数好坏的方法、找出最好的 function。

image-20240306211022849

随着要找的函数不同,机器学习有不同的类别:

  • Regression,回归:函数输出的是数值。
  • Classification,分类:函数从给定选项(类别)中选择一个当作输出。
  • Structed Learning:创建一个有结构的对象,如图片、句子等。

机器怎么找到一个函数?

假如要基于 Youtube 后台信息预测明天的观看人数,分成三个步骤:

步骤一:写出一个带有未知参数的函数,基于领域知识(domain knowledge)进行猜测,此处为方便理解,不妨设为

\[y = b + wx_1 \]

在机器学习中,将带有未知参数的函数称为 Model(模型)

\(x_1\) 是前一天的观看人数,称为 特征(Feature)。在一个房价预测的任务中,特征可能包括房屋的面积、卧室数量、浴室数量、地理位置等。在图像分类任务中,特征可能包括图像的像素值、颜色直方图、纹理特征等。在文本分类任务中,特征可能包括文本的词频、TF-IDF值、词嵌入向量等。特征在机器学习中起着非常重要的作用,它们帮助我们理解数据、构建模型并解决实际问题。

\(b\)\(w\) 是未知参数,称为 偏置(Bias)权重(Weight)。在机器学习中,权重是指模型中用来调节输入特征对输出的影响程度的参数。偏置是模型中的一个常数项,它代表了模型在没有输入时的输出值。偏置可以理解为模型的基准值或者是在没有其他特征信息的情况下对输出的影响。权重和偏置都是用来调整模型的参数,通过学习训练数据,优化算法可以自动调整权重和偏置的数值,使得模型能够更好地拟合数据,并做出准确的预测。

步骤二:结合训练数据定义损失函数(Loss Function)。在机器学习中,Loss(损失)是一个衡量模型预测值与真实值(真实值也称 label)之间差异的指标。损失函数衡量了模型在训练过程中产生的错误程度。

常见的损失函数有:

  • 均方误差(Mean Squared Error,MSE):用于回归问题,计算预测值与真实值之间的平方差的平均值。
  • 交叉熵损失(Cross-Entropy Loss): 用于分类问题,衡量模型对于真实类别的预测与真实标签之间的差异。
  • 对数损失(Log Loss): 与交叉熵损失类似,用于二分类问题,对于每个样本,将预测值和真实值的对数差异进行加权求和。

现在我们需要定义一个损失函数来衡量模型的预测观看人数与真实观看人数之间的差异。上述假设问题是一个回归问题,我们的损失函数可以选择 MSE,定义如下:

\[MSE = \frac{1}{n}\sum_{i=1}^n(y_i-\hat{y}_i)^2 \]

其中,n 是训练数据数量,\(y_i\) 是第 i 个样本的模型预测值,\(\hat{y}_i\) 是第 i 个样本的真实值。MSE 就是真实值与模型预测值之间的差值的平方的平均值。这个值越小,表示模型的预测结果与真实值越接近,模型的性能越好。在训练过程中,我们的目标就是最小化损失函数。通过调整模型的参数即 b 和 w,使得损失函数的值逐渐减小,从而让模型能够更好地拟合训练数据,提高预测的准确性,也即接下来的第三步解最优化问题。

步骤三:解最优化问题。在机器学习中,最优化问题通常指的是通过优化算法来最小化或最大化损失函数(或目标函数)。在训练过程中,我们通过调整模型的参数,使得损失函数的值达到最小化,以便模型能够更好地拟合训练数据和提高预测性能。

此处,我们的目标是通过调整权重 w 和偏置 b 的值,使得损失函数 MSE 最小化。这个问题可以通过梯度下降等优化算法来解决。

梯度下降的步骤如下:

  1. 随机初始化权重 w 和偏置 b 的值。
  2. 计算损失函数 MSE 关于参数 wb 的梯度。损失函数 MSE 记为 L(w,b):

\[\vec{\nabla}L(w,b)=(\frac{\partial L}{\partial w},\frac{\partial L}{\partial b}) \]

  1. 根据梯度的方向和大小更新参数 wb 的值。

\[w:=w-\eta\frac{\partial L}{\partial w} \\ b:=b-\eta\frac{\partial L}{\partial b} \]

其中,\(\eta\) 是学习率(learning rate),用于控制参数更新的步长,它决定了在每次参数更新中,参数沿着梯度的方向移动的大小。在梯度下降算法中,我们通过计算损失函数对参数的梯度来确定参数的更新方向,\(\eta\) 控制了参数更新的速度。学习率的选择对于梯度下降算法的性能至关重要。如果学习率太小,模型收敛速度会很慢,需要较长的时间来找到最优解;如果学习率太大,可能会导致参数在损失函数中跳动,甚至无法收敛。

学习率不是直接从训练数据中学习得到的,而是在训练之前需要手动设定的参数。这种参数称为超参数(hyperparameters)。与模型的权重和偏置等参数不同,超参数不会在训练过程中通过梯度下降等优化算法进行更新。相反,超参数的选择通常是基于经验、试验或者启发式方法。一种常见的做法是从一个小的初始学习率开始,然后根据训练过程中损失函数的变化情况逐渐调整学习率的大小。常见的调整方法包括学习率衰减、自适应学习率等。

  1. 重复步骤 2 和步骤 3,直到损失函数收敛或达到停止条件。

通过这样的优化过程,我们可以找到一组最优的参数 wb,使得模型的预测值与真实值之间的均方误差最小化,从而达到最佳化的目标。

以上三个步骤属于机器学习的训练过程。

image-20240212183318377

一般会将训练数据分成两份,一份用于训练,另一份用于测试。从训练数据中得到的参数只对训练数据有效,还要评估模型是否正确。将测试数据视作未知数据,模型评估是检查训练好的模型对测试数据的拟合情况。

从上图中明显看出训练好的模型并不是很理想,可以修改模型进行改进。修改模型往往来自于对这个问题的理解,也就是领域知识。若一开始对问题完全不理解时,我们胡乱写了一个模型 \(y=b+wx_1\),但结果并不理想。我们可以观察真实数据(如下图),

image-20240212184756226

得到一个结论是每隔七天有一个循环,所以可以考虑前七天的观看人数,修改模型为 \(y=b+\sum_{j=1}^7w_jx_j\),显然有所提升。

image-20240212185327839

假如考虑更多天:

image-20240212185545649

看来考虑前28天的观看人数已经触碰到了极限,要考虑别的因素的影响。上面这几个模型都是 Linear Model,它假设 feature 之间都是线性相关的。

深度学习介绍

仍然是通过基于 Youtube 后台信息预测明天的观看人数这一例子来引入深度学习。

Linear Model 是机器学习中最简单且最常用的模型之一,但 Linear Model 的局限性在于它只能建模特征之间的线性关系。

image-20240212191033446

但 x 和 y 的关系也许就如红色曲线那样,就很难用 Linear Model 来建模。这种来自 Model 的限制,从而没有办法模拟真实的状况叫模型偏差(Model Bias)

那么红色曲线如何表示呢?

image-20240212224953545

红色曲线为分段线性曲线(Piecewise Linear Curve),分段线性曲线都可以由常量(0号直线)+一组特殊的函数(函数特点:小于某个阈值时是定值,大于另一个阈值时是定值,两个阈值之间是一条斜线段,如1、2、3号)组成。

image-20240212230143842

现在的问题是如何表达 1、2、3号这种函数。我们可以考虑用一条曲线即 Sigmoid 函数来逼近它:

image-20240212231257894

这也是为什么像 1、2、3号这种函数被称为 Hard sigmoid 函数的原因。为什么不将 Hard Sigmoid 作为基础函数呢?因为转角处无法求微分,所以要用一个平滑的曲线做基础函数。

调整 b、w 和 c 就可以制作各种不同形状的 sigmoid 函数,将不同 sigmoid 函数组合起来即可逼近分段线性曲线。

image-20240212231932736

现在尝试写出红色曲线的函数:

image-20240212233041127

假如是 x 和 y 的关系是复杂的连续曲线而不是分段线性曲线呢?可以使用分段线性曲线去逼近连续曲线:

image-20240212233854258

如果存在多个特征呢?Model 可以表示为:

\[y = b + \sum_ic_isigmoid(b_i+\sum_jw_{ij}x_j) \]

image-20240213141154265

每个 i 对应一个 sigmoid function ,每个 j 对应一个特征。\(w_{ij}\) 表示在第 i 个 sigmoid function 里第 j 个特征对应的权重。

接下来我们来图解这个式子,并试着用线性代数的方式简化表达式的写法。这里假设有三个特征,设置三个 sigmoid 函数(sigmoid 函数的数量是一个超参数)。图解 \(b_i+\sum_jw_{ij}x_j\)

image-20240213142253655

为方便起见,记 \(r_i=b_i+\sum_jw_{ij}x_j\)。为进一步简化写法,改成向量和矩阵表示:

image-20240213204122573

接着将 \(r_i\) 输入到 sigmoid 函数中生成结果 \(a_i\),同样为简化表达式,记 \(\vec{a}=\sigma(\vec{r})\),其中 sigmoid 函数通常用 \(\sigma\) 表示,\(\vec{a}= \begin{bmatrix}a_1\\a_2\\a_3\end{bmatrix}\)\(\vec{r}=\begin{bmatrix}r_1\\r_2\\r_3\end{bmatrix}\)

image-20240213210303311

接着进行最后一步,将每个 sigmoid 函数输出值加权求和并加上偏置值 b,其中,\(c^T=\begin{bmatrix}c_1,c_2,c_3\end{bmatrix}\)

image-20240213212712935

不管是普通的数学表达式、图解或线性代数形式,归根结底都是在说同一件事。只不过转换为线性代数的形式一方面有助于表达式的简洁,另一方面有许多关于矩阵运算的库(如 numpy),方便编程。

image-20240214103119612

经过上面的步骤,我们已经完成了面对一个非线性问题,如分段线性曲线或者是更复杂的连续曲线问题时,如何进行机器学习的第一步 ”写出带有未知参数的函数“。接下来要进行机器学习的第二步 ”定义损失函数“。

image-20240214110326146

除了 \(\vec{x}\) 是特征向量,\(\vec{W}、\vec{b}、\vec{c}^T、b\) 都是未知参数,现在将未知参数 "拉直"组合成一组未知参数 ,每个未知参数对应一个 \(\theta_i\),所有参数组合成向量 \(\vec{\theta}\)。为什么要这样做呢?因为未知参数太多了,在 Loss 函数中再一个个列出来就太繁琐了,于是用 \(\vec{\theta}\) 来统称所有的参数。

image-20240214103849955

Loss 函数的定义还是类似只有两个未知参数的情况,计算真实值与预测值的均方误差,\(e=(\hat{y}-y)^2\)

image-20240214110651657

现在进行机器学习的第三步 ”解最优化问题“。

image-20240214111531596

这里还是用梯度下降算法,步骤类似只有两个未知参数的情况,目标是找到一组 \(\vec{\theta^\star}\),使得损失函数 L 值最小。

先随机初始化未知参数的值为 \(\vec{\theta_0}\),然后计算损失函数关于所有未知参数的偏置值,组合成梯度向量 \(\vec{g}\)。然后根据梯度的方向和大小更新参数的值。

image-20240214112127270

拿新的参数值继续计算梯度,然后更新参数,一直到损失函数收敛或达到停止条件。

image-20240214112939881

到这时候可能会有个疑问,除了 Sigmoid 函数外,是不是还有其他函数也能近似 Hard Sigmoid 呢?

没错,除了 sigmoid 函数外,还有 ReLU 函数(Rectified Linear Unit,修正线性单元)。ReLU函数的定义如下:

\[f(x)=max(0,x) \]

当输入 x 大于等于 0 时输出为 x,否则输出为 0。

不同于只用一个 Sigmoid 函数就能逼近一个 Hard Sigmoid,要用两个 ReLU 函数才能逼近一个 Hard Sigmoid。

image-20240214122213689

机器学习中把类似 Sigmoid 和 ReLU 这种函数称为 Activation Function(激活函数)

现在来看下用 ReLU 相对于线性模型的表现是否有所提升:

image-20240214122747321

接下来继续改我们的模型,将 Sigmoid/ReLU 输出值先不加权求和,而是再做一次 Sigmoid/ReLU。

image-20240214155425709

当然,也可以继续多做几次,做几次 Sigmoid/ReLU 也是超参数。

来看下分别做了1层、2层、3层的表现,显然又有所提升:

image-20240214155842821

到目前为止,针对复杂问题我们讲了以上一些模型,是时候给这些模型起一个花俏的名字了!

image-20240214160543340

Neural Network,神经网络:神经网络是一种由多个神经元(Neural)组成的数学模型,每个神经元接收来自前一层的输入,并对这些输入进行加权求和,并通过激活函数((如 Sigmoid、ReLU等)处理,最终产生输出。

由于神经网络在80/90年代时吹捧太过,名声不太好,为了重振神经网络雄风,需要新的名字:每一排神经元称作一个 Hidden Layer(隐藏层),有很多层就意味着 ”Deep(深)“,这整套技术就称为 Deep Learning(深度学习)

Hidden Layer,隐藏层:位于输入层和输出层之间,每一排神经元称作一个隐藏层。在隐藏层中,神经元接收来自输入层或前一隐藏层的输入,并对这些输入进行加权求和,并通过激活函数进行处理,最终产生输出。


现在的深度学习隐藏层是越来越多,可以看下例子:

image-20240214215122991

想一下,用 Sigmoid/ReLU 函数能逼近复杂曲线,越多的 Sigmoid/ReLU 函数就能逼近越复杂的曲线,那为什么是往 ”Deep“ 方向发展,一层层套下去,而不是在一排里用尽可能多的 Sigmoid/ReLU 函数呢?这个问题将在后续章节讲到。


过拟合(Overfitting)指的是机器学习模型在训练数据上表现良好,但在测试数据或新数据上表现不佳的现象。简单来说,过拟合发生在模型过度地记忆训练数据的特征和噪声,而未能捕捉到数据的真实模式或潜在规律。过拟合通常是由于模型的复杂度过高或者训练数据过少造成的。

值得注意的是,隐藏层并不是越多越好,当隐藏层过多时会导致模型的复杂度过高,可能会导致过拟合

image-20240214215741145
posted @ 2024-02-26 15:45  hzyuan  阅读(11)  评论(0编辑  收藏  举报