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参数