这些知识点基本是本人在准备春招和秋招时做的笔记,东西比较杂,有的是自己总结,有的是参考网上博客,可能不是很准确,还望各位批评指正,多多交流。
答:
相同点:
1:都可以用来防止过拟合
2:其主要思想都是结构风险最小化:在经验风险最小化的基础上(也就是训练误差最小化,原有的损失),尽可能采用简单的模型,以此提高泛化预测精度。
不同点:
1:L1正则化(L1范数,Lasso回归)是各个参数绝对值的和, L2正则化(L2范数,Ridge回归,岭回归)是各个参数的平方和
2:L1通过产生稀疏权重矩阵,趋向于产生少量特征, L2通过选择接近于0的特征来进行正则化
3:L1范数服从拉普拉斯分布(多边形),不完全可微; L2范数服从高斯(圆形)分布,完全可微,因此L2的解更加平滑,且计算更加方便。
4:L1正则化更有解释性,L2则不然, 因为它考虑了所有特征,只是有些趋近于零。
5:L1下降更快一些,以为其梯度为1,L2在趋近于0的时候下降更慢,因此收敛更慢。
6:L1可能有多个解,但是由于L2可微,其只有一个解。
答:
L1范数的图形类似多边形,其顶点在坐标轴上,而标轴上的点会有维度为0,这些顶点更加容易和目标函数相交,因此最优值易于在顶点出现,保证了权值矩阵是稀疏的。
权值矩阵如果是稀疏的,会使得部分特征的系数为0,相当于抛弃了部分的无用特征,使得模型变得更加简单,从而起到正则化的作用,模型的泛化能力更强。
由上也可以使用L1来选择特征,即那些权值为1的特征项,应该是对模型有用的特征。
L0范数,向量中不为零的个数,如果最优化这个话,就是倾向于把参数全整成0,但是因为其不好计算,因此经常使用L1范数代替。
答:
因为L2正则化的符合高斯分布,是完全可微的,相当于一个圆形,而圆形与目标函数很难相交于坐标轴上,因此不易产生稀疏矩阵,但是会使得参数越来越小,这样同样能够起到正则化的效果。(那些没用的特征可能还有一点点用,所以L2并不像L1那样,直接给其0,而是给一个很小的值,也使其参与模型的构建,不过就是权值较小罢了)求导后发现,每次迭代都会使得参数乘以一个小于1的值,所以L2正则化也叫权重衰减。
答:
越复杂的模型会尝试模拟所有的样本点,包括那些异常点,导致过拟合现象。由于包括了异常点,导致较小区间内产生较大的振荡,这些振荡则可由导数来表达。而只有越大的参数,才有可能导致越大的导数值。因此模型的参数越小,模型越简单,输入的数据偏移大一些也不会造成太大的影响,使得模型的泛化能力提高。
答:
在所有可能选择的模型中,我们应该选择能够很好地解释已知数据并且十分简单的模型。就是在保证效果较好的同时选择参数较为简单的模型。
答:
正则化:其本质是约束待优化的参数,限制最优解的空间。一般表现在损失函数中加入和参数权重相关的惩罚项。
Dropout:在神经网络的反向传播误差更新权值的时候,随机失活一部分节点(不进行权值的更新操作)。防止某些特殊的特征只依赖于特定的节点进行计算。其缺点是损失函数不再明确。
从直觉上理解Dropout,就是神经网络的节点越多代表着模型的复杂程度越高,这样对节点的失活则会使得模型变得简单,从而起到正则化的效果。
从另一个角度考虑,训练的时候,每次失活不同的节点,相当于改变了网络结构,使用了不一样的模型进行了训练,但是在测试的时候却是同时使用了所有节点,相当于把模型结合在一起了,有点bagging模型的意思,这样使用多个模型的组合来防止出现过拟合。
实现正则化还有一种方法是early stopping,过拟合就是训练过头了,那就提前停止训练,防止出现过拟合。
注:在使用dropout时,要将所有参数都乘以1/p,此时所有节点都是要使用的。
答:
梯度下降(Gradient Descent):
当目标函数是凸函数时,求解的最优解。其优化思想是用当前位置的负梯度方向作为搜索方向,因为这是当前下降最大的搜索方向,所以也叫最速下降法。
缺点:
1:越靠近最优值,其收敛速度越慢,需要的迭代次数增多
2:可能会出现Z字型下降
批量梯度下降法(Batch Gradient Descent, BGD):
每次计算完所有样本的梯度值之后,再更新参数,相当于每次迭代都得遍历所有的样本。最小化所有训练样本的损失函数,使得最终求解的是(凸函数)全局的最优解,即求解的参数是使得风险函数最小,但是对于大规模样本问题效率低下。
缺点:
1:计算量大,速度慢。由于每次都需要遍历所有样本,因此速度较慢
2:不适合大规模数据,内存受限
3:不能进行在线模型参数更新。
随机梯度下降法(Stochastic Gradient Descent,SGD):
随机梯度是每次选择一个样本进行更新迭代参数一次。最小化每条样本的损失函数,虽然不是每次迭代得到的损失函数都向着全局最优方向, 但是大的整体的方向是向全局最优解的,最终的结果往往是在全局最优解附近,适用于大规模训练样本情况。
缺点:
1:可能不是全局最优解,优化过程会出现较大的噪声
2:每次更新可能不是朝向最优方向的,但这也有好处,避免陷入局部最优解。
小批量梯度下降(Mini-batch Gradient Descent):
小批量梯度下降考虑了批量梯度下降和随机梯度下降结合的方法,在更新速度和更新次数中保持了一个平衡,即每次更新时在样本中选取m个样本,m
1:学习率的选取比较困难
2:容易陷入鞍点,导致不收敛
梯度下降法的优化方法:
Momentum动量技术
通过优化相关方向的训练和弱化无关方向的振荡,来加速SGD训练。Momentum使用V即历史和现在的梯度的exponential moving average来替代当前梯度来更新权重。
与SGD相比,在更新参数theta时,除了像SGD一样按照本次的反向梯度更新外,还会将上次更新的反向梯度乘以系数alpha后也更新到参数theta中,这就是添加的动量项,类似物体的惯性。alpha系数一般设置为0.9。
相当于如果和上次优化方向一样,则加大下降速度,如果优化方向和上次不一样,那就减小下降速度。因此它可以有效地抑制振荡。
AdaGrad:Adaptive Gradient,自适应梯度
是一种基于梯度的优化算法,它能够对每个参数自适应不同的学习速率,对稀疏特征,得到大的学习更新,对非稀疏特征,得到较小的学习更新,因此该优化算法适合处理稀疏特征数据。
与SGD的核心区别在于计算更新步长时,增加了分母:梯度平方累积和的平方根。此项能够累积各个参数gt,i的历史梯度平方,频繁更新的梯度,则累积的分母项逐渐偏大,那么更新的步长(stepsize)相对就会变小,而稀疏的梯度,则导致累积的分母项中对应值比较小,那么更新的步长则相对比较大。
其缺点在于需要计算参数梯度序列平方和,并且学习速率趋势是不断衰减最终达到一个非常小的值
AdaDelta:
是对Adagrad的改进,Adadelta限制把历史梯度累积窗口限制到固定的尺寸w的梯度平方和,而不是累加所有的梯度平方和。
RMSProp:
也是对Adagrad的改进,越早时候计算的梯度对计算衰减系数的影响越小,这种影响的减小速度就是decay_rate的指数衰减速度。
在更新参数的时候,加入一个衰减,计算梯度平方的指数移动平均数(Exponential Moving Average,Vt = p*Vt-1+(1-p)gt),这样可以使得较早计算的梯度,对后面的影响比较小。相比于直接截断的Adadelta,其方法更加软一些。
Adam(Adaptive Moment Estimation):自适应矩估计
Adam综合了Momentum的更新方向策略和RMSProp的计算衰减系数策略。梯度更新值是梯度的指数移动平均数V(Momentum),然后再除以S,S是梯度平方和的平方根(RMSProp),这两个值再分别使用两个参数beta1和beta2进行衰减。
对梯度的一阶矩估计(First Moment Estimation,即梯度的均值)和二阶矩估计(Second Moment Estimation,即梯度的未中心化的方差)。Adam 就是在 RMSprop 的基础上加了 bias-correction(避免分母为0)和 momentum,随着梯度变的稀疏,Adam 比 RMSprop 效果会好。
beta1: 一阶矩估计的指数衰减因子 beta2: 二阶矩估计的指数衰减因子 epsilon:大于但接近 0 的数,放在分母,避免除以 0
基本上是当前最好的优化器,默认选择这个即可,参数也可以使用默认的。
为什么使用指数移动平均数?
在进行权重迭代时我们不仅仅希望使用到当前的梯度值,还希望使用到历史数据来指导我们进行梯度值的更新,同样地,为了保证梯度大的时候step小一些,梯度小的时候step大一些,使得学习率能够自适应地变化,同样也可以使用当前和历史数据来指导学习率的变化,而使用平方和的平方根则使得学习率始终是正的。
这两个现象的本质原因都来至于梯度反向传播的连乘机制(链式),由于网络层数越来越深,导致梯度可能出现指数级增长或减少。
梯度消失:模型参数无法从上层梯度中学习到东西,使得模型参数无法更新,学习失败
梯度爆炸:梯度过大,使得网络不稳定,极端情况下会出现溢出现象。
解决方法:
1:采用ReLu激活函数
2:合适的权重初始化
3:残差结构:通过短路操作,使得梯度可以回传到浅层的网络中
4:Normalization
5:梯度裁剪-解决梯度爆炸问题
6:使用LSTM等网络结构,或者更改网络结构
对缺失值的处理是将其看做是与稀疏矩阵的处理看待,在寻找split point时,只对该列特征值没有缺失的样本进行统计,忽略特征缺失的样本,这样可以减少为稀疏离散特征寻找split point的时间开销。在逻辑实现上,为保证完备性,分别将有缺失特征的样本划分到左子节点和右子节点,分别计算增益,取增益最大的一个方向进行优化,这可以大大提高效率。如果在训练时没有缺失数值,但是在预测时有数值缺失,那么就将缺失数值的样本默认划分到右子节点。
首先上面四个都属于集成学习(ensemble learning),其目的是通过结合多个基学习器的预测结果来改善单个学习器的泛化能力和鲁棒性。
主要分为两大类:
一:个体之间不存在强依赖关系,可以同时生成的并行方法
Bagging:
有放回抽样,多数表决(分类)或者简单平均(回归),各个基学习器之间并列生成,没有强依赖关系
随机森林(random forest):
它是Bagging的变体,在意决策树为基学习器构建Bagging 的基础上,进一步在决策树的训练过程中引入随机特征选择。可分为四个部分,随机采样样本(有放回抽样),随机选择特征,构建决策树。随机森林投票(平均)
就是在单个基学习器(强学习器)的构建过程中,首先随机选取部分样本用于构建决策树,然后在这些样本的特征集上再随机选择部分,只使用这些特征用于构建决策树,这样多个决策树使用不同的特征子集来划分样本,最后的组合使得其效果变得更好。** 随机选取特征会使单个学习器的偏差变大,但是由于随机森林的平均特性,使得其方差变小,这样弥补了偏差的增大。**
在构建决策树时,每个决策树都进行最大可能的生长,而不进行剪枝,在对预测输出是分类问题使用简单的投票法,回归任务使用简单的平均法。
随机森林比Bagging的好处是训练效率应该会更高,因为其只使用了部分特征,可以处理高维数据,容易并行化。
二:个体学习器之间存在强烈的依赖关系,必须串行生成的序列方法
Boosting:
不同的分类器通过串行训练而获取,通过关注被已有分类器错分的那些数据来获取新的分类器。在输出结果上,基于所有分类器的加权求和。加权值是对应分类器在上一轮迭代中的成功度。
GBDT(GradientBoostDT):
其与传统的Boosting区别较大,它的每次计算都是为了减少上一次的残差,为了消除残差,我们可以在残差减小的梯度方向上建立模型。其关键就是利用损失函数的负梯度方向在当前模型的值作为残差的近似值,进而拟合一颗CART回归树。
GBDT会累加所有树的结果,而这种累加是无法通过分类完成的,因此GBDT的树都是CART回归树,而不是分类树。
XGBoost:
其在GBDT的基础上又有了进一步的提升,其能够自动地运用CPU的多线程进行并行计算。
学习器多样:XGBoost不仅以CART作为基学习器,还支持线性分类器,此时,相当于L1和L2正则化的逻辑回归或者线性回归。
加入正则项:使用了正则化控制了模型的复杂度,降低了模型的方差,防止过拟合,这是其由于传统GBDT的特性。
学习率缩减:完成一次迭代后,会将叶子节点的权值乘以该系数。
列抽样:借鉴了随机森林的做法,随机抽取特征,不仅能够防止过拟合,还能减少计算。
对缺失值的处理:对于有特征值缺失的样本,可以自动学习出它的分裂方向
支持并行:它的并行颗粒度实在特征粒度上,而不是在构建每一个树的Tree粒度上。因为决策树在学习时,最耗时的一个步骤就是对特征的值进行排序。而XGBoost在训练之前,预先对数据进行了排序,然后保存下来,后面的迭代中会重复利用这个结构,可以减少计算量。在进行节点的分裂时,需要计算每个特征的增益,最终选取增益最大的那个特征去做分裂,那么各个特征的增益计算就可以使用多线程进行。
缺点:
对所有叶子节点同等看待,有些叶子节点分裂的收益非常小,对结果没有影响,但是还是要分裂,加重了计算代价
预排序方法空间消耗比较大,不仅要保存特征值,还要保存特征的排序索引。
LightGBM:
1:和XGBoost相比,每次并不是分裂所有叶子节点,而是分裂当前叶子节点中收益最大的节点,这样递归下去。不过这样容易产生过拟合,所以需要对最大深度进行限制,从而避免过拟合。
2:Lightgbm使用的是基于histogram(直方图)算法的决策树。其在内存和计算代价衫都有不少的优化。
3:直方图加速:一个子节点的直方图可以通过父节点的直方图减去兄弟节点的直方图得到,从而加速计算。
4:支持类别型的特征输入:对离散特征进行分裂时,每个取值都当做一个桶,分裂时的增益算的是“是否属于某个类别”的增益,类似One-hot编码
5:也同样进行了多线程优化。
理解bagging和boosting模型处理方差和偏差之间的区别:https://www.cnblogs.com/zongfa/p/9502470.html
Bert:
Mask language model:用于获取双向信息
Next sentence prediction:用于获取句子级别的语义信息
position and segment embedding:同时输入单词和句子的位置嵌入信息
ELMO:
Bidirectional LSTM:尝试用于获取双向信息,其实是拼接完成的
OOV:模型的输入和输出采用的是字符级的CNN模型
向量拼接:在输出向量时,拼接的是不同层的隐藏状态,使其获取不同方向,不同级别的语义信息
偏差:
偏差度量了模型预测值和真实值之间的差别,也刻画了模型的拟合能力,偏差越大,意味着模型预测值越偏离真实数据。
高偏差:如果训练误差很大,同时测试误差和其相当,说明模型对数据的拟合不是很好。(增大数据集没有意义,因为模型本身无法拟合现有数据)
1)更多的特征
2)增加多项式特征
3)减小正则化系数
4)尝试非线性模型
5)Boosting,通常具有较小的偏差
方差:
刻画了同样大小训练集变化所带来的学习性能的变化,即数据变动所带来的扰动。就是对预测值方差的描述。这个方差是在不同数据集上得到的预测值之间的方差。
高方差:如果测试误差远高于训练误差,说明模型过拟合,表明模型的方差较大。
1)选用更少的特征
2)增大正则化系数
3)增加训练样本数
4)交叉验证,通过交叉验证得到较优的模型参数
5)Bagging,这个方法通常具有较小的方差
6)Dropout
7)early stop,早停
8)Normalization
对于mean pooling来说,前向传递时是求均值,向后传递。反向传播时,把当前梯度值除以pooling面积的size,然后分配到之前的每个节点上。而不是复制n份,传递给所有的,这样会使得梯度总量变大,从而导致梯度爆炸。
对于Max Pooling来说,前向传递是求得最大值,向后传递。反向传播时,只把当前梯度加到那个最大值的位置,其余位置的梯度不变。这样也保证了梯度总量不变。此时可以通过设置一个mask记录下最大位置为1,其余位置为0,然后梯度和这个mask map相乘,最后再加到上一层的节点上。
在训练集合验证集上表现很好,但是在测试集上表现很差,说明模型过拟合。
可以采用dropout,正则项,增加数据集或进行数据增强处理,Normalization(Batch,layer),提前终止,交叉验证。
答:
n-gram分为两种:
1:用于构建词向量的subword-n-gram,通过分解单词的字符,构建基于字符的n-gram特征,训练出来的词向量可以解决OOV问题,还可以共享权重,对低频词效果比较好。这个是经过模型训练得到的结果。
2:用于分类的word-n-gram,这个用于文本分类的单词级n-gram。
在进行分类任务时,因为其隐藏层是通过求和平均获取的,因此丢失了词序信息,所以增加了词级别的n-gram特征进入补充(同时使用hash进行存储),输入时包括前面提到的subword-n-gram的嵌入(对一个词来说,是所有subword词向量的均值),还有word-n-gram级别的嵌入,将这些经过嵌入的词向量进行加和平均,得到隐藏层的值,然后再利用softmax进行分类。
答:
1:下采样:对较多的那个类别进行欠采样,丢弃一部分数据,使其与较少类别的数据相当。
easy ensemble:
在多数类中有放回随机采样与少数类别个数相当的样本,然后和少数样本组合成新的数据集,通过这些新的数据集训练出n个模型,然后将这些模型进行集成,最后得到一个整体的系统。
BalanceCascade:
每一轮训练时都使用多数类与少数类数量相等的训练集,训练出一个Adaboost基分类器,然后使用该分类器对全体多数类进行预测,通过控制分类阈值来控制假正例率(False Positive Rate),将所有判断正确的类删除。最后,进入下一轮迭代中,继续降低多数类数量。
2:上采样:对较少的类别进行过采样(over-sampling),使其与较多类别的数据相当
随机过采样:
随机选取类别数少的样本,然后将其复制,添加到原有数据集,直到其类别相当,然后再进行训练。容易造成过拟合问题。
SMOTE:
SMOTE全称是Synthetic Minority Oversampling即合成少数类过采样技术。基本思想是对每个少数类样本xi,从它的最近邻中随机选择一个样本 xj( 是少数类中的一个样本),然后在 xi和xj之间的连线上随机选择一点作为新合成的少数类样本。
缺点:
每个样本点都进行了采样,很容易导致重复采样。
不考虑样本点临近样本点的分布,使得采样的点发生类间重叠
Borderline-SMOTE:
先求出少数类别中所有样本的k个最近邻,然后根据每个样本的k个最近邻的类别分布把这些样本进行分类,把哪些既有多数类又有少数类的最近邻的样本(一般为大于一半,但不能全部都是,否则被当做噪声。),划分到集合D中,这些样本代表着两个类别之间的分界面。然后对于集合D中的每一样本Xd,找到其在少数类别中的s个最近邻Xs,按照SMOTE计算出s个少量样本数据。重复此步骤,直到样本数目达到要求。
3:代价敏感学习(cost sensitive learning)为不同的分类结果设置不同的代价值,这样可以使模型关心那些样本数量少的类别。
AdaCost:
算法修改了Adaboost算法的权重更新策略,其基本思想是对代价高的误分类样本大大地提高其权重,而对于代价高的正确分类样本适当地降低其权重,使其权重降低相对较小。总体思想是代价高样本权重增加得大降低的慢。
4:阈值调整(threshold moving):在最后的类别判断时,调整阈值,使得其更难生成样本数目多的类别,这样保证样本少的类别能够被输出。
Rule函数相比于sigmod或者tanh来说计算比较简单,相对于后面两者,不容易出现梯度消失问题,同时使得部分的结果置位零,简化了网络结构,降低模型的过拟合程度。
很奇怪,其实对于Relu和最大池化来说,接到最大池化层前面和后面输出的结果实际上是一样的,而且接到最大池化之后反而会减少模型的计算量。但是我们如果考虑反向传播的话,在卷积层如果不做Relu操作,那么其计算的梯度值就是原有的参数的,而最大池化层由于选取的是最大值,所以较多情况下得到的是一个大于零的值,后面再加一个relu函数的话,其输出值是没有任何变化的,这样整个模型的就相当于没有加relu一样,而这有可能会引起梯度消失问题。
答:
当采样某一维度的时候,固定住其他维度,在以其他维度固定的条件下,对这个维度进行采样。采样后立马更新这个维度的值,然后采样下个维度。依此类推,直到所有维度完成采样,或者采样到一定的步数,这样得到的样本分布,接近于其原始的样本的联合分布。使得采样得到的样本和真实数据较为接近。
答:hierarchical attention network,分层式注意力机制。主要为了捕捉更高层次的语义信息。首先使用双向的神经网络将一个句子中的单词嵌入编码成隐藏状态,然后使用注意力机制获取整个句子的表示向量,将多个句子的表示向量输入到下面的一层类似结构,最后输出整篇文章的向量表示,用于分类或者别的下游任务。
答:
窗口长度越长,捕捉的上下文信息越多,但同时输入和输出的矩阵维度会变大,训练速度会下降。
答:
逻辑回归假设数据服从伯努利分布,通过极大化似然函数的方法,运用梯度下降来求解参数,来达到将数据二分类的目的。
伯努利分布:伯努利分布:是一个离散型概率分布,若成功,则随机变量取值1;若失败,随机变量取值为0。成功概率记为p,失败为q = 1-p。
最大化似然:给定一个数据集,求出使得这个数据集产生概率最大的一组参数。
为什么逻辑回归的损失函数就是其最大似然函数?
目的是为了使得到的预测结果接近真实的结果,那么列出这个模型得到正确分类的概率(是正确分类,而不是得到正类的概率),然后通过更新参数来,最大化这个概率,最后得到的就是模型的最大似然函数。
为什么使用极大似然函数作为损失函数?
一般和平方损失函数(最小二乘法)拿来比较,因为线性回归用的就是平方损失函数,原因就是平方损失函数加上sigmoid的函数将会是一个非凸的函数,不易求解,会得到局部解,用对数似然函数得到高阶连续可导凸函数,可以得到最优解。
答:前者选择信息增益,后者选择信息增益比。前者在选取特征时,更多地偏向哪些拥有较多值的特征,此时样本会被分为更多的叶子节点,使得其纯度更高,熵较小,相应地信息增益也大。但是如果叶子节点过多,可能对于这个分类来说并没有太大的意义,极端一点的例子是使用每样本的id号进行划分,这时,每样本都能被正确分类,且此时信息增益最大,但是这样的分类是没有意义的。C4.5算法并不是直接选择增益率最大的候选划分属性,而是使用了一个启发式:先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的。
LR,SVM,决策树,朴素贝叶斯,最大熵,EM等
首先先说一下总体上的作用:
从前后向传播角度:前向传播过程中,可以使得输入信号通过这些短路连接,传播到高层,相当于提供了一个天然的恒等映射函数,一定程度上可以缓解网络退化问题。后向传播过程中,错误信号可以不经过任何中间矩阵变化传播到前层,可以缓解梯度消失问题。
从集成学习的角度:通过残差结构,使得模型看起来像是不同层的组合形式,模型最后选择的是最优的路径组合。
关于网络退化问题可以这样理解,如果已经有了K层网络,f是这个网络的一个最优拟合。那么如果增加网络层数K+J,按理说模型的效果至少要比f要好,因为即使后面J层无法学习到更多的信息,那么它可以把自己学习成一个恒等映射,而如果学习到东西了,那么模型结果至少不会比f差,但是现实是如果无限增加层数的话,模型效果是变差的。这说明,模型很难学习成一个恒等映射,所以我直接给你一个短路操作,添加了一个恒等映射的结构,这样即使后面的层数学习不到东西,也不会对模型已学习到的信息造成太多影响,而如果学习到了一些东西,那就能提高效果,所以可以多增加这样的残差层,看模型能不能尽可能地学习到更多信息。
加快收敛速度,起到一定的正则化作用降低过拟合,缓解梯度消失
通过改变数据的分布,使得各层之间的数据分布变化不会受到上一层输入变化的剧烈影响。前面层参数的更新将导致后面层输入数据的变化,这会导致后面所有层的输入发生变化,由于积累效应,后面层的变化就会很大,这会使得模型变得不稳定,所以对数据进行归一化,可以使得各层的数据分布稳定。
注意:如果出现数据分布很不平衡的时候,BN效果不是很好。
BN在训练阶段是保持计算每一个Batch的均值和方差的,然后使用这个值对数据进行归一化。
BN在测试阶段是使用的训练过程中每个Batch的均值和方差的指数移动平均数,相当于是使用训练集中的均值和方差来对数据进行归一化的。
联系:
1:都是有监督的分类算法
2:不考虑核函数,两者都是线性方法
3:都是判别型模型
区别:
1:损失函数不同
LR使用的是交叉熵损失函数,SVM使用的是合页损失函数,SVM是结构风险最小化,LR则是经验风险最小化。SVM损失函数中自带正则化,LR则需要自己添加正则化。
LR基于概率理论中的极大似然估计。SVM的目标是最大化分类间隔(硬SVM),或者最大化 [分类间隔—a*分错的样本数量](软SVM)
2:数据依赖性不同
LR对数据分布有很大影响,SVM只对支持向量点有影响。只要新增的数据不影响支持向量,那么SVM的分类面就不会改变,因为它只对在分类面附近的点感兴趣。
3:SVM可以使用核函数
SVM可以使用核函数来解决非线性分类问题,LR如果也采用的话会有很大的计算复杂度。
4:SVM计算复杂,但效果比LR好,适合小数据集;LR计算简单,适合大数据集,可以在线训练。
由上诉比较可以看出LR对异常数据点更加敏感一些,因为它会对所有的数据都进行拟合,但是SVM只关心支持向量,异常点很难对SVM分类面产生影响。
一般来说,CV中常用BN,NLP中常用LN。归一化技术主要的目的是使得每一层的参数分布稳定下来。
NLP任务中,同一个batch中的不同样本长度是不一致的,如果直接使用BN,会破坏句子内部信息的关联度。而且NLP任务实际上是从word embedding开始学习的,如果进行BN则会改变word的嵌入表达。
CV任务中,不同的特征相当于不同位置的像素,如果对同一幅图像的不同位置的像素进行归一化,会直接影响到图像的真实信息,而batch size这个维度进行归一化,则不会影响这样的信息。
FFN其实是使用了两层的dense层,中间使用relu函数,只不过针对的是每个token的位置进行的(相当于kernel size=1的卷积),由512->2048->512。
FFN(x)=Relu(xw1+b1)w2+b2 这样经过两层,得到每个位置的输出。W1-5122048 W2-2048512
1:先把其映射到高维空间再映射到低维空间,可以学习到更加抽象的特征
2:在前面的各层只是在做线性变换,其表达能力可能不够,所以后面需要加入激活函数,增加非线性变换,使得需要注意的位置进行加强,不需要注意的位置进行衰弱。
3:只针对某个位置进行单独的这个操作,不考虑临近的位置,目的是为了提取出这个位置或者这个词所独有的一些信息,前面的注意力机制已经提取到了很多的单词之间的相关性信息了。
论文中提到,由于采用点乘的机制,会使得输入到softmax的值变大,导致在反向求导的时候梯度过小,所以需要对其进行一定的放缩。假设q和k都是服从均值为0,方差为1的分布,进行点乘之后,由于维度为d,那么其结果会变成均值为0,方差为d的分布,所以除以d的开方,可以使得其方差不会随着特征维度的增加而发生太大的变化,至于为啥除以这个值,可能就是经验了吧。
在原版的tranformer中,同时对learned positional encoding和sinusoidal positional encoding进行了实验,发现其效果差异不大,而由于后者使用起来更加简洁,可以拓展到其他长度的序列上,所以默认选择的后者作为位置嵌入。而Bert使用的则是前者,直接随机初始化位置矩阵,然后进行训练,最后可以学习得到一个位置嵌入表示。
前者使用的是绝对位置编码,sinusoidal positional encoding,通过两个位置编码的点积获取相对位置信息。后者在位置编码的基础上,加入了segement position encoding,用于表征单词来至于哪个句子。