美文网首页机器学习
机器学习笔记

机器学习笔记

作者: Jorvi | 来源:发表于2018-08-14 11:21 被阅读26次

    学习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的取值,称这些参数为超参数。

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

    相关文章

      网友评论

        本文标题:机器学习笔记

        本文链接:https://www.haomeiwen.com/subject/drfcpftx.html