见招拆招,算法面试套路~
问题不保证全面,不保证有意义,仅记录我面过的,见过的,觉得可能能面的
答案不保证100%正确,100%全面,能在面试官面前眉飞色舞地吹就行
答案偏口语化,毕竟面试
如有错误,或有补充,欢迎评论指出
安利个非常有用的算法基础教程【牛客网出品】直通BAT — 求职算法精品课,资源私聊(右下角DaoVoice or 文末评论)
机器学习基本概念
- 学习器在训练集上的误差称为训练误差或经验误差,在新样本上的误差称为泛化误差
- 显然,我们希望得到泛化误差小的学习器
- 然而,我们事先并不知道新样本是什么样,实际能做的是努力使经验误差最小化,同时需要对过拟合进行一定处理
- MSE:均方误差
- RMSE:均方根误差,针对异常值更加敏感;衡量预测值与真值之间的偏差,对误差取了平方,使得计算结果与较大值更相关,公式$RMSE=\sqrt{\frac{1}{n}\sum _{t=1}^n(|A_t-F_t|)^2}$
- MRE:平均相对误差
- MAE:平均绝对误差
- MAPE:平均绝对百分比误差,不仅考虑了预测值与真实值的误差,还考虑了误差与真实值之间的比例,公式$MAPE=\frac{100}{n}\sum _{t=1}^n|\frac{A_t-F_t}{A_t}|$
- other
- P:准确率/查准率,真正例(TP)占全部预测正例(TP+FP)的比例
- R:召回率/查全率,真正例(TP)占全部正例(TP+TF)的比例
- F1:准确率和召回率的调和平均
- $F_1=\frac{2RP}{R+P}$
- $F_\beta =\frac{1}{1+\beta ^2}(\frac{1}{P}+\frac{\beta ^2}{R})$
- ROC:横轴假正例率,纵轴真正例率
- 对预测结果进行排序
- 阈值设置为最大值,此时所有样本均为负例,真正例率与假正例率均为零,表现为原点
- 逐渐降低阈值,依次使得每个样本预测为正例
- 如果下一个样本是真正例,对应y值加上1/n,否则x值加上1/n(假设当前坐标为(x, y),如果该样本是真正例,则下一个点坐标为$(x, y+\frac{1}{n^+})$;如果该样本是假正例,则下一个点坐标为$(x+\frac{1}{n^+}, y)$)
- 最后阈值设置最小,使得所有样本预测为正例,此时对应坐标(1, 1)
- 获取更多数据:从数据源头获取、根据数据分布生成、数据增广
- 正则化:更小的参数值w意味着模型的复杂度更低,对训练数据的拟合刚刚好
- Bagging、Boosting、Dropout
- 贝叶斯方法
预测正例P 预测反例N 正例T TP TN 反例F FP FN - 标准归一化
- $z=\frac{x_i-\mu }{\delta }$
- 当使用距离来度量相似性时,标准归一化表现更好
- 需要原始数据至少近似呈现正态分布
- 最大最小归一化
- $z=\frac{x_i-min }{max-min}$
- 缺点是新数据的加入可能导致max和min的变化
- 对方差非常小的属性可以增强其稳定性
- 维持稀疏矩阵中为0的条目
- 图像处理中,常将RGB图像转化为灰度图像后将其值限定在[0 255]的范围
- 线性比例变化法
- softmax变化
- 标准归一化
- 不同特征之间往往具有不同的量纲和量纲单位,使得损失函数可能呈现出扁平状,此时的梯度下降过程是曲折的
- 提升模型的精度,量级相差太多的数运算会导致许多错误,让损失函数中的数据不要太大或者太小
- 梯度下降过程中,能更好的找到最小值
LR
- 基于均方误差最小化来进行模型求解的方法;试图找到一条直线,使所有样本到直线上的欧式距离之和最小
- 从线性模型出发,我们有$y=w^Tx+b$,就是使用x的线性组合去预测y,y也可以是关于y的单调可微函数,这是广义线性模型
- 对于一个二分类问题来说,需要将结果转换为0/1值,最容易想到的就是单位阶跃函数。很明显,这是不可微的
- 于是我们就找到了sigmoid函数,能在一定程度上近似单位阶跃函数
- 最后,LR就是用线性模型的预测结果去逼近真实标记的对数几率
- $y=\frac{1}{1+e^{-z}}$
- 一个事件的几率(odds)是指该事件发生的概率与该事件不发生的概率的比值
- $y’=y(1-y)$
- 最小二乘法试图找到一条直线或者一个超平面,使得所有样本到该直线的欧氏距离最小
- 极大似然估计使模型对于此数据集中样本值的发生概率最大,也就是使模型能尽可能拟合现有数据集中现有的样本
- $P(y=1|x;w)=\sigma (wx)$
- $P(y=0|x;w)=1-\sigma (wx)$
- 取似然函数
- $l(w)=\prod _{i=1}^mP(y_i|x_i;w)=\prod \sigma (wx_i)^{y_i}(1-\sigma (wx_i))^{1-y_i}$
- $-L(x)=log l(w)=\sum _{i=1}^m(y_ilog\sigma (wx_i)+(1-y_i)log(1-\sigma (wx_i)))$
- 问题转化为求L(x)最小值
- $\frac{\partial L}{\partial (wx_i)}=\frac{\partial L}{\partial \sigma (wx_i)}\frac{\partial \sigma (wx_i)}{\partial (wx_i)}$
- $=[-y_i\frac{1}{\sigma (wx_i)}-(1-y_i)\frac{-1}{1-\sigma (wx_i)}]\sigma (wx_i)(1-\sigma (wx_i))$
- $-y_i(1-\sigma (wx_i))+(1-y_i)\sigma (wx_i)$
- $\sigma (wx_i)-y_i$
- 信息量:事件发生概率越大,它所携带的信息量越小$l(x)=-logp(x)$
- 熵:衡量的是事件发生的确定性,所有可能取值的信息量的期望,熵越大,变量的取值就越不确定$H(x)=-\sum _xP(x)logP(x)$
- 交叉熵:衡量着两个分布之间的差异,两个随机分布间的距离度量
- 学习概率模型时,在所有可能的概率模型中,熵最大的模型是最好的模型
- TODU
SVM
- 支持向量机是一种二分类模型,它的基本思路是在特征空间中寻找间隔最大化的分割超平面
- 线性可分支持向量机:训练样本线性可分,硬间隔最大化
- 线性支持向量机:训练样本近似线性可分,软间隔最大化
- 非线性支持向量机:训练样本线性不可分,软间隔最大化+核技巧
- 当训练样本线性可分时,存在无穷多个分割超平面
- 利用间隔最大化可以找到最优的超平面,此时,解是唯一的,对未知样本的泛化能力也是最强的
- 间隔分为函数间隔与几何间隔
- 函数间隔与几何间隔的关系是,几何间隔=函数间隔/w的模
- 函数间隔是$y_i (wx_i+b)$,其中$|wx+b|$相对地表示点x距离超平面的远近,符号是否一致就能表示分类是否正确,整个式子就能表示分类的正确性以及确信度
- 然后我们看到函数间隔是有一定问题的,我们保持超平面不变,只是等比例地改变w,b,此时函数间隔也会发生变化
- 因此引入几何间隔的概念,$y_i(\frac {w} {‖w‖}x_i+\frac {b}{‖w‖})$,将w,b同时除以w的模,使得间隔唯一确定下来
- 公式TODU
- 首先,我们希望最大化几何间隔,约束条件是超平面(w, b)关于每个训练样本点的距离都至少是$\gamma $
- 根据几何间隔与函数间隔的关系,可以写出第二个式子
- 其中,函数间隔的取值并不影响最优化问题的解,我们不失一般性地取$\hat{\gamma }=1$,同时注意到最大化$\frac {1} {‖w‖}$与最小化$\frac {1} {2}‖w‖^2$是等价的
- 核函数:将输入从输入空间映射到特征空间中进行内积计算
- 核技巧:通过核函数,隐式地在高维特征空间中进行学习
- 样本在原始空间不可分时,需要将原始空间映射到一个高维的特征空间,使得样本在这个特征空间内线性可分
- 映射函数往往不好求,通过核函数可以不显式地定义映射函数
- 特征空间一般是高维的,甚至可能是无穷维
- 而在SVM中,只涉及向量之间的内积运算
- 训练数据集的样本点与分离超平面距离最近的样本点的实例
- 也就是$wx+b = ±1$上的点
- 在SVM中,会有很多变量需要进行最优化求解
- SMO的基本思路就是选择两个变量,固定其他变量,针对这两个变量进行求解
- 这样不断将原问题分解为只有两个变量的子问题,并对子问题进行解析求解
- 直到所有的变量都满足KTT条件为止
- 第一个变量选取:最不满足KTT条件的样本点
- 第二个变量选取:与第一个变量间距最大
- 多项式核$K_Q(x_i,x_j)=(\zeta + \gamma x_i^Tx_j)^Q$
- 高斯核函数$K(x_i,x_j)=exp(-\frac{\left | x_i-x_j \right |^2}{2\sigma ^2})$
- $\sigma$很大,低维;$\sigma$很小,高维,可能过拟合
- 为什么也叫径向基核函数,因为高斯函数本身就是一个径向基函数,径向基函数是取值依赖于距离的函数
- 泰勒展开
- 泰勒展开
- 线性核函数
- 优点:最简单,计算速度最快,更可解释
- 缺点:需要线性可分或近似线性可分
- 多项式核函数
- 优点:比线性核函数的限制少,当我们对实际问题有一定了解时,可能很好地认为限定Q
- 缺点:Q较大时,计算困难,可能导致核函数趋近于0或者无穷大;参数选择较多,有三个
- 高斯核函数
- 优点:能映射到无穷维,因此可以拟合复杂的非线性问题;高斯函数数值上在0-1之间,更好计算;参数更好调节
- 缺点:可解释性差;计算速度慢;过拟合
- 线性核函数
- 特征数m远大于样本数n,LR或线性核函数SVM
- 特征数m小于样本数n,高斯核函数SVM
- 样本数n非常大,此时高斯核函数SVM速度会很慢,因该引入更多特征
K-Means
- K-Means是一种聚类算法,基本思想是对于给定的类别数目k,首先给出初始划分,通过迭代改变样本和簇的隶属关系,使得每一次改变后的划分方案都比前一次好
- 选择初始的k个类别中心
- 将每个样本标记为最近的类别
- 更新类别中心,将类别中心更新为该类别中所有样本的均值
- 重复前面两步,直到类别中心的变化小于某阈值或者迭代一定轮数
- 简单、快速
- 对高斯分布的数据集,效果较好
- K需要预先定义
- 均值不可计算时无法使用
- 初值敏感
- 不适用于发现非凸或者大小差别很大的簇
- 对噪声和孤立点敏感
- 经验
- 又放回抽样,对不同的K值做两次聚类,计算相似性
- 计算平均轮廓系数
- 对不同的K值计算平方误差和(SSE),随着K的增大,SSE是肯定会降低的,找到那个开始降低不明显的点
- K-Means++
- 先计算整体样本中心,然后从中心点出发,由近至远均匀采样
- 划分区域,区域中心未聚类中心
- 先用层次聚类初始聚类,再进行K-Means
- 随机选取第一个聚类中心
- 计算每个点到最近聚类中心的距离D(x)
- 选择D(x)最大的点作为下一个聚类中心
- 重复上面步骤,直到得到k个聚类中心
决策树
- 决策树是一种树形结构学习器
- 从根节点开始,对实例的某一特征进行测试,根据测试结果,将实例分配到其子节点
- 如此递归地对实例进行测试并分配,直到达到叶节点
- 由决策树的根节点到叶节点的每一条路径就构建除了一条规则
- 决策树学习本质上是从训练集中归纳出一组分类规则
- 特征选择
- 决策树的生成
- 决策树的修剪
- 节点样本集合为空
- 节点样本属于同一类别
- 节点属性集合为空
- 基尼系数$Gini(p) = - \sum _{k=1}^Kp_k(1-p_k) = 1 - \sum ^Kp_k^2$
- 熵:随机变量的不确定性的度量$H(X) = -\sum _{i=1}^np_ilogp_i$
- 信息增益:g(D,A) = H(D) - H(D|A),H(D)表示对数据集D进行分类的不确定性;H(D|A)表示特征A给定的条件下对数据集D分类的不确定性;信息增益则表示,由于特征A而使得数据集D的分类不确定性减少的程度
- ID3:基于信息增益的大小来逐层确定分类特征,偏向于选择取值多的特征
- C4.5:先从候选特征中找出信息增益高于平均水平的特征,再从中选择信息增益比最高的
- CART:分类树用基尼系数最小化,回归树用平方误差最小化
- 从跟节点开始,对节点计算所有可能的特征信息增益
- 选择信息增益最大的特征作为节点的特征,由该特征的不同取值建立子节点
- 再对子节点递归地调用以上方法,构建决策树
- 直到所有特征的信息增益均很小或没有特征可以选择为止
- 极小化决策树整体损失函数
- 树形,非线性,简单,易于理解
- 能处理数据缺失问题
- 能处理多分类问题
- 能同时处理连续型变量与离散型变量
- 缺点:容易过拟合,启发式
- 每个节点采用二叉分裂,分裂准则采用基尼系数或者平方误差最小
- 剪枝:从生成算法产生的决策树底端开始不断剪枝,直到根节点,形成一个T0, T1, …, Tn的子序列
- 缺失值:训练的过程中保存替代特征,对于缺失数据,用替代特征进行划分
- 划分点选择:未缺失样本的信息增益乘以为缺失样本的占比
- 怎么划分:让同一样本以不同的概率划入到不同的子节点中
- 分类树使用信息增益/信息增益比/基尼系数进行划分节点
- 回归树使用均方误差来划分节点
- 预剪枝:在决策树生成过程中,对每个节点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前节点标记为叶节点
- 先从训练集生成一颗完整的决策树,然后从底向上地对非叶节点进行考察,若将该节点对应地子树替换为叶节点能带来决策树泛化性能提升,则将该子树替换为叶节点
随机森林
- 随机森林是以决策树为基学习器构建Bagging集成
- 进一步在决策树的训练过程中引入了随机特征组合
- 具体地说,就是在决策树每次进行最优划分特征选择时,不考虑所有的特征,而只考虑随机的特征子空间或者随机特征组合
- 高效并行训练
- 决策树的所有优点
- 降低了过拟合的可能
- 可用评估特征的重要性,做特征选择
- 随机森林采用了bagging的方式,每次训练大约有1/3的数据可以用于做验证
- 对于每个样本xn,都有部分子决策树没有使用该样本进行训练,我们将这些子树拿出来就组成了$G_n^− (x_n)$,再求一下误差值,最终将所有的$G_n^− (x_n)$综合起来
- 将OOB的特征值进行重排,对模型效果影响是否显著
集成学习
- 对于一个复杂的任务来说,将多个专家的判断进行适当的综合所得出的判断,要比其中任何一个专家单独的判断好
- Boosting就是从弱学习算法出发,反复学习,得到一系列弱学习器,然后组合这些弱学习器得到一个强学习器
- 先从初始训练集训练出一个基学习器,在根据基学习器的表现对训练样本分布进行调整,使得之前错的训练样本在后续受到更多关注,也就是提高那些被前一轮分类器错误分类样本的权值,而降低那些被正确分类样本的权值
- 最终采用加权多数表决进行综合
- 通过迭代拟合损失函数的负梯度值,让损失函数持续下降
- 每次迭代先求得关于累加函数F(x)的负梯度(- gradient),然后通过弱学习器f(x)去拟合该负梯度,然后将弱学习器f累加到F得到新的F
- 当损失函数是平方损失时,该负梯度值也就是残差,模型退化为回归提升模型
- 基于bootstrap sampling:从m样本中,有放回地取出m个样本
- 构建多个学习器,并集成
- 一个GBDT大规模并行开源框架
- GBDT是一种Boosting
- Boosting是…
- 提升树拟合的是残差,损失函数是均方误差;GBDT拟合的是负梯度值
- GBDT中引入了学习率
- 二分类:比较最终的概率大小,区分属于正类还是负类
- 多分类:生成k棵回归数,每棵树的叶节点表示某一类样本的得分,样本最终对各类的概率由softmax对每个得分归一化处理得到
- 传统的GBDT以CART树为基学习器,XGBOOST还支持线性分类器,这时候的XGBOOST就相当于加了正则项的逻辑回归或者线性回归
- XGBOOST在代价函数中加入了正则项,用于控制模型的复杂度;L1可以控制叶节点的个数,L2可以控制叶节点上的样本数目
- 传统GBDT在优化的时候只用到了一阶导数,XGBOOST则对代价函数进行二阶泰勒展开,同时利用一阶和二阶导信息计算
- 列抽样:XGBOOST借鉴了随机森林的做法,对特征抽样再拟合,不仅防止过拟合,还能减少计算
- 并行结算:XGBOOST在特征粒度上开多个线程同时计算它们各自的最佳信息增益
ARIMA
- AR是使用当前观察点以及若干延迟时期观察点的依赖关系进行建模
- MA是使用当前观察点以及若干延迟时期观察点在移动平均模型上的残差的依赖关系进行建模
- I表示对数据地差分,使得不平稳地序列变得平稳
- 恒定的平均数
- 恒定地方差
- 不随时间变化地自协方差
- 常数均值
- 自协方差与自相关系数只依赖于时间地平移长度而与时间地起止点无关
- 用自相关系数来描述就是随着延迟期k的增加,平稳序列的自相关系数会很快衰减向零
- 在自相关图(PAC)上,随着延迟期数k的增加,自相关系数很快衰减向零,且之后始终控制在2倍标准差范围内
- 为什么引入2倍标准差呢?由于样本的随机性,很难确定是否真正截尾(最初的d阶明显超过2倍标准差范围,而后几乎95%的(偏)自相关系数都落在2倍标准差范围以内,则d阶截尾)
- 平稳性检验(DF检验)
- 白噪声检验
- 定阶
- 偏自相关系数定p
- 自相关系数定q
- 参数估计
- 模型验证
- 模型的显著性检验:残差为白噪声,好的拟合模型能够提取观测序列中几乎所有样本的相关信息
- 参数的显著性检验:每一个未知参数显著非零
- 模型优化,AIC、SBS越小越好
- 方差$\sigma _t^2=D(X_t)=E(X_t-\mu _t)^2$
- 自协方差$\gamma (t,s)=E(X_t-\mu _t)E(X_s-\mu _s)$
- 自相关系数$ACF=\frac{\gamma (t,s)}{\sqrt{D(X_t)D(X_s)}}$
梯度下降
- 梯度下降法是最小化目标函数$J(\theta )$的一种方法
- 梯度下降法利用目标函数关于参数的梯度$\bigtriangledown _\theta J(\theta )$的反方向更新参数。
- 学习率$\eta$决定达到最小值或者局部最小值过程中所采用的步长大小
- 对于凸误差函数,批量梯度下降法能够保证收敛到全局最小值,对于非凸函数,则收敛到一个局部最小值
- BGD
- $\theta = \theta - \eta \bigtriangledown _\theta J(\theta )$
- 在整个训练集上计算损失函数关于参数θ的梯度
- 计算速度慢、内存需求高
- 不能在线更新模型
- 对于非凸损失函数,容易陷入局部最优
- SGD
- $\theta = \theta - \eta \bigtriangledown _\theta J(\theta ;x^i;y^i)$
- 批量梯度下降会对相似样本计算梯度,造成冗余;而SGD从一定程度上消除冗余
- 训练速度快
- 支持在线学习
- 波动性使得SGD可以跳出局部最优,但也使得收敛变得复杂
- 小批量梯度下降
- $\theta = \theta - \eta \bigtriangledown _\theta J(\theta ;x^{i:i+n};y^{i:i+n})$
- 减少参数更新的方差,这样可以得到更加稳定的收敛结果
- 可以利用最新的深度学习库中高度优化的矩阵优化方法,高效地求解每个小批量数据的梯度
- 如果学习率很小或者梯度随着x变化很小,SGD与批梯度下降法具有相同的收敛行为
- BGD
- 动量法(Momentum)
在梯度方向上增加一个分量,这个分量与历史步长有关 - NAG
给动量项预知得能力 - Adagrad
自适应学习率 - Adadelta
克服Adagrad学习率单调递减问题 - RMSprop
Adadelta得一个特例 - Adam
- 动量法(Momentum)
- 如果输入数据是稀疏的,选择任一自适应学习率算法可能会得到最好的结果。选用这类算法的另一个好处是无需调整学习率,选用默认值就可能达到最好的结果
- 优化后期由于梯度变得越来越稀疏,偏差校正能够帮助Adam微弱地胜过RMSprop
- 如果你关心的是快速收敛和训练一个深层的或者复杂的神经网络,你应该选择一个自适应学习率的方法
- 大多数情况下希望避免模型中以一定意义的顺序提供训练数据,通过洗牌避免;另一方面,有些情况下需要逐步解决问题
- 批量归一化
- Early Stopping
- 梯度噪音
LSTM
- RNN对序列的每一个元素都执行相同的任务,输出依赖于先前的计算
- 普通神经网络,基于data0预测result0,data1预测result1
- 当我们的data0跟data1是相互关联的时候,普通的神经网络不能了解这种关联
- 而RNN就是让神经网络具备记住之前发生事情的能力
- 当data0预测result0的时候形成记忆state0,然后在data1预测result1的时候将之前的记忆state0调用过来
- $o_t=g(Vs_t)$
- $s_t=f(Ux_t+Ws_{t-1})$
- 在传统的RNN中,单元状态$s_t$可以表示为,$s_t=f(Ux_t+W_{t-1})$,根据求导的链式法则,可以看出,$s_t$对U、W的偏导跟$s_{t-1}$ 有关,最后会形成一个与W有关的累乘形式
- 这种累乘的求导形式正是导致梯度问题的关键,简单的说,如果这个W小于1,最后的误差就几乎消失,如果这个W大于1,不断累乘,误差可能变成一个无穷大的数
- 在LSTM中,由于门控单元的引入,在反向传播中,先会经过一个加法操作,然后再与遗忘门$f_t$相乘,累乘形式中不再是固定的W,而是变化的遗忘门$f_t$,这能在一定程度上缓解梯度消失
- 进一步看,这个遗忘门是一个sigmoid函数,最终的累乘形式中包含$tanh′(x)\sigma(y)$的形式,而这个乘积本身是一个非0即1的值
- 简单地说,原始RNN的隐藏层只有一个状态,它对于短期的输入非常敏感,LSTM就是再增加一个状态,用它来保存长期的状态
- 全反向传播
- 误差会一直传递到初始时刻
- 计算开销大
- 梯度消失的存在,使得进一步反向传播不再重要
- 截断反向传播
- 真截断:每个误差反向传播n steps
- Tensorflow-style:切成n个子序列,n个误差被反向传播了n steps
- 结论:随着BPTT steps的增加,Tensorflow-style逐渐占据优势
- 全反向传播
- 遗忘门决定了上一时刻的单元状态$c_{t−1}$有多少保留到当前时刻$c_t$
- 输入门决定了当前时刻网络的输入$x_t$有多少保存到单元状态$c_t$
- 输出门决定了单元状态$c_t$有多少输出到LSTM的当前输出值$h_t$
- 遗忘门:$f_t=W_f[h_{t-1},x_t]+b_f$
- 输入门:$i_t=W_i[h_{t-1},x_t]+b_i$
- 输出门:$o_t=W_o[h_{t-1},x_t]+b_o$
- 本次输入的单元状态:$c’_t=tanh(W_c[h_{t-1},x_t]+b_c)$
- 本次输出的单元状态:$c_t=f_t\circ c_{t-1}+i_t \circ c’_t$
- 最终输出:$h_t=o_t \circ tanh(c_t)$
- sigmoid
- 梯度饱和问题:sigmoid在激活值接近于0或者1时,梯度接近于0,反向传播过程中容易出现梯度弥散
- sigmoid函数输出不是以0为中心
- tanh
- 同样存在梯度饱和问题
- 函数输出以0为中心
- Relu(Rectified Linear Unit,修正线性单元)
- 减轻了梯度弥散问题
- Relu会使部分神经元的输出为0,造成网络的稀疏性,缓解过拟合
- 计算速度快
- sigmoid
- TODU
- Gated Recurrent Unit
- 更新门:$z_t=\sigma (W_z[h_{t-1},x_t]+b_z)$
- 重置门:$r_t=\sigma (W_r[h_{t-1},x_t]+b_r)$
- 候选隐藏层:$h’_t=tanh(W[r_t \circ h_{t-1}, x_t]+b)$
- 输出:$h_t=(1-z_t \circ h_{t-1}+z_t \circ h’_t)$
- 更新门:决定了先前记忆信息的保留程度
- 重置门:决定了新的输入与前一时刻记忆的组合方式
- 当$r_t=1$,$z_t=0$。这就是个普通的RNN
CNN
- 卷积神经网络里的“卷积”,代表的是神经网络不再是对每个像素的输入信息做处理了,而是图片上每一小块像素区域进行处理, 这种做法加强了图片信息的连续性。使得神经网络能看到图形, 而非一个点。
- 卷积神经网络与传统全连接网络的区别在于1. 神经元间的连接是非全连接的,2. 同一层中某些神经元之间的连接的权重是共享的
- 在每一次进行多步的卷积时, 神经层可能会无意地丢失一些信息
- pooling就是为了解决这个问题
- 在进行卷积时不压缩长宽,也就是步长设置为1,这样可以尽量保留更多信息,压缩的工作就交给pooling层去做
- pooling分为Max pooling和Average pooling,前者取最大值代表一小块区域,后者取平均值
- 速度快,和sigmoid函数需要计算指数和倒数相比,relu函数其实就是一个max(0,x),计算代价小很多
- 减轻梯度消失问题
- 稀疏性,relu函数在输入小于0时是完全不激活的,因此可以获得一个更低的激活率
- TODU
NLP
- 前面i个词出现的条件下,第i+1个词出现的概率
- $P(x_i, …, x_m)=\prod _{i=1}^mP(w_i|w_i, …, w_{i-1})$
- Word2Vec是从大量文本语料中无监督的方式学习语义知识的一种模型
- Embedding其实就是一个映射,将单词从原先所属的空间映射到新的多维空间中,也就是把原先词所在空间嵌入到一个新的空间中去
- CBOW:给定上下文,来预测input word
- Skip-Gram:给定input word,来预测上下文
- 在skip_window*2的窗口范围内,随机选取num_skips个词,产生一系列(input_word, output_word)对
- (1, 10000)的向量与(10000, 300)的向量直接相乘将消耗大量的资源,转换为取出矩阵中对应向量值为1的索引行
- 改进:
- 词组
- 高频词抽样处理,抽样率根据出现频次计算
- 负采样,每次训练一个样本仅更新一小部分的权重
- 对应输出为1以及少数输出为0的神经元
- negative words的选取,出现频次越高,越容易被选取
- 实际代码中有一种unigram table,一亿维,单词索引重复出现,负采样概率越高,出现次数越多
- TODU