1. 随机梯度下降为什么比梯度下降快
原始的随机梯度下降(SGD)适合于低精度的任务,而梯度下降算法适合用于高精度的任务。
如果接受一个比较低的精度(应用问题中往往不要求高精度),那么由于SGD每次只利用一个或部分样本的梯度做更新,所以前期迭代较快,导致前期一段时间内比梯度下降算法下降得多。
但是由于原始的SGD算法在目标函数强凸的情况下依旧无法做到线性收敛,所以当执行的时候足够长的时候SGD的精度会被梯度下降算法赶超,因为梯度下降算法可以在目标函数强凸的时候有线性收敛速度。
2. 人工智能一些术语总结
随着智能时代慢慢的到来,有一些基本概念都不知道真的是要落伍了,作为正在积极学习向上的青年,我想总结一份笔记,此份笔记会记录众多AI领域的术语和概念,当然,学一部分记录一部分,并且可能会夹杂着自己的一些理解,由于能力有限,有问题希望大家多多赐教。当然,由于内容太多,仅仅只是记录了中英名对照,有的加上了简单的解释,没加的后续大家有需求,我会慢慢完善~~。目录暂定以首字母的字典序排序。可以当作目录方便以后查阅~~建议收藏加点赞哈哈哈
------------------------------------------------这里是分割线--------------------------------------------------
A
准确率(accuracy)
分类模型预测准确的比例。
二分类问题中,准确率定义为:accuracy = (true positives +true negatives)/all samples
多分类问题中,准确率定义为:accuracy = correctpredictions/all samples
激活函数(activation function)
一种函数,将前一层所有神经元激活值的加权和 输入到一个非线性函数中,然后作为下一层神经元的输入,例如 ReLU 或 Sigmoid
AdaGrad
一种复杂的梯度下降算法,重新调节每个参数的梯度,高效地给每个参数一个单独的学习率。
AUC(曲线下面积)
一种考虑到所有可能的分类阈值的评估标准。ROC 曲线下面积代表分类器随机预测真正类(Ture Positives)要比假正类(False Positives)概率大的确信度。
Adversarial example(对抗样本)
Adversarial Networks(对抗网络)
Artificial General Intelligence/AGI(通用人工智能)
Attention mechanism(注意力机制)
Autoencoder(自编码器)
Automatic summarization(自动摘要)
Average gradient(平均梯度)
Average-Pooling(平均池化)
B
反向传播(Backpropagation/BP)
神经网络中完成梯度下降的重要算法。首先,在前向传播的过程中计算每个节点的输出值。然后,在反向传播的过程中计算与每个参数对应的误差的偏导数。
基线(Baseline)
被用为对比模型表现参考的简单模型。
批量(Batch)
模型训练中一个迭代(指一次梯度更新)使用的样本集。
批量大小(Batch size)
一个批量中样本的数量。例如,SGD 的批量大小为 1,而 mini-batch 的批量大小通常在 10-1000 之间。
偏置(Bias)
与原点的截距或偏移量。
二元分类器(Binary classification)
一类分类任务,输出两个互斥类别中的一个。比如垃圾邮件检测。
词袋(Bag of words/Bow)
基学习器(Base learner)
基学习算法(Base learning algorithm)
贝叶斯网络(Bayesian network)
基准(Bechmark)
信念网络(Belief network)
二项分布(Binomial distribution)
玻尔兹曼机(Boltzmann machine)
自助采样法/可重复采样/有放回采样(Bootstrap sampling)
广播(Broadcasting)
C
类别(Class)
所有同类属性的目标值作为一个标签。
分类模型(classification)
机器学习模型的一种,将数据分离为两个或多个离散类别。
收敛(convergence)
训练过程达到的某种状态,其中训练损失和验证损失在经过了确定的迭代次数后,在每一次迭代中,改变很小或完全不变。
凸函数(concex function)
一种形状大致呈字母 U 形或碗形的函数。然而,在退化情形中,凸函数的形状就像一条线。
成本(cost)
loss 的同义词。深度学习模型一般都会定义自己的loss函数。
交叉熵(cross-entropy)
多类别分类问题中对 Log 损失函数的推广。交叉熵量化两个概率分布之间的区别。
条件熵(Conditional entropy)
条件随机场(Conditional random field/CRF)
置信度(Confidence)
共轭方向(Conjugate directions)
共轭分布(Conjugate distribution)
共轭梯度(Conjugate gradient)
卷积神经网络(Convolutional neural network/CNN)
余弦相似度(Cosine similarity)
成本函数(Cost Function)
曲线拟合(Curve-fitting)
D
数据集(data set)
样本的集合
深度模型(deep model)
一种包含多个隐藏层的神经网络。深度模型依赖于其可训练的非线性性质。和宽度模型对照(widemodel)。
dropout 正则化(dropoutregularization)
训练神经网络时一种有用的正则化方法。dropout 正则化的过程是在单次梯度计算中删去一层网络中随机选取的固定数量的单元。删去的单元越多,正则化越强。
数据挖掘(Data mining)
决策树/判定树(Decisiontree)
深度神经网络(Deep neural network/DNN)
狄利克雷分布(Dirichlet distribution)
判别模型(Discriminative model)
下采样(Down sampling)
动态规划(Dynamic programming)
E
早期停止法(early stopping)
一种正则化方法,在训练损失完成下降之前停止模型训练过程。当验证数据集(validationdata set)的损失开始上升的时候,即泛化表现变差的时候,就该使用早期停止法了。
嵌入(embeddings)
一类表示为连续值特征的明确的特征。嵌入通常指将高维向量转换到低维空间中。
经验风险最小化(empirical risk minimization,ERM)
选择能使得训练数据的损失函数最小化的模型的过程。和结构风险最小化(structualrisk minimization)对照。
集成(ensemble)
多个模型预测的综合考虑。可以通过以下一种或几种方法创建一个集成方法:
设置不同的初始化;
设置不同的超参量;
设置不同的总体结构。
深度和广度模型是一种集成。
样本(example)
一个数据集的一行内容。一个样本包含了一个或多个特征,也可能是一个标签。参见标注样本(labeledexample)和无标注样本(unlabeled example)。
F
假负类(false negative,FN)
被模型错误的预测为负类的样本。例如,模型推断一封邮件为非垃圾邮件(负类),但实际上这封邮件是垃圾邮件。
假正类(false positive,FP)
被模型错误的预测为正类的样本。例如,模型推断一封邮件为垃圾邮件(正类),但实际上这封邮件是非垃圾邮件。
假正类率(false positive rate,FP rate)
ROC 曲线(ROC curve)中的 x 轴。FP 率的定义是:假正率=假正类数/(假正类数+真负类数)
特征工程(feature engineering)
在训练模型的时候,挖掘对模型效果有利的特征。
前馈神经网络(Feedforward Neural Networks/FNN )
G
泛化(generalization)
指模型利用新的没见过的数据而不是用于训练的数据作出正确的预测的能力。
广义线性模型(generalized linear model)
最小二乘回归模型的推广/泛化,基于高斯噪声,相对于其它类型的模型(基于其它类型的噪声,比如泊松噪声,或类别噪声)。广义线性模型的例子包括:
logistic 回归
多分类回归
最小二乘回归
梯度(gradient)
所有变量的偏导数的向量。在机器学习中,梯度是模型函数的偏导数向量。梯度指向最陡峭的上升路线。
梯度截断(gradient clipping)
在应用梯度之前先修饰数值,梯度截断有助于确保数值稳定性,防止梯度爆炸出现。
梯度下降(gradient descent)
通过计算模型的相关参量和损失函数的梯度最小化损失函数,值取决于训练数据。梯度下降迭代地调整参量,逐渐靠近权重和偏置的最佳组合,从而最小化损失函数。
图(graph)
在 TensorFlow 中的一种计算过程展示。图中的节点表示操作。节点的连线是有指向性的,表示传递一个操作(一个张量)的结果(作为一个操作数)给另一个操作。使用 TensorBoard 能可视化计算图。
高斯核函数(Gaussian kernel function)
高斯混合模型(Gaussian Mixture Model)
高斯过程(Gaussian Process)
泛化误差(Generalization error)
生成模型(Generative Model)
遗传算法(Genetic Algorithm/GA)
吉布斯采样(Gibbs sampling)
基尼指数(Gini index)
梯度下降(Gradient Descent)
H
启发式(heuristic)
一个问题的实际的和非最优的解,但能从学习经验中获得足够多的进步。
隐藏层(hidden layer)
神经网络中位于输入层(即特征)和输出层(即预测)之间的合成层。一个神经网络包含一个或多个隐藏层。
超参数(hyperparameter)
连续训练模型的过程中可以拧动的“旋钮”。例如,相对于模型自动更新的参数,学习率(learningrate)是一个超参数。和参量对照。
硬间隔(Hard margin)
隐马尔可夫模型(Hidden Markov Model/HMM)
层次聚类(Hierarchical clustering)
假设检验(Hypothesis test)
I
独立同分布(independently and identicallydistributed,i.i.d)
从不会改变的分布中获取的数据,且获取的每个值不依赖于之前获取的值。i.i.d. 是机器学习的理想情况——一种有用但在现实世界中几乎找不到的数学构建。
推断(inference)
在机器学习中,通常指将训练模型应用到无标注样本来进行预测的过程。在统计学中,推断指在观察到的数据的基础上拟合分布参数的过程。
输入层(input layer)
神经网络的第一层(接收输入数据)。
评分者间一致性(inter-rater agreement)
用来衡量一项任务中人类评分者意见一致的指标。如果意见不一致,则任务说明可能需要改进。有时也叫标注者间信度(inter-annotator agreement)或评分者间信度(inter-raterreliability)。
增量学习(Incremental learning)
独立成分分析(Independent Component Analysis/ICA)
独立子空间分析(Independent subspace analysis)
信息熵(Information entropy)
信息增益(Information gain)
J
JS 散度(Jensen-ShannonDivergence/JSD)
K
Kernel 支持向量机(KernelSupport Vector Machines/KSVM)
一种分类算法,旨在通过将输入数据向量映射到更高维度的空间使正类和负类之间的边际最大化。例如,考虑一个输入数据集包含一百个特征的分类问题。为了使正类和负类之间的间隔最大化,KSVM 从内部将特征映射到百万维度的空间。KSVM 使用的损失函数叫作 hinge 损失。
核方法(Kernel method)
核技巧(Kernel trick)
k 折交叉验证/k 倍交叉验证(K-fold cross validation)
K - 均值聚类(K-MeansClustering)
K近邻算法(K-Nearest NeighboursAlgorithm/KNN)
知识图谱(Knowledge graph)
知识库(Knowledge base)
知识表征(Knowledge Representation)
L
L1 损失函数(L1 loss)
损失函数基于模型对标签的预测值和真实值的差的绝对值而定义。L1 损失函数比起 L2 损失函数对异常值的敏感度更小。
L1 正则化(L1regularization)
一种正则化,按照权重绝对值总和的比例进行惩罚。在依赖稀疏特征的模型中,L1 正则化帮助促使(几乎)不相关的特征的权重趋近于 0,从而从模型中移除这些特征。
L2 损失(L2 loss)
参见平方损失。
L2 正则化(L2regularization)
一种正则化,按照权重平方的总和的比例进行惩罚。L2 正则化帮助促使异常值权重更接近 0 而不趋近于 0。(可与 L1 正则化对照阅读。)L2 正则化通常改善线性模型的泛化效果。
标签(label)
在监督式学习中,样本的“答案”或“结果”。标注数据集中的每个样本包含一或多个特征和一个标签。在垃圾邮件检测数据集中,特征可能包括主题、发出者何邮件本身,而标签可能是“垃圾邮件”或“非垃圾邮件”。
标注样本(labeled example)
包含特征和标签的样本。在监督式训练中,模型从标注样本中进行学习。
学习率(learning rate)
通过梯度下降训练模型时使用的一个标量。每次迭代中,梯度下降算法使学习率乘以梯度,乘积叫作 gradient step。学习率是一个重要的超参数。
最小二乘回归(least squares regression)
通过 L2 损失最小化进行训练的线性回归模型。
线性回归(linear regression)
对输入特征的线性连接输出连续值的一种回归模型。
logistic 回归(logisticregression)
将 sigmoid 函数应用于线性预测,在分类问题中为每个可能的离散标签值生成概率的模型。尽管 logistic 回归常用于二元分类问题,但它也用于多类别分类问题(这种情况下,logistic回归叫作“多类别 logistic 回归”或“多项式 回归”。
对数损失函数(Log Loss)
二元 logistic 回归模型中使用的损失函数。
损失(Loss)
度量模型预测与标签距离的指标,它是度量一个模型有多糟糕的指标。为了确定损失值,模型必须定义损失函数。例如,线性回归模型通常使用均方差作为损失函数,而 logistic 回归模型使用对数损失函数。
隐狄利克雷分布(Latent Dirichlet Allocation/LDA)
潜在语义分析(Latent semantic analysis)
线性判别(Linear Discriminant Analysis/LDA)
长短期记忆(Long-Short Term Memory/LSTM)
M
机器学习(machine learning)
利用输入数据构建(训练)预测模型的项目或系统。该系统使用学习的模型对与训练数据相同分布的新数据进行有用的预测。机器学习还指与这些项目或系统相关的研究领域。
均方误差(Mean Squared Error/MSE)
每个样本的平均平方损失。MSE 可以通过平方损失除以样本数量来计算。
小批量(mini-batch)
在训练或推断的一个迭代中运行的整批样本的一个小的随机选择的子集。小批量的大小通常在10 到 1000 之间。在小批量数据上计算损失比在全部训练数据上计算损失要高效的多。
机器翻译(Machine translation/MT)
马尔可夫链蒙特卡罗方法(Markov Chain Monte Carlo/MCMC)
马尔可夫随机场(Markov Random Field)
多文档摘要(Multi-document summarization)
多层感知器(Multilayer Perceptron/MLP)
多层前馈神经网络(Multi-layer feedforward neuralnetworks)
N
NaN trap
训练过程中,如果模型中的一个数字变成了 NaN,则模型中的很多或所有其他数字最终都变成 NaN。NaN 是“Not aNumber”的缩写。
神经网络(neural network)
该模型从大脑中获取灵感,由多个层组成(其中至少有一个是隐藏层),每个层包含简单的连接单元或神经元,其后是非线性。
神经元(neuron)
神经网络中的节点,通常输入多个值,生成一个输出值。神经元通过将激活函数(非线性转换)应用到输入值的加权和来计算输出值。
归一化(normalization)
将值的实际区间转化为标准区间的过程,标准区间通常是-1 到+1 或 0 到 1。例如,假设某个特征的自然区间是 800 到 6000。通过减法和分割,你可以把那些值标准化到区间-1 到+1。参见缩放。
Numpy
Python 中提供高效数组运算的开源数学库。pandas 基于 numpy 构建。
Naive bayes(朴素贝叶斯)
Naive Bayes Classifier(朴素贝叶斯分类器)
Named entity recognition(命名实体识别)
Natural language generation/NLG(自然语言生成)
Natural language processing(自然语言处理)
Norm(范数)
O
目标(objective)
算法尝试优化的目标函数。
one-hot 编码(独热编码)(one-hotencoding)
一个稀疏向量,其中:一个元素设置为 1,所有其他的元素设置为 0。。
一对多(one-vs.-all)
给出一个有 N 个可能解决方案的分类问题,一对多解决方案包括 N 个独立的二元分类器——每个可能的结果都有一个二元分类器。例如,一个模型将样本分为动物、蔬菜或矿物,则一对多的解决方案将提供以下三种独立的二元分类器:
动物和非动物
蔬菜和非蔬菜
矿物和非矿物
过拟合(overfitting)
创建的模型与训练数据非常匹配,以至于模型无法对新数据进行正确的预测
Oversampling(过采样)
P
pandas
一种基于列的数据分析 API。很多机器学习框架,包括 TensorFlow,支持 pandas 数据结构作为输入。参见 pandas 文档。
参数(parameter)
机器学习系统自行训练的模型的变量。例如,权重是参数,它的值是机器学习系统通过连续的训练迭代逐渐学习到的。注意与超参数的区别。
性能(performance)
在软件工程中的传统含义:软件运行速度有多快/高效?
在机器学习中的含义:模型的准确率如何?即,模型的预测结果有多好?
困惑度(perplexity)
对模型完成任务的程度的一种度量指标。例如,假设你的任务是阅读用户在智能手机上输入的单词的头几个字母,并提供可能的完整单词列表。该任务的困惑度(perplexity,P)是为了列出包含用户实际想输入单词的列表你需要进行的猜测数量。
流程(pipeline)
机器学习算法的基础架构。管道包括收集数据、将数据放入训练数据文件中、训练一或多个模型,以及最终输出模型。
Principal component analysis/PCA(主成分分析)
Precision(查准率/准确率)
Prior knowledge(先验知识)
Q
Quasi Newton method(拟牛顿法)
R
召回率(recall)
回归模型(regression model)
一种输出持续值(通常是浮点数)的模型。而分类模型输出的是离散值。
正则化(regularization)
对模型复杂度的惩罚。正则化帮助防止过拟合。正则化包括不同种类:
L1 正则化
L2 正则化
dropout 正则化
early stopping(这不是正式的正则化方法,但可以高效限制过拟合)
正则化率(regularization rate)
一种标量级,用 lambda 来表示,指正则函数的相对重要性。从下面这个简化的损失公式可以看出正则化率的作用:
minimize(loss function + λ(regularization function))
提高正则化率能够降低过拟合,但可能会使模型准确率降低。
表征(represention)
将数据映射到有用特征的过程。
受试者工作特征曲线(receiver operatingcharacteristic/ROC Curve)
反映在不同的分类阈值上,真正类率和假正类率的比值的曲线。参见 AUC。
Recurrent Neural Network(循环神经网络)
Recursive neural network(递归神经网络)
Reinforcement learning/RL(强化学习)
Re-sampling(重采样法)
Representation learning(表征学习)
Random Forest Algorithm(随机森林算法)
S
缩放(scaling)
特征工程中常用的操作,用于控制特征值区间,使之与数据集中其他特征的区间匹配。例如,假设你想使数据集中所有的浮点特征的区间为 0 到 1。给定一个特征区间是 0 到 500,那么你可以通过将每个值除以 500,缩放特征值区间。还可参见正则化。
scikit-learn
一种流行的开源机器学习平台。网址:www.scikit-learn.org。
序列模型(sequence model)
输入具有序列依赖性的模型。例如,根据之前观看过的视频序列对下一个视频进行预测。
Sigmoid 函数(sigmoid function)
softmax
为多类别分类模型中每个可能的类提供概率的函数。概率加起来的总和是 1.0。例如,softmax 可能检测到某个图像是一只狗的概率为 0.9,是一只猫的概率为 0.08,是一匹马的概率为 0.02。(也叫作 full softmax)。
结构风险最小化(structural risk minimization/SRM)
这种算法平衡两个目标:
构建预测性最强的模型(如最低损失)。
使模型尽量保持简单(如强正则化)。
比如,在训练集上的损失最小化 + 正则化的模型函数就是结构风险最小化算法。更多信息,参见 http://www.svms.org/srm/。可与经验风险最小化对照阅读。
监督式机器学习(supervised machine learning)
利用输入数据及其对应标签来训练模型。监督式机器学习类似学生通过研究问题和对应答案进行学习。在掌握问题和答案之间的映射之后,学生就可以提供同样主题的新问题的答案了。可与非监督机器学习对照阅读。
Similarity measure(相似度度量)
Singular Value Decomposition(奇异值分解)
Soft margin(软间隔)
Soft margin maximization(软间隔最大化)
Support Vector Machine/SVM(支持向量机)
T
张量(tensor)
TensorFlow 项目的主要数据结构。张量是 N 维数据结构(N 的值很大),经常是标量、向量或矩阵。张量可以包括整数、浮点或字符串值。
Transfer learning(迁移学习)
U
无标签样本(unlabeled example)
包含特征但没有标签的样本。无标签样本是推断的输入。在半监督学习和无监督学习的训练过程中,通常使用无标签样本。
无监督机器学习(unsupervised machine learning)
训练一个模型寻找数据集(通常是无标签数据集)中的模式。无监督机器学习最常用于将数据分成几组类似的样本。无监督机器学习的另一个例子是主成分分析(principal componentanalysis,PCA)
W
Word embedding(词嵌入)
Word sense disambiguation(词义消歧)
3. 10的三次方怎么稀释梯度
这个复杂,需要了解方法。可以用到两三种方法。
十倍梯度稀释法(倍比稀释和梯度稀释):
梯度下降是寻找函数极小值的优化方法,在深度学习模型中常用于在反向传播过程中更新神经网络的权重。
梯度下降优化算法功能是什么?
梯度下降,优化算法发挥了以下三个主要方面的作用:
1、学习率成分、或
2、修正坡度成分L/W
3或2者
让我们看看下面的公式1。
方程1 :随机梯度下降中的各种量
学习率调度器vs梯度下降优化的主要区别在于,梯度下降优化是将学习率乘以梯度的函数即因子来调整学习率成分,而学习率调度器是将学习率乘以一定的常数或关于时间步的函数的因子来更新学习率。
第一种方法主要是通过将学习率(learning rate )乘以0到1之间的因子来降低学习率)例如RMSprop。 第二种方法通常使用坡度(Gradient )的滑动平均(也称为动量)而不是纯坡度来确定下降方向。 第三种方法是将Adam和AMSGrad这样的两者结合起来。
Fig.2 )各类梯度下降优化算法、其发表年和使用的核心思路。
Fig.3自上而下,展示了这些优化算法是如何从最简单的简单梯度下降(SGD )进化到Adam的各种变种的。 SGD最初分别向两个方向发展,一个是AdaGrad,主要调整学习率(learning rate )。 另一个是Momentum,主要调整梯度的构成要素。 随着进化的发展,Momentum和RMSprop一体化,“QS dch”(Adam )诞生了。 你可能会对我这样的组织方式提出异议,但我一直以来都是这样理解的。
Fig.3 )各种最优化算法的进化图(gist ) ) ) ) ) )。
符号表示
t -迭代步数
w -需要更新的权重和参数
-学习率
L/w - L (损失函数)相对于w的梯度
因为我统一了论文中出现的希腊文字和符号表示,所以可以用统一的“进化”的观点来看这些优化算法
1. 随机梯度下降(Stochastic Gradient Descend)
最原始的随机梯度下降算法主要是将当前梯度l/w乘以一个系数学习率来更新模型的权重w。
2. 动量算法(Momentum)
动量算法使用具有动量的坡度(坡度的指数滑动平均、Polyak、1964 )而不是当前坡度来更新w。 在后续的文章中,我们会发现采用指数滑动平均作为动量更新方法几乎已经成为行业标准。
另外,v初始化值为0。 通常设定为0.9。
值得注意的是,许多文章在引用Momemtum算法时都使用年轻花瓣Qian,1999的文章。 但是,该算法的原始来源是Sutskever et al。 另一方面,经典动量算法是1964年由Polyak提出的,因此上述也引用了Polyak的文章。 (谢谢James指出这一点)
3.Nesterov加速梯度下降法(NAG)
是在Polyak提出动量法后(双关: Polyak势)
头正盛),一个使用Nesterov加速梯度下降法(Sutskever et al., 2013)的类似更新方法也被实现了。此更新方法使用V,即我称之为投影梯度的指数移动平均值。
其中
且V 初始化为0。
第二个等式中的最后一项就是一个投影梯度。这个值可以通过使用先前的速度“前进一步”获得(等式4)。这意味着对于这个时间步骤t,我们必须在最终执行反向传播之前执行另一个前向传播。这是步骤:
1.使用先前的速度将当前权重w更新为投影权重w*
(等式4)
2. 使用投影权重计算前向传播
3.获得投影梯度∂L/∂w*
4.计算相应的V和w
常见的默认值:
β = 0.9
请注意,原始的Nesterov 加速梯度下降法论文( Nesterov, 1983 )并不是关于随机梯度下降,也没有明确使用梯度下降方程。因此,更合适的参考是上面提到的Sutskever等人的出版物。在2013年,它描述了NAG在随机梯度下降中的应用。(再一次,我要感谢James对HackerNews的评论中指出这一点。)
4. 根号a-+5的最小值和a的值
梯度下降是非常常用的优化算法。作为机器学习的基础知识,这是一个必须要掌握的算法。借助本文,让我们来一起详细了解一下这个算法。
前言
本文的代码可以到我的Github上获取:
https://github.com/paulQuei/gradient_descent
本文的算法示例通过Python语言实现,在实现中使用到了numpy和matplotlib。如果你不熟悉这两个工具,请自行在网上搜索教程。
关于优化
大多数学习算法都涉及某种形式的优化。优化指的是改变x以最小化或者最大化某个函数的任务。
我们通常以最小化指代大多数最优化问题。最大化可经由最小化来实现。
我们把要最小化或最大化的函数成为目标函数(objective function)或准则(criterion)。
我们通常使用一个上标*表示最小化或最大化函数的x值,记做这样:
[x^* = arg; min; f(x)]
优化本身是一个非常大的话题。如果有兴趣,可以通过《数值优化》和《运筹学》的书籍进行学习。
模型与假设函数
所有的模型都是错误的,但其中有些是有用的。– George Edward Pelham Box
模型是我们对要分析的数据的一种假设,它是为解决某个具体问题从数据中学习到的,因此它是机器学习最核心的概念。
针对一个问题,通常有大量的模型可以选择。
本文不会深入讨论这方面的内容,关于各种模型请参阅机器学习的相关书籍。本文仅以最简单的线性模型为基础来讨论梯度下降算法。
这里我们先介绍一下在监督学习(supervised learning)中常见的三个符号:
m,描述训练样本的数量
x,描述输入变量或特征
y,描述输出变量或者叫目标值
训练集会包含很多的样本,我们用 表示其中第i个样本。
x是数据样本的特征,y是其目标值。例如,在预测房价的模型中,x是房子的各种信息,例如:面积,楼层,位置等等,y是房子的价格。在图像识别的任务中,x是图形的所有像素点数据,y是图像中包含的目标对象。
我们是希望寻找一个函数,将x映射到y,这个函数要足够的好,以至于能够预测对应的y。由于历史原因,这个函数叫做假设函数(hypothesis function)。
学习的过程如下图所示。即:首先根据已有的数据(称之为训练集)训练我们的算法模型,然后根据模型的假设函数来进行新数据的预测。
线性模型(linear model)正如其名称那样:是希望通过一个直线的形式来描述模式。线性模型的假设函数如下所示:
[h_{ heta}(x) = heta_{0} + heta_{1} * x]
这个公式对于大家来说应该都是非常简单的。如果把它绘制出来,其实就是一条直线。
下图是一个具体的例子,即: 的图形:
在实际的机器学习工程中,你会拥有大量的数据。这些数据会来自于某个数据源。它们存储在csv文件中,或者以其他的形式打包。
但是本文作为演示使用,我们通过一些简单的代码自动生成了需要的数据。为了便于计算,演示的数据量也很小。
import numpy as np
max_x = 10
data_size = 10
theta_0 = 5
theta_1 = 2
def get_data:
x = np.linspace(1, max_x, data_size)
noise = np.random.normal(0, 0.2, len(x))
y = theta_0 + theta_1 * x + noise
return x, y
这段代码很简单,我们生成了x范围是 [1, 10] 整数的10条数据。对应的y是以线性模型的形式计算得到,其函数是:。现实中的数据常常受到各种因素的干扰,所以对于y我们故意加上了一些高斯噪声。因此最终的y值为比原先会有轻微的偏离。
最后我们的数据如下所示:
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [6.66, 9.11, 11.08, 12.67, 15.12, 16.76, 18.75, 21.35, 22.77, 24.56]
我们可以把这10条数据绘制出来这样就有一个直观的了解了,如下图所示:
虽然演示用的数据是我们通过公式计算得到的。但在实际的工程中,模型的参数是需要我们通过数据学习到的。所以下文我们假设我们不知道这里线性模式的两个参数是什么,而是通过算法的形式求得。
最后再跟已知的参数进行对比以验证我们的算法是否正确。
有了上面的数据,我们可以尝试画一条直线来描述我们的模型。
例如,像下面这样画一条水平的直线:
很显然,这条水平线离数据太远了,非常的不匹配。
那我们可以再画一条斜线。
我们初次画的斜线可能也不贴切,它可能像下面这样:
最后我们通过不断尝试,找到了最终最合适的那条,如下所示:
梯度下降算法的计算过程,就和这种本能式的试探是类似的,它就是不停的迭代,一步步的接近最终的结果。
代价函数
上面我们尝试了几次通过一条直线来拟合(fitting)已有的数据。
二维平面上的一条直线可以通过两个参数唯一的确定,两个参数的确定也即模型的确定。那如何描述模型与数据的拟合程度呢?答案就是代价函数。
代价函数(cost function)描述了学习到的模型与实际结果的偏差程度。以上面的三幅图为例,最后一幅图中的红线相比第一条水平的绿线,其偏离程度(代价)应该是更小的。
很显然,我们希望我们的假设函数与数据尽可能的贴近,也就是说:希望代价函数的结果尽可能的小。这就涉及到结果的优化,而梯度下降就是寻找最小值的方法之一。
对于每一个样本,假设函数会依据计算出一个估算值,我们常常用来表示。即 。
很自然的,我们会想到,通过下面这个公式来描述我们的模型与实际值的偏差程度:
[(h_ heta(x^i) - y^i)^2 = (widehat{y}^{i} - y^i)^2 = ( heta_{0} + heta_{1} * x^{i} - y^{i})^2]
请注意, 是实际数据的值, 是我们的模型的估算值。前者对应了上图中的离散点的y坐标,后者对应了离散点在直线上投影点的y坐标。
每一条数据都会存在一个偏差值,而代价函数就是对所有样本的偏差求平均值,其计算公式如下所示:
[L( heta) = frac {1}{m} sum_{i=1}^{m}(h_ heta(x^i) - y^i)^2 = frac {1}{m} sum_{i=1}^{m}( heta_{0} + heta_{1} * x^{i} - y^{i})^2]
当损失函数的结果越小,则意味着通过我们的假设函数估算出的结果与真实值越接近。这也就是为什么我们要最小化损失函数的原因。
借助上面这个公式,我们可以写一个函数来实现代价函数:
def cost_function(x, y, t0, t1):
cost_sum = 0
for i in range(len(x)):
cost_item = np.power(t0 + t1 * x[i] - y[i], 2)
cost_sum += cost_item
return cost_sum / len(x)
这个函数的代码应该不用多做解释,它就是根据上面的完成计算。
我们可以尝试选取不同的 和 组合来计算代价函数的值,然后将结果绘制出来:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
theta_0 = 5
theta_1 = 2
def draw_cost(x, y):
fig = plt.figure(figsize=(10, 8))
ax = fig.gca(projection='3d')
scatter_count = 100
radius = 1
t0_range = np.linspace(theta_0 - radius, theta_0 + radius, scatter_count)
t1_range = np.linspace(theta_1 - radius, theta_1 + radius, scatter_count)
cost = np.zeros((len(t0_range), len(t1_range)))
for a in range(len(t0_range)):
for b in range(len(t1_range)):
cost[a][b] = cost_function(x, y, t0_range[a], t1_range[b])
t0, t1 = np.meshgrid(t0_range, t1_range)
ax.set_xlabel('theta_0')
ax.set_ylabel('theta_1')
ax.plot_surface(t0, t1, cost, cmap=cm.hsv)
在这段代码中,我们对 和 各自指定了一个范围进行100次的采样,然后以不同的 组合对来计算代价函数的值。
如果我们将所有点的代价函数值绘制出来,其结果如下图所示:
从这个图形中我们可以看出,当 越接近 [5, 2]时其结果(偏差)越小。相反,离得越远,结果越大。
直观解释
从上面这幅图中我们可以看出,代价函数在不同的位置结果大小不同。
从三维的角度来看,这就和地面的高低起伏一样。最高的地方就好像是山顶。
而我们的目标就是:从任意一点作为起点,能够快速寻找到一条路径并以此到达图形最低点(代价值最小)的位置。
而梯度下降的算法过程就和我们从山顶想要快速下山的做法是一样的。
在生活中,我们很自然会想到沿着最陡峭的路往下行是下山速度最快的。如下面这幅图所示:
针对这幅图,细心的读者可能很快就会有很多的疑问,例如:
对于一个函数,怎么确定下行的方向?
每一步该往前走多远?
有没有可能停留在半山腰的平台上?
这些问题也就是本文接下来要讨论的内容。
算法描述
梯度下降算法最开始的一点就是需要确定下降的方向,即:梯度。
我们常常用 来表示梯度。
对于一个二维空间的曲线来说,梯度就是其切线的方向。如下图所示:
而对于更高维空间的函数来说,梯度由所有变量的偏导数决定。
其表达式如下所示:
[ abla f({ heta}) = ( frac{partial f({ heta})}{partial heta_1} , frac{partial f({ heta})}{partial heta_2} , ... , frac{partial f({ heta})}{partial heta_n} )]
在机器学习中,我们主要是用梯度下降算法来最小化代价函数,记做:
[ heta ^* = arg min L( heta)]
其中,L是代价函数,是参数。
梯度下降算法的主体逻辑很简单,就是沿着梯度的方向一直下降,直到参数收敛为止。
记做:
[ heta ^{k + 1}_i = heta^{k}_i - lambda abla f( heta^{k})]
这里有几点需要说明:
收敛是指函数的变化率很小。具体选择多少合适需要根据具体的项目来确定。在演示项目中我们可以选择0.01或者0.001这样的值。不同的值将影响算法的迭代次数,因为在梯度下降的最后,我们会越来越接近平坦的地方,这个时候函数的变化率也越来越小。如果选择一个很小的值,将可能导致算法迭代次数暴增。
公式中的 称作步长,也称作学习率(learning rate)。它决定了每一步往前走多远,关于这个值我们会在下文中详细讲解。你可以暂时人为它是一个类似0.01或0.001的固定值。
在具体的项目,我们不会让算法无休止的运行下去,所以通常会设置一个迭代次数的最大上限。
线性回归的梯度下降
有了上面的知识,我们可以回到线性模型代价函数的梯度下降算法实现了。
首先,根据代价函数我们可以得到梯度向量如下:
[ abla f({ heta}) = (frac{partial L( heta)}{ partial heta_{0}}, frac{ partial L( heta)}{ partial heta_{1}}) = (frac {2}{m} sum_{i=1}^{m}( heta_{0} + heta_{1} * x^{i} - y^{i}) , frac {2}{m} sum_{i=1}^{m}( heta_{0} + heta_{1} * x^{i} - y^{i}) x^{i})]
接着,将每个偏导数带入迭代的公式中,得到:
[ heta_{0} := heta_{0} - lambda frac{partial L( heta_{0})}{ partial heta_{0}} = heta_{0} - frac {2 lambda }{m} sum_{i=1}^{m}( heta_{0} + heta_{1} * x^{i} - y^{i}) heta_{1} := heta_{1} - lambda frac{partial L( heta_{1})}{ partial heta_{1}} = heta_{1} - frac {2 lambda }{m} sum_{i=1}^{m}( heta_{0} + heta_{1} * x^{i} - y^{i}) x^{i}]
由此就可以通过代码实现我们的梯度下降算法了,算法逻辑并不复杂:
learning_rate = 0.01
def gradient_descent(x, y):
t0 = 10
t1 = 10
delta = 0.001
for times in range(1000):
sum1 = 0
sum2 = 0
for i in range(len(x)):
sum1 += (t0 + t1 * x[i] - y[i])
sum2 += (t0 + t1 * x[i] - y[i]) * x[i]
t0_ = t0 - 2 * learning_rate * sum1 / len(x)
t1_ = t1 - 2 * learning_rate * sum2 / len(x)
print('Times: {}, gradient: [{}, {}]'.format(times, t0_, t1_))
if (abs(t0 - t0_) < delta and abs(t1 - t1_) < delta):
print('Gradient descent finish')
return t0_, t1_
t0 = t0_
t1 = t1_
print('Gradient descent too many times')
return t0, t1
这段代码说明如下:
我们随机选择了 都为10作为起点
设置最多迭代1000次
收敛的范围设为0.001
学习步长设为0.01
如果我们将算法迭代过程中求得的线性模式绘制出来,可以得到下面这幅动态图:
最后算法得到的结果如下:
Times: 657, gradient: [5.196562662718697, 1.952931052920264]
Times: 658, gradient: [5.195558390180733, 1.9530753071808193]
Times: 659, gradient: [5.194558335124868, 1.9532189556399233]
Times: 660, gradient: [5.193562479839619, 1.9533620008416623]
Gradient descent finish
从输出中可以看出,算法迭代了660次就收敛了。这时的结果[5.193562479839619, 1.9533620008416623],这已经比较接近目标值 [5, 2]了。如果需要更高的精度,可以将delta的值调的更小,当然,此时会需要更多的迭代次数。
高维扩展
虽然我们举的例子是二维的,但是对于更高维的情况也是类似的。同样是根据迭代的公式进行运算即可:
[ heta_{i} = heta_{i} - lambda frac {partial L( heta)}{partial heta_i} = heta_{i} - frac{2lambda}{m} sum_{i=1}^{m}(h_ heta(x^{k})-y^k)x_i^k]
这里的下标i表示第i个参数,上标k表示第k个数据。
梯度下降家族BGD
在上面的内容中我们看到,算法的每一次迭代都需要把所有样本进行遍历处理。这种做法称为之Batch Gradient Descent,简称BGD。作为演示示例只有10条数据,这是没有问题的。
但在实际的项目中,数据集的数量可能是几百万几千万条,这时候每一步迭代的计算量就会非常的大了。
于是就有了下面两个变种。
SGD
Stochastic Gradient Descent,简称SGD,这种算法是每次从样本集中仅仅选择一个样本来进行计算。很显然,这样做算法在每一步的计算量一下就少了很多。
其算法公式如下:
[ heta_{i} = heta_{i} - lambda frac {partial L( heta)}{partial heta_i} = heta_{i} - lambda(h_ heta(x^k)-y^k)x_i^k]
当然,减少算法计算量也是有代价的,那就是:算法结果会强依赖于随机取到的数据情况,这可能会导致算法的最终结果不太令人满意。
MBGD
以上两种做法其实是两个极端,一个是每次用到了所有数据,另一个是每次只用一个数据。
我们自然就会想到两者取其中的方法:每次选择一小部分数据进行迭代。这样既避免了数据集过大导致每次迭代计算量过大的问题,也避免了单个数据对算法的影响。
这种算法称之为Mini-batch Gradient Descent,简称MBGD。
其算法公式如下:
[ heta_{i} = heta_{i} - lambda frac {partial L( heta)}{partial heta_i} = heta_{i} - frac{2lambda}{m} sum_{i=a}^{a + b}(h_ heta(x^k)-y^k)x_i^k]
当然,我们可以认为SGD是Mini-batch为1的特例。
针对上面提到的算法变种,该如何选择呢?
下面是Andrew Ng给出的建议:
如果样本数量较小(例如小于等于2000),选择BGD即可。
如果样本数量很大,选择 来进行MBGD,例如:64,128,256,512。
下表是 Optimization for Deep Learning 中对三种算法的对比
方法准确性更新速度内存占用在线学习BGD好慢高否SGD好(with annealing)快低是MBGD好中等中等是
算法优化
式7是算法的基本形式,在这个基础上有很多人进行了更多的研究。接下来我们介绍几种梯度下降算法的优化方法。
Momentum
Momentum是动量的意思。这个算法的思想就是借助了动力学的模型:每次算法的迭代会使用到上一次的速度作为依据。
算法的公式如下:
[v^t = gamma v^{t - 1} + lambda abla f( heta) heta = heta - v_t]
对比式7可以看出,这个算法的主要区别就是引入了,并且,每个时刻的受前一个时刻的影响。
从形式上看,动量算法引入了变量 v 充当速度角色——它代表参数在参数空间移动的方向和速率。速度被设为负梯度的指数衰减平均。名称动量来自物理类比,根据牛顿运动定律,负梯度是移动参数空间中粒子的力。动量在物理学上定义为质量乘以速度。在动量学习算法中,我们假设是单位质量,因此速度向量 v 也可以看作是粒子的动量。
对于可以取值0,而是一个常量,设为0.9是一个比较好的选择。
下图是momentum算法的效果对比:
对原来的算法稍加修改就可以增加动量效果:
def gradient_descent_with_momentum(x, y):
t0 = 10
t1 = 10
delta = 0.001
v0 = 0
v1 = 0
gamma = 0.9
for times in range(1000):
sum1 = 0
sum2 = 0
for i in range(len(x)):
sum1 += (t0 + t1 * x[i] - y[i])
sum2 += (t0 + t1 * x[i] - y[i]) * x[i]
v0 = gamma * v0 + 2 * learning_rate * sum1 / len(x)
v1 = gamma * v1 + 2 * learning_rate * sum2 / len(x)
t0_ = t0 - v0
t1_ = t1 - v1
print('Times: {}, gradient: [{}, {}]'.format(times, t0_, t1_))
if (abs(t0 - t0_) < delta and abs(t1 - t1_) < delta):
print('Gradient descent finish')
return t0_, t1_
t0 = t0_
t1 = t1_
print('Gradient descent too many times')
return t0, t1
以下是该算法的输出:
Times: 125, gradient: [4.955453758569991, 2.000005017897775]
Times: 126, gradient: [4.955309381126545, 1.9956928964532015]
Times: 127, gradient: [4.9542964317327005, 1.9855674828684156]
Times: 128, gradient: [4.9536358220657, 1.9781180992510465]
Times: 129, gradient: [4.95412496254411, 1.9788858350530971]
Gradient descent finish
从结果可以看出,改进的算法只用了129次迭代就收敛了。速度比原来660次快了很多。
同样的,我们可以把算法计算的过程做成动态图:
对比原始的算法过程可以看出,改进算法最大的区别是:在寻找目标值时会在最终结果上下跳动,但是越往后跳动的幅度越小,这也就是动量所产生的效果。
Learning Rate 优化
至此,你可能还是好奇该如何设定学习率的值。
事实上,这个值的选取需要一定的经验或者反复尝试才能确定。
关键在于,这个值的选取不能过大也不能过小。
如果这个值过小,会导致每一次迭代的步长很小,其结果就是算法需要迭代非常多的次数。
那么,如果这个值过大会怎么样呢?其结果就是:算法可能在结果的周围来回震荡,却落不到目标的点上。下面这幅图描述了这个现象:
事实上,学习率的取值未必一定要是一个常数,关于这个值的设定有很多的研究。
下面是比较常见的一些改进算法。
AdaGrad
AdaGrad是Adaptive Gradient的简写,该算法会为每个参数设定不同的学习率。它使用历史梯度的平方和作为基础来进行计算。
其算法公式如下:
[ heta_i = heta_i - frac{lambda}{sqrt{G_t + epsilon}} abla f( heta)]
对比式7,这里的改动就在于分号下面的根号。
根号中有两个符号,第二个符号比较好理解,它就是为了避免除0而人为引入的一个很小的常数,例如可以设为:0.001。
第一个符号的表达式展开如下:
[G_t = sum_{i = 1}^{t} abla f( heta){i} abla f( heta){i}^{T}]
这个值其实是历史中每次梯度的平方的累加和。
AdaGrad算法能够在训练中自动的对learning rate进行调整,对于出现频率较低参数采用较大的学习率;相反,对于出现频率较高的参数采用较小的学习率。因此,Adagrad非常适合处理稀疏数据。
但该算法的缺点是它可能导致学习率非常小以至于算法收敛非常的慢。
关于这个算法的直观解释可以看李宏毅教授的视频课程:ML Lecture 3-1: Gradient Descent。
RMSProp
RMS是Root Mean Square的简写。RMSProp是AI教父Geoff Hinton提出的一种自适应学习率方法。AdaGrad会累加之前所有的梯度平方,而RMSProp仅仅是计算对应的平均值,因此可缓解Adagrad算法学习率下降较快的问题。
该算法的公式如下:
[E[ abla f( heta_{i})^2]^{t} = gamma E[ abla f( heta_{i})^2]^{t - 1} + (1-gamma)( abla f( heta_{i})^{t})^{2} heta_i = heta_i - frac{lambda}{sqrt{E[g^2]^{t+1} + epsilon}} abla f( heta_{i})]
类似的,是为了避免除0而引入。 是衰退参数,通常设为0.9。
这里的 是t时刻梯度平方的平均值。
Adam
Adam是Adaptive Moment Estimation的简写。它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。
Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。
该算法公式如下:
[m^{t} = eta_{1} m^{t-1} + (1-eta_{1}) abla f( heta) v^{t} = eta_{2} v^{t-1} + (1-eta_{2}) abla f( heta)^2 widehat{m}^{t} = frac{m^{t}}{1 - eta^{t}_1} widehat{v}^{t} = frac{v^{t}}{1 - eta^{t}_2} heta = heta - frac{lambda}{sqrt{widehat{v}^{t}} + epsilon}widehat{m}^{t}]
,分别是对梯度的一阶矩估计和二阶矩估计。, 是对,的校正,这样可以近似为对期望的无偏估计。
Adam算法的提出者建议 默认值为0.9,默认值为0.999,默认值为 。
在实际应用中 ,Adam较为常用,它可以比较快地得到一个预估结果。
优化小结
这里我们列举了几种优化算法。它们很难说哪种最好,不同的算法适合于不同的场景。在实际的工程中,可能需要逐个尝试一下才能确定选择哪一个,这个过程也是目前现阶段AI项目要经历的工序之一。
实际上,该方面的研究远不止于此,如果有兴趣,可以继续阅读 《Sebastian Ruder: An overview of gradient descent optimization algorithms》 这篇论文或者 Optimization for Deep Learning 这个Slides进行更多的研究。
由于篇幅所限,这里不再继续展开了。
算法限制
梯度下降算法存在一定的限制。首先,它要求函数必须是可微分的,对于不可微的函数,无法使用这种方法。
除此之外,在某些情况下,使用梯度下降算法在接近极值点的时候可能收敛速度很慢,或者产生Z字形的震荡。这一点需要通过调整学习率来回避。
另外,梯度下降还会遇到下面两类问题。
局部最小值
局部最小值(Local Minima)指的是,我们找到的最小值仅仅是一个区域内的最小值,而并非全局的。由于算法的起点是随意取的,以下面这个图形为例,我们很容易落到局部最小值的点里面。
这就是好像你从上顶往下走,你第一次走到的平台未必是山脚,它有可能只是半山腰的一个平台的而已。
算法的起点决定了算法收敛的速度以及是否会落到局部最小值上。
坏消息是,目前似乎没有特别好的方法来确定选取那个点作为起点是比较好的,这就有一点看运气的成分了。多次尝试不同的随机点或许是一个比较好的方法,这也就是为什么做算法的优化这项工作是特别消耗时间的了。
但好消息是:
对于凸函数或者凹函数来说,不存在局部极值的问题。其局部极值一定是全局极值。
最近的一些研究表明,某些局部极值并没有想象中的那么糟糕,它们已经非常的接近全局极值所带来的结果了。
鞍点
除了Local Minima,在梯度下降的过程中,还有可能遇到另外一种情况,即:鞍点(Saddle Point)。鞍点指的是我们找到点某个点确实是梯度为0,但它却不是函数的极值,它的周围既有比它小的值,也有比它大的值。这就好像马鞍一样。
如下图所示:
多类随机函数表现出以下性质:在低维空间中,局部极值很普遍。但在高维空间中,局部极值比较少见,而鞍点则很常见。
不过对于鞍点,可以通过数学方法Hessian矩阵来确定。关于这点,这里就不再展开了,有兴趣的读者可以以这里提供的几个链接继续探索。
参考资料与推荐读物
Wikipeida: Gradient descent
Sebastian Ruder: An overview of gradient descent optimization algorithms
吴恩达:机器学习
吴恩达:深度学习
Peter Flach:机器学习
李宏毅 - ML Lecture 3-1: Gradient Descent
PDF: 李宏毅 - Gradient Descent
Intro to optimization in deep learning: Gradient Descent
Intro to optimization in deep learning: Momentum, RMSProp and Adam
Stochastic Gradient Descent – Mini-batch and more
刘建平Pinard - 梯度下降(Gradient Descent)小结
多元函数的偏导数、方向导数、梯度以及微分之间的关系思考
[Machine Learning] 梯度下降法的三种形式BGD、SGD以及MBGD
5. 梯度下降法是什么
梯度下降是通过迭代搜索一个函数极小值的优化算法。使用梯度下降,寻找一个函数的局部极小值的过程起始于一个随机点,并向该函数在当前点梯度(或近似梯度)的反方向移动。梯度下降算法是一种非常经典的求极小值的算法。
比如逻辑回归可以用梯度下降进行优化,因为这两个算法的损失函数都是严格意义上的凸函数,即存在全局唯一极小值,较小的学习率和足够的迭代次数,一定可以达到最小值附近,满足精度要求是完全没有问题的。并且随着特征数目的增多,梯度下降的效率将远高于去解析标准方程的逆矩阵。
常用的梯度下降法有3种不同的形式:
(1)批量梯度下降法,简称BGD,使用所有样本,比较耗时。
(2)随机梯度下降法,简称SGD,随机选择一个样本,简单高效。
(3)小批量梯度下降法,简称MBGD,使用少量的样本,这是一个折中的办法。
机梯度下降法优点:
1、更容易跳出局部最优解。
2、具有更快的运行速度。
6. 常用激活函数比较
本文结构:
如下图,在神经元中,输入的 inputs 通过加权,求和后,还被作用了一个函数,这个函数就是激活函数 Activation Function。
如果不用激励函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合。
如果使用的话,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。
公式:
曲线:
也叫 Logistic 函数,用于隐层神经元输出
取值范围为(0,1)
它可以将一个实数映射到(0,1)的区间,可以用来做二分类。
在特征相差比较复杂或是相差不是特别大时效果比较好。
sigmoid缺点:
激活函数计算量大,反向传播求误差梯度时,求导涉及除法
反向传播时,很容易就会出现梯度消失的情况,从而无法完成深层网络的训练
下面解释为何会出现梯度消失:
反向传播算法中,要对激活函数求导,sigmoid 的导数表达式为:
sigmoid 原函数及导数图形如下:
由图可知,导数从 0 开始很快就又趋近于 0 了,易造成“梯度消失”现象
公式
曲线
也称为双切正切函数
取值范围为[-1,1]。
tanh在特征相差明显时的效果会很好,在循环过程中会不断扩大特征效果。
与 sigmoid 的区别是,tanh 是 0 均值的,因此实际应用中 tanh 会比 sigmoid 更好
Rectified Linear Unit(ReLU) - 用于隐层神经元输出
公式
曲线
输入信号 <0 时,输出都是0,>0 的情况下,输出等于输入
ReLU 的优点:
Krizhevsky et al. 发现使用 ReLU 得到的 SGD 的收敛速度会比 sigmoid/tanh 快很多
ReLU 的缺点:
训练的时候很”脆弱”,很容易就”die”了
例如,一个非常大的梯度流过一个 ReLU 神经元,更新过参数之后,这个神经元再也不会对任何数据有激活现象了,那么这个神经元的梯度就永远都会是 0.
如果 learning rate 很大,那么很有可能网络中的 40% 的神经元都”dead”了。
Softmax - 用于多分类神经网络输出
公式
举个例子来看公式的意思:
就是如果某一个 zj 大过其他 z, 那这个映射的分量就逼近于 1,其他就逼近于 0,主要应用就是多分类。
为什么要取指数,第一个原因是要模拟 max 的行为,所以要让大的更大。
第二个原因是需要一个可导的函数。
Sigmoid 和 ReLU 比较:
sigmoid 的梯度消失问题,ReLU 的导数就不存在这样的问题,它的导数表达式如下:
曲线如图
对比sigmoid类函数主要变化是:
1)单侧抑制
2)相对宽阔的兴奋边界
3)稀疏激活性。
Sigmoid 和 Softmax 区别:
softmax is a generalization of logistic function that “squashes”(maps) a K-dimensional vector z of arbitrary real values to a K-dimensional vector σ(z) of real values in the range (0, 1) that add up to 1.
sigmoid将一个real value映射到(0,1)的区间,用来做二分类。
而 softmax 把一个 k 维的real value向量(a1,a2,a3,a4….)映射成一个(b1,b2,b3,b4….)其中 bi 是一个 0~1 的常数,输出神经元之和为 1.0,所以相当于概率值,然后可以根据 bi 的概率大小来进行多分类的任务。
二分类问题时 sigmoid 和 softmax 是一样的,求的都是 cross entropy loss,而 softmax 可以用于多分类问题
softmax是sigmoid的扩展,因为,当类别数 k=2 时,softmax 回归退化为 logistic 回归。具体地说,当 k=2 时,softmax 回归的假设函数为:
利用softmax回归参数冗余的特点,从两个参数向量中都减去向量θ1 ,得到:
最后,用 θ′ 来表示 θ2−θ1,上述公式可以表示为 softmax 回归器预测其中一个类别的概率为
另一个类别概率的为
这与 logistic回归是一致的。
softmax建模使用的分布是多项式分布,而logistic则基于伯努利分布
多个logistic回归通过叠加也同样可以实现多分类的效果,但是 softmax回归进行的多分类,类与类之间是互斥的,即一个输入只能被归为一类;多个logistic回归进行多分类,输出的类别并不是互斥的,即"苹果"这个词语既属于"水果"类也属于"3C"类别。
选择的时候,就是根据各个函数的优缺点来配置,例如:
如果使用 ReLU,要小心设置 learning rate,注意不要让网络出现很多 “dead” 神经元,如果不好解决,可以试试 Leaky ReLU、PReLU 或者 Maxout.
参考资料:
http://feisky.xyz/machine-learning/neural-networks/active.html
http://jishu.y5y.com.cn/qq_17754181/article/details/56495406
https://www.hu.com/question/29021768
http://blog.csdn.net/cyh_24/article/details/50593400
http://www.itda.com/articles/c15a1000722p0.html
https://www.hu.com/question/23765351
推荐阅读 历史技术博文链接汇总
也许可以找到你想要的
我是 不会停的蜗牛 Alice
85后全职主妇
喜欢人工智能,行动派
创造力,思考力,学习力提升修炼进行中
欢迎您的喜欢,关注和评论!
7. 100维度用什么优化算法
神经网络中常用的优化算法。
优化算法的目的:
1. 跳出局部极值点或鞍点,寻找全局最小值;
2.使训练过程更加稳定,更加容易收敛。
优化算法:深度学习优化学习方法(一阶、二阶)
一阶方法:随机梯度下降(SGD)、动量(Momentum)、牛顿动量法(Nesterov动量)、AdaGrad(自适应梯度)、RMSProp(均方差传播)、Adam、Nadam。
二阶方法:牛顿法、拟牛顿法、共轭梯度法(CG)、BFGS、L-BFGS。
自适应优化算法有哪些?(Adagrad(累积梯度平方)、RMSProp(累积梯度平方的滑动平均)、Adam(带动量的RMSProp,即同时使用梯度的一、二阶矩))。
梯度下降陷入局部最优有什么解决办法?可以用BGD、SGD、MBGD、momentum,RMSprop,Adam等方法来避免陷入局部最优。
8. 梯度下降法是什么
梯度下降法,是一种基于搜索的最优化方法,它其实不是一个机器学习算法,但是在机器学习领域,许多算法都是以梯度下降法为基础的,它的主要作用是寻找目标函数的最优解。
在求解损失函数的最小值时,可以通过梯度下降法来一步步的迭代求解,得到最小化的损失函数和模型参数值。反过来,如果我们需要求解损失函数的最大值,这时就需要用梯度上升法来迭代了。在机器学习中,基于基本的梯度下降法发展了两种梯度下降方法,分别为随机梯度下降法和批量梯度下降法。
常用的梯度下降法有3种不同的形式:
(1)批量梯度下降法,简称 BGD,使用所有样本,比较耗时;
(2)随机梯度下降法,简称 SGD,随机选择一个样本,简单高效;
(3)小批量梯度下降法,简称 MBGD,使用少量的样本,这是一个折中的办法。
9. e的x减一次方的导数
e的x减一次方的导数是e^(x-1)。
具体解法如下:
e的x减一次方,即为e^(x-1)
e的x减一次方的导数,即为e^(x-1)的导数
e^(x-1)'=e^(x-1)*(1)=e^(x-1)
所以e的x减一次方的导数是e^(x-1)。
(9)sgd算法扩展阅读
导数的求解注意点:
1、理解并牢记导数定义。导数定义中一定要出现这一点的函数值,如果已知告诉等于零,那极限表达式中就可以不出现,否就不能推出在这一点可导。
2、导数定义相关计算。这里有几种题型:1)已知某点处导数存在,计算极限,这需要掌握导数的广义化形式,还要注意是在这一点处导数存在的前提下,否则是不一定成立的。
3、导数、可微与连续的关系。函数在一点处可导与可微是等价的,可以推出在这一点处是连续的,反过来则是不成立的。
4、导数的计算。导数的计算可以说在每一年的考研数学中都会涉及到,而且形式不一,考查的方法也不同。
5、高阶导数计算。需要同学们记住几个常见的高阶导数公式,将其他函数都转化成我们这几种常见的函数,代入公式就可以了,也有通过求一阶导数,二阶,三阶的方法来找出他们之间关系的。
10. 有目标函数,怎么用sgd算法优化
<pre t="code" l="java">function main()
clc;clear all;close all;
tic; %程序运行计时
E0=0.001; %允许误差
MaxNum=100; %粒子最大迭代次数
narvs=1; %目标函数的自变量个数
particlesize=30; %粒子群规模
c1=2; %每个粒子的个体学习因子,也称为加速常数
c2=2; %每个粒子的社会学习因子,也称为加速常数
w=0.6; %惯性因子
vmax=0.8; %粒子的最大飞翔速度
x=-5+10*rand(particlesize,narvs); %粒子所在的位置
v=2*rand(particlesize,narvs); %粒子的飞翔速度
%用inline定义适应度函数以便将子函数文件与主程序文件放在一起,
%目标函数是:y=1+(2.1*(1-x+2*x.^2).*exp(-x.^2/2))
%inline命令定义适应度函数如下:
fitness=inline('1/(1+(2.1*(1-x+2*x.^2).*exp(-x.^2/2)))','x');
%inline定义的适应度函数会使程序运行速度大大降低
for i=1:particlesize
for j=1:narvs
f(i)=fitness(x(i,j));
end
end
personalbest_x=x;
personalbest_faval=f;
[globalbest_faval i]=min(personalbest_faval);
globalbest_x=personalbest_x(i,:);
k=1;
while k<=MaxNum
for i=1:particlesize
for j=1:narvs
f(i)=fitness(x(i,j));
end
if f(i)<personalbest_faval(i) %判断当前位置是否是历史上最佳位置
personalbest_faval(i)=f(i);
personalbest_x(i,:)=x(i,:);
end
end
[globalbest_faval i]=min(personalbest_faval);
globalbest_x=personalbest_x(i,:);
for i=1:particlesize %更新粒子群里每个个体的最新位置
v(i,:)=w*v(i,:)+c1*rand*(personalbest_x(i,:)-x(i,:))
+c2*rand*(globalbest_x-x(i,:));
for j=1:narvs %判断粒子的飞翔速度是否超过了最大飞翔速度
if v(i,j)>vmax;
v(i,j)=vmax;
elseif v(i,j)<-vmax;
v(i,j)=-vmax;
end
end
x(i,:)=x(i,:)+v(i,:);
end
if abs(globalbest_faval)<E0,break,end
k=k+1;
end
Value1=1/globalbest_faval-1; Value1=num2str(Value1);
% strcat指令可以实现字符的组合输出
disp(strcat('the maximum value','=',Value1));
%输出最大值所在的横坐标位置
Value2=globalbest_x; Value2=num2str(Value2);
disp(strcat('the corresponding coordinate','=',Value2));
x=-5:0.01:5;
y=2.1*(1-x+2*x.^2).*exp(-x.^2/2);
plot(x,y,'m-','linewidth',3);
hold on;
plot(globalbest_x,1/globalbest_faval-1,'kp','linewidth',4);
legend('目标函数','搜索到的最大值');xlabel('x');ylabel('y');grid on;toc;