ctrl+f
就能找到相应的内容; 对数的函数图如下(截图来自WolframAlpha),当一个真实标签为1类的样本被预测为0类,我们应该对其进行惩罚,预测概率与真实标签之间的差距越大,也就是x越趋近于0,我们应该赋予它更大的损失,对数函数正好能完成这个任务。
这个一个很基础的问题,如果答不出来会很掉分。首先要明确,LR使用的激活函数是Sigmoid,它将模型输出值压缩到(0,1)区间,输出一个预测概率值,从而实现分类。使用的损失函数是BCE。我们需要知道Sigmoid的函数:
S i g m o i d ( z ) = 1 1 + e − z , 其 中 z = w x + b Sigmoid(z) = \frac{1}{1+e^{-z}}, 其中z=wx+b Sigmoid(z)=1+e−z1,其中z=wx+b
那么Sigmoid的导数求解为:
S i g m o i d ′ ( z ) = 1 ( 1 + e − z ) 2 ∗ ( − e − z ) = 1 1 + e − z ∗ − e − z 1 + e − z = 1 1 + e − z ∗ ( 1 − 1 1 + e − z ) = S i g m o i d ( z ) ∗ ( 1 − S i g m o i d ( z ) ) Sigmoid^{'}(z)=\frac{1}{(1+e^{-z})^{2}}*(-e^{-z})\\ =\frac{1}{1+e^{-z}}*\frac{-e^{-z}}{1+e^{-z}}\\ =\frac{1}{1+e^{-z}}*(1-\frac{1}{1+e^{-z}})\\ =Sigmoid(z)*(1-Sigmoid(z)) Sigmoid′(z)=(1+e−z)21∗(−e−z)=1+e−z1∗1+e−z−e−z=1+e−z1∗(1−1+e−z1)=Sigmoid(z)∗(1−Sigmoid(z))
BCE的表达式为:
− B C E = y l o g y ^ + ( 1 − y ) l o g ( 1 − y ^ ) , 其 中 y ^ = S i g m o i d ( z ) -BCE = ylog ŷ +(1−y)log(1−ŷ ),其中ŷ =Sigmoid(z) −BCE=ylogy^+(1−y)log(1−y^),其中y^=Sigmoid(z)
面试的时候要真问到这个题,就只写一个样本的推导过程:
− ∂ B C E ∂ w = ∂ B C E ∂ y ^ ∗ ∂ y ^ ∂ z ∗ ∂ z ∂ w = ( y y ^ + − ( 1 − y ) 1 − y ^ ) ∗ S i g m o i d ′ ∗ ∂ z ∂ w = ( y y ^ + − ( 1 − y ) 1 − y ^ ) ∗ ( y ^ ∗ ( 1 − y ^ ) ) ∗ ∂ z ∂ w = ( y ∗ ( 1 − y ^ ) − y ^ ∗ ( 1 − y ) ) ∗ x = ( y − y ^ ) ∗ x = ( y − S i g m o i d ( z ) ) ∗ x -\frac{\partial BCE}{\partial w} = \frac{\partial BCE}{\partial ŷ}*\frac{\partial ŷ}{\partial z}*\frac{\partial z}{\partial w}\\ =(\frac{y}{ŷ}+\frac{-(1-y)}{1-ŷ})*Sigmoid^{'}*\frac{\partial z}{\partial w}\\ =(\frac{y}{ŷ}+\frac{-(1-y)}{1-ŷ})*(ŷ *(1-ŷ ))*\frac{\partial z}{\partial w}\\ =(y*(1-ŷ)-ŷ*(1-y))*x\\ =(y-ŷ)*x\\ =(y-Sigmoid(z))*x −∂w∂BCE=∂y^∂BCE∗∂z∂y^∗∂w∂z=(y^y+1−y^−(1−y))∗Sigmoid′∗∂w∂z=(y^y+1−y^−(1−y))∗(y^∗(1−y^))∗∂w∂z=(y∗(1−y^)−y^∗(1−y))∗x=(y−y^)∗x=(y−Sigmoid(z))∗x
由于在前面取的负数,所以将负号放到等式另一边,最终的BCE导数为下式子,在计算BCE的梯度时,知道输入的值,输入的类别,以及预测概率值,便能计算得到BCE的梯度。且BCE的梯度和激活函数的梯度无关:
B C E ′ = ( S i g m o i d ( z ) − y ) ∗ x BCE^{'}=(Sigmoid(z)-y)*x BCE′=(Sigmoid(z)−y)∗x
结合逻辑回归LR损失函数梯度推导过程,我们也可以对LR使用均方误差时的梯度进行一番推导。依然只考虑一个样本,均方误差为:
M S E = 1 2 ∗ ( y ^ − y ) 2 = ( y ^ − y ) ∗ S i g m o i d ′ ∗ ∂ z ∂ w = ( y ^ − y ) ∗ S i g m o i d ′ ∗ x MSE = \frac{1}{2}*(ŷ-y)^2\\ =(ŷ-y)*Sigmoid^{'}*\frac{\partial z}{\partial w}\\ =(ŷ-y)*Sigmoid^{'}*x MSE=21∗(y^−y)2=(y^−y)∗Sigmoid′∗∂w∂z=(y^−y)∗Sigmoid′∗x
可以看到,推导到这一步便不可以再往下化简了。推出来的式子和Sigmoid的导数有关,我们知道Sigmoid是存在梯度消失的情况的,当z的值很大时,Sigmoid导数趋近于0,那么我们的参数更新得就会特别慢,这就是问题的原因。
有个个人观点:面试有些问题其实可以说的不那么深,比如说这个问题,就单纯地把它的区别说出来就好了。所以没必要知道这两者的全部区别,毕竟面试官也记不住全部区别(欢迎讨论)。
生成模型
从统计角度出发,估计的是联合概率分布。因为它关注的是数据的产生过程,即x与y的生成关系,不考虑决策边界到底在哪里,只需要找到满足数据的分布模型即可,因而称之为生成模型。常见的生成模型有朴素贝叶斯分类器、马尔可夫模型、高斯混合模型、限制波尔曼机。
判别模型
学习的是条件概率分布,希望能找到一个决策边界能够将数据正确分类。常见的判别模型有kNN、决策树、LR、SVM、Boosting方法。
根据两种方法种类多少,我们也能感受到,判别式模型实践性能是要比生成式模型要好的。
最小二乘法使用的是均方误差作为损失函数,如下:
L o s s = ∑ i = 1 n ( a x i + b − y i ) 2 Loss = \sum_{i=1}^{n}(ax_{i}+b-y_{i})^2 Loss=i=1∑n(axi+b−yi)2
a和b的求解,其实就是分别对a和b求导,令导数为0,提取出a和b的表达式即可,建议自己手动推到一遍,别光看别人的解答。
默认极大似然估计是掌握了的。
y是存在随机性的或者说有噪声,我们假设噪声 ε \varepsilon ε服从高斯分布 N ( 0 , σ 2 ) N(0,{\sigma ^2}) N(0,σ2),那么y表示为 y = w T x + ε y = w^{T}x + \varepsilon y=wTx+ε,所以条件概率 P ( y ∣ w , x ) P(y|w,x) P(y∣w,x)是服从高斯分布的,期望为 w T x w^{T}x wTx,方差为 σ 2 \sigma ^2 σ2,因此我们可以构造出极大似然估计方程:
L = ∑ i = 1 N l o g P ( y i ∣ x i ) = ∑ i = 1 N l o g ( 1 2 π σ ∗ e x p ( − ( y − w T x ) 2 2 σ 2 ) ) = ∑ i = 1 N l o g ( 1 2 π σ ) − ( y − w T x ) 2 2 σ 2 L = \sum_{i=1}^{N}logP(y_{i}|x_{i})\\ =\sum_{i=1}^{N}log(\frac{1}{\sqrt{2\pi}\sigma}*exp(-\frac{(y-w^{T}x)^2}{2\sigma^2}))\\ =\sum_{i=1}^{N}log(\frac{1}{\sqrt{2\pi}\sigma})-\frac{(y-w^{T}x)^2}{2\sigma^2} L=i=1∑NlogP(yi∣xi)=i=1∑Nlog(2πσ1∗exp(−2σ2(y−wTx)2))=i=1∑Nlog(2πσ1)−2σ2(y−wTx)2
如果我们要最大化似然函数,就相当于最小化 ( y − w T x ) 2 2 σ 2 \frac{(y-w^{T}x)^2}{2\sigma^2} 2σ2(y−wTx)2,可以看到,这一项就是最小二乘法要优化的东西。所以我们可以得出结论:当噪声服从均值为0的高斯分布的时候,最小二乘法LSE和极大似然估计法MLE是等价的。
朴素贝叶斯方法是在贝叶斯算法的基础上进行了相应的简化,即假定给定目标值时属性之间相互条件独立。也就是说没有哪个属性变量对于决策结果来说占有着较大的比重,也没有哪个属性变量对于决策结果占有着较小的比重。
Xgboost是基于GBDT改进的梯度提升算法。他们主要有如下区别:
总的来说,划分方法有三种:
构建决策树时,每次选择所以还没有作为划分的节点,计算以他们为划分节点时的信息增益、信息增益率、GINI系数,选择使得这些值最大的节点作为当前的划分节点,直到运行到最大的迭代次数或者决策树已经构建到了最大深度时停止迭代。
为什么要进行决策树剪枝呢?因为使用训练数据构造的决策树可能对训练集的拟合效果特别好,因为树枝很多,但这样往往会导致对未见过的数据拟合能力差,也就是产生过拟合的现象。我们将简化决策树的过程就叫剪枝。
西瓜书上说明了两种方法(第80页),预剪枝和后剪枝:
《统计学习方法》的第78页也描述了一个思想,我觉得也可以作为一种剪枝策略:比如说Xgboost中加入的对树叶子结点数的惩罚项,就是希望我们得到的决策树模型不那么复杂,这不就是剪枝的思想吗?
如果说是问,说一说SVM,那么就要知道SVM有哪些主要的方面:思想、推导过程、核函数,以下说说自己对SVM的理解,可能不太对,指正之。
思想:在保证能够正确划分数据集的情况下,使得决策边界离支持向量尽可能远。根据思想就可以得到目标函数:
min w , b 1 2 ∣ ∣ w ∣ ∣ 2 s . t . y i ( w T x i + b ) ≥ 1 , i = 1 , 2 , ⋅ ⋅ ⋅ , m \min_{w,b}\frac{1}{2}||w||^{2}\\ s.t.\ y_{i}(w^Tx_{i}+b)\ge1,i=1,2,···,m w,bmin21∣∣w∣∣2s.t. yi(wTxi+b)≥1,i=1,2,⋅⋅⋅,m
目标函数中就包含了最大化间隔的思想,这是硬间隔,因为它不容忍样本被划分错误,所有的样本不能被划分到隔离带当中(也就是下图中的margin,图源);当容忍样本划分错误时,这是软间隔,引入一个松弛因子,这个时候样本就能够被划分到下图的margin中。
推导:第一步,构造拉格朗日函数;第二步,对w和b求导,并令导数为0,带入原式,可消除w和b,对偶转化,最大化一个不包含参数w和b的式子;第三步,根据KKT条件求解w和b。
但是我觉得,可能大家都觉得,从吴恩达的机器学习教程中使用铰链损失方面来理解更容易。也就是推导过程中第一步的拉格朗日函数可以理解为,铰链损失加一个正则化项,希望优化这个函数。
这里只把图放在这里,后面会有很多推荐算法类的问题。
传统的推荐算法可以分成几个族:
协同过滤算法(Collaborative Filtering)是最经典的推荐算法,核心思想是:根据用户之前的喜好以及其他兴趣相近的用户的选择来给用户推荐物品。一般选择用皮尔逊相关系数作为相似度度量。它有两种类型:
隐语义模型LFM(Latent Factor Model),其核心思想就是通过隐含特征联系用户兴趣和物品。过程分为三个部分,将物品映射到隐含分类,确定用户对隐含分类的兴趣,然后选择用户感兴趣的分类中的物品推荐给用户。隐语义模型在Top-N推荐中的应用十分广泛。其中MF(矩阵分解、Matrix Factorization)是常用的隐语义模型。
还是那个用户和物品之间的关系矩阵V,我们令其为 V = W ∗ H V=W*H V=W∗H。其中,W的大小为m×r,H的大小为r×n。在隐语义模型中,W(i,j)被解释为用户i属于类别j的权重,H(a,b)被解释为物品b属于类别a的的权重,r为隐因子。对于一个用户,其权重最大的类别被看作是该用户的类别。由于设定共有r个隐含的分类,分类结果也是r个分类。模型要学习的就是W矩阵和H矩阵。人可能理解不了这两个矩阵,但是计算机能理解。
引申一点:这个有点像PCA降维,也用到了特征值分解、奇异值分解,具体什么关系,可以捋一捋。
FM(Factorization Machine)是基于POLY2算法,引入矩阵分解的思想,解决POLY2的一些缺陷,比如特征稀疏的问题。这里给出两个算法的数学模型,首先是POLY2:
z = w 0 + ∑ j = 1 n w j x j + ∑ i = 1 n − 1 ∑ j = i + 1 n w i j x i x j z=w_{0}+\sum_{j=1}^{n}w_{j}x_{j}+\sum_{i=1}^{n-1}\sum_{j=i+1}^{n}w_{ij}x_{i}x_{j} z=w0+j=1∑nwjxj+i=1∑n−1j=i+1∑nwijxixj
然后是FM:
z = w 0 + ∑ j = 1 n w j x j + ∑ i = 1 n − 1 ∑ j = i + 1 n < v i , v j > x i x j z=w_{0}+\sum_{j=1}^{n}w_{j}x_{j}+\sum_{i=1}^{n-1}\sum_{j=i+1}^{n}
FM的数学基础是:当k足够大时,对于任意对称正定实矩阵W,均存在V,使得 W = V V T W=VV^T W=VVT。可以看到,FM其实就是对POLY中的 w i , j w_{i,j} wi,j进行了一个矩阵分解。
FM有以下优点:
TF-IDF(term frequency–inverse document frequency)主要思想是:如果某个单词在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
具体计算方法如下:
T F = n i , j ∑ k n k , j I D F = l o g ∣ D ∣ ∣ j : t i ∈ d j ∣ T F − I D F = T F ∗ I D F TF=\frac{n_{i,j}}{\sum_{k}n_{k,j}}\\ IDF=log\frac{|D|}{|{j:t_{i}}\in d_{j}|}\\ TF-IDF = TF*IDF TF=∑knk,jni,jIDF=log∣j:ti∈dj∣∣D∣TF−IDF=TF∗IDF
其中,TF表示一个词在文档中出现的概率,出现的次数越多,TF越大, n i , j n_{i,j} ni,j表示在文档j中,第i个单词出现的次数;IDF表示表示逆文档频率,即总的文档数除上包含该词的文档数的对数,包含一个词的文档数越少,那么IDF越大,这个词就越具有辨别性。
GBDT在这个算法里面作用是生成新的特征:因为GBDT会生成很多颗树,在树构建好之后,我们的一个特征在树里面会落到不同的叶子节点,然后把这些特征用one-hot向量表示,并把不同子树的one-hot向量连接,就生成了一个新特征。在GBDT中,可以把树的生成过程理解成自动进行多维度的特征组合与特征筛选的过程。然后就是将这个生成的心特征放进R里面进行分类。如下图,图源水印:
优点:1.大大提升了特征工程模型化这一重要趋势,这意味着特征工程可以完全交由一个独立的模型来完成,模型的输入可以是原始的特征向量,不必在特征工程中投入过多的人工筛选和模型设计的精力。2.在一定程度上解决了高阶特征交叉的问题。
精度是检索出相关文档数与检索出的文档总数的比率,衡量的是检索系统的查准率;在分类中可以理解为,返回的阳性样本中,正确的阳性样本所占的比例。
召回率是指检索出的相关文档数和文档库中所有的相关文档数的比率,衡量的是检索系统的查全率。在分类中可以理解为,所有的阳性样本中,正确分类为阳性样本的比例。
推荐系统通常分为两个阶段,首先召回,其次排序。我目前的理解是这样的:召回模型,就是对用户的行为或者是物品进行编码,得到一个embedding;排序模型是对得到的embedding模型进行一个分类,得到一个预测概率值,选择K个做为推荐结果。所以,排序算法的历程就是:LR-》FM-》DeepFM。
推荐系统需要根据用户的历史行为和兴趣预测用户未来的行为和兴趣,对于BAT这类大公司来说,它们已经积累了大量的用户数据,不发愁。但是对于很多做纯粹推荐系统的网站或者很多在开始阶段就希望有个性化推荐应用的网站来说,如何在对用户一无所知(即没有用户行为数据)的情况下进行最有效的推荐呢?这就衍生了冷启动问题。(就相当于基于用户的协同过滤算法中存在的缺陷一样,即改算法不能解决冷启动问题)。
有一些解决方案,如下:
提出的动机:利用手工构造的交叉特征会使得模型具有记忆性,会得到一个不错的效果。但是构建手工特征会非常耗时,那我们希望有模型能够自动构建特征,从而加强特征的泛化能力。简单的模型,比如说协同过滤算法有较好的特征组合能力,但是无法学习潜在关联;FM模型能够学习潜在关联,但是对于特定场景过度泛化。所以Deep & Wide就是想融合这两种算法的优势!
可以从图中看到,左边为wide,右边为Deep。Wide希望记忆能力好,Deep希望泛化能力好。Wide是一些组合特征, W T X + b W^TX+b WTX+b,一些高稀疏的离散特征;Deep部分就是神经网络,Deep部分的输入是每个域的特征,比如说用户下载的APP特征、用户设备类型特征、用户之间的关系,每个域都有一个特定维度的特征,需要进行embedding;最后将两部分的内容组合起来。这是一个架构后续的一些工作改进,就是基于wide、deep两部分的改进。
我就被问到过这个问题。
后面的问题都是基于神经网络的推荐算法,这里先把图给弄上来。
对于一个基于CTR(Click-Through-Rate,点击通过率)预估的推荐系统,最重要的是学习到用户点击行为背后隐含的特征组合。在不同的推荐场景中,低阶组合特征或者高阶组合特征可能都会对最终的CTR产生影响。FM通过对于每一维特征的隐变量内积来提取特征组合。最终的结果也非常好。但是,虽然理论上来讲FM可以对高阶特征组合进行建模,但实际上因为计算复杂度的原因一般都只用到了二阶特征组合。那么对于高阶的特征组合来说,我们很自然的想法,通过多层的神经网络即DNN去解决。
说白了,就是图中所说的,使用FM替换wide & deep中wide部分的LR。需要注意的是:
是基于Deep & Wide进行的改进。因为Deep & Wide存在一个缺点,在Wide部分,需要人工进行特征筛选,二阶交叉,我们希望自动特征筛选,高维特征交叉,因此Deep & Cross替换了Deep & Wide中的Wide部分。
dense特征是数值型的。图左边的公式,每一层都会加上原来这一层的输入,有种残差CNN的味道;都会和第0层的输入进行特征交叉(实现高阶特征交叉,解决只有二阶特征交叉的问题)。
Nerual FM。是针对FM模型提出来的,是FM模型的神经网络化尝试:即将FM的二阶交叉项做为Deep模型的输入,以此加强模型的表达能力,改动的是Deep & Wide中的Deep部分。最主要的贡献就是特征交叉池化层。