学习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之间(可看成是对应离散值的概率)。
逻辑回归是分类算法。
其中, 是特征值, 是权重值,() 是逻辑函数(激活函数)。
对于逻辑回归的代价函数,如果仍然使用均方误差(如线性回归)作为代价函数,由于激活函数sigmoid的存在,代价函数是非凸的,这会导致梯度下降法无法使用(存在多个极值点)。因此考虑使用其它函数作为逻辑回归的代价函数。
对于二元分类,假设模型的结果是样本类别为1的概率,则两种类别的概率分别为:其含义表示:对于某一组参数,某一组样本(x,y)的概率结果。
现在的目的是希望:调整参数,使所有样本的概率乘积最大,利用最大似然函数:线性回归与逻辑回归对比
线性回归:
逻辑回归:
线性回归和逻辑回归的参数迭代公式表述一样,但是区别在于模型函数ℎ()
多元分类
逻辑回归一般用于二元分类问题,现将其扩展到多元分类问题上。
分类思想:
- 首先选取一种类型作为1,其他类型均看成0,此时可以利用逻辑回归处理这个二元分类问题,得到一个分类器。
- 再选取另一种类型作为1,除该类型外的均看成0,利用逻辑回归得到该类型的分类器,循环处理每一种类型。
- 对于一个新的输入值,依次运行各类型分类器得到各类型概率,选择最大的那一种类型作为输出。
正则化
处理过拟合问题的方法:
- 丢弃一些无用的特征项,可以手工筛选或使用一些模型选择的算法(PCA)帮忙。
- 正则化。保留所有特征项,但是减小参数的大小。
正则化线性回归
代价函数表示为:
该惩罚因子用于惩罚参数, 称为正则化参数。(一般不对 0 进行惩罚)
通过调整,可以改变参数的大小。
当变大时,为使代价函数最小,所有参数(不包括 0)会变小,此时可以缓解过拟合现象。
正则化逻辑回归
代价函数表示为:
和正则化线性回归类似,都是加入了惩罚因子用于减小参数(不包括 0)。
浅层神经网络
对于线性回归和逻辑回归问题,当特征项太多时,计算量会非常大,此时需要使用神经网络。
模型描述
神经网络是许多逻辑单元按照不同层级组织起来的网络,每一层的输出是下一层的输入。下图是一个简单的两层神经网络模型(Hidden Layer + Output Layer):
[l]
表示第l层;下标i
表示该层中的第i个节点。
输入层是第0层,隐藏层是第1层,输出层是第2层。 神经网络模型的描述如下图:
左边是隐藏层中某一逻辑节点的模型(逻辑回归模型)。
NN的每个逻辑节点都相当于一个逻辑回归(线性回归+激活函数),上层节点的输出作为后一层节点的输入。
每一层每个节点都有各自的权重(weight)和偏差(bias)。
其中X是3*m维数组,A是4*m维数组。
激活函数
目前NN使用的激活函数有:sigmoid
、tanh
、ReLU
、Leaky ReLU
。如下所示:
- 除了二元分类的输出层可以选择sigmoid,除此之外的所有情况都不要选用sigmoid。
- tanh在所有场合中都比sigmoid更优越。
- 最常用的默认激活函数是ReLU。
- 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为例。梯度下降算法可表述为:
[l]
表示第l层。
为简化书写,将 dJ/dw[l] 表示为 dw[l],dJ/db[l] 表示为 db[l]。
直观理解反向传播
对于逻辑回归的梯度下降法可表示如下,可利用反向传播过程计算参数的导数
对于NN而言,每个神经元上都是一个逻辑回归模型,每一层相当于一个矩阵化的逻辑回归模型,因此一个NN相当于多层逻辑回归的堆叠。
具体推导
前向传播(m组训练集向量化后)描述如下:
利用反向传播计算导数:
代价函数表示为:J,用于衡量误差。
- 求出输出层代价函数关于参数的偏微分:
- 根据前向传播公式,可以得到:
- 将上式表示为第l层形式,于是可得到第l层代价函数关于参数的偏微分:
注:公式中*
在Python中也为*
,表示矩阵对应位置元素相乘;其它均为线性代数的矩阵乘法,Python中用numpy.dot()计算。
由上面的公式可知,第 l 层的相关导数依赖于第 l+1 层的导数,因此可依次求出第L,L-1,L-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),此时斜率更大,梯度下降快。
深层神经网络
深层神经网络是对浅层神经网络的扩展,在浅层神经网络的基础上增加了隐藏层。
模型描述
深层神经网络的模型(前向传播)可描述为:
右边是对m个训练数据向量化处理后模型描述,W[l]、dW[l]、b[l]、db[l]的维度不变,Z[l]和A[l]维度是(n[l],m)。
深度神经网络块的搭建
对于某一层神经网络,工作流程如下:具体可表述为:
- 对于第l层,参数为W[l],b[l]。
- 前向传播:输入a[l-1],计算并缓存z[l],计算输出a[l]。
- 反向传播:输入da[l]和缓存的z[l],计算输出da[l-1]、dW[l]、db[l]。
左边是单一数据集的前向传播描述,右边是m个数据集向量化的前向传播描述。
左边是单一数据集的反向传播描述,右边是m个数据集向量化的反向传播描述。
整体的流程如下:超参数
在计算神经网络时,除了模型中使用的参数W,b之外,还会有许多其他参数(例如:学习率、隐藏层数、逻辑节点数等),而这些参数会影响W,b的取值,称这些参数为超参数。