Deep Learning - Lecture 2 Machine Learning Fundamentals
- 介绍(Introduction)
- 回归(Regression)
- 回归问题中的数据
- 梯度下降(Gradient descent)算法
- 回归问题中的损失函数梯度
- 线性回归中的随机梯度下降算法
- 分类(Classification)
- 分类问题中的数据
- 左上部分
- 多分类问题中的损失函数
- 不同点
- 与最大似然的联系(Connection to maximum likelihood)
- 回归问题中最大化高斯似然
- 多分类问题中的最大化似然函数
- 总结
- 标题部分
本节目标:
- 解释基本的机器学习原理,包括:
- 定义数据;
- 模型;
- 损失函数;
- 估计算法。
- 设计并实现用于线性回归和线性分类的机器学习方法。
介绍(Introduction)
我们将重点关注机器学习的回归和分类的学习模型。示例:模型正在预测边界框(回归)和类别标签(分类)),通过此示例直观地展示了回归和分类在实际应用中的体现,即模型不仅要确定物体的位置(边界框,对应回归问题),还要识别物体的类别(类别标签,对应分类问题)
机器学习系统的组成部分
机器学习系统通常有四个主要组成部分:
- Data(数据):是系统的起始输入部分,示例展示了不同品种狗的图片,分别为斑点狗(dalmatian)、荷兰毛狮犬(keeshond)、迷你雪纳瑞(miniature schnauzer )。数据会被输入到模型中。
- Model(模型):以公式“e.g. y ^ = f ( x ; θ ) \hat{y} = f(x; \theta) y^=f(x;θ)”示例,其中 y ^ \hat{y} y^ 是预测输出, x x x 是输入, θ \theta θ 是模型参数。模型接收数据进行运算。
- Loss Function(损失函数):常见的损失函数有:均方误差(squared error)、最大似然(maximum likelihood)、贝叶斯(Bayesian)等。模型的输出会通过损失函数来衡量预测结果与真实结果的差异。
- Parameter Estimation Algorithm(参数估计算法):常见的有最小二乘法(least squares)、随机梯度下降(stochastic gradient descent)、牛顿法(Newton methods)、遗传算法(genetic algorithms)等。它们根据损失函数计算出的差异,来估计和调整模型参数。
从最后的参数估计会反馈回之前的各个部分,即机器学习系统各组件间的反馈调整机制:
- 根据参数估计算法的结果,考虑是否需要新的数据或更多数据来改进模型。
- 参数估计算法可能会促使对模型超参数进行调整。
- 表示参数估计算法可能会决定是否对损失函数应用正则化方法,以防止过拟合等问题,提升模型的泛化能力。
回归(Regression)
回归问题中的数据
机械学习算法从数据中学习,在机械学习的回归问题中输出的数据都是连续的。
下图一个示例图表,图中标注了一些数据点,如 ( x 1 , y 1 ) (x_1, y_1) (x1,y1)、 ( x 2 , y 2 ) (x_2, y_2) (x2,y2)、 ( x 7 , y 7 ) (x_7, y_7) (x7,y7) 等, x x x 轴表示输入, y y y 轴表示输出。该图展示了有 m = 7 m = 7 m=7 个数据样本的情况,而那条红色直线代表可能的回归模型。直观地呈现了回归问题中输出都是连续的。
回归中的线性模型
机器学习算法通常从数据中学习一个模型,例如具有参数 θ \theta θ 和输入 x x x 的函数 f f f
线性回归在神经网络中通常对应于全连接层(Fully - Connected Layer,也叫 Dense Layer) 。
平方误差损失函数
在回归问题里,我们想要评估模型参数的好坏,就会用到平方误差损失函数。
- 左侧给出了一个简单的线性模型 y = θ x y = \theta x y=θx ,这里 x x x 是输入变量, y y y 是输出变量, θ \theta θ 是模型参数。图中还有一些黑色的点,代表实际的数据样本。每个点到红色直线(也就是线性模型 y = θ x y = \theta x y=θx 所代表的直线)的垂直距离就是误差 e j e_j ej ,它衡量了模型预测值和实际值之间的差距。
- 右侧为损失函数 J ( θ ) = ∑ e j 2 J(\theta)=\sum e_j^2 J(θ)=∑ej2 ,意思是把所有样本的误差 e j e_j ej 进行平方后再求和。它是关于参数 θ \theta θ 的函数,其图像是一个类似碗状的曲线。这个曲线的最低点(图中红色箭头所指处)对应的 θ \theta θ 值就是最优的参数选择。因为在这一点,损失函数的值最小,也就意味着模型的预测值和实际值之间的整体差距最小,此时模型的性能是最佳的。
梯度下降(Gradient descent)算法
在梯度下降算法中,我们通过沿着损失函数梯度 ∇ θ J ( θ ) \nabla_{\theta}J(\theta) ∇θJ(θ) 的负方向来更新参数 θ \theta θ ,更新公式为 θ ← θ − ϵ ∇ θ J ( θ ) \theta \leftarrow \theta - \epsilon\nabla_{\theta}J(\theta) θ←θ−ϵ∇θJ(θ) 其中箭头表示“更新”,与 θ k + 1 = θ k − ϵ ∇ θ J ( θ ) \theta_{k + 1} = \theta_{k} - \epsilon\nabla_{\theta}J(\theta) θk+1=θk−ϵ∇θJ(θ) 含义相同, ϵ \epsilon ϵ 是步长或学习率参数。
具体来说:
- 当梯度 ∇ θ J ( θ ) \nabla_{\theta}J(\theta) ∇θJ(θ) 为负时,参数值 θ \theta θ 会增加。
- 当梯度 ∇ θ J ( θ ) \nabla_{\theta}J(\theta) ∇θJ(θ) 为正时,参数值 θ \theta θ 会减小。
- 这样,参数估计收敛到损失函数的一个局部最小值。
如上图像展示了损失函数 J ( θ ) J(\theta) J(θ) 关于参数 θ \theta θ 的曲线。
红色线段表示梯度 ∇ θ J ( θ ) \nabla_{\theta}J(\theta) ∇θJ(θ) ,在曲线的这一部分,梯度为负,因此参数从 θ k \theta_{k} θk 更新到 θ k + 1 \theta_{k + 1} θk+1 时逐步增加。通过多次迭代更新,参数估计值会收敛到损失函数的局部最小值。
梯度下降是机器学习中常用的优化算法,用于最小化损失函数,以找到最优的模型参数。
随机梯度下降(Stochastic Gradient Descent, SGD)算法
随机梯度下降是一种通过随机采样一小批数据来近似损失函数梯度 ∇ θ J ( θ ) \nabla_{\theta}J(\theta) ∇θJ(θ) 的方法。参数更新公式为 θ ← θ − ϵ g \theta \leftarrow \theta - \epsilon g θ←θ−ϵg
其中 g g g 是损失函数梯度 ∇ θ J ( θ ) \nabla_{\theta}J(\theta) ∇θJ(θ) 的随机近似值。 g g g 的计算方式为 g = 1 m ′ ∑ j = 1 m ′ ∇ θ L j g = \frac{1}{m'}\sum_{j = 1}^{m'}\nabla_{\theta}L_j g=m′1j=1∑m′∇θLj m ′ m' m′ 是小批量数据中的样本数量。
还是上图那个,这次换成随机梯度下降g。红色线段标注的 g g g 是损失函数梯度 ∇ θ J ( θ ) \nabla_{\theta}J(\theta) ∇θJ(θ) 的近似值。
随机梯度下降的主要优点是计算效率高,因为在每次更新时,它只需要处理少量的数据样本,而不需要使用整个数据集来计算梯度,这在处理大规模数据集时能够显著减少计算量和计算时间。
回归问题中的损失函数梯度
- 平方误差损失函数: J ( θ ) = ∑ j = 1 m e j 2 J(\theta)=\sum_{j = 1}^{m}e_j^2 J(θ)=j=1∑mej2 其中 e j e_j ej 是误差, m m m 是样本数量。
- 损失函数梯度: ∇ θ J ( θ ) = ( ∂ J ∂ θ 1 , . . . , ∂ J ∂ θ n ) T = ∑ j = 1 m ( y ^ j − y j ) x j \nabla_{\theta}J(\theta)=(\frac{\partial J}{\partial \theta_1},...,\frac{\partial J}{\partial \theta_n})^T=\sum_{j = 1}^{m}(\hat{y}_j - y_j)x_j ∇θJ(θ)=(∂θ1∂J,...,∂θn∂J)T=j=1∑m(y^j−yj)xj 这里 y ^ j \hat{y}_j y^j 是模型预测值, y j y_j yj 是实际值, x j x_j xj 是输入特征向量。图像中还用红色线段标注了 g g g 是损失函数梯度 ∇ θ J ( θ ) \nabla_{\theta}J(\theta) ∇θJ(θ) 的近似值。
接下来具体算损失函数的梯度 ∇ θ J ( θ ) \nabla_{\theta}J(\theta) ∇θJ(θ)
假设我们有模型: y ^ = θ T x = ∑ i = 1 n θ i x i = θ 1 x 1 + ⋯ + θ n x n \hat{y}=\theta^Tx=\sum_{i = 1}^{n}\theta_ix_i=\theta_1x_1+\cdots+\theta_nx_n y^=θTx=i=1∑nθixi=θ1x1+⋯+θnxn其中 θ \theta θ 是参数向量, x x x 是输入特征向量。
对于单个样本,因为样本数量是1,所有求和就没用了,损失函数简化为 J = e 2 J = e^2 J=e2 ,其中 e = θ T x − y = ∑ i = 1 n θ i x i − y e=\theta^Tx - y=\sum_{i = 1}^{n}\theta_ix_i - y e=θTx−y=∑i=1nθixi−y 。
损失函数利用链式法则推导:
根据链式法则 ∂ J ∂ θ i = ∂ J ∂ e ∂ e ∂ θ i \frac{\partial J}{\partial \theta_i}=\frac{\partial J}{\partial e}\frac{\partial e}{\partial \theta_i} ∂θi∂J=∂e∂J∂θi∂e
因为 J = e 2 J = e^2 J=e2 ,所以 ∂ J ∂ e = 2 e = 2 ( y ^ − y ) \frac{\partial J}{\partial e}=2e = 2(\hat{y}-y) ∂e∂J=2e=2(y^−y) ;又因为 e = θ T x − y e=\theta^Tx - y e=θTx−y ,所以 ∂ e ∂ θ i = x i \frac{\partial e}{\partial \theta_i}=x_i ∂θi∂e=xi 。
由此可得 ∂ J ∂ θ i = 2 e x i = 2 ( y ^ − y ) x i \frac{\partial J}{\partial \theta_i}=2ex_i=2(\hat{y}-y)x_i ∂θi∂J=2exi=2(y^−y)xi 。
线性回归中的随机梯度下降算法
线性回归情况下的参数估计更新:
- 线性模型:给出线性模型 y ^ = θ T x \hat{y} = \theta^T x y^=θTx,其中 y ^ \hat{y} y^ 是模型的预测输出, θ \theta θ 是参数向量, x x x 是输入特征向量。
- 平方误差损失函数:定义为 J ( θ ) = ∑ j = 1 m e j 2 J(\theta)=\sum_{j = 1}^{m}e_j^2 J(θ)=∑j=1mej2, m m m 是样本数量, e j e_j ej 是每个样本的误差。
- 损失函数梯度: ∇ θ J ( θ ) = ( ∂ J ∂ θ 1 , . . . , ∂ J ∂ θ n ) T = ∑ j = 1 m ( y ^ j − y j ) x j \nabla_{\theta}J(\theta)=(\frac{\partial J}{\partial \theta_1},...,\frac{\partial J}{\partial \theta_n})^T=\sum_{j = 1}^{m}(\hat{y}_j - y_j)x_j ∇θJ(θ)=(∂θ1∂J,...,∂θn∂J)T=∑j=1m(y^j−yj)xj,即损失函数对各个参数 θ i \theta_i θi 的偏导数组成的向量,其中 y ^ j \hat{y}_j y^j 是预测值, y j y_j yj 是实际值, x j x_j xj 是输入特征向量。
- 在大小为 m ′ m' m′ 的小批量数据中:通用的随机梯度下降更新公式(1)更新为线性回归中针对小批量数据的更新公式(1): θ ← θ − ϵ g ( 1 ), − − > θ ← θ − ϵ ∑ j = 1 m ′ ( y ^ j − y j ) x j ( 2 ) \theta \leftarrow \theta - \epsilon g(1),--> \ \theta \leftarrow \theta - \epsilon\sum_{j = 1}^{m'}(\hat{y}_j - y_j)x_j(2) θ←θ−ϵg(1),−−> θ←θ−ϵj=1∑m′(y^j−yj)xj(2)
使用随机梯度下降(SGD)的线性回归算法
算法描述:假设小批量大小为1的SGD回归算法:
- 初始化参数:初始化参数 θ \theta θ 和学习率 ϵ \epsilon ϵ。
- 循环:For j = 1 , 2 , . . . j = 1, 2, ... j=1,2,... 执行以下操作:
- 模型预测:使用当前参数估计 θ \theta θ 进行模型预测, y ^ j = θ T x j \hat{y}_j = \theta^T x_j y^j=θTxj。
- 估计损失函数梯度:使用一小批量数据估计损失函数梯度, g = ( y ^ j − y j ) x j g = (\hat{y}_j - y_j)x_j g=(y^j−yj)xj。
- 更新参数估计:更新参数估计 θ ← θ − ϵ g \theta \leftarrow \theta - \epsilon g θ←θ−ϵg。
- 循环结束:End for。
Matlab示例代码
% loop over all training samples
for j = 1:maxIter
% model prediction
yhat = theta'*X(:,j);
% estimate gradient of loss function
g = (yhat-y(j))*X(:,j);
% SGD update rule
theta = theta - epsilon*g;
end
Python示例代码
# loop over all training samples
for j in range(maxIter):
# model prediction
yhat = np.dot(np.transpose(theta), x[:,j])
# estimate gradient of loss function
g = (yhat - y[j]) * x[:,j]
g = g[..., None] # force column vector
# SGD update rule
theta = theta - epsilon*g
回归问题中随机梯度下降(SGD)的示例
Matlab代码示例
%% define data
% define linear function to model with additive noise
x = [-5:0.1:5]; % input data
m = length(x); % number of data samples
v = 2*randn(1,m); % additive Gaussian noise
y = 2*x + 3 + v; % output data
X = [ones(1,m); x]; % construct the regression matrix
r = randi([1 m],1,m); % set of random indices
%% estimate model parameters using (SGD)
% initialise SGD algorithm
theta = zeros(2,1); % initial parameters
epsilon = 0.01; % learning rate
% loop over all training samples once (single epoch)
maxIter = 100;
for j = 1:maxIter
% model prediction using a single data point
yhat = theta'*X(:,r(j));
% estimate gradient of loss function
g = (yhat-y(r(j)))*X(:,r(j));
% SGD update rule
theta = theta - epsilon*g;
end
figure; plot(x,y,x,theta'*X) % plot results
分类(Classification)
分类问题中的数据
这张图片介绍了分类问题中的数据相关内容。
左上部分
在多分类问题中,输出数据是离散的。
数据集表示为 D = { ( x j , y j ) : 1 ≤ j ≤ m } \mathcal{D}=\{(x_j,y_j):1\leq j\leq m\} D={(xj,yj):1≤j≤m} ,其中 ( x j , y j ) (x_j,y_j) (xj,yj) 是数据对, x j x_j xj 是输入, y j y_j yj 是输出。
- 输入: x j x_j xj 是实值向量, x j ∈ R n x_j\in\mathbb{R}^n xj∈Rn 。
- 输出: y j y_j yj 是整数类标签, y j ∈ { 0 , 1 , … , K − 1 } y_j\in\{0,1,\ldots,K - 1\} yj∈{0,1,…,K−1} , K K K 是类别数。
对于类别数据,实际会使用独热编码(one - hot encoding),即每个类别用一个0或1表示: y j = ( 0 , … , 0 , 1 , 0 , … , 0 ) T y_j=(0,\ldots,0,1,0,\ldots,0)^T yj=(0,…,0,1,0,…,0)T ,其中只有一个位置为1,对应所属类别,其余位置为0,分别表示各个类别的概率。
如下是一个分类示例:数据样本数量: m = 15 m = 15 m=15 ,类别数量: K = 3 K = 3 K=3 ,分别为鸟类(birds)、猫类(cats)、狗类(dogs) 。则对应的独热编码示例:鸟类编码为 y j = ( 1 , 0 , 0 ) y_j=(1,0,0) yj=(1,0,0) 、猫类编码为 y j = ( 0 , 1 , 0 ) y_j=(0,1,0) yj=(0,1,0) 、狗类编码为 y j = ( 0 , 0 , 1 ) y_j=(0,0,1) yj=(0,0,1) 。
了用于多分类问题的Softmax模型
分类模型通常包含一个线性函数,其后接一个Softmax函数,用于将输出归一化到0到1的范围。
- 线性多分类模型: y ^ i = p ( Y = i ∣ x ; θ ) = exp ( θ i T x ) ∑ k = 1 K exp ( θ k T x ) \hat{y}_i = p(Y = i|x;\theta)=\frac{\exp(\theta_i^T x)}{\sum_{k = 1}^{K}\exp(\theta_k^T x)} y^i=p(Y=i∣x;θ)=∑k=1Kexp(θkTx)exp(θiTx)
其中 i = 0 , … , K − 1 i = 0, \ldots, K - 1 i=0,…,K−1 .
该公式表示在给定输入 x x x 和参数 θ \theta θ 的情况下,样本属于类别 i i i 的概率 y ^ i \hat{y}_i y^i 。 K K K 是类别总数, θ i \theta_i θi 是与类别 i i i 相关的参数向量。
简单网络图:(是对回归问题中的线性模型那里的扩充)输入 x x x(图中是一张狗的图片示例)先经过每个类别 i i i 的线性模型 θ i T x \theta_i^T x θiTx 得到 z ^ i \hat{z}_i z^i ,然后进入Softmax函数(如下),最终输出 y ^ i \hat{y}_i y^i 。 exp ( θ i T x ) ∑ k = 1 K exp ( θ k T x ) \frac{\exp(\theta_i^T x)}{\sum_{k = 1}^{K}\exp(\theta_k^T x)} ∑k=1Kexp(θkTx)exp(θiTx)
- Softmax函数的作用:下方通过一个柱状图说明Softmax函数将输出归一化到0 - 1的范围,类似于概率,并且所有输出的总和为1。图中展示了三个类别(bird、dog、cat)对应的输出值。
在神经网络中,Softmax 通常作为输出层的激活函数,主要用于处理多分类问题。
多分类问题中的损失函数
在多分类问题中,将使用类别交叉熵(categorical cross - entropy)损失函数。
给出类别交叉熵损失函数的公式: J ( θ ) = − ∑ j = 1 m ∑ k = 1 K y j , k log y ^ j , k J(\theta)=-\sum_{j = 1}^{m}\sum_{k = 1}^{K}y_{j,k}\log\hat{y}_{j,k} J(θ)=−j=1∑mk=1∑Kyj,klogy^j,k 其中, m m m 是样本数量, K K K 是类别数量; y j , k y_{j,k} yj,k 是样本 j j j 属于类别 k k k 的真实标签(取值为 0 或 1,采用独热编码), y ^ j , k \hat{y}_{j,k} y^j,k 是样本 j j j 属于类别 k k k 的预测概率。记住:类别标签 y j , k y_{j,k} yj,k 为 0 或 1。
损失函数梯度公式
损失函数梯度公式为: ∇ θ k J ( θ ) = ( ∂ J ∂ θ k 1 , ⋯ , ∂ J ∂ θ k n ) T = ∑ j = 1 m ( y ^ j , k − y j , k ) x j \nabla_{\theta_k}J(\theta)=(\frac{\partial J}{\partial \theta_{k1}},\cdots,\frac{\partial J}{\partial \theta_{kn}})^T=\sum_{j = 1}^{m}(\hat{y}_{j,k}-y_{j,k})x_j ∇θkJ(θ)=(∂θk1∂J,⋯,∂θkn∂J)T=j=1∑m(y^j,k−yj,k)xj 其中, θ k \theta_k θk 是与类别 k k k 相关的参数向量, x j x_j xj 是样本 j j j 的输入特征向量。
注意分类损失梯度和回归损失梯度之间的相似性!!!
相似点
- 形式结构:多分类问题中类别交叉熵损失函数的梯度 ∇ θ k J ( θ ) = ∑ j = 1 m ( y ^ j , k − y j , k ) x j \nabla_{\theta_k}J(\theta)=\sum_{j = 1}^{m}(\hat{y}_{j,k}-y_{j,k})x_j ∇θkJ(θ)=∑j=1m(y^j,k−yj,k)xj ,与回归问题中平方误差损失函数的梯度(如前文提到的 ∇ θ J ( θ ) = ∑ j = 1 m ( y ^ j − y j ) x j \nabla_{\theta}J(\theta)=\sum_{j = 1}^{m}(\hat{y}_j - y_j)x_j ∇θJ(θ)=∑j=1m(y^j−yj)xj )在形式上有相似性,都是预测值与真实值的某种差值(分类中是概率差值,回归中是数值差值 )和输入特征向量 x j x_j xj 的乘积的累加形式。这种相似性反映了在两种不同任务中,更新模型参数时都考虑了预测值和真实值之间的差异以及输入特征的影响。
- 优化目的:二者都是为了在模型训练过程中,通过梯度下降等优化算法来调整模型参数 θ \theta θ 。其核心目标都是让模型的预测结果尽可能接近真实结果,从而提升模型的性能。例如,在回归中通过不断调整参数使得预测的连续值更接近真实值,在分类中则是让预测的类别概率更符合真实的类别标签。
不同点
- 损失函数基础不同:分类损失函数基于交叉熵,如多分类使用的类别交叉熵损失函数 J ( θ ) = − ∑ j = 1 m ∑ k = 1 K y j , k log y ^ j , k J(\theta)=-\sum_{j = 1}^{m}\sum_{k = 1}^{K}y_{j,k}\log\hat{y}_{j,k} J(θ)=−∑j=1m∑k=1Kyj,klogy^j,k ,它衡量的是预测概率分布与真实标签(独热编码形式 )的概率分布之间的差异。而回归损失函数常见的有均方误差(MSE) J ( θ ) = ∑ j = 1 m e j 2 = ∑ j = 1 m ( y ^ j − y j ) 2 J(\theta)=\sum_{j = 1}^{m}e_j^2=\sum_{j = 1}^{m}(\hat{y}_j - y_j)^2 J(θ)=∑j=1mej2=∑j=1m(y^j−yj)2 ,主要衡量的是预测的连续数值与真实连续数值之间的距离。
- 处理的数据类型和任务不同:分类损失梯度针对的是分类问题,输出是离散的类别标签(通常经过独热编码处理 ),目的是最小化预测类别概率与真实类别标签之间的差距,以正确分类样本。回归损失梯度针对的是回归问题,输出是连续的数值,旨在最小化预测值与真实值之间的距离,实现对连续数值的准确预测。
- 梯度含义细节不同:分类损失梯度中的 y ^ j , k \hat{y}_{j,k} y^j,k 是样本 j j j 属于类别 k k k 的预测概率, y j , k y_{j,k} yj,k 是样本 j j j 属于类别 k k k 的真实标签(0 或 1 ),梯度反映的是预测概率和真实标签在类别维度上的差异对参数的影响。回归损失梯度中的 y ^ j \hat{y}_j y^j 是样本 j j j 的预测连续值, y j y_j yj 是样本 j j j 的真实连续值,梯度体现的是预测值和真实值在数值大小上的差异对参数的作用 。
使用随机梯度下降(SGD)进行多分类的算法
算法描述:小批量大小为1的SGD多分类算法:
- 初始化参数:初始化参数 θ \theta θ 和学习率 ϵ \epsilon ϵ。
- 外层循环:对于 j = 1 , 2 , . . . j = 1, 2, ... j=1,2,... 执行以下操作:
- 内层循环:对于 k = 1 , . . . , K k = 1, ..., K k=1,...,K( K K K 为类别数)执行以下操作:
- 模型预测:使用当前参数估计 θ \theta θ 进行模型预测, y ^ k , j = exp ( θ k T x j ) ∑ n = 1 K exp ( θ n T x j ) \hat{y}_{k,j}=\frac{\exp(\theta_k^T x_j)}{\sum_{n = 1}^{K}\exp(\theta_n^T x_j)} y^k,j=∑n=1Kexp(θnTxj)exp(θkTxj) ,这是Softmax函数的形式,计算样本 j j j 属于类别 k k k 的预测概率。
- 估计损失函数梯度:使用一小批量数据估计损失函数梯度, g k = ( y ^ k , j − y k , j ) x j g_k = (\hat{y}_{k,j} - y_{k,j})x_j gk=(y^k,j−yk,j)xj ,其中 y k , j y_{k,j} yk,j 是样本 j j j 属于类别 k k k 的真实标签。
- 内层循环结束:End for。
- 更新参数估计:更新参数估计 θ ← θ − ϵ g \theta \leftarrow \theta - \epsilon g θ←θ−ϵg 。
- 内层循环:对于 k = 1 , . . . , K k = 1, ..., K k=1,...,K( K K K 为类别数)执行以下操作:
- 外层循环结束:End for。
Matlab示例代码
% estimate model parameters using SGD
for j = 1:maxIter
% calculate loss gradient for each class function
g = [];
for k = 1:K
% extract class label for current iteration
y = Y(k,j);
% softmax prediction (probability of class k)
yhat = exp(theta(k,:)*X(:,r(j)))./sum(exp(theta*X(:,r(j))));
% estimate loss function gradient from single data point
g(k,:) = (yhat - y)*X(:,r(j))';
end
% SGD update rule
theta = theta - epsilon*g;
end
Python示例代码:
# estimate model parameters using SGD
for j in range(m):
# initialise loss function gradient
g = np.zeros((K,n+1))
# calculate loss gradient for each class function
for k in range(K):
# extract class label for current iteration
y = Y[k,j]
# softmax prediction (probability of class k)
yhat = ( np.exp(np.dot(theta[k,:], x[:,j])) /
sum(np.exp(np.dot(theta, x[:,j]))) )
# estimate loss function gradient
g[k,:] = (yhat - y) * np.transpose(x[:,j])
# SGD update rule
theta = theta - epsilon * g
多分类问题中随机梯度下降(SGD)的示例
下面的示例说明了随机梯度下降(SGD)在分类问题中的应用。
红色圆圈、绿色方块和蓝色十字分别代表 3 个类别。背景的颜色区域表示模型的决策边界。
右侧有两个损失图,“Training Data Loss” 图展示了训练数据的损失随着迭代次数的变化趋势,随着迭代次数增加,损失逐渐下降。“Validation Data Loss” 图展示了验证数据的损失变化情况,同样随着迭代次数增加,损失呈下降趋势。x 轴为迭代次数(Iteration),y 轴为损失值(Loss)。
Matlab代码实现
% prepare input-output data
load fisheriris
m = size(meas,1); x1raw = meas(1:m,1); x2raw = meas(1:m,2);
x1 = (x1raw-mean(x1raw))./std(x1raw); % standardise
x2 = (x2raw-mean(x2raw))./std(x2raw); % standardise
X = [ones(1,m); x1'; x2']; % feature matrix
n = size(X,1); % no. of features
targets = grp2idx(species(1:m)); % labels to integers
Y = double((targets==1:3))'; % one hot encode
K = size(Y,1); % number of classes
% initialise SGD algorithm
theta = 0.01*rand(K,n); % initialise parameters
epsilon = 0.1; % learning rate
maxIter = 70; % number of training iterations
% estimate model parameters using SGD
for j = 1:maxIter
% calculate loss gradient for each class function
g = [];
for k = 1:K
% extract class label for current iteration
y = Y(k,r(j));
% softmax prediction (probability of class k)
yhat = exp(theta(k,:)*X(:,r(j)))./sum(exp(theta*X(:,r(j))));
% estimate loss function gradient from single data point
g(k,:) = (yhat - y)*X(:,r(j))';
end
% SGD update rule
theta = theta - epsilon*g;
end
在实际的编码过程中,有许多现成的深度学习工具,例如:Matlab 里的Deep Learning Toolbox、Python 中的 Keras-Tensorflow
TensorFlow:是 Google 开源的深度学习框架,采用数据流图进行数值计算,支持 CPU、GPU、移动设备等多种平台。它具有高度灵活性、真正可移植性、自动求微分、性能最优化等优势,广泛应用于图像识别、语音识别、自然语言处理等多个领域,支持卷积神经网络(CNN)、循环神经网络(RNN)等多种深度学习算法,并提供了丰富的 API 用于构建、训练和评估深度学习模型。
与最大似然的联系(Connection to maximum likelihood)
在机器学习中,通常从统计估计的角度思考,即最大化似然函数等同于最小化负对数似然函数。
- 似然函数 l ( θ ) = p ( y 1 , … , y m ∣ x 1 , … , x m ; θ ) = ∏ j = 1 m p ( y j ∣ x j ; θ ) l(\theta)=p(y_1, \ldots, y_m|x_1, \ldots, x_m; \theta)=\prod_{j = 1}^{m}p(y_j|x_j; \theta) l(θ)=p(y1,…,ym∣x1,…,xm;θ)=j=1∏mp(yj∣xj;θ) 该公式表示在给定参数 θ \theta θ 和输入数据 x 1 , … , x m x_1, \ldots, x_m x1,…,xm 的情况下,输出数据 y 1 , … , y m y_1, \ldots, y_m y1,…,ym 出现的概率。它是所有单个样本条件概率的乘积。
- 负对数似然损失函数 J ( θ ) = − ∑ j = 1 m log p ( y j ∣ x j ; θ ) J(\theta)=-\sum_{j = 1}^{m}\log p(y_j|x_j; \theta) J(θ)=−j=1∑mlogp(yj∣xj;θ) 它是对似然函数取对数后再取负得到的,将乘积运算转换为求和运算,便于计算和优化。
通过红色箭头表明最大化似然函数(找到似然函数曲线的最大值)和最小化负对数似然损失函数(找到负对数似然损失函数曲线的最小值)是等价的,在机器学习中,常通过最小化负对数似然损失函数来估计模型的参数 θ \theta θ 。
补充概念
- 似然函数基础:似然函数是一种关于统计模型中的参数的函数,用于描述已知样本数据的情况下,不同参数值的可能性。它衡量了在给定参数 θ \theta θ 时,观测数据出现的概率。
- 高斯似然性定义:高斯似然性是在假设数据服从正态分布(也叫高斯分布)的前提下构建的似然函数。对于一组独立同分布的样本 y 1 , y 2 , … , y m y_1, y_2, \ldots, y_m y1,y2,…,ym ,在给定输入 x 1 , x 2 , … , x m x_1, x_2, \ldots, x_m x1,x2,…,xm 和参数 θ \theta θ 的情况下,如果假设每个样本 y j y_j yj 都服从均值为 θ T x j \theta^T x_j θTxj 、方差为 σ 2 \sigma^2 σ2 的正态分布,即 y j ∼ N ( θ T x j , σ 2 ) y_j \sim N(\theta^T x_j, \sigma^2) yj∼N(θTxj,σ2) ,那么单个样本的概率密度函数为 p ( y j ∣ x j ; θ ) = 1 σ 2 π exp ( − 1 2 σ 2 ( y j − θ T x j ) 2 ) p(y_j|x_j; \theta)=\frac{1}{\sigma\sqrt{2\pi}}\exp(-\frac{1}{2\sigma^2}(y_j - \theta^T x_j)^2) p(yj∣xj;θ)=σ2π1exp(−2σ21(yj−θTxj)2) 。此时,似然函数 l ( θ ) l(\theta) l(θ) 就是所有样本概率密度函数的乘积,即 l ( θ ) = ∏ j = 1 m p ( y j ∣ x j ; θ ) l(\theta)=\prod_{j = 1}^{m}p(y_j|x_j; \theta) l(θ)=∏j=1mp(yj∣xj;θ) ,这个似然函数就被称为高斯似然函数,体现了在正态分布假设下参数 θ \theta θ 与样本数据之间的关系。
回归问题中最大化高斯似然
在高斯似然情况下,最大化似然函数等同于最小化平方误差和。明通过最大化高斯似然来估计模型参数,与最小化平方误差损失函数的效果是一致的。
假设回归问题中的数据具有正态(高斯)似然性。 下图展示了高斯似然函数 p ( y j ∣ x j ; θ ) p(y_j|x_j; \theta) p(yj∣xj;θ) 的图像, x x x 轴表示取值范围, y y y 轴表示概率密度。图像呈现出典型的高斯分布形状,中间高两边低。
回归问题中负对数似然损失函数详细推导如下:
-
假设数据分布:在回归问题中,通常假设目标变量 y j y_j yj 围绕预测值 θ T x j \theta^T x_j θTxj 服从均值为 θ T x j \theta^T x_j θTxj 、方差为 σ 2 \sigma^2 σ2 的正态分布(高斯分布),其概率密度函数为:
p ( y j ∣ x j ; θ ) = 1 σ 2 π exp ( − 1 2 σ 2 ( y j − θ T x j ) 2 ) p(y_j|x_j; \theta)=\frac{1}{\sigma\sqrt{2\pi}}\exp\left(-\frac{1}{2\sigma^2}(y_j - \theta^T x_j)^2\right) p(yj∣xj;θ)=σ2π1exp(−2σ21(yj−θTxj)2)
这里 θ \theta θ 是模型参数向量, x j x_j xj 是输入特征向量, y j y_j yj 是对应的真实输出值。 -
构建似然函数:对于 m m m 个独立的样本点 ( x 1 , y 1 ) , ( x 2 , y 2 ) , ⋯ , ( x m , y m ) (x_1, y_1), (x_2, y_2), \cdots, (x_m, y_m) (x1,y1),(x2,y2),⋯,(xm,ym) ,似然函数 l ( θ ) l(\theta) l(θ) 是所有样本点概率密度函数的乘积,即:
l ( θ ) = ∏ j = 1 m p ( y j ∣ x j ; θ ) = ∏ j = 1 m 1 σ 2 π exp ( − 1 2 σ 2 ( y j − θ T x j ) 2 ) l(\theta)=\prod_{j = 1}^{m}p(y_j|x_j; \theta)=\prod_{j = 1}^{m}\frac{1}{\sigma\sqrt{2\pi}}\exp\left(-\frac{1}{2\sigma^2}(y_j - \theta^T x_j)^2\right) l(θ)=j=1∏mp(yj∣xj;θ)=j=1∏mσ2π1exp(−2σ21(yj−θTxj)2) -
取对数转换:为了便于计算和处理乘积形式,对似然函数取自然对数,得到对数似然函数 ln l ( θ ) \ln l(\theta) lnl(θ) :
ln l ( θ ) = ln ( ∏ j = 1 m 1 σ 2 π exp ( − 1 2 σ 2 ( y j − θ T x j ) 2 ) ) = ∑ j = 1 m ln ( 1 σ 2 π exp ( − 1 2 σ 2 ( y j − θ T x j ) 2 ) ) = ∑ j = 1 m ( ln 1 σ 2 π − 1 2 σ 2 ( y j − θ T x j ) 2 ) \begin{align*} \ln l(\theta)&=\ln\left(\prod_{j = 1}^{m}\frac{1}{\sigma\sqrt{2\pi}}\exp\left(-\frac{1}{2\sigma^2}(y_j - \theta^T x_j)^2\right)\right)\\ &=\sum_{j = 1}^{m}\ln\left(\frac{1}{\sigma\sqrt{2\pi}}\exp\left(-\frac{1}{2\sigma^2}(y_j - \theta^T x_j)^2\right)\right)\\ &=\sum_{j = 1}^{m}\left(\ln\frac{1}{\sigma\sqrt{2\pi}}-\frac{1}{2\sigma^2}(y_j - \theta^T x_j)^2\right) \end{align*} lnl(θ)=ln(j=1∏mσ2π1exp(−2σ21(yj−θTxj)2))=j=1∑mln(σ2π1exp(−2σ21(yj−θTxj)2))=j=1∑m(lnσ2π1−2σ21(yj−θTxj)2)
其中, ln 1 σ 2 π \ln\frac{1}{\sigma\sqrt{2\pi}} lnσ2π1 是与 θ \theta θ 无关的常数项。 -
构建负对数似然损失函数:为了将最大化对数似然函数转化为最小化问题,取对数似然函数的负值,得到负对数似然损失函数 J ( θ ) J(\theta) J(θ) :
J ( θ ) = − ln l ( θ ) = − ∑ j = 1 m ( ln 1 σ 2 π − 1 2 σ 2 ( y j − θ T x j ) 2 ) = ∑ j = 1 m ( 1 2 σ 2 ( y j − θ T x j ) 2 − ln 1 σ 2 π ) \begin{align*} J(\theta)&=-\ln l(\theta)\\ &=-\sum_{j = 1}^{m}\left(\ln\frac{1}{\sigma\sqrt{2\pi}}-\frac{1}{2\sigma^2}(y_j - \theta^T x_j)^2\right)\\ &=\sum_{j = 1}^{m}\left(\frac{1}{2\sigma^2}(y_j - \theta^T x_j)^2-\ln\frac{1}{\sigma\sqrt{2\pi}}\right) \end{align*} J(θ)=−lnl(θ)=−j=1∑m(lnσ2π1−2σ21(yj−θTxj)2)=j=1∑m(2σ21(yj−θTxj)2−lnσ2π1)
由于常数项 − ln 1 σ 2 π -\ln\frac{1}{\sigma\sqrt{2\pi}} −lnσ2π1 对模型参数 θ \theta θ 的优化没有影响(在求导时常数项导数为 0 ),通常可以忽略,所以最终负对数似然损失函数简化为:
J ( θ ) = 1 2 σ 2 ∑ j = 1 m ( y j − θ T x j ) 2 J(\theta)=\frac{1}{2\sigma^2}\sum_{j = 1}^{m}(y_j - \theta^T x_j)^2 J(θ)=2σ21j=1∑m(yj−θTxj)2
如果令 σ 2 = 1 \sigma^2 = 1 σ2=1 (在一些简化情况下可以这样假设),则 J ( θ ) = ∑ j = 1 m ( y j − θ T x j ) 2 J(\theta)=\sum_{j = 1}^{m}(y_j - \theta^T x_j)^2 J(θ)=∑j=1m(yj−θTxj)2 ,这就是常见的均方误差(MSE)损失函数形式。
多分类问题中的最大化似然函数
在类别似然情况下,最大化似然函数等同于最小化类别交叉熵。在多分类问题中,通过最大化类别似然来估计模型参数,与最小化类别交叉熵损失函数的效果是一致的。
在多分类问题中,对于 p ( y j ∣ x j ; θ ) p(y_j|x_j; \theta) p(yj∣xj;θ) 假设其具有多项式(类别)似然性。
多分类问题中负对数似然损失函数详细推导
-
假设数据分布:在多分类问题中,假设数据服从多项式分布(Multinoulli distribution ,也叫类别分布)。对于每个样本 j j j ,其属于类别 k k k 的概率为 y ^ j , k \hat{y}_{j,k} y^j,k ,其中 ∑ k = 1 K y ^ j , k = 1 \sum_{k = 1}^{K}\hat{y}_{j,k}=1 ∑k=1Ky^j,k=1 , K K K 是类别总数。样本 j j j 的真实类别标签采用独热编码(one - hot encoding),即如果样本 j j j 属于类别 k k k ,则 y j , k = 1 y_{j,k}=1 yj,k=1 ,否则 y j , k = 0 y_{j,k}=0 yj,k=0 。
-
构建似然函数:对于 m m m 个样本,似然函数 l ( θ ) l(\theta) l(θ) 为:
l ( θ ) = ∏ j = 1 m p ( y j ∣ x j ; θ ) = ∏ j = 1 m ∏ k = 1 K y ^ j , k y j , k l(\theta)=\prod_{j = 1}^{m}p(y_j|x_j; \theta)=\prod_{j = 1}^{m}\prod_{k = 1}^{K}\hat{y}_{j,k}^{y_{j,k}} l(θ)=j=1∏mp(yj∣xj;θ)=j=1∏mk=1∏Ky^j,kyj,k
这里的 y ^ j , k y j , k \hat{y}_{j,k}^{y_{j,k}} y^j,kyj,k 形式是因为当 y j , k = 0 y_{j,k}=0 yj,k=0 时,该项为 1 ,不影响乘积结果;当 y j , k = 1 y_{j,k}=1 yj,k=1 时,该项就是 y ^ j , k \hat{y}_{j,k} y^j,k ,即样本 j j j 属于类别 k k k 的预测概率。 -
取对数转换:对似然函数取自然对数,得到对数似然函数 ln l ( θ ) \ln l(\theta) lnl(θ) :
ln l ( θ ) = ln ( ∏ j = 1 m ∏ k = 1 K y ^ j , k y j , k ) = ∑ j = 1 m ∑ k = 1 K y j , k ln y ^ j , k \begin{align*} \ln l(\theta)&=\ln\left(\prod_{j = 1}^{m}\prod_{k = 1}^{K}\hat{y}_{j,k}^{y_{j,k}}\right)\\ &=\sum_{j = 1}^{m}\sum_{k = 1}^{K}y_{j,k}\ln\hat{y}_{j,k} \end{align*} lnl(θ)=ln(j=1∏mk=1∏Ky^j,kyj,k)=j=1∑mk=1∑Kyj,klny^j,k -
构建负对数似然损失函数:取对数似然函数的负值,得到负对数似然损失函数 J ( θ ) J(\theta) J(θ) :
J ( θ ) = − ln l ( θ ) = − ∑ j = 1 m ∑ k = 1 K y j , k ln y ^ j , k J(\theta)=-\ln l(\theta)=-\sum_{j = 1}^{m}\sum_{k = 1}^{K}y_{j,k}\ln\hat{y}_{j,k} J(θ)=−lnl(θ)=−j=1∑mk=1∑Kyj,klny^j,k
这就是多分类问题中的负对数似然损失函数,它也被称为类别交叉熵(categorical cross - entropy)损失函数。
总结
这张图片是关于机器学习内容的总结,主要涵盖了机器学习的关键要素以及在深度学习中涉及的相关类型。
标题部分
-
机器学习的关键要素:指出机器学习基于四个关键要素:
- 数据(Data):是机器学习的基础,为模型提供学习的信息。
- 模型(Model):用于对数据进行处理和预测,不同的任务会使用不同类型的模型。
- 损失函数(Loss function):衡量模型预测结果与真实结果之间的差异,用于评估模型的性能,并作为优化的目标。
- 参数估计算法(Parameter estimation algorithm):用于调整模型的参数,以最小化损失函数,提高模型的准确性。
-
深度学习中涉及的要素类型:提到已经涵盖了深度学习中会使用的四种类型的要素:
- 回归和分类的数据(Data for regression & classification):介绍了回归问题和分类问题中数据的特点和形式,如回归问题处理连续值数据,分类问题处理离散的类别标签数据。
- 成为深度学习输出层的线性/Softmax模型(Linear/softmax models that become output layers in deep learning):线性模型常用于回归任务的输出,Softmax模型则常用于多分类任务的输出层,将模型的输出转换为概率分布。
- 最大似然损失函数(Maximum likelihood loss functions):包括基于高斯似然的回归损失函数和基于多项式似然的多分类损失函数,通过最大化似然函数或最小化负对数似然损失函数来估计模型参数。
- 使用随机梯度下降的参数估计(Parameter estimation with stochastic gradient descent):随机梯度下降是一种常用的参数估计算法,通过迭代地更新模型参数,以最小化损失函数。在每次迭代中,它使用一个或一小批样本计算梯度并更新参数。