青翼

CSDN 地址 GitHub 地址
文章 分类

机器学习 quick access

2024-11-08

机器学习quick access

 

什么是机器学习

计算机程序从经验E中学习解决某一任务T,进行某一性能度量P,通过P测定在T上的表现,因经验E而提高

 

监督学习:包含了正确答案的数据集

classification problem

regression(回归) problem (regression 意思是设法预测连续值的属性)

无监督学习:没有label的数据集

交给机器一个数据结构,自动分析

聚类问题(eg 新闻,降噪)

 

 

模型描述

数据集

(x,y)标识一个训练数据,用(xi,yi)标识第i个训练数据

 

假设函数(Hypothesis)

hθ(x)=θ0+θ1x

θ称为模型参数

 

代价函数

j(θ0,θ1)=12nx1xn(hθ(x(i))y(i))2

我们需要尽量减少M的值,x1xn指样本容量 ,乘以12n是为了抵消求导以及n个求和过程,实际最终得到模型参数应该一样

 

 

 

 

梯度下降算法(Batch Gradient Descent)

θj:=θjαθjj(θ0,θ1)

不断更新θjα称为学习率用来控制梯度下降的时候跨出多大的步子,在这里由于越接近局部最优解时斜率越小,所以每次步长会自动减小,直到

这里θ0θ1需要同时更新

tmp0:=θ0αθ0j(θ0,θ1)tmp1:=θ1αθ1j(θ0,θ1)θ0:=tmp0θ1:=tmp1

逐步寻找局部最低点,从而得到代价函数的其中一个局部最优解(不一定是最值)

每一步下降都遍历了整个训练集的样本

 

 

 


线性回归的梯度下降(Gradient Descent)

θjj(θ0,θ1)=θj12mi=1m(θ0+θ1x(i)y(i))2

凸函数只有全局最优解,没有局部最优解,只要使用线性回归算法就会找到全局最优解

 

当只有二维的时候:

θ0:=θ0α1mi=1m(hθ(x(i))y(i))θ1:=θ1α1mi=1m(hθ(x(i))y(i))x(i)

θ1后面的x(i)是求偏导时的对h(θ0,θ1)θ1求偏导出现的

 

总结线性回归算法

θj:=θjα1mi=1m(hθ(x(i))y(i))xj(i)

注意:约定x0(i)=1

 

 

 

特征缩放

当数据集数据差距太大时,梯度下降可能不会直接指向圆心下降,而是震荡摆动逐步逼近圆心,这个时候可能会花很久时间

这个时候使用特征缩放,例如将大数据那一个特征,整体除以2000

同时还可以对于同一个特征值整体加减乘除,使他们标准化,这样能大大提升我们梯度下降的效率

 

学习率选取

绘制不同学习率下的j(θ)/α的函数图像,如果函数不收敛则减小α,之后根据图选择使j(θ)快速下降的一种α

 

多项式回归

具体参考泰勒展开,其中多项式也可以含有根号等,只有合理的模型,没有最好的模型

 

 

 


正规方程(Normal Equation)

 

examples: m=4

 SizeNumber of bedroomNumber of floorsAge of homePrice
x_0x_1x_2x_3x_4y
121045145460
114163240232
115343230315
18522136178

 

将数据集合成矩阵以及向量

X=[12104514511416324011534323018522136]      y=[460232315178]

则当X为满秩时可以得到

θ=(XTX)1XTy

用此方法不需要对于特征进行缩放

 

比较来说,梯度下降需要选择合适的学习率α因此需要多次运行绘制曲线找到最佳学习率,而正规方程只需要计算一次,但是正规方程不适合于大维数矩阵,因为矩阵维数规模过大,无法求逆O(n3)

特征个数少于一万通常用正规方程,反之梯度下降

 

 


分类

logistic回归算法

hθ(x)=g(θTx)

得到的是y=1时的概率

激活函数(Sigmoid function)

g(z)=11+ez

决策界限

画出一条线(可由泰勒展开)将所有样本分类成两部分,之后根据激活函数将假设函数的结果大于0或小于0拟合成0或1

 

分类问题代价函数

Cost(hθ(x),y)={log(hθ(x))if  y=1log(1hθ(x))if  y=0

将cost函数合并成一个函数,不再分y的情况去讨论

Cost(hθ(x),y)=ylog(hθ(x))(1y)log(1hθ(x))

So there‘s the Logistic regression cost function:

J(θ)=1m[i=1my(i)log(hθ(x(i)))(1y(i))log(1hθ(x(i)))]

多元分类问题

通过建立多个分类器,每个分类器将其中一个元素和其他元素进行分类,得到是该元素的概率,多个分类器协同工作得到分别是每个元素的概率最后选择概率最大的输出,也是多层感知机的原理

 

 

 


过拟合(overfitting)问题

过度拟合:当假设函数存在太多模型参数时,我们没有很多的数据对假设函数进行约束,从而得到了不好的假设函数

1、舍弃一些特征量

2、正则化,减少特征量数量级θ的数量级以弱化特征对模型的影响

 

 

正则化

因为过拟合的存在,所以我们可以使用正则化去弱化特征对模型的影响,但是我们并不知道需要去弱化哪一个或哪几个,因此选择全部弱化

正则化后代价函数

j(θ)=12m[i=1m(θ0+θ1x(i)y(i))2+λj=1nθj2]

λ 是一个较大的数,但是不能过大,否则所有参数都会接近0,变成欠拟合的结果

这里实际上没有对 θ0 进行正则化,实际上加入与否不影响

 

正则化后的梯度下降式

θj:=θjα[1mi=1m(hθ(x(i))y(i))xj(i)+λmθj] θj:=θj(1αλm)α1mi=1m(hθ(x(i))y(i))xj(i)

正则化后正规方程的式

θ=(XTX+λ[0111])1XTy

 

神经网络

即通过多层,第一层、隐藏层、最终层,每一层都是一组假设函数将上一层的特征量提取,最后通过最终层输出得到假设

 

 

多元分类

在最后一层建立一个多元的向量层,每一个元素判断是否是其中一个元

 

多元分类问题代价函数

j(Θ)=1m[i=1mk=1Kyk(i)log(hΘ(xx(i)))k+(1yk(i))log(1hΘ(x(i)))k]+λ2ml=1L1i=1slj=1sl+1Θjil

代价函数最小化算法

反向传播算法

引入 δj(l)=zj(l)cost(i) “error” of node j in layer l .

eg : 四层的神经网络

δj(4)=aj(4)yjthen the nextδj(3)=(Θ(3))Tδ(4)g(z(3))δj(2)=(Θ(2))Tδ(3)g(z(2))

 

 

 


pytorch

 

2 预备知识

2.3.2 Tenser

Tensor是这个包的核心类,如果将其属性.requires_grad设置为True,它将开始追踪(track)在其上的所有操作(这样就可以利用链式法则进行梯度传播了)。完成计算后,可以调用.backward()来完成所有梯度计算。此Tensor的梯度将累积到.grad属性中。

Function是另外一个很重要的类。TensorFunction互相结合就可以构建一个记录有整个计算过程的有向无环图(DAG)。每个Tensor都有一个.grad_fn属性,该属性即创建该TensorFunction, 就是说该Tensor是不是通过某些运算得到的,若是,则grad_fn返回一个与这些运算相关的对象,否则是None。

 

 

2.3.3 梯度

因为out是一个标量,所以调用backward()时不需要指定求导变量:

注:torch.mean()返回是矩阵的平均值

 

数学上,如果有一个函数值和自变量都为向量的函数 y=f(x), 那么 y 关于 x 的梯度就是一个雅可比矩阵(Jacobian matrix):

J=(y1x1y1xnymx1ymxn)

torch.autograd这个包就是用来计算一些雅克比矩阵的乘积的。例如,如果 v 是一个标量函数的 l=g(y)的梯度:

v=(ly1  lym)

那么根据链式法则我们有 l 关于 x 的雅克比矩阵就为:

vJ=(ly1  lym)(y1x1y1xnymx1ymxn)=(lx1  lxn)

grad在反向传播过程中是累加的(accumulated),这意味着每一次运行反向传播,梯度都会累加之前的梯度,所以一般在反向传播之前需把梯度清零。

求梯度的时候是对于前一层每一个求所以结果存储在前一层对应项中

 

来看一些实际例子

现在 z 不是一个标量,所以在调用backward时需要传入一个和z同形的权重向量进行加权求和得到一个标量。

 

再来看看中断梯度追踪的例子:

可以看到,上面的y2是没有grad_fn而且y2.requires_grad=False的,而y3是有grad_fn的。

 

此外,如果我们想要修改tensor的数值,但是又不希望被autograd记录(即不会影响反向传播),那么我么可以对tensor.data进行操作。

 

 

3 深度学习基础

3.1 线性回归

优化算法

当模型和损失函数形式较为简单时,上面的误差最小化问题的解可以直接用公式表达出来。这类解叫作解析解(analytical solution)。本节使用的线性回归和平方误差刚好属于这个范畴。然而,大多数深度学习模型并没有解析解,只能通过优化算法有限次迭代模型参数来尽可能降低损失函数的值。这类解叫作数值解(numerical solution)。

在求数值解的优化算法中,小批量随机梯度下降(mini-batch stochastic gradient descent)在深度学习中被广泛使用。它的算法很简单:先选取一组模型参数的初始值,如随机选取;接下来对参数进行多次迭代,使每次迭代都可能降低损失函数的值。在每次迭代中,先随机均匀采样一个由固定数目训练数据样本所组成的小批量(mini-batch)B,然后求小批量中数据样本的平均损失有关模型参数的导数(梯度),最后用此结果与预先设定的一个正数的乘积作为模型参数在本次迭代的减小量。

 

在训练本节讨论的线性回归模型的过程中,模型的每个参数将作如下迭代:

w1w1η|B|iB(i)(w1,w2,b)w1=w1η|B|iBx1(i)(x1(i)w1+x2(i)w2+by(i)),w2w2η|B|iB(i)(w1,w2,b)w2=w2η|B|iBx2(i)(x1(i)w1+x2(i)w2+by(i)),bbη|B|iB(i)(w1,w2,b)b=bη|B|iB(x1(i)w1+x2(i)w2+by(i)).

在上式中,|B|代表每个小批量中的样本个数(批量大小,batch size),η 称作学习率(learning rate)并取正数。需要强调的是,这里的批量大小和学习率的值是人为设定的,并不是通过模型训练学出的,因此叫作超参数(hyperparameter)。我们通常所说的“调参”指的正是调节超参数,例如通过反复试错来找到超参数合适的值。在少数情况下,超参数也可以通过模型训练学出。本书对此类情况不做讨论。

 

线性回归的表示方法

我们已经阐述了线性回归的模型表达式、训练和预测。下面我们解释线性回归与神经网络的联系,以及线性回归的矢量计算表达式。

 

神经网络图

在图所示的神经网络中,输入分别为 x1x2,因此输入层的输入个数为2。输入个数也叫特征数特征向量维度。图中网络的输出为 o,输出层的输出个数为1。需要注意的是,我们直接将图中神经网络的输出 o 作为线性回归的输出,即 y^=o。由于输入层并不涉及计算,按照惯例,图所示的神经网络的层数为1。所以,线性回归是一个单层神经网络。输出层中负责计算 o 的单元又叫神经元。在线性回归中,o 的计算依赖于 x1x2。也就是说,输出层中的神经元和输入层中各个输入完全连接。因此,这里的输出层又叫全连接层(fully-connected layer)或稠密层(dense layer)。

 

矢量计算表达式

向量相加的一种方法是,将这两个向量按元素逐一做标量加法。向量相加的另一种方法是,将这两个向量直接做矢量加法。结果很明显,后者比前者更省时。因此,我们应该尽可能采用矢量计算,以提升计算效率。

 

 

3.2 线性回归的从零开始实现