Machine Learning - 李宏毅 学习笔记 (2)

Gradient Descent的原理可以理解为:函数图像上某个点到该函数最小值的距离是正比一次微分(一阶导),反比于它的二次微分。所以 The Best Step = |一阶微分| / 二阶微分

AdaGrad就是利用了这个原理,用之前微分值的RMS近似二次微分值.(因为如果再计算二阶微分会增加很多时间成本)

Tip 2:Stochastic Gradient Descent 随机梯度下降

之前的Gradient Descent:Loss function = Σ(i误差)²

Stochastic GD:Loss function = (K误差)² - 随机选取一个exampleK(随机选取小批量样本)

虽然每一步不一定走正确,但是耗时短,迭代次数多,总时间成本短。

Tip 3:Feature Scaling 特征缩放

各特征取值变化较大,导致不同特征的权重系数变化受影响

特征缩放 - 特征归一化:取值到同一个范围上

常见做法:(特征值 - 平均值) / 标准差

梯度下降理论基础

损失函数用泰勒展开式进行简化后(考虑一阶导足够)最后的式子就是梯度下降式子:前提是估算精度足够精确 - 也就是学习率足够小来保证

梯度下降的限制就是之前所说的三点挑战 - ≈0 / 鞍点 / 局部最小

第七章:分类 Classification

分类问题不能将结果化为单一数值化(如class1-1,class2-2...),如果这样做则表明不同类之间有明显的联系,实际上可能并没有。

概率与分类

Generative Model 生成模型

生成一个x,可以计算某个x出现的概率,知道了x的分布,就可以自己产生X

P(x) = P(x|C1)P(C1) + P(x|C2)P(C2)

Prior probability 先验概率

分类概率 P(C1|x) = P(x|C1)P(C1) / (P(x|C1)P(C1)+P(x|C2)P(C2)) - 全概率公式

Gaussian Distribution 高斯分布

P(x|C1)就算x未在C1中出现,也不能说概率为0,其概率值满足正比于高斯分布Gaussian Distribution - fμ,Σ(x)

满足C1数据集的高斯分布不止一个,对应的(μ,Σ)也不止一个,所以用 Maximum Likelihood 最大似然估计去拟合出最大可能性的高斯分布fμ,Σ(x) - L(μ,Σ)max

模型优化

通常而言,如果每个类别都用不同的高斯分布,会导致协方差矩阵参数过多,容易过拟合 - 所有class都用同一个高斯分布 L(μ1,μ2,Σ),得到的边界是线性边界

概率模型 - 建模三部曲

Step 1:function set P(Ci|x) - 概率分布模型

Step 2:Goodness of function

(μ,Σ) - 计算跟dataset假设满足的分布相关

高斯分布

二分类常假设符合 Bernoulli distribution 伯努利分布

假设所有类别独立产生,则这种分类称为 - Naive Bayes Classifier 朴素贝叶斯分类器:概率生成模型+先验概率

the licklihood - L(μ,Σ) 最大可能性

Step 3:Find the best:easy

Posteriori Probability 后验概率

先验概率:P(C1|x) = P(x|C1)P(C1) / (P(x|C1)P(C1)+P(x|C2)P(C2))

P(C1|x) = P(x|C1)P(C1) / (P(x|C1)P(C1)+P(x|C2)P(C2)) = 1 / (1 + P(x|C2)P(C2) / P(x|C1)P(C1)) = 1 / (1 + exp(-z)) = σ(z) 其中 z =ln[ P(x|C1)P(C1) / P(x|C2)P(C2) ]

σ(z) - Sigmoid函数

N1=P(C1),N2=P(C2)

代入P(x|Ci),结论:z = w(μ1,μ2)·x+b(μ1,μ2,Σ,N1,N2) - 过程略

最后得到的z是一个线性的,说明了当共享协方差矩阵的时,为什么分界线是线性的。 - σ(z)让边界非线性

第八章:逻辑回归 Logistic Regression 步骤

Step 1:Function set - 后验概率

z = Σwixi+b - 向量

f(x) = Pw,b(C1|x) = σ(z)

Step 2:Goodness of function 定义损失函数

Ci类可能性 L(w,b) = ∏f(xi) - 每个样本求积,是Ci类则f(xi),不是Ci类则(1-f(xi))

损失函数变换:最大化L(w,b) - 最小化 -lnL(w,b)

Loss function = -lnL(w,b) =Σ - [ ylnf(xi) + (1-y)ln(1-f(xi)) ]

实际上是两个伯努利分布(0-1分布,两点分布)的 Cross Entropy(交叉熵)

两点分布:

p(x=1)=y - p(x=0)=1-y

q(x=1)=f(x) - q(x=0)=1-f(x)

Cross Entropy:H(p,q) = -Σp(x)ln(q(x) - 交叉熵代表的含义是这两个分布有多接近,所以直观上理解就是希望这两个伯努利分布越接近越好

Step 3:find the best function

参数更新还是用Gradient Descent.

wnew = wold - η·Σ-(y-f(xi))xi

学习率η后部分直观上看就是真正的目标 y与我们的function差距有多大。

损失函数为什么用交叉熵而不用线性模型的平方误差:

因为当f(x)距离y很远的时候,平方误差斜率很小,收敛很慢;而交叉熵斜率很大,收敛很快,效果非常好。

Discriminative 判别模型 vs Generative 生成模型

生成模型 vs. 判别模型

之前用高斯分布描述后验概率得到的L(w,b) - Lossfunction称为 Generative 生成方法。

Step 2对L(w,b) 做了取负取对数得到的-lnL(w,b) - Loss function称为Discriminative 判别方法

如果是概率生成模型,后续方法就是按上述计算出μ1,μ2,协方差矩阵的逆再得到w,b

如果是逻辑回归,后续方法就是用梯度下降迭代收敛得到w,b

两者最终得到的w,b是不一样的

在数据量少的情况下,Discriminative < Generative - 语音识别就是用的先验概率

Discriminative看训练集来计算 - Generative看分布,数据量少时有脑补能力(先验)

多类别分类 Multi-class

zi = wixi+bi

softmax函数

计算每个类别的ezi, 并且将这个值除以Σez作为输出概率yi,最大的yi就是所属类别

softmax - 估计后验概率

为什么softmax用来作为后验概率

假设分类高斯分布且共用一个协方差矩阵可得到softmax

Maximum Entropy 最大熵也可得到softmax

二项式的最大熵解等价于二项式指数形式(sigmoid)的最大似然,多项式分布的最大熵等价于多项式分布指数形式(softmax)的最大似然

为什么用sigmoid函数,因为指数簇分布最大熵的特性的必然性。

Limitation ofLogistic Regression

逻辑回归在二分类中决策边界是一条直线,有时候无法正确分类

解决方法:

Feature Transformation 特征转换

比如降维

特征转换后再用逻辑回归

级联逻辑回归模型

用多个逻辑回归连接一起做成级联进行特征转换,最后再用一个逻辑回归分类

这种结构就是 Neural Network - 神经网络,每一个单元称为 Neuron - 神经元

第九章 深度学习简介

步骤

神经网络

模型评估

选择最优函数

Step 1:神经网络

Fully Connect Feedforward Network FCN

Input Layer:1 Hidden Layer:N Output Layer:1

Fully Connect:每两层之间各神经元都有连接

Feedforward:前馈,数据信息往前传递

激活函数:sigmoid(权重w* 输入+偏移量b)= 输出 - 现在很少用sigmoid作为激活函数了

每一层的输出作为下一层的输入

本质:中间的隐藏层进行特征转换(黑箱操作)

深度学习中网络机构尤为重要,决定了功能集

比如Layer数量和Neuron数量

Step 2:模型评估

每一层的Loss function

一般采取 Cross Entropy 交叉熵进行损失计算,越小越好

Total Loss = Σ每一层的Loss function 迭代参数使其最小化

Step 3:选择最优函数

随机初始值再迭代参数 - Gradient descent 梯度下降

计算 dL/dw 的梯度微分项,一般的方法就是用 Backpropagation 反向传播计算。

反向传播 Backpropagation - BP

dL/dw = dL/dz * dz/dw - 根据链式法则梯度进行拆分

dL/dz:Backward pass部分,从该层的的Output向前计算得到

dz/dw:Forward pass部分,从该层的Input向后计算得到

Forward pass = dz/dw 就是输入的xi

Backward pass = dL/dz 就是计算激活函数的偏导

z\':a=σ(z)输入后一层输出的第一行z - z\'\':输入后一层输出的第二行z

z\'=w1a+b1 - z\'\'=w2a+b2

dL/dz = da/dz * dL/da
= σ(z)‘ * [ dz\'/da * dL/dz\'+dz\'\'/da * dL/dz\'\' ] ......

一直链式法则分解下去,直至到最后的输出:y1=z\',y2=z\'\',都是常数值了

dL/dz\' = σ(z\')\' - dL/dz\'\' = σ(z\'\')\'

实际计算从最后面一步一步往前计算出所有的Backward pass - 顾名思义反向传播,计算量就跟Forward pass的计算量一样

加上反向传播的训练过程就是:

从前往后Input - Output,中间存储产生的σ(z)\' 值

再从后往前bp,知道本层的σ(z)\' +下一层的σ(z)\'

则可以得到梯度微分项,进行梯度下降迭代参数。

第十章 “hello world”of deep learning

Keras - tensorflow的后台API,很容易学习和使用,灵活性也有一些

Step 1:定义模型

创建模型:Sequential() 顺序模型,由多个网络层线性堆叠

模型添加层:model.add()

全连接层 Fully Connect Layer - Dense()

卷积层 convolution layer - Con2d()

Keras1.0 激活函数 Activation() - softplus softsign sigmoid relu tanh linear hard-sigmoid softmax / Keras2.0 activation参数

输入维度 Input_dim参数 - 只需要在第一次输入填,如 20 * 20

Keras1.0 输出维度 Output_dim参数 - 输出维度 / Keras2.0 神经元 units参数

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwsszd.html