机器学习必刷题-手撕推导篇(3):FM与softmax
本专题对高频机器学习面试题进行了搜集、分类和整理,主要包括”手撕推导篇“、“模型比较篇”、“工程经验篇”以及“基础概念篇”等多个子系列,考前刷一刷,面试更好过!
本文是【机器学习必刷题-手撕推导篇】第3篇文章,主要介绍FM和softMax的算法原理和推导过程,内容较干,优点是面试前方便快速回忆。
往期回顾:
推导FM
(1) 线性拟合(LR)
缺点:线性拟合无法自动表示特征的相互组合,组合特征都是通过人工特征工程加入的,费时费力。
(2) Poly2
在LR基础上,加入任意两个特征之间的关系:
其中,wij是feature pair(xi,xj)的权重,只有xi和xj都非零时,组合特征xixj才有意义。
由于样本数据非常稀疏,满足“xi和xj都非零”的样本将会非常少,很容易导致参数wij不准确,严重影响模型性能。
缺点:
- 参数空间大幅增加,由线性增加至平方级,训练效率极低且容易内存溢出;
- 在数据稀疏的场景下,二次项系数难以充分训练。
- 当样本量不足以训练巨大的参数空间时,非常容易过拟合;
(3) FM
FM将wij分解为两个向量的内积:
其中,vi是一个k维向量。直观上看,FM的复杂度为O(kn2),但是通过下式,FM的二次项可以化简,其复杂度可以优化到O(kn)。由此可见,FM可以在线性时间对新样本做出预测。
划重点:FM推导过程
(1) 根据矩阵对称性
(2) f求和项可以单独出来,而且
FM的优势:
- 参数的数量大幅度缩减,从n×(n−1)/2降低到nk;
- 隐向量的点积可以表示原本两个毫无相关的参数之间的关系;
- 可以解决稀疏向量问题,因为每个特征都有一个隐向量,就算是稀疏向量在训练样本没有出现过的组合在预测时也可以进行计算。
推导SoftMax
1、softmax函数
softmax回归是LR在多分类问题上的推广,一般用于神经网络的输出层,叫做softmax层。
假设在进入softmax函数之前,模型的全连接网络输出为:
其中,C为类别的个数。则对每个样本,它属于类别 i 概率为:
更详细地如下图所示:
2、softmax求导
对softmax函数进行求导,即求:
第 i 项的输出 yi 对第
项输入 aj 求导。
代入softmax函数表达式,可以得到:
因此,
当 i = j 时:
当 i != j 时:
3、结合交叉熵loss求导
对一个样本来说,真实类标签分布与模型预测的类标签分布可以用交叉熵
来表示:
最终,对所有的样本,我们有以下loss function:
更多参考:
- softmax详细推导(简单实例):https://www.cnblogs.com/zongfa/p/8971213.html
- Golang语言--将byte的int转换
- HDUOJ------Daydream字符查找-并求其始末位置
- HDUOJ------敌兵布阵
- 复杂SQL性能优化的剖析(二)(r11笔记第37天)
- HDUOJ-------Being a Good Boy in Spring Festival
- Golang语言--slice 切片原理
- GoLang语言--的函数运用
- HDUOJ----John
- 一个SQL性能问题的优化探索(二)(r11笔记第38天)
- HDUOJ---kiki's game
- Golang语言中的多维数组传递
- HDUOJ-----Brave Game
- 事实证明Linux永远是NO.1
- HDUOJ-Counting Triangles
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法