机器学习笔记

学习Andrew Ng的机器学习教程,做个笔记。

初识机器学习

人工智能的核心是机器学习,机器学习的本质是算法

机器学习是指,如果一个程序可以在任务T上,随经验E的增加,效果P也随之增加,则这个程序可以从经验中学习。

训练:

  • Step1:设计一个模型(函数集合)
  • Step2:设计一个衡量模型好坏的标准(Cost Function)
  • Step3:找出函数集合中拟合最好的那个函数

测试
测试模型的好坏

机器学习分类

监督学习
使用标记过的训练集,主要用于回归和分类问题。

无监督学习
使用无标记的训练集,解决模式识别中的各种问题,典型的例子是聚类。

半监督学习
半监督学习是监督学习和无监督学习相结合的一种学习方法,使用大量未标记数据和少量标记数据进行模式识别,例如图片识别。

强化学习
强化学习又称再励学习、评价学习,强化学习对机器产生的动作的好坏进行评价,而不告诉机器如何产生正确的动作,通过不断的训练最终产生满意的模型,例如Alpha Go Zero。

迁移学习
迁移学习是指一种学习对另一种学习产生影响,已有的知识会对新的学习产生影响。

深度学习
深度学习用的主要算法是机器学习的人工神经网络(更强大),可以和以上多种学习形式结合使用。


单变量线性回归

模型表示
:代表训练集中实例的数量
:代表特征/输入变量
:代表目标变量/输出变量
(,):代表训练集中的实例
((),()):代表第 个观察实例
ℎ:代表学习算法的解决方案或函数,也称为假设(hypothesis)

单变量线性回归模型可表示为:ℎ()=0+1,只含有一个特征/输入变量。

代价函数
参数0,1该如何选择?
参数的不同决定了模型的准确度,模型预测的值与训练集实际值之间的差距就是建模误差。
目标:找到一组参数,使得建模误差最小。

对于大多数线性回归模型而言,均方误差都可以用来描述建模误差,因此代价函数可表示为:

梯度下降
为了得到代价函数 (0,1) 的最小值,可以使用梯度下降算法来求解。

梯度下降的基本思想:

  • 随机选择一组参数的组合(0,1,......,)作为初始值,并计算代价函数
  • 寻找下一个能让代价函数下降最多的参数组合
  • 重复上一步骤直至找到一个局部最小值

梯度下降存在的问题:
选择不同的初始值可能会找到不同的局部最小值,无法保证找到的局部最小值就是全局最小值。

如何寻找下一个让代价函数下降最多的参数组合?
  • 对各参数分别求偏微分(即斜率)
  • 将各偏微分值乘以得到各维度上的下降步长(为学习率)
  • 对各维度参数,同时分别减去各维度下降步长,得到下一个参数组合
  • 循环直至确定参数组合(局部最小值),此时各维度偏微分值等于0

对于学习率:

  • 如果太小,则下降步长太小,计算量大
  • 如果太大,则下降步长太大,可能出现无法收敛的情况

线性回归中的梯度下降
将梯度下降算法运用到线性回归的代价函数上,对0,1分别求偏微分,得到


将该微分项代入梯度下降算法中,迭代得到最终的参数0,1。

该算法又被称为批量梯度下降算法,原因是每一次计算下降步长时,都会使用这一批所有的训练集数据(求和操作)。


多变量线性回归

多变量/多特征线性回归是对单变量线性回归的一个推广。

假设多变量的模型中特征为 (1,2,...,), 代表特征的数量

模型可表示为:

代价函数可表示为:

其中,()是一个向量[1,2 ... ],表示训练集中的第个训练实例(其包含个特征值)。

同样,利用梯度下降算法求解使得代价函数最小的参数组合[0,1,2 ... ]

特征缩放
在面对多维特征问题的时候,应该要保证这些特征都具有相近的尺寸,这样可以让梯度下降算法收敛更快。
方法一:=(−)/,其中是特征值,是平均值,是标准差。
方法二:min-man标准化:=(−min)/(max-min)。

学习率
学习率过小,收敛太慢;学习率过大,可能无法收敛。
学习率尝试:=0.01,0.03,0.1,0.3,1,3,10


多项式回归

多项式回归模型可表示为:

如果令:
那么:多项式回归模型可以转化为多特征线性回归模型。
注意:如果采用多项式回归模型的话,在梯度下降算法前,特征缩放很有必要。


正规方程

对于某些线性回归问题,除了梯度下降算法外,正规方程法也许更好。

正规方程法是通过求解下面的方程来找出参数,使得代价函数最小:
假设训练集特征矩阵为(包含了0=1),训练集结果为向量 ,求解上述方程,得到模型参数:


逻辑回归

在线性回归模型中,预测的值是连续的。
在二元分类问题中,预测的值是0和1(离散值),此时使用逻辑回归模型。
逻辑回归模型的输出永远在0-1之间(可看成是对应离散值的概率)。
逻辑回归是分类算法。

逻辑回归模型

其中, 是特征值, 是权重值,() 是逻辑函数(激活函数)。

对于逻辑回归的代价函数,如果仍然使用均方误差(如线性回归)作为代价函数,由于激活函数sigmoid的存在,代价函数是非凸的,这会导致梯度下降法无法使用(存在多个极值点)。因此考虑使用其它函数作为逻辑回归的代价函数。

对于二元分类,假设模型的结果是样本类别为1的概率,则两种类别的概率分别为:

写成一个式子可表示为:

其含义表示:对于某一组参数,某一组样本(x,y)的概率结果。

现在的目的是希望:调整参数,使所有样本的概率乘积最大,利用最大似然函数:

为方便计算,对最大似然函数取对数(log函数单调增,不影响似然函数单调性):

对上式取反并求平均,则逻辑回归的代价函数可定义为(凸函数):

对代价函数求微分,得到梯度下降参数迭代:

线性回归与逻辑回归对比
线性回归:

其中:

逻辑回归:

其中:

线性回归和逻辑回归的参数迭代公式表述一样,但是区别在于模型函数ℎ()


多元分类

逻辑回归一般用于二元分类问题,现将其扩展到多元分类问题上。

分类思想:

  1. 首先选取一种类型作为1,其他类型均看成0,此时可以利用逻辑回归处理这个二元分类问题,得到一个分类器。
  2. 再选取另一种类型作为1,除该类型外的均看成0,利用逻辑回归得到该类型的分类器,循环处理每一种类型。
  3. 对于一个新的输入值,依次运行各类型分类器得到各类型概率,选择最大的那一种类型作为输出。

正则化

处理过拟合问题的方法:

  1. 丢弃一些无用的特征项,可以手工筛选或使用一些模型选择的算法(PCA)帮忙。
  2. 正则化。保留所有特征项,但是减小参数的大小。

正则化线性回归
代价函数表示为:

其中加入了惩罚因子:

该惩罚因子用于惩罚参数, 称为正则化参数。(一般不对 0 进行惩罚)

通过调整,可以改变参数的大小。
当变大时,为使代价函数最小,所有参数(不包括 0)会变小,此时可以缓解过拟合现象。

正则化逻辑回归
代价函数表示为:

和正则化线性回归类似,都是加入了惩罚因子用于减小参数(不包括 0)。


浅层神经网络

对于线性回归和逻辑回归问题,当特征项太多时,计算量会非常大,此时需要使用神经网络。

模型描述
神经网络是许多逻辑单元按照不同层级组织起来的网络,每一层的输出是下一层的输入。下图是一个简单的两层神经网络模型(Hidden Layer + Output Layer):

其中,上标[l]表示第l层;下标i表示该层中的第i个节点。
输入层是第0层,隐藏层是第1层,输出层是第2层。

神经网络模型的描述如下图:

左边是隐藏层中某一逻辑节点的模型(逻辑回归模型)。
NN的每个逻辑节点都相当于一个逻辑回归(线性回归+激活函数),上层节点的输出作为后一层节点的输入。
每一层每个节点都有各自的权重(weight)和偏差(bias)。

对于某一组训练数据(x(i),y(i)),NN的隐藏层(第一层)完整表述为:

假设训练数据有m组,如果用for循环处理,效率非常低,因此将m组训练数据向量化处理:

其中X是3*m维数组,A是4*m维数组。

激活函数
目前NN使用的激活函数有:sigmoidtanhReLULeaky ReLU。如下所示:

选择激活函数的建议:

  1. 除了二元分类的输出层可以选择sigmoid,除此之外的所有情况都不要选用sigmoid。
  2. tanh在所有场合中都比sigmoid更优越。
  3. 最常用的默认激活函数是ReLU。
  4. Leaky ReLU使用较少。

这几种激活函数的导数为:

  • sigmoid:a = 1/(1+exp(-z)),da/dz = a(1-a)
  • tanh:a = (exp(z)-exp(-z))/(exp(z)+exp(-z)),da/dz = 1-a2
  • ReLU:a = max(0,z),da/dz = 0(z<0) | 1(z>=0)
  • Leaky ReLU:a = max(0.01z,z),da/dz = 0.01(z<0) | 1(z>=0)

梯度下降
以一层隐藏层的NN为例。梯度下降算法可表述为:

其中,w表示权重,b表示偏差,n表示节点数,上标[l]表示第l层。
为简化书写,将 dJ/dw[l] 表示为 dw[l],dJ/db[l] 表示为 db[l]

直观理解反向传播
对于逻辑回归的梯度下降法可表示如下,可利用反向传播过程计算参数的导数

NN的梯度下降表示如下:

对于NN而言,每个神经元上都是一个逻辑回归模型,每一层相当于一个矩阵化的逻辑回归模型,因此一个NN相当于多层逻辑回归的堆叠。

具体推导
前向传播(m组训练集向量化后)描述如下:

各元素维度如下:

利用反向传播计算导数:

  1. 代价函数表示为:J,用于衡量误差。

  2. 求出输出层代价函数关于参数的偏微分:
  1. 根据前向传播公式,可以得到:
  1. 将上式表示为第l层形式,于是可得到第l层代价函数关于参数的偏微分:

注:公式中*在Python中也为*,表示矩阵对应位置元素相乘;其它均为线性代数的矩阵乘法,Python中用numpy.dot()计算。

  1. 由上面的公式可知,第 l 层的相关导数依赖于第 l+1 层的导数,因此可依次求出第L,L-1,L-2 ...... 层的相关导数,直至计算到输入层。

  2. 计算出各层相关参数的导数后,就可根据梯度下降法训练出最终神经网络模型了。

有篇文章写得很好:
https://mattmazur.com/2015/03/17/a-step-by-step-backpropagation-example/
https://github.com/mattm/simple-neural-network

参数随机初始化
对于NN,权重W的初始化必须使用随机数,不能使用全零数组;偏差b可以初始化为全零数组。
如果激活函数是sigmoid / tanh,初始值应尽可能小(接近0),此时斜率更大,梯度下降快。


深层神经网络

深层神经网络是对浅层神经网络的扩展,在浅层神经网络的基础上增加了隐藏层。

模型描述
深层神经网络的模型(前向传播)可描述为:

左边是单个训练数据的模型描述,W[l]和dW[l]维度是(n[l],n[l-1]),b[l]和db[l]维度是(n[l],1),z[l]和a[l]维度是(n[l],1)。
右边是对m个训练数据向量化处理后模型描述,W[l]、dW[l]、b[l]、db[l]的维度不变,Z[l]和A[l]维度是(n[l],m)。

深度神经网络块的搭建

对于某一层神经网络,工作流程如下:

具体可表述为:

  1. 对于第l层,参数为W[l],b[l]
  2. 前向传播:输入a[l-1],计算并缓存z[l],计算输出a[l]
  3. 反向传播:输入da[l]和缓存的z[l],计算输出da[l-1]、dW[l]、db[l]

左边是单一数据集的前向传播描述,右边是m个数据集向量化的前向传播描述。

左边是单一数据集的反向传播描述,右边是m个数据集向量化的反向传播描述。

整体的流程如下:

超参数
在计算神经网络时,除了模型中使用的参数W,b之外,还会有许多其他参数(例如:学习率、隐藏层数、逻辑节点数等),而这些参数会影响W,b的取值,称这些参数为超参数。

对这些超参数的调试是重要且需要经验的。


你可能感兴趣的:(机器学习笔记)