目录
51、概率和信息量的关系
52、数据清理中,缺失值的处理方法
53、统计模式分类问题
54、语言模型0概率问题
55、逻辑回归和多元回归分析的不同
56、关于Word2Vec
57、词向量
58、二次准则函数的H-K算法比感知器的优势
59、卷积之后特征图谱的大小
60、矩阵计算效率
61、数据过大时,那种梯度下降方法更好
62、选择神经网络深度时,需要考虑哪些参数
63、如何利用已有训练好的网络进行现有问题的分类
64、不同隐藏层的梯度下降问题
65、增加卷积核大小对神经网络性能的影响
66、卷积神经网络对全白图片的分类效果
67、将神经网络的初始权重设为0,会有什么样的结果
68、局部极小值使得误差很大
69、对数据进行PCA和归一化来优化网络
70、过拟合震荡
71、深度学习的机理可解释性比传统机器学习方法差很多
72、SVM
73、EM算法
74、CNN参数如何初始化
75、如果神经网络参数全部初始化为0会出现什么情况
76、权值初始化:
77、Regularization 规则化
78、损失函数
79、集成学习的区别
80、机器学习中,为什么经常要对数据进行归一化
81、完整的机器学习项目的流程是什么
82、线性分类器和非线性分类器的区别
83、存储结构
84、当机器学习性能遭遇瓶颈时,你会如何优化的?
85、什麽样的资料集不适合用深度学习?
86、机器学习要了解哪些理论知识
87、标准化和归一化的区别
88、解释对偶的概念
89、机器学习中如何进行特征的选择
90、数据预处理
91、有哪些数据处理和特征工程的处理?
92、比下Sigmoid、Tanh、ReLu这三个激活函数
93、怎么理解决策树、xgboost能处理缺失值?而有的模型(svm)对缺失值比较敏感
94、为什么引入非线性激励函数
95、如何衡量分类器的性能
96、如何理解AUC
97、梯度消失问题及其推导
98、如何解决梯度消失和梯度爆炸问题
99、反向传播的推导
100、PCA降维和SVD降维的区别
示例:
符号集 a 、 b 、 c 、 d ,它们相互独立,相应概率为 1/2 、 1/4 、 1/8/ 、 1/16 ,其中包含信息量最小的符号(a)
解析:
消息出现的概率越小,说明限制条件越多,则消息中所包含的信息量就越大;
事件出现的概率越大,说明限制条件越少,则所包含的信息量就越小;
数据清理中,处理缺失值的方法有两种:
一、删除法:
二、查补法:均值插补、回归插补、抽样填补等
示例:
在数据清理中,下面哪个不是处理缺失值的方法?(D)
A. 估算
B. 整例删除
C. 变量删除
D. 成对删除 (×)
语言模型的参数估计经常使用MLE(最大似然估计)。面临的一个问题是没有出现的项概率为0,这样会导致语言模型的效果不好。为了解决这个问题,需要使用(平滑 )
**解析:**拉普拉斯平滑假设,将分子和分母各加上一个常数项。
逻辑回归与多元回归分析有哪些不同?(D)
A. 逻辑回归预测某事件发生的概率
B. 逻辑回归有较高的拟合效果
C. 逻辑回归回归系数的评估
D. 以上全选
解析:
A. 逻辑回归是用于分类问题,我们能计算出一个事件/样本的概率;
B. 一般来说,逻辑回归对测试数据有着较好的拟合效果;
C. 建立逻辑回归模型后,我们可以观察回归系数类标签(正类和负类)与独立变量的的关系。
中文同义词替换时,常用到Word2Vec,以下说法错误的是(C)
A. Word2Vec基于概率统计 (√)
B. Word2Vec结果符合当前预料环境 (√)
C. Word2Vec得到的都是语义上的同义词 (×)
D. Word2Vec受限于训练语料的数量和质量 (√)
解析:
Word2vec,为一群用来产生词向量的相关模型。这些模型为浅而双层的神经网络,用来训练以重新建构语言学之词文本。网络以词表现,并且需猜测相邻位置的输入词,在word2vec中词袋模型假设下,词的顺序是不重要的。
训练完成之后,word2vec模型可用来映射每个词到一个向量,可用来表示词对词之间的关系。该向量为神经网络之隐藏。
Word2vec依赖skip-grams或连续词袋(CBOW)来建立神经词嵌入。
详细介绍:
word2vec是什么:
word2vec是Google在2013年开源的一款将词表征为实数值向量(word vector)的高效工具,采用的模型有CBOW(Continuous Bag-Of-Words,即连续的词袋模型)和Skip-Gram两种。
word2vec工作原理:
word2vec是一个将单词转换成向量形式的工具。word2vec通过训练,可以把对文本内容的处理简化为K维向量空间中的向量运算,而向量空间上的相似度可以用来表示文本语义上的相似度。因此,word2vec输出的词向量可以被用来做很多NLP相关的工作,比如聚类、找同义词、词性分析等等。word2vec大受欢迎的另一个原因是其高效性,Mikolov在论文中指出一个优化的单机版本一天可训练上千亿词。
word2vec是浅层模型:
word2vec一般被外界认为是一个Deep Learning(深度学习)的模型,究其原因,可能和word2vec的作者Tomas Mikolov的Deep Learning背景以及word2vec是一种神经网络模型相关,但我们谨慎认为该模型层次较浅,严格来说还不能算是深层模型。当然如果word2vec上层再套一层与具体应用相关的输出层,比如Softmax,此时更像是一个深层模型。
word2vec的输入输出:
Word2vec是一个用于处理文本的双层神经网络。它的输入是文本语料,输出则是一组向量:该语料中词语的特征向量。虽然Word2vec并不是深度神经网络,但它可以将文本转换为深度神经网络能够理解的数值形式。Word2vec衡量词的余弦相似性,无相似性表示为90度角,而相似度为1的完全相似则表示为0度角,即完全重合。
word2vec的模型训练:
Word2vec与自动编码器相似,它将每个词编码为向量,但Word2vec不会像受限玻尔兹曼机那样通过重构输入的词语来定型,而是根据输入语料中相邻的其他词来进行每个词的定型。
具体的方式有两种,这两种方法都利用人工神经网络作为它们的分类算法:
自然语言理解的问题要转化为机器学习的问题,第一步肯定是要找一种方法把这些符号数学化。词向量就是用来将语言中的词进行数学化的一种方式,顾名思义,词向量就是把一个词表示成一个向量。
主要有两种表示方式:
1)One-Hot Representation
这种方法把每个词顺序编号,每个词就是一个很长的向量,向量的维度等于词表大小,只有对应位置上的数字为1,其他都为0。
当然在实际应用中,一般采用稀疏编码存储,主要采用词的编号,非常的简洁,也就是给每个词分配一个数字ID,。
这么简洁的表示方法配合上最大熵、SVM、CRF 等等算法已经很好地完成了 NLP 领域的各种主流任务。这种表示方法一个最大的问题是无法捕捉词与词之间的相似度,就算是近义词也无法从词向量中看出任何关系。此外这种表示方法还容易发生维数灾难,尤其是在Deep Learning相关的一些应用中。
2)Distributed Representation
Distributed representation 最早是 Hinton 在 1986 年的论文《Learning distributed representations of concepts》中提出的。
通过训练将每个词映射成K维实数向量(K一般为模型中的超参数),通过词之间的距离(比如cosine相似度、欧氏距离等)来判断它们之间的语义相似度。虽然这篇文章没有说要将词做 Distributed representation,但至少这种先进的思想在那个时候就在人们的心中埋下了火种,到 2000 年之后开始逐渐被人重视。
Distributed representation 最大的贡献就是让相关或者相似的词,在距离上更接近了。向量的距离可以用最传统的欧氏距离来衡量,也可以用余弦夹角来衡量。用这种方式表示的向量,“麦克”和“话筒”的距离会远远小于“麦克”和“天气”。可能理想情况下“麦克”和“话筒”的表示应该是完全一样的,但是由于有些人会把英文名“迈克”也写成“麦克”,导致“麦克”一词带上了一些人名的语义,因此不会和“话筒”完全一致。word2vec使用的就是这种Distributed representation的词向量表示方式。
解答:二次准则函数的H-K算法可以判别问题是否线性可分
解析:
HK算法思想很朴实,就是在最小均方误差准则下求得权矢量.
它相对于感知器算法的优点在于,适用于线性可分和非线性可分得情况,对于线性可分的情况,给出最优权矢量,对于非线性可分得情况,能够判别出来,以退出迭代过程。
图像大小为:N*N
步长为:S
padding为:P
卷积核大小为:F*F
特征图谱大小:W=N−F+2PS+1
W=SN−F+2P+1
深度学习是当前很热门的机器学习算法,在深度学习中,涉及到大量的矩阵相乘,现在需要计算三个稠密矩阵A,B,C的乘积ABC,假设三个矩阵的尺寸分别为m∗n,n∗p,p∗q,且m < n < p < q,以下计算顺序效率最高的是(A)
A. (AB)C
B. AC(B) (×,无法进行乘法)
C. A(BC)
D. 所以效率都相同
解析:
A. m∗n 的矩阵 A 和n∗p的矩阵 B 的乘积,得到 m∗p的矩阵 AB ,而 A∗B的每个元素需要 n 次乘法和 n-1 次加法,忽略加法,共需要 m∗n∗p次乘法运算。同样情况分析 AB 之后再乘以 C 时的情况,共需要 m∗p∗q次乘法运算。因此, A 选项 (AB)C 需要的乘法次数是 m∗n∗p+m∗p∗q 。
C. 选项 A (BC) 需要的乘法次数是 n∗p∗q+m∗n∗q。
当数据过大以至于无法在RAM中同时处理时,哪种梯度下降方法更加有效?(A)
A. 随机梯度下降法(Stochastic Gradient Descent)
B. 不知道
C. 整批梯度下降法(Full Batch Gradient Descent)
D. 都不是
梯度下降法分类:
这三个方法, 对于全体样本的损失函数曲面来说, 梯度指向一个比一个准确. 但是在工程应用中,受到内存/磁盘IO的吞吐性能制约, 若要最小化梯度下降的实际运算时间, 需要在梯度方向准确性和数据传输性能之间取得最好的平衡.
所以, 对于数据过大以至于无法在RAM中同时处理时, RAM每次只能装一个样本, 那么只能选随机梯度下降法。
所有上述因素对于选择神经网络模型的深度都是重要的。特征抽取所需分层越多, 输入数据维度越高, 映射的输出函数非线性越复杂, 所需深度就越深. 另外为了达到最佳效果, 增加深度所带来的参数量增加, 也需要考虑硬件计算能力和学习速率以设计合理的训练时间。
示例:
考虑某个具体问题时,你可能只有少量数据来解决这个问题。不过幸运的是你有一个类似问题已经预先训练好的神经网络。可以用下面哪种方法来利用这个预先训练好的网络?(C)
A. 把除了最后一层外所有的层都冻住,重新训练最后一层
B. 对新数据重新训练整个模型
C. 只对最后几层进行调参(fine tune)
D. 对每一层模型进行评估,选择其中的少数来用
解析:
如果有个预先训练好的神经网络, 就相当于网络各参数有个很靠谱的先验代替随机初始化. 若新的少量数据来自于先前训练数据(或者先前训练数据量很好地描述了数据分布, 而新数据采样自完全相同的分布), 则冻结前面所有层而重新训练最后一层即可;
但一般情况下, 新数据分布跟先前训练集分布有所偏差, 所以先验网络不足以完全拟合新数据时, 可以冻结大部分前层网络, 只对最后几层进行训练调参(这也称之为fine tune)。
下图是一个利用sigmoid函数作为激活函数的含四个隐藏层的神经网络训练的梯度下降图。这个神经网络遇到了梯度消失的问题。下面哪个叙述是正确的?(A)
A. 第一隐藏层对应D,第二隐藏层对应C,第三隐藏层对应B,第四隐藏层对应
B. 第一隐藏层对应A,第二隐藏层对应C,第三隐藏层对应B,第四隐藏层对应
C. 第一隐藏层对应A,第二隐藏层对应B,第三隐藏层对应C,第四隐藏层对应
D. 第一隐藏层对应B,第二隐藏层对应D,第三隐藏层对应C,第四隐藏层对应
解析:
由于反向传播算法进入起始层,学习能力降低,这就是梯度消失。换言之,梯度消失是梯度在前向传播中逐渐减为0, 按照图标题所说, 四条曲线是4个隐藏层的学习曲线, 那么第一层梯度最高(损失函数曲线下降明显), 最后一层梯度几乎为零(损失函数曲线变成平直线). 所以D是第一层, A是最后一层。
增加卷积核的大小不一定会改进卷积神经网络的效果,这个问题很大程度上取决于数据集。
假设我们已经在ImageNet数据集(物体识别)上训练好了一个卷积神经网络。然后给这张卷积神经网络输入一张全白的图片。对于这个输入的输出结果为任何种类的物体的可能性都是一样的(×)
解析:
已经训练好的卷积神经网络, 各个神经元已经精雕细琢完工, 对于全白图片的输入, 其 j 层激活函数输出给最后的全连接层的值几乎不可能恒等, 再经softmax转换之后也不会相等, 所以"输出结果为任何种类的等可能性一样"也就是softmax的每项均相等, 这个概率是极低的。
对于一个分类任务,如果开始时神经网络的权重不是随机赋值的,二是都设成0,下面哪个叙述是正确的?
A. 其他选项都不对
B. 没啥问题,神经网络会正常开始训练
C. 神经网络可以训练,但是所有的神经元最后都会变成识别同样的东西(√)
D. 神经网络不会开始训练,因为没有梯度改变
解析:
令所有权重都初始化为0这个一个听起来还蛮合理的想法也许是一个我们假设中最好的一个假设了, 但结果是错误的,因为如果神经网络计算出来的输出值都一个样,那么反向传播算法计算出来的梯度值一样,并且参数更新值也一样(w=w−α∗dw)。更一般地说,如果权重初始化为同一个值,网络即是对称的, 最终所有的神经元最后都会变成识别同样的东西。
示例:
声明1:可以通过将所有权重初始化为0 来训练网络。(×)
声明2:可以通过将偏差初始化为0来很好地训练网络。(√)
即使所有的偏差都为零,神经网络也有可能学习。
另一方面,如果所有的权重都是零; 神经网络可能永远不会学习执行任务。
下图显示,当开始训练时,误差一直很高,这是因为神经网络在往全局最小值前进之前一直被卡在局部最小值里。为了避免这种情况,我们可以采取下面哪种策略?(A)
A. 改变学习速率,比如一开始的几个训练周期不断更改学习速率
B. 一开始将学习速率减小10倍,然后用动量项(momentum)
C. 增加参数数目,这样神经网络就不会卡在局部最优处
D. 其他都不对
解析:
A可以将陷于局部最小值的神经网络提取出来
假设在训练中我们突然遇到了一个问题,在几次循环之后,误差瞬间降低
![这里写图片描述](https://img-blog.csdn.net/20180410210054430?)
你认为数据有问题,于是你画出了数据并且发现也许是数据的偏度过大造成了这个问题。
![这里写图片描述](https://img-blog.csdn.net/20180410210124482?)
解决方法:对数据作主成分分析(PCA)和归一化
解析:首先将相关的数据去掉,然后将其置零。具体来说,误差瞬间降低, 一般原因是多个数据样本有强相关性且突然被拟合命中, 或者含有较大方差数据样本突然被拟合命中. 所以对数据作主成分分析(PCA)和归一化能够改善这个问题。
在下图中,我们可以观察到误差出现了许多小的"涨落"。 这种情况我们应该担心吗?
解答:不需要,只要在训练集和交叉验证集上有累积的下降就可以了
解析:为了减少这些“起伏”,可以尝试增加批尺寸(batch size)。具体来说,在曲线整体趋势为下降时, 为了减少这些“起伏”,可以尝试增加批尺寸(batch size)以缩小batch综合梯度方向摆动范围. 当整体曲线趋势为平缓时出现可观的“起伏”, 可以尝试降低学习率以进一步收敛. “起伏”不可观时应该提前终止训练以免过拟合
以传统机器学习中的监督学习为例,朴素贝叶斯实现的是概率量化计算的模型,它的解释是通过对样本的统计,然后算出某件事 A 发生的概率和某件事 B 发生的概率之间的量化关系 。
基本思想:求解能够正确划分训练样本并且其几何间隔最大化的超平面
对于样本点(xi,yi)
(xi,yi),以及SVM超平面wTxi+b=0
wTxi+b=0
函数间隔:yi(wTxi+b)
yi(wTxi+b)
几何间隔:yi(wTxi+b)∣∣w∣∣
∣∣w∣∣为w的L2范数,几何间隔不会因为参数比例的改变而改变。
线性SVM问题:
对偶求解:
损失函数:
为什么要引入对偶算法:
对偶问题往往更加容易求解(结合拉格朗日和kkt条件)
可以很自然的引用核函数(拉格朗日表达式里面有内积,而核函数也是通过内积进行映射的)
核函数:
SVM优缺点:
优点:
使用核函数可以向高维空间进行映射
使用核函数可以解决非线性的分类
分类思想很简单,就是将样本与决策面的间隔最大化
分类效果较好
缺点:
对大规模数据训练比较困难
无法直接支持多分类,但是可以使用间接的方法来做
SMO:
SMO是用于快速求解SVM的
它选择凸二次规划的两个变量,其他的变量保持不变,然后根据这两个变量构建一个二次规划问题,这个二次规划关于这两个变量解会更加的接近原始二次规划的解,通过这样的子问题划分可以大大增加整个算法的计算速度,关于这两个变量:
SVM多分类问题:
直接在目标函数上进行修改,将多个分类面的参数求解合并到一个最优化问题中,通过求解该优化就可以实现多分类(计算复杂度很高,实现起来较为困难)
2.间接法
一对多
其中某个类为一类,其余n-1个类为另一个类,比如A,B,C,D四个类,第一次A为一个类,{B,C,D}为一个类训练一个分类器,第二次B为一个类,{A,C,D}为另一个类,按这方式共需要训练4个分类器,最后在测试的时候将测试样本经过这4个分类器f 1 (x) ,f 2 (x) ,f 3 (x) 和f 4 (x) ,取其最大值为分类器(这种方式由于是1对M分类,会存在偏置,很不实用)
一对一(libsvm实现的方式)
任意两个类都训练一个分类器,那么n个类就需要n*(n-1)/2个svm分类器。
还是以A,B,C,D为例,那么需要{A,B},{A,C},{A,D},{B,C},{B,D},{C,D}为目标共6个分类器,然后在预测的将测试样本通过这6个分类器之后进行投票选择最终结果。(这种方法虽好,但是需要n*(n-1)/2个分类器代价太大,不过有好像使用循环图来进行改进)
EM用于隐含变量的概率模型的极大似然估计,它一般分为两步:第一步求期望(E),第二步求极大(M),
如果概率模型的变量都是观测变量,那么给定数据之后就可以直接使用极大似然法或者贝叶斯估计模型参数。
但是当模型含有隐含变量的时候就不能简单的用这些方法来估计,EM就是一种含有隐含变量的概率模型参数的极大似然估计法。
应用到的地方:混合高斯模型、混合朴素贝叶斯模型、因子分析模型
该链接有详细介绍
1) 不能使用全零初始化,更严谨的说,不能初始化为同样的值,否则神经元之间就失去了不对称性的源头。
2)使用小随机数初始化
权重初始值要非常接近0又不能等于0。解决方法就是将权重初始化为很小的数值,以此来打破对称性。
**其思路是:**如果神经元刚开始的时候是随机且不相等的,那么它们将计算出不同的更新,并将自身变成整个网络的不同部分。
小随机数权重初始化的实现方法是:W = 0.01 * np.random.randn(D,H)
。其中randn函数是基于零均值和标准差的一个高斯分布(译者注:国内教程一般习惯称均值参数为期望\mu)来生成随机数的。根据这个式子,每个神经元的权重向量都被初始化为一个随机向量,而这些随机向量又服从一个多变量高斯分布,这样在输入空间中,所有的神经元的指向是随机的。也可以使用均匀分布生成的随机数,但是从实践结果来看,对于算法的结果影响极小。
并不是小数值一定会得到好的结果。例如,一个神经网络的层中的权重值很小,那么在反向传播的时候就会计算出非常小的梯度(因为梯度与权重值是成比例的)。这就会很大程度上减小反向传播中的“梯度信号”,在深度网络中,就会出现问题。
神经网络的第一层输入往往是均值为0,方差为1的分布(均匀或高斯分布),对于多层神经网络,每一层的输出都是下一层的输入,所以我们也希望是均值为0,方差为1的分布,好的初始化的一个目的就是让每层的输入相比第一层的均值为0,方差为1别偏差太多,batch normal就是为了实现这样的效果。
我们经常将权重初始化为高斯分布,或者均匀分布。高斯分布或者均匀分布的选择并没有太大的区别。但是初始化分布的**大小(scale)**对优化结果和泛化能力有极大的影响。
方差的意义:
1)高斯分布的方差越大:
高斯分布的方差越大的时候,概率密度函数越平坦,也就是分布函数不会集中于均值附近,会以更大的概率取更大的值,这种初始化机制会带来一定的问题,假设取值为z
z,则z<<−1z<<−1或z>>1z>>1,相应的该神经元的激活后的值σ(z)σ(z)就会接近于0 / 1,我们已知,当σ(z)σ(z)接近于0 / 1的时候,变化率很小,也就会达到一种饱和的状态。
权值更新公式为∂C∂wL=(aL−y)σ′(z)
∂wL∂C=(aL−y)σ′(z)
也就意味着越小的σ′(z)
σ′(z)会带来越小的梯度更新,同时学习率 ηη 也会越小。
2)方差为1的意义
上述方差过大的情况会造成训练过程出现问题,假设输入层有nin
nin个神经元,我们将权值初始化为均值为0,方差为1/nin−−−√1/nin,这样的话,pdf的分布情况会趋于陡峭,σ′(z)σ′(z)达到饱和状态的概率会较小,参数更新效率更高。
均匀分布
一种初始化m个输入和n个输出的全连接层的启发式的方法是从分布U(−1m√,1m√)
U(−m1,m1)中采样权重。
高斯分布
对于高斯分布,需要设置的参数是均值和方差,一般情况下,均值都设为0 ,方差有以下几种不同的方式。
① 设置stddev=0.01或者0.001(一个小的常数)带来的问题是,可能过小而导致前向传播时信号丢失
② Xavier Initialization (m为输入个数,n为输出个数)
上面做法存在一个问题,随着输入数据量的增长,随机初始化的神经元的输出数据的分布中的方差也在增大。我们可以除以输入数据量的平方根来调整其数值范围,这样神经元输出的方差就归一化到1了。也就是说,建议将神经元的权重向量初始化为:w = np.random.randn(n) / sqrt(n)
。其中n是输入数据的数量。这样就保证了网络中所有神经元起始时有近似同样的输出分布。实践经验证明,这样做可以提高收敛的速度。
思想是使得输入和输出的方差保持一致(需要注意的是只要满足均值是0,标准差是sqrt(1/m)或sqrt(2/(m+n))分布的都叫做Xavier Initialization。只不过在高斯分布中应用较多,故放在高斯分布的分类下
最初的方式是stddev=1/m−−−−√
这个形式是神经网络算法使用ReLU神经元时的当前最佳推荐。
稀疏初始化:
另一个处理非标定方差的方法是将所有权重矩阵设为0,但是为了打破对称性,每个神经元都同下一层固定数目的神经元随机连接(其权重数值由一个小的高斯分布生成)。一个比较典型的连接数目是10个。
偏置初始化
通常将偏置初始化为0,这是因为随机小数值权重矩阵已经打破了对称性。对于ReLU非线性激活函数,有研究人员喜欢使用如0.01这样的小数值常量作为所有偏置的初始值,这是因为他们认为这样做能让所有的ReLU单元一开始就激活,这样就能保存并传播一些梯度。然而,这样做是不是总是能提高算法性能并不清楚(有时候实验结果反而显示性能更差),所以通常还是使用0来初始化偏置参数。
一般情况下,偏置总设为0,但是也可能有如下几个非零情况:
1)如果偏置作为输出单元,初始化偏置以获取正确的输出边缘的统计通常是有利的。
2)有时,我们可能想要选择偏置以避免初始化引起的太大饱和
3)一个单元会控制其他单元能否参与到等式中,比如常见的门操作,在LSTM中将forget_bias=1.0.
批量归一化
批量归一化是loffe和Szegedy最近才提出的方法,该方法减轻了如何合理初始化神经网络这个棘手问题带来的头痛:),其做法是让激活数据在训练开始前通过一个网络,网络处理数据使其服从标准高斯分布。因为归一化是一个简单可求导的操作,所以上述思路是可行的。在实现层面,应用这个技巧通常意味着全连接层(或者是卷积层,后续会讲)与激活函数之间添加一个BatchNorm层。对于这个技巧本节不会展开讲,因为上面的参考文献中已经讲得很清楚了,需要知道的是在神经网络中使用批量归一化已经变得非常常见。在实践中,使用了批量归一化的网络对于不好的初始值有更强的鲁棒性。最后一句话总结:批量归一化可以理解为在网络的每一层之前都做预处理,只是这种操作以另一种方式与网络集成在了一起。
更新之后的所有节点的参数都是相同的,无法进行训练
更新过程:
假设要初始化的神经网络如下所示:
初始化的权重为:
其中w1代表输入层到隐藏层的权重矩阵,w2代表隐藏层到输入层的权重矩阵。
假设网络的输入为[x1,x2,x3]
[x1,x2,x3],然后通过网络的正向传播,可以得到:
由于W1
W1全为0,此时隐藏层的值是相同的,经过激活函数ff之后,得到的activate(z)activate(z)仍然是相同的,所以网络最终的输出为yy。
损失函数:
利用BP算法来反向更新权值,最小化损失函数,使得预测的输出值与实际值越来越靠近,但是经过反向传播之后结点4、5的梯度改变是一样的,也就是所计算出来的梯度都是相同的,从而进行同样的参数更新。
同理,输入层与隐藏层之间的参数更新都是一样的,得出更新之后的参数都是相同的。
**注意:**一般只在训练SLP/逻辑回归模型时才使用0初始化所有参数., 更实用的结论是, 深度模型都不会使用0初始化所有参数.
全零初始化是错误的:
让我们从应该避免的错误开始。在训练完毕后,虽然不知道网络中每个权重的最终值应该是多少,但如果数据经过了恰当的归一化的话,就可以假设所有权重数值中大约一半为正数,一半为负数。这样,一个听起来蛮合理的想法就是把这些权重的初始值都设为0吧,因为在期望上来说0是最合理的猜测。这个做法错误的!因为如果网络中的每个神经元都计算出同样的输出,然后它们就会在反向传播中计算出同样的梯度,从而进行同样的参数更新。换句话说,如果权重被初始化为同样的值,神经元之间就失去了不对称性的源头。
在训练上面我们处理好的数据之前,还需要对神经网络的权重进行初始化。
a. 为什么不能初始化为全0
首先说明下,初始权重不能全为0.经过适当的数据预处理之后我们可以合理的认为大约有一般的权重是正的另一半是负的,我们可能认为他的均值可能为0,但是绝对不能将其全部都设为0,严格来说不能把所有的权重都设置为相同的值,以前在反向传播中已经提到过,如果所有的权重相同,如下图:
那么所有的神经单元都会得到相同的结果,另外在求梯度时候得到的梯度也是全部都一样(还可以看知乎的相关问题)。
b. 小随机数
如2.1所说,我们还是想让权重的接近于0,那么取一个很小的接近于0的随机数可以么?例如这样设置:
W = 0.01* np.random.randn(D,H)
这样既可以满足各个初始值不一样又可以使其接近于0,但是这样还是不好,因为反向传播的梯度大小是和权重的值成正比的,所以如果其值很小那么得到的梯度也是很小的,小型我拿过来也许还可以,但是通过几层网络之后,会产生激活值的非均匀分布:
如果一个10层,每层500个单元的神经网络,初始化设置为W = 0.01* np.random.randn(D,H)
,激活函数为tanh,就会发现每层得到的激活值如下:
可以看到后面的激活值全部都成了0,毕竟wT⋅x
wT⋅x之后经过激活函数再经过乘以w得到的结果会越来越接近于0,梯度也会变大很小。
如果我们将其值变大些W = 1* np.random.randn(D,H)
,得到的结果又会变为:
所有的又接近于1和-1,那么每个激活函数的导数又接近于0,那么到底应该如何设置初值呢?
c. 如何设置初值:
① 方差校准
由经验可知,如果初始时每个单元的输出都有着相似的分布,会使得收敛速度增大,而上面使用随机的方式会使得各个单元的输出值的分布产生较大的变化,新建设使用线性激活函数,探究输入与输出的分布关系,首先设输入是x
x,x和w的内积是s,则其方差的关系:
其中,我们设x和w的均值相同,都为0,且相互独立,得到的结果显示,如果希望s与输入变量x同分布,就需要使w的方差为1/n
1/n,即:w = np.random.randn(n) / sqrt(n)
,这样设置之后每层输出值的均值、方差分布如下:
当激活函数换做ReLU时(上面的激活函数为tanh),结果如下:
分布发生了较大的变化,我们需要根据上面的过程,做一个更加复杂的推导使得各层的输出分布相似,文章Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification by He et al 探讨了ReLU的初始化应该是w = np.random.randn(n) * sqrt(2.0/n)
这样得到的分布是:
② 系数初始化 Sparse initialization
其思想是先将权重初始设置为全部都是0,但是为了避免训练结果完全一样的情况,即为了打破初始对称,每个神经单元只能随机的与固定个数的神经单元连接(比如经典的选取10个的方法)。
③ 截距的初始化
截距或者biase的初始化可以使用0,因为w的设置已经使对称失效了,在使用ReLU时有人会设置为较小的数例如0.01,但是这样设置会不会有好处还没有确切的定论。
总结:推荐使用ReLU单元和w = np.random.randn(n) * sqrt(2.0/n)
的初始化设置方法。
d. Batch Normalization
这是一种近期才出现的技术,提出者是Ioffe 和Szegedy,效果不错,详解在该文章中。它强制将激活值在训练前设置为高斯分布,他在全连接层和激活函数层中间插入了一层Batch Normalization层. 现在batch normalization的使用已经比较广泛了,具体设置方法请看前面连接的论文,它具有以下优点:
另外,Batch normailization可以被理解为在每层之前做一下预处理, 但是却集成到了神经网络中去了。
overfitting就是过拟合, 其直观的表现如下图所示,随着训练过程的进行,模型复杂度增加,在training data上的error渐渐减小,但是在验证集上的error却反而渐渐增大——因为训练出来的网络过拟合了训练集, 对训练集外的数据却不work, 这称之为泛化(generalization)性能不好。泛化性能是训练的效果评价中的首要目标,没有良好的泛化,就等于南辕北辙, 一切都是无用功。
1)L2:
L2 regularization可能是最常见的规则化方法了,其手段就是将每个w都加入一项$\frac{1}{2} λw^2 $,这里的1/2是为了在求导的时候能够约去2,其作用相当于W += -lambda * W
,让w
向0的方向线性降低。它倾向于使各个权重变得分散均匀,也就是倾向于使各个输入值都可以被利用。是控制的w的变化率,并不是控制的w。
2)L1:
L1是加入了λ∣w∣
λ∣w∣ 项,其好处是可以得到稀疏矩阵,留住重要的输入,去除噪音,但是不易于求导,计算较为复杂,所以用的较少。L1可以和L2 混用这时也称作Elastic net regularization。如果不是想明确特征的选择,一般L2的效果要比L1要好。
3)最大范数约束 Max norm contraints
最大范数约束主要思路是安照正常进行update,只不过每次更新之后检查其范数是否大约了设定值$∥w ⃗ ∥ 2 ,c$的经典取值是3或者4.有人说效果还可以。 4)Dropout: 在训练的运行的时候,让神经元以超参数p的概率被激活(也就是1-p的概率被设置为0), 每个w因此随机参与, 使得任意w都不是不可或缺的, 效果类似于数量巨大的模型集成。 这是一种简单高效常用的方法,与前面的三种方法互补,由 Srivastava等提出的。文章在这里Dropout: A Simple Way to Prevent Neural Networks from Overfitting(PDF)。 这种方法的思想是在训练时候只是一部分的神经单元工作,如图: 神经单元可以被使用的概率是P(是一个超参数)或者是0,其测试的时候全部的神经元都是可以利用的,这时候相当于ensemble。 相关资料: Dropout paper by Srivastava et al. 2014. Dropout Training as Adaptive Regularization 5)偏置正则化 bias不与输入变量直接相乘,不能控制数据对最终目标的影响,所以表示一般不用regularization,但是它的数量相对于w很少,约束下也不会有太大的影响。 6)batch_normalization 这个方法给每层的输出都做一次归一化(网络上相当于加了一个线性变换层), 使得下一层的输入接近高斯分布,也就是输入数据大小处于激活函数的激活状态范围内,避免激活函数的饱和带来的梯度消失,神经网络无法训练的问题。这个方法相当于下一层的w训练时避免了其输入以偏概全, 因而泛化效果非常好。 我们已经考虑loss function里的regularization loss 还有一部分 data loss还没有考虑.损失函数是考虑每个案例的损失的平均值$L=\frac{1}{N}\sum_i L_i ,这里设神经网络的激活函数为 ,这里设神经网络的激活函数为f=f(x i ;W)$ ,下面按照分类和回归问题分析损失函数。 1)分类问题: 我们目前讨论的分类问题一般只有一个正确答案,常用的有svm和softmax的损失函数。svm的分类损失函数是: 或者: softmax的损失函数为: 大量类别问题: 在进行文字分类等有很多类别的时候可以用Hierarchical Softmax的方法,其栗子在这里,他先创建一棵类别树,每一个节点用于softmax,树的结构对分类效果影响很大,需要具体问题具体分析。 多属性类别: 同一个物体可能有多重属性,其类别也就可能有多个,解决方法有: j代表类别,yij代表第i个example是否属于j类(取1或者-1),fj是预测的score function。 其中σ 是sigmoid函数,对f求导得到: 2)回归 3)总结 集成学习的集成对象是学习器,Bagging和Boosting属于集成学习的两类方法,Bagging方法有放回地采样同数量样本训练每个学习器,然后再一起集成(简单投票),Boosting方法适应全部样本(可调权重)依次训练每个学习器,迭代集成(平滑加权) 决策树是属于最常用的学习器,其学习过程是从根建立树,也就是如何决策叶子节点分裂,ID3/C4.5决策树用信息熵计算最优分裂, CART决策树用基尼指数计算最优分裂, xgboost决策树使用二阶泰勒展开系数计算最优分裂. 下面所提到的学习器都是决策树: Bagging方法: Boosting方法: 学习器之间存在强依赖关系、必须串行生成, 集成方式为加权和; 1)Adaboost: 属于Boosting, 采用指数损失函数替代原本分类任务的0/1损失函数; 2)GBDT: 属于Boosting的优秀代表, 对函数残差近似值进行梯度下降, 用CART回归树做学习器, 集成为回归模型; 3)xgboost: 属于Boosting的集大成者, 对函数残差近似值进行梯度下降, 迭代时利用了二阶梯度信息, 集成模型可分类也可回归. 由于它可在特征粒度上并行计算, 结构风险和工程实现都做了很多优化, 泛化, 性能和扩展性都比GBDT要好,具体的优点有: xgboost使用了一阶和二阶偏导, 二阶导数有利于梯度下降的更快更准. 使用泰勒展开取得函数做自变量的二阶导数形式, 可以在不选定损失函数具体形式的情况下, 仅仅依靠输入数据的值就可以进行叶子分裂优化计算, 本质上也就把损失函数的选取和模型算法优化/参数选择分开了. 这种去耦合增加了xgboost的适用性, 使得它按需选取损失函数, 可以用于分类, 也可以用于回归。 对树的结构进行了正则化约束,防止模型过度复杂,降低了过拟合的可能性 节点分裂的方式不同,gbdt是用的gini系数,xgboost是经过优化推导后的 xgboost如何寻找最优特征: xgboost在训练的过程中给出各个特征的增益评分,最大增益的特征会被选出来作为分裂依据, 从而记忆了每个特征对在模型训练时的重要性 – 从根到叶子中间节点涉及某特征的次数作为该特征重要性排序. xgboost属于boosting集成学习方法, 样本是不放回的, 因而每轮计算样本不重复. 另一方面, xgboost支持子采样, 也就是每轮计算可以不使用全部样本, 以减少过拟合. 进一步地, xgboost 还有列采样, 每轮计算按百分比随机采样一部分特征, 既提高计算速度又减少过拟合。 关于决策树,这里有篇《决策树算法》。而随机森林Random Forest是一个包含多个决策树的分类器。至于AdaBoost,则是英文"Adaptive Boosting"(自适应增强)的缩写,关于AdaBoost可以看下这篇文章《Adaboost 算法的原理与推导》。GBDT(Gradient Boosting Decision Tree),即梯度上升决策树算法,相当于融合决策树和梯度上升boosting算法。 一般机器学习应用的时候大部分时间花费在特征处理上,其中很关键的一步就是对特征数据进行归一化,之所以进行归一化,就是因为各个维度的量纲不同,归一化有两点好处: 1)归一化为什么能够提高梯度下降法求解最优解的速度? 下图中,蓝色圈表示两个特征的等高线,左图的两个特征x1和x2区间相差非常大,x1区间为[0,2000],x2区间是[1,5],故形成椭圆形的等高线,当梯度下降法求最优解的时候,按照垂直等高线切线的放下收敛是“z”字型路线,从而需要很多次才能收敛。 右图对两个原始特征进行了归一化,其对应的等高线呈圆形,在梯度下降求解时能较快的收敛。 故归一化对收敛速度有很大的影响,且归一化往往很有必要,否则可能导致无法收敛。 2)归一化提高精度 一些分类器需要计算样本之间的距离(如欧氏距离),例如KNN。如果一个特征值域范围非常大,那么距离计算就主要取决于这个特征,从而与实际情况相悖(比如这时实际情况是值域范围小的特征更重要)。 归一化的类型: 1)线性归一化: 这种归一化方法比较适用在数值比较集中的情况。这种方法有个缺陷,如果max和min不稳定,很容易使得归一化结果不稳定,使得后续使用效果也不稳定。实际使用中可以用经验常量值来替代max和min。 x′=max−minx−min 经过处理的数据符合标准正态分布,即均值为0,标准差为1,其转化函数为: x′=σx−μ 其中μ为所有样本数据的均值,σ为所有样本数据的标准差。 3)非线性归一化: 经常用在数据分化比较大的场景,有些数值很大,有些很小。通过一些数学函数,将原始值进行映射。该方法包括 log、指数,正切等。需要根据数据分布的情况,决定非线性函数的曲线,比如log(V, 2)还是log(V, 10)等。 哪些机器学习算法不需要归一化 对于树形结构为什么不需要归一化? 答:数值缩放,不影响分裂点位置。因为第一步都是按照特征值进行排序的,排序的顺序不变,那么所属的分支以及分裂点就不会有不同。对于线性模型,比如说LR,我有两个特征,一个是(0,1)的,一个是(0,10000)的,这样运用梯度下降时候,损失等高线是一个椭圆的形状,这样我想迭代到最优点,就需要很多次迭代,但是如果进行了归一化,那么等高线就是圆形的,那么SGD就会往原点迭代,需要的迭代次数较少。 另外,注意树模型是不能进行梯度下降的,因为树模型是阶跃的,阶跃点是不可导的,并且求导没意义,所以树模型(回归树)寻找最优点事通过寻找最优分裂点完成的。 1)抽象成数学问题 明确问题是进行机器学习的第一步,机器学习的训练过程通常都是一件非常耗时的事情,盲目的尝试带来的成本是非常高的,此处的“抽象成数学问题”指的是我们明确可以获得什么样的数据,目标是一个分类还是回归或者聚类的问题,如果都不是的话,尝试将其划归到某类问题中。 2)获取数据 数据决定了机器学习结果的上限,而算法只能尽可能的逼近这个上限,数据要有代表性,否则必然会产生过拟合。 对于分类问题,数据偏斜不能过于严重,不同类别的数据数量不要有多个数量级的差距。 对数据的量级要有一个评估,多少个样本,多少个特征,可以估算出其对内存的消耗程度,判断训练过程中内存是否够用,如果不够用的话要考虑降维技巧,或者分布式计算了。 3)特征预处理和特征选择 良好的数据要能够提取出良好的特征才能真正的发挥效果。 特征预处理、数据清洗是很关键的步骤,往往能使得算法在效果和性能上得到显著的提高。归一化、离散化、因子化、缺失值处理、去除共线性等,数据挖掘过程中很多时间就花费在它们上面。 4)训练模型与调优 直到这一步才用到我们上面说的算法进行训练。现在很多算法都能够封装成黑盒供人使用。但是真正考验水平的是调整这些算法的(超)参数,使得结果变得更加优良。 这需要我们对算法的原理有深入的理解。理解越深入,就越能发现问题的症结,提出良好的调优方案。 5)模型诊断 如何确定模型调优的方向与思路呢?这就需要对模型进行诊断的技术。 过拟合、欠拟合 判断是模型诊断中至关重要的一步。常见的方法如交叉验证,绘制学习曲线等。过拟合的基本调优思路是增加数据量,降低模型复杂度。欠拟合的基本调优思路是提高特征数量和质量,增加模型复杂度。 误差分析 也是机器学习至关重要的步骤。通过观察误差样本,全面分析误差产生误差的原因:是参数的问题还是算法选择的问题,是特征的问题还是数据本身的问题…… 诊断后的模型需要进行调优,调优后的新模型需要重新进行诊断,这是一个反复迭代不断逼近的过程,需要不断地尝试, 进而达到最优状态。 6)模型融合 一般来说,模型融合之后都能使得效果有一定的提升。 工程上,主要提升算法准确度的方法是分别在模型的前端(特征清洗和处理、不同的采样模式)与后端(模型融合)上下功夫,因为他们比较标准可复制,效果比较稳定。而直接调参的工作不会很多,毕竟大量数据训练起来太慢了,而且效果难以保证。 7)上线运行 这一部分内容主要跟工程实现的相关性比较大。工程上是结果导向,模型在线上运行的效果直接决定模型的成败。 不单纯包括其准确程度、误差等情况,还包括其运行的速度(时间复杂度)、资源消耗程度(空间复杂度)、稳定性是否可接受。 这些工作流程主要是工程实践上总结出的一些经验。并不是每个项目都包含完整的一个流程。这里的部分只是一个指导性的说明,只有大家自己多实践,多积累项目经验,才会有自己更深刻的认识。 线性和非线性是针对模型参数和输入特征来讲的,比如输入x x2则模型是线性的。 线性分类器优势:可解释性好,计算复杂度低 非线性分类器优势:拟合能力强 常见的线性分类器:LR、贝叶斯分类器、单层感知机、线性回归 SVM是依据核函数是线性核还是非线性核来判定为线性或非线性分类器的。 数据的逻辑存储结构(如数组,队列,树等)对于软件开发具有十分重要的影响,试对你所了解的各种存储结构从运行速度、存储效率和适用场合等方面进行简要地分析。 可以从这4个方面进行尝试:、基于数据、借助算法、用算法调参、借助模型融合。当然能谈多细多深入就看你的经验心得了。这里有一份参考清单:机器学习性能改善备忘单。 数据集太小,数据样本不足时,深度学习相对其它机器学习算法,没有明显优势。 数据集没有局部相关特性,目前深度学习表现比较好的领域主要是图像/语音/自然语言处理等领域,这些领域的一个共性是局部相关性。图像中像素组成物体,语音信号中音位组合成单词,文本数据中单词组合成句子,这些特征元素的组合一旦被打乱,表示的含义同时也被改变。对于没有这样的局部相关性的数据集,不适于使用深度学习算法进行处理。举个例子:预测一个人的健康状况,相关的参数会有年龄、职业、收入、家庭状况等各种元素,将这些元素打乱,并不会影响相关的结果。 归一化方法: 将数变为(0,1)之间的小数,主要是为了数据处理方便提出来的,把数据映射到0~1范围内处理,加快处理速度。 把有量纲表达式变为无量纲表达式,归一化是一种简化计算的方式,使表达式成为纯量。 标准化方法: 数据的标准化是将数据按比例缩放,使之落入一个小的特定区间,由于训勇指标体系的各个指标度量单位是不同的,为了能够将指标参与评价计算,需要对指标进行规范化处理,通过函数将其数值映射到某个数值区间。 一个优化问题可以从两个角度进行考察,一个是primal 问题,一个是dual 问题,就是对偶问题,一般情况下对偶问题给出主问题最优值的下界,在强对偶性成立的情况下由对偶问题可以得到主问题的最优下界,对偶问题是凸优化问题,可以进行较好的求解,SVM中就是将primal问题转换为dual问题进行求解,从而进一步引入核函数的思想。 特征选择是一个重要的数据预处理过程,主要有两个原因: 一是减少特征数量、降维,使模型泛化能力更强,减少过拟合; 二是增强对特征和特征值之间的理解 常见的特征选择方式: 连续值:离散化。有的模型(如决策树)需要离散值 对定量特征二值化。核心在于设定一个阈值,大于阈值的赋值为1,小于等于阈值的赋值为0。如图像操作 皮尔逊相关系数,去除高度相关的列 1)sigmoid函数: 因此,使用logistic函数将自变量映射到(0,1)上,映射后的值被认为是属于y=1的概率。 假设函数(特征属于y=1的概率):hθ(x)=g(θTx)=11+e−θTx hθ(x)=g(θTx)=1+e−θTx1 其中,x是n维特征向量,函数g就是logistics函数(将无穷映射到了0~1)。 而假设函数就是特征属于y=1的概率: P(y=0∣x;θ)=1−hθ(x) 从而,当我们要判别一个新来的特征属于哪个类时,只需求hθ(x) hθ(x)大于0.5就是y=1的类,反之属于y=0类。 Sigmoid 因其在 logistic 回归中的重要地位而被人熟知,值域在 0 到 1 之间。Logistic Sigmoid(或者按通常的叫法,Sigmoid)激活函数给神经网络引进了概率的概念。它的导数是非零的,并且很容易计算(是其初始输出的函数)。然而,在分类任务中,sigmoid 正逐渐被 Tanh 函数取代作为标准的激活函数,因为后者为奇函数(关于原点对称)。 sigmoid函数将输出映射到0-1范围之间,可以被看做是概率,因而,sigmoid函数是Logstic回归模型的激活函数。 但sigmoid函数有如下几个缺点: 正向计算包含指数,反向传播的导数也包含指数计算和除法运算,因而计算复杂度很高。 对于深层网络,sigmoid函数反向传播时,很容易就会出现梯度消失的情况(在sigmoid接近饱和区时,变换太缓慢,导数趋于0,这种情况会造成信息丢失),这种现象称为饱和,从而无法完成深层网络的训练。输出的均值非0,这样使得网络容易发生梯度消失或梯度爆炸。这也是batch normalization要解决的问题。 假如sigmoid函数为f(x),那么f’(x)=f(x)(1-f(x)),因为f(x)输出在0-1之间,那么f’(x)恒大于0。 这就导致全部的梯度的正负号都取决于损失函数上的梯度。这样容易导致训练不稳定,参数一荣俱荣一损俱损。 同样的,f’(x)=f(x)(1-f(x)),因为f(x)输出在0-1之间,那么f’(x)输出也在0-1之间,当层次比较深时,底层的导数就是很多在0-1之间的数相乘,从而导致了梯度消失问题。 2)tanh函数: 在分类任务中,双曲正切函数(Tanh)逐渐取代 Sigmoid 函数作为标准的激活函数,其具有很多神经网络所钟爱的特征。它是完全可微分的,反对称,对称中心在原点。为了解决学习缓慢和/或梯度消失问题,可以使用这个函数的更加平缓的变体(log-log、softsign、symmetrical sigmoid 等等) 对于tanh来说,同sigmoid类似,但是输出值在-1到1之间,均值为0,是其相对于sigmoid的提升。但是因为输出在-1,1之间,因而输出不能被看做是概率。 3)ReLU函数: 修正线性单元(Rectified linear unit,ReLU)是神经网络中最常用的激活函数。它保留了 step 函数的生物学启发(只有输入超出阈值时神经元才激活),不过当输入为正的时候,导数不为零,从而允许基于梯度的学习(尽管在 x=0 的时候,导数是未定义的)。使用这个函数能使计算变得很快,因为无论是函数还是其导数都不包含复杂的数学运算。然而,当输入为负值的时候,ReLU 的学习速度可能会变得很慢,甚至使神经元直接无效,因为此时输入小于零而梯度为零,从而其权重无法得到更新,在剩下的训练过程中会一直保持静默。 对于ReLU来说,相对于sigmoid和tanh来说,有如下优点: 计算量下,没有指数和除法运算。 不会饱和,因为在x>0的情况下,导数恒等于1 收敛速度快,在实践中可以得知,它的收敛速度是sigmoid的6倍。 Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生 但是Relu也有缺点,缺点在于: 4)Leaky ReLU: sigmoid、Tanh、ReLU的缺点在121问题中已有说明,为了解决ReLU的dead cell的情况,发明了Leaky Relu, 即在输入小于0时不让输出为0,而是乘以一个较小的系数,从而保证有导数存在。同样的目的,还有一个ELU,函数示意图如下。 5)Maxout: Maxout,即使用两套w,b参数,输出较大值。本质上Maxout可以看做Relu的泛化版本,因为如果一套w,b全都是0的话,那么就是普通的ReLU。Maxout可以克服Relu的缺点,但是参数数目翻倍。 问题:为什么LSTM模型中既存在sigmoid又存在tanh两种激活函数?为什么不是选择统一一种sigmoid或者tanh,而是混合使用呢?这样的目的是什么? 解析: 选择技巧: 如果输出是0、1值(二分类问题),则输出层选择sigmoid函数,然后其它的所有单元都选择Relu函数。 这是很多激活函数的默认选择,如果在隐藏层上不确定使用哪个激活函数,那么通常会使用Relu激活函数。有时,也会使用tanh激活函数,但Relu的一个优点是:当是负值的时候,导数等于0。 sigmoid激活函数:除了输出层是一个二分类问题基本不会用它。在二分类的问题中,对于输出层,因为y y^的数值介于0和1之间,而不是在-1和+1之间。所以需要使用sigmoid激活函数。 tanh激活函数:tanh是非常优秀的,几乎适合所有场合。 ReLu激活函数:最常用的默认函数,,如果不确定用哪个激活函数,就使用ReLu或者Leaky ReLu。公式3.23: 为什么常数是0.01?当然,可以为学习算法选择不同的参数。 在选择自己神经网络的激活函数时,有一定的直观感受,在深度学习中的经常遇到一个问题:在编写神经网络的时候,会有很多选择:隐藏层单元的个数、激活函数的选择、初始化权值……这些选择想得到一个对比较好的指导原则是挺困难的。 鉴于以上三个原因,以及在工业界的见闻,提供一种直观的感受,哪一种工业界用的多,哪一种用的少。但是,自己的神经网络的应用,以及其特殊性,是很难提前知道选择哪些效果更好。所以通常的建议是:如果不确定哪一个激活函数效果更好,可以把它们都试试,然后在验证集或者发展集上进行评价。然后看哪一种表现的更好,就去使用它。 为自己的神经网络的应用测试这些不同的选择,会在以后检验自己的神经网络或者评估算法的时候,看到不同的效果。如果仅仅遵守使用默认的ReLu激活函数,而不要用其他的激励函数,那就可能在近期或者往后,每次解决问题的时候都使用相同的办法。 基于特征采样的统计分布的方法对缺失值有更高的抗性。 决策树能将缺失值尽量解释为其它特征,从而最适用于应对缺失值。其它基于统计分布的方法(如广义加性模型和KNN)能在尽量保证“缺失值是随机的”的前提下降低缺失值造成的负面影响,机理是预先填充缺失值并在训练中视其有值。 基于数据的值来定位边界的方法(如支持向量)对缺失值的抗性不好,不恰当的非随机缺失值可能导致模型出现意外。 树模型对于缺失值的敏感度较低,大部分时候可以在数据有缺失时使用。 涉及到距离度量(distance measurement)时,如计算两个点之间的距离,缺失数据就变得比较重要。因为涉及到“距离”这个概念,那么缺失值处理不当就会导致效果很差,如K近邻算法(KNN)和支持向量机(SVM)。 线性模型的代价函数(loss function)往往涉及到距离(distance)的计算,计算预测值和真实值之间的差别,这容易导致对缺失值敏感。 神经网络的鲁棒性强,对于缺失数据不是非常敏感,但一般没有那么多数据可供使用。 贝叶斯模型对于缺失数据也比较稳定,数据量很小的时候首推贝叶斯模型。 总结来看,对于有缺失值的数据在经过缺失值处理后: 下面来看下通常用来处理缺失值的两种方式: 让训练算法在训练阶段自行处理缺失值; 在训练开始前处理掉缺失值。 解释: 决策树类算法用来处理缺失值的方式是第一种方式。对于随机森林,基于的是所谓“代理变量”思想。我们知道,随机森林关注的是各个特征之间的相关性。缺失值与其它变量间相关性越高,意味着用已有的变量来“模拟”缺失值时损失的信息越少。仍然用用户的网络特征为例,随机森林会在网络特征缺失的情况下转而使用其它存在的稍弱的高相关特征(如页面响应时间)的值进行所谓的second split,从而保证了信息量的最大程度保留。事实上,XGBoost为缺失值设定了默认的分裂方向。XGBoost在树的构建过程中选择能够最小化训练误差的方向作为默认的分裂方向,这个默认方向可以是左孩子方向也可以是右孩子方向。对于additive model,常用来处理缺失值的方式是第二种。 对additive model而言,在训练中将missing单独视为一个值处理和在训练前将缺失值填充为mean是等价的,相当于在迭代的时候对目标函数不作为。GBDT作为generalized additive model的一种,它能处理缺失值其实意思是“缺失值虽然会降低信息量, 但不会对最终结果(尤其是其它特征的结果)造成主动性的负面影响”。但由于普通的填充方法相当于假设缺失特征的分布是MCAR的,它能带来的信息量也仅限于用均值或其它值填充时逼近的信息量,且本身会带来uncertainty。 至于SVM为何不擅长处理缺失值,是因为SVM不是基于特征在样本上的总体分布的,而是基于边界点而做的结论。我们看到,只有缺失值是MCAR的才能保证统计量上与观测数据无偏,那么非MCAR的缺失很容易导致分割面的错误移动。做个推论,神经网络也不能很好地处理缺失值,因为边界点上的值的非MCAR缺失会造成梯度判断的方向性错误。相对地,虽然KNN是一个基于距离的模型,但它仍然是一个基于统计的模型,对缺失值仍然是比较robust的。对于样本较为充分的特征,KNN可以接受在训练开始前处理缺失值,并且导致意外的损失的概率较低。 对于神经网络来说,网络的每一层相当于f(wx+b)=f(w′x) f(w1∗f(w2x))=w1w2x=wx。 非线性变换是深度学习有效的原因之一。原因在于非线性相当于对空间进行变换,变换完成后相当于对问题空间进行简化,原来线性不可解的问题现在变得可以解了。 如果不用激励函数,每层的输出都是上层输入的线性函数,很容易验证,无论神经网络有多少层,输出都是输入的线性组合,与没有隐藏层时候的效果相当,这种情况就是最原始的感知机了。 正因为上面的原因,我们决定引入非线性函数作为激励函数,这样深层神经网络就有意义了(不再是输入的线性组合,可以逼近任意函数)。最早的想法是sigmoid函数或者tanh函数,输出有界,很容易充当下一层输入(以及一些人的生物解释)。 下图可以很形象的解释这个问题,左图用一根线是无法划分的。经过一系列变换后,就变成线性可解的问题了。 这里首先要知道TP、FN(真的判成假的)、FP(假的判成真)、TN四种(可以画一个表格)。 几种常用的指标: 什么是AUC: AUC是一个模型评价指标,只能用于二分类模型的评价,对于二分类模型,还有很多其他评价指标,比如logloss,accuracy,precision。如果你经常关注数据挖掘比赛,比如kaggle,那你会发现AUC和logloss基本是最常见的模型评价指标。为什么AUC和logloss比accuracy更常用呢?因为很多机器学习的模型对分类问题的预测结果都是概率,如果要计算accuracy,需要先把概率转化成类别,这就需要手动设置一个阈值,如果对一个样本的预测概率高于这个预测,就把这个样本放进一个类别里面,低于这个阈值,放进另一个类别里面。所以这个阈值很大程度上影响了accuracy的计算。使用AUC或者logloss可以避免把预测概率转换成类别。 AUC是Area under curve的首字母缩写。Area under curve是什么呢,从字面理解,就是一条曲线下面区域的面积。所以我们要先来弄清楚这条曲线是什么。这个曲线有个名字,叫ROC曲线。 ROC曲线是基于样本的真实类别和预测概率来画的,具体来说,ROC曲线的x轴是伪阳性率(false positive rate),y轴是真阳性率(true positive rate)。那么问题来了,什么是真、伪阳性率呢?对于二分类问题,一个样本的类别只有两种,我们用0,1分别表示两种类别,0和1也可以分别叫做阴性和阳性。当我们用一个分类器进行概率的预测的时候,对于真实为0的样本,我们可能预测其为0或1,同样对于真实为1的样本,我们也可能预测其为0或1,这样就有四种可能性: 真阳性率=(真阳性的数量)/(真阳性的数量+伪阴性的数量) AUC的意义: AUC就是从所有1样本中随机选取一个样本, 从所有0样本中随机选取一个样本,然后根据你的分类器对两个随机样本进行预测,把1样本预测为1的概率为p1,把0样本预测为1的概率为p0,p1>p0的概率就等于AUC。所以AUC反应的是分类器对样本的排序能力。根据这个解释,如果我们完全随机的对样本分类,那么AUC应该接近0.5。另外值得注意的是,AUC对样本类别是否均衡并不敏感,这也是不均衡样本通常用AUC评价分类器性能的一个原因。 AUC的几何意义就是ROC曲线下的面积,面积越接近与1表明模型效果越好,随机模型的AUC是0.5。ROC曲线就是你根据模型计算的样本得分卡一刀,把大于阈值的样本找出来,找到的正例比例(找到的正例/总的正例数目)和负例比例(找到的负例/总的负例比例)就是纵横坐标。显然,随机策略这两个比例都等于卡到的样本占总体的比例。所以ROC曲线是一条直线,AUC=0.5. AUC的概率意义是随机取一对正负样本,正样本得分大于负样本的概率。这个定义和几何意义是等价的,具体解释可以参考博客文章 AUC对正负样本比例不敏感: 利用概率解释,还可以得到AUC另外一个性质,对正负样本比例不敏感。 在训练模型的时候,如果正负比例差异比较大,例如正负比例为1:1000,训练模型的时候通常要对负样本进行下采样。当一个模型训练完了之后,用负样本下采样后的测试集计算出来的AUC和未采样的测试集计算的AUC基本一致,或者说前者是后者的无偏估计! 如果采样是随机的,对于给定的正样本,假定得分为s+,那么得分小于s+的负样本比例不会因为采样而改变! 例如,假设采样前负样本里面得分小于s+的样本占比为70%,如果采样是均匀的,即>s+的负样本和 相比于其他评估指标,例如准确率、召回率和F1值,负样本下采样相当于只将一部分真实的负例排除掉了,然而模型并不能准确地识别出这些负例,所以用下采样后的样本来评估会高估准确率;因为采样只对负样本采样,正样本都在,所以采样对召回率并没什么影响。这两者结合起来,最终导致高估F1值! 根据概率解释很容易得到AUC的几条性质: 样本得分都加上某个常数,AUC不变 对正负样本比例不敏感,意味着你可以用负采样后的样本进行模型评估也不会差太多。 神经网络的训练过程,是通过改变神经元的权重,使得网络的输出值尽可能逼近标签以降低误差值,训练一般使用BP算法,核心思想是计算输出和标签之间的损失函数值,然后及其其相对于每个神经元的梯度,进行权重的迭代。 层数比较多的神经网络模型在训练时也是会出现一些问题的,其中就包括梯度消失问题(gradient vanishing problem)和梯度爆炸问题(gradient exploding problem)。梯度消失问题和梯度爆炸问题一般随着网络层数的增加会变得越来越明显。 造成梯度消失的原因: 许多激活函数将输出值挤压在很小的区间内,在激活函数两端较大范围的定义域内梯度几乎为0,造成学习停止,而反向传播的链式法则带来的连乘,使得如果有数趋于0,则结果很小,造成梯度消失问题,如果数都非常大,则结果会很大,造成梯度爆炸。 举例: 对于含有3个隐层的神经网络,梯度消失问题发生时,接近于输出层的hidden layer 3的权重更新相对正常,但前面的hidden layer 1权重更新会很慢,导致前面的层的权重几乎不变,仍然接近于初始化的权重,这就导致hidden layer 1相当于只是一个映射层,对所有的输入做了同一映射,这时该深层网络的学习就等价于只有后几层的浅层网络学习了。 问题产生的原因: 以下图的反向传播为例(假设每一层只有一个神经元且对于每一层yi=σ(zi)=σ(wixi+bi) σ为sigmoid函数) 可以推导出: 而sigmoid的导数σ′(x) σ′(x)如下图 可见,σ′(x) ∂b1∂C越小,因而导致梯度消失的情况出现。 这样,梯度爆炸问题的出现原因就显而易见了,即∣σ′(z)w∣>1 (z=wx+b),除非该层的输入值x在一直一个比较小的范围内。 其实梯度爆炸和梯度消失问题都是因为网络太深,网络权值更新不稳定造成的,本质上是因为梯度反向传播中的连乘效应。对于更普遍的梯度消失问题,可以考虑用ReLU激活函数取代sigmoid激活函数。另外,LSTM的结构设计也可以改善RNN中的梯度消失问题。 梯度下降法的步骤: 梯度下降法的神经网络容易收敛到局部最优,为什么仍然应用广泛? 深度神经网络“容易收敛到局部最优”,很可能是一种想象,实际情况是,我们可能从来没有找到过“局部最优”,更别说全局最优了。 很多人都有一种看法,就是“局部最优是神经网络优化的主要难点”。这来源于一维优化问题的直观想象。在单变量的情形下,优化问题最直观的困难就是有很多局部极值,如 人们直观的想象,高维的时候这样的局部极值会更多,指数级的增加,于是优化到全局最优就更难了。然而单变量到多变量一个重要差异是,单变量的时候,Hessian矩阵只有一个特征值,于是无论这个特征值的符号正负,一个临界点都是局部极值。但是在多变量的时候,Hessian有多个不同的特征值,这时候各个特征值就可能会有更复杂的分布,如有正有负的不定型和有多个退化特征值(零特征值)的半定型 现在看来,神经网络的训练的困难主要是鞍点的问题。在实际中,我们很可能也从来没有真的遇到过局部极值。Bengio组这篇文章Eigenvalues of the Hessian in Deep Learning(https://arxiv.org/abs/1611.07476)里面的实验研究给出以下的结论: 另一方面,即使有局部极值,具有较差的loss的局部极值的吸引域也是很小的。 所以,很可能我们实际上是在“什么都没找到”的情况下就停止了训练,然后拿到测试集上测试,效果还不错。 真的结束于最优点吗? 我们知道,在局部最优点附近,各个维度的导数都接近0,而我们训练模型最常用的梯度下降法又是基于导数与步长的乘积去更新模型参数的,因此一旦陷入了局部最优点,就像掉进了一口井,你是无法直着跳出去的,你只有连续不间断的依托四周的井壁努力向上爬才有可能爬出去。更何况梯度下降法的每一步对梯度正确的估计都在试图让你坠入井底,因此势必要对梯度“估计错很多次”才可能侥幸逃出去。那么从数学上看,什么才是局部最优点呢?这个问题看似很白痴,很多人会说“局部最优点不就是在loss曲面上某个一阶导数为0的点嘛”。这就不准确啦,比如下面这个马鞍形状的中间的那个点: 显然,只用一阶导数是难以区分最优点和鞍点的。 什么是鞍点? 我们想一下,最优点和鞍点的区别不就在于其在各个维度是否都是最低点嘛~只要某个一阶导数为0的点在某个维度上是最高点而不是最低点,那它就是鞍点。而区分最高点和最低点当然就是用二阶导数(斜率从负变正的过程当然就是“下凸”,即斜率的导数大于0,即二阶导数大于0。反之则为“上凹”,二阶导数小于0)。也就是说,若某个一阶导数为0的点在至少一个方向上的二阶导数小于0,那它就是鞍点啦。 当模型参数稍微一多,即n稍微一大,就会发现这个点为鞍点的概率会远大于局部最优点!也就是说,如果最后模型确实在梯度下降法的指引下收敛到了一个导数为0的点,那这个点几乎可以肯定就是一个鞍点。 1)梯度消失: 根据链式法则,如果每一层神经元对上一层的输出的偏导数乘以权值结果都小于1的话,那么即使这个结果是0.99,在经过足够多层传播之后,误差对输入层的偏导数会趋于0。 可以采用ReLU激活函数来有效的解决梯度消失情况,也可以用BN来解决这个问题。 BN: 即在每次SGD时,通过mini-batch来对相应的activation做规范化操作,使得结果(输出信号各个维度)的均值为0,方差为1. 而最后的“scale and shift”操作则是为了让因训练所需而“刻意”加入的BN能够有可能还原最初的输入 2)梯度爆炸: 如何修复梯度爆炸问题? 有很多方法可以解决梯度爆炸问题,本节列举了一些最佳实验方法。 博客推导 首先,要理解反向传播的基本原理,即链式求导法则。 反映到神经网络里: 下面从损失函数开始用公式推导: 反向传播是在求解损失函数L对参数w求导时候用到的方法,目的是通过链式法则对参数进行一层一层的求导。这里重点强调:要将参数进行随机初始化而不是全部置0,否则所有隐层的数值都会与输入相关,这称为对称失效。 ![这里写图片描述](https://img-blog.csdn.net/20180428104250409?) ![这里写图片描述](https://img-blog.csdn.net/20180428104321172?) ![这里写图片描述](https://img-blog.csdn.net/2018042810435013?) PCA的理念是使得数据投影后的方差最大,找到这样一个投影向量,满足方差最大的条件即可。而经过了去除均值的操作之后,就可以用SVD分解来求解这样一个投影向量,选择特征值最大的方向。 PCA的本质是对于一个以矩阵为参数的分布进行似然估计,而SVD是矩阵近似的有效手段。78、损失函数
79、集成学习的区别
学习器间不存在强依赖关系, 学习器可并行训练生成, 集成方式一般为投票;
Random Forest属于Bagging的代表, 放回抽样, 每个学习器随机选择部分特征去优化;
80、机器学习中,为什么经常要对数据进行归一化
x′=x−minmax−min
2)标准差归一化:
x′=x−μσ
81、完整的机器学习项目的流程是什么
82、线性分类器和非线性分类器的区别
线性分类器不足:模型的拟合效果相对弱些
非线性分类器不足:容易过拟合、计算复杂度高、可解释性不好
常见的非线性分类器:决策树、RF、GBDT、多层感知机83、存储结构
结构
运行速度
存储效率
适用场合
数组
快
高
比较适合进行查找操作,还有像类似于矩阵等的操作
链表
较快
较高
比较适合增删改频繁操作,动态的分配内存
队列
较快
较高
比较适合进行任务类等的调度
栈
一般
较高
比较适合递归类程序的改写
二叉树(树)
较快
一般
一切具有层次关系的问题都可用树来描述
图
一般
一般
除了像最小生成树、最短路径、拓扑排序等经典用途。还被用于像神经网络等人工智能领域等等。
84、当机器学习性能遭遇瓶颈时,你会如何优化的?
85、什麽样的资料集不适合用深度学习?
86、机器学习要了解哪些理论知识
87、标准化和归一化的区别
88、解释对偶的概念
89、机器学习中如何进行特征的选择
90、数据预处理
91、有哪些数据处理和特征工程的处理?
92、比下Sigmoid、Tanh、ReLu这三个激活函数
sigmoid函数又称logistic函数,应用在Logistic回归中。logistic回归的目的是从特征学习出一个0/1分类模型,而这个模型是将特性的线性组合作为自变量,由于自变量的取值范围是负无穷到正无穷。
P(y=1∣x;θ)=hθ(x)
P(y=0∣x;θ)=1−hθ(x)
y的值是0或1,所以想让yˆ
93、怎么理解决策树、xgboost能处理缺失值?而有的模型(svm)对缺失值比较敏感
94、为什么引入非线性激励函数
f(wx+b)=f(w′x),对于线性函数,其实相当于f(x)=xf(x)=x,那么在线性激活函数下,每一层相当于用一个矩阵去乘以xx,那么多层就是反复的用矩阵去乘以输入。根据矩阵的乘法法则,多个矩阵相乘得到一个大矩阵。所以线性激励函数下,多层网络与一层网络相当。比如,两层的网络f(w1∗f(w2x))=w1w2x=wx
95、如何衡量分类器的性能
96、如何理解AUC
伪阳性率=(伪阳性的数量)/(伪阳性的数量+真阴性的数量)
97、梯度消失问题及其推导
在后两种情况下,是很难找到局部极值的,更别说全局最优了。
显然这个点也是(一阶)导数为0,但是肯定不是最优点。事实上,这个点就是我们常说的鞍点。98、如何解决梯度消失和梯度爆炸问题
根据链式法则,如果每一层神经元对上一层的输出的偏导乘上权重结果都大于1的话,在经过足够多层传播之后,误差对输入层的偏导会趋于无穷大
可以通过激活函数来解决,或用Batch Normalization解决这个问题。
在深度神经网络中,梯度爆炸可以通过重新设计层数更少的网络来解决。
使用更小的批尺寸对网络训练也有好处。
在循环神经网络中,训练过程中在更少的先前时间步上进行更新(沿时间的截断反向传播,truncated Backpropagation through time)可以缓解梯度爆炸问题。
在深度多层感知机神经网络中,梯度爆炸的发生可能是因为激活函数,如之前很流行的 Sigmoid 和 Tanh 函数。
使用 ReLU 激活函数可以减少梯度爆炸。采用 ReLU 激活函数是最适合隐藏层的新实践。
在循环神经网络中,梯度爆炸的发生可能是因为某种网络的训练本身就存在不稳定性,如随时间的反向传播本质上将循环网络转换成深度多层感知机神经网络。
使用长短期记忆(LSTM)单元和相关的门类型神经元结构可以减少梯度爆炸问题。
采用 LSTM 单元是适合循环神经网络的序列预测的最新最好实践。
在非常深且批尺寸较大的多层感知机网络和输入序列较长的 LSTM 中,仍然有可能出现梯度爆炸。如果梯度爆炸仍然出现,你可以在训练过程中检查和限制梯度的大小。这就是梯度截断。
处理梯度爆炸有一个简单有效的解决方案:如果梯度超过阈值,就截断它们。
——《Neural Network Methods in Natural Language Processing》,2017.
具体来说,检查误差梯度的值是否超过阈值,如果超过,则截断梯度,将梯度设置为阈值。
梯度截断可以一定程度上缓解梯度爆炸问题(梯度截断,即在执行梯度下降步骤之前将梯度设置为阈值)。
——《深度学习》,2016.
在 Keras 深度学习库中,你可以在训练之前设置优化器上的 clipnorm 或 clipvalue 参数,来使用梯度截断。
默认值为 clipnorm=1.0 、clipvalue=0.5。详见:https://keras.io/optimizers/。
如果梯度爆炸仍然存在,可以尝试另一种方法,即检查网络权重的大小,并惩罚产生较大权重值的损失函数。该过程被称为权重正则化,通常使用的是 L1 惩罚项(权重绝对值)或 L2 惩罚项(权重平方)。
对循环权重使用 L1 或 L2 惩罚项有助于缓解梯度爆炸。99、反向传播的推导
推导2
100、PCA降维和SVD降维的区别