文章目录
- 2.相似度
- 3.正则化
- 3.1 L1
- 3.2 过拟合和欠拟合
- 3.2.1 dropout
- 3.3 欠拟合
- 4. 激活函数
- 4.1 sigmoid
- 5.Bert
- 5.1 Bert原版
- 5.1.2 bert的训练
- 5.2改进
- 5.2.1缺点改进
- 5.2.2任务改进
- 5.3 参数量
- 5.3 transformer
- 5.3.1 多头注意力机制
- 6.搜索
- 6.1pagerank
- 6.2 文本匹配
- 7.神经网络基础
- 7.1Norm
- 7.2 LSTM
- 7.2.1结构
- 7.2.2公式
- 7.2.3 计算参数
- 7.2.4 why解决了梯度消失/梯度消失
- 7.2.5初始化方法,免于梯度消失
- 7.3 归一化
- 7.4 optim
- 1.1 随机梯度下降
- 8.常见函数
- 8.1 softmax
- softmax
- 8.2损失函数
- 8.2.1交叉熵和平方损失
- 8.2.2交叉熵是怎么来的
- 8.2.3分类的损失函数
- 8.2.4 交叉熵的梯度
- 8.2.5 BP
- 8.2.6 KL散度
- 9.word2vec
- 10.训练
- 10.1如何调整学习率
- 11.python语言基础
- 11.1 迭代器和生成器
- 11.2 垃圾回收机制
- 12 sql
- 12.1 阿里的留存量问题
- 13. 评价指标
- 13.1 F1,P,R,AUC
- 13.2 验证集recall和p都高,测试集recall和auc没下降,prec下降很厉害
- 14 . 算法题:
- 14.1n*m的01矩阵,做q次翻转(0->1,1->0),每次翻转后输出行内最长的1序列
- 14.2 .二叉树,每个节点为原点有一个左子树集合,将每个集合的节点向前平移n格,输出层次遍历
- 15. 智力题
- 16 机器学习
- 16.1 决策树:
- 16.1.1 分类树
- 16.1.1.1 ID3:信息增益划分
- 16.1.1.2 C4.5:增益率
- 16.1.1.3 CART
- 16.1.2 回归树
- 16.1.2.1 提升树
- GBDT:提升树基础上的改进
- 16.2 线性回归
- 16.3 word2vec
- 16.3.1 negative sampling
- 16.4 处理过拟合
- 17. 任务
2.相似度
https://blog.csdn.net/ctwy291314/article/details/81667288
3.正则化
-
L1:
- 菱形
-
L2:
- 圆形
- 圆形
-
趋于0的概率大小:
-
L0>Lp(p~(0,1))>L1>L2
-
L0太理想了
-
在实际应用中,由于L0范数本身不容易有一个好的数学表示形式,给出上面问题的形式化表示是一个很难的问题,故被人认为是一个NP难问题。所以在实际情况中,L0的最优问题会被放宽到L1或L2下的最优化。
-
L1–>参数稀疏,特征选择
- 原因一:有尖,最小值容易出现在坐标轴上
- 原因2: L1是拉普拉斯分布,更尖锐,L2则是高斯分布,比L1平缓,所以L1更容易收敛到0的点*
- 原因3:L1是L0的凸优化?之类的。
- 效果就是让w往0靠,使网络中的权重尽可能为0,也就相当于减小了网络复杂度,防止过拟合。
-
L2:平滑
- 经变化后w前面系数为 1−ηλ/n ,由于η、λ、n都是正的。所以 1−ηλ/n小于1,它的效果是减小w,这也就是权重衰减(weight decay)的由来
3.1 L1
- L1不可导的时候该怎么办
- 当损失函数不可导,梯度下降不再有效,可以使用坐标轴下降法,
- 梯度下降是沿着当前点的负梯度方向进行参数更新,
- 坐标轴下降法是沿着坐标轴的方向,假设有m个特征个数,坐标轴下降法进参数更新的时候,先固定m-1个值,然后再求另外一个的局部最优解,从而避免损失函数不可导问题。
- 使用Proximal Algorithm对L1进行求解,此方法是去优化损失函数上界结果。
3.2 过拟合和欠拟合
过拟合:随着训练过程的进行,模型复杂度,在training data上的error渐渐减小。可是在验证集上的error却反而渐渐增大——由于训练出来的网络过拟合了训练集,对训练集以外的数据却不work。
1.正则化(Regularization)(L1和L2)
2.数据增强(Data augmentation),也就是增加训练数据样本,清洗噪声
将原始图片旋转一个小角度
加入随机噪声
一些有弹性的畸变(elastic distortions),论文《Best practices for convolutional neural networks applied to visual document analysis》对MNIST做了各种变种扩增。
截取(crop)原始图片的一部分
3.Dropout
在dropout部分, 我们已经解释过, 之所以dropout可以抑制overfitting, 是因为在训练阶段, 我们引入了 随机性(随机cancel一些Neuron),减少网络的匹配度, 在测试阶段, 我们去除掉随机性, 并通过期望的方式marginalize随机影响。
在BatchNormalization中, 训练阶段, 我们随机选取了Batch进行Normalization, 并计算running mean等, 在测试阶段, 应用running_mean这些训练参数来进行整体Normalization, 本质上是 在Marginalize训练阶段的随机性。 因此, BatchNormalization也提供了 Regularization的作用, 实际应用中证明, NB在防止过拟合方面确实也有相当好的表现。
4…early stopping
3.2.1 dropout
Dropout
在dropout部分, 我们已经解释过, 之所以dropout可以抑制overfitting, 是因为在训练阶段, 我们引入了 随机性(随机cancel一些Neuron),减少网络的匹配度, 在测试阶段, 我们去除掉随机性, 并通过期望的方式marginalize随机影响。
在BatchNormalization中, 训练阶段, 我们随机选取了Batch进行Normalization, 并计算running mean等, 在测试阶段, 应用running_mean这些训练参数来进行整体Normalization, 本质上是 在Marginalize训练阶段的随机性。 因此, BatchNormalization也提供了 Regularization的作用, 实际应用中证明, NB在防止过拟合方面确实也有相当好的表现。
3.3 欠拟合
1)添加其他特征项,有时候我们模型出现欠拟合的时候是因为特征项不够导致的,可以添加其他特征项来很好地解决。例如,“组合”、“泛化”、“相关性”三类特征是特征添加的重要手段,无论在什么场景,都可以照葫芦画瓢,总会得到意想不到的效果。除上面的特征之外,“上下文特征”、“平台特征”等等,都可以作为特征添加的首选项。
2)添加多项式特征,这个在机器学习算法里面用的很普遍,例如将线性模型通过添加二次项或者三次项使模型泛化能力更强。例如上面的图片的例子。
3)减少正则化参数,正则化的目的是用来防止过拟合的,但是现在模型出现了欠拟合,则需要减少正则化参数。
4. 激活函数
4.1 sigmoid
- sigmoid函数特性
- 二分类为什么用sigmoid:
- 二分类满足伯努利假设
- sigmoid可由伯努利假设推出
5.Bert
- Bert
- 是个预训练语言模型,基本结构取自transformer的编码层,基本的bert叠加了12个transformer编码层,但是与transformer不同的是,
- 在输入层:不仅有token embedding,position embedding,还有segment embedding(因为bert允许输入两个句子,以sep间隔,以segment区分
- position encoding:transformer使用sin,cos;
- position encoding:
- 使 PE 能够适应比训练集里面所有句子更长的句子,假设训练集里面最长的句子是有 20 个单词,突然来了一个长度为 21 的句子,则使用公式计算的方法可以计算出第 21 位的 Embedding。
- 可以让模型容易地计算出相对位置,对于固定长度的间距 k,PE(pos+k) 可以用 PE(pos) 计算得到。因为 Sin(A+B) = Sin(A)Cos(B) + Cos(A)Sin(B), Cos(A+B) = Cos(A)Cos(B) - Sin(A)Sin(B)。
- 人为提升多样性:频率不同,
- position encoding:
- multi-head self-attention,K,Q,V=WX
- attention比lstm好在哪里:
- attention会记住重要的,不会因为距离太远而遗忘
- lstm会遗忘(有遗忘门)
- attention可并行
- attention比lstm好在哪里:
- add:残差x+mh-self-attention(x)
- norm:layernorm:使得方差,均值相同(每层输入)
- y=x−E[x]Var[x]+ϵ∗γ+βy = \frac{x - \mathrm{E}[x]}{ \sqrt{\mathrm{Var}[x] + \epsilon}} * \gamma + \betay=Var[x]+ϵx−E[x]∗γ+β
torch,matmul(
torch.softmax(
torch.matmul(q, k.permute(0, 1, 3, 2)) / sqrt(dk) ), v).permute(0, 2, 1, 3).reshape(batch, n, self.dim_v)
- y=x−E[x]Var[x]+ϵ∗γ+βy = \frac{x - \mathrm{E}[x]}{ \sqrt{\mathrm{Var}[x] + \epsilon}} * \gamma + \betay=Var[x]+ϵx−E[x]∗γ+β
5.1 Bert原版
-
XLNET
BERT在第一个预训练阶段,假设句子中多个单词被Mask掉,这些被Mask掉的单词之间没有任何关系,是条件独立的,然而有时候这些单词之间是有关系的,比如”New York is a city”,假设我们Mask住”New”和”York”两个词,那么给定”is a city”的条件下”New”和”York”并不独立,因为”New York”是一个实体,看到”New”则后面出现”York”的概率要比看到”Old”后面出现”York”概率要大得多。
但是需要注意的是,这个问题并不是什么大问题,甚至可以说对最后的结果并没有多大的影响,因为本身BERT预训练的语料就是海量的(动辄几十个G),所以如果训练数据足够大,其实不靠当前这个例子,靠其它例子,也能弥补被Mask单词直接的相互关系问题,因为总有其它例子能够学会这些单词的相互依赖关系。
BERT的在预训练时会出现特殊的[MASK],但是它在下游的fine-tune中不会出现,这就造成了预训练和微调之间的不匹配,微调不出现[MASK]这个标记,模型好像就没有了着力点、不知从哪入手。所以只将80%的替换为[mask],但这也只是缓解、不能解决。
相较于传统语言模型,Bert的每批次训练数据中只有 15% 的标记被预测,这导致模型需要更多的训练步骤来收敛。
另外还有一个缺点,是BERT在分词后做[MASK]会产生的一个问题,为了解决OOV的问题,我们通常会把一个词切分成更细粒度的WordPiece。BERT在Pretraining的时候是随机Mask这些WordPiece的,这就可能出现只Mask一个词的一部分的情况 -
中文上
bert仅仅基于attention,没有考虑词性、对上下文信息也仅仅用了embedding,仅仅用语义信息,会出现错判。Bert对各个词的权重是一样的,不能突出关键词。bert对整句话只抽取一个主旨,像‘我做了头发,我还能买新衣服’这样的句子,就判断不出来了。
在训练中,融入词性、句法信息、停用词,抽取多个主旨,以改善这个现象
5.1.2 bert的训练
- mask掉一部分然后去预测这部分词。
- 判断两个句子是否相连
5.2改进
5.2.1缺点改进
- 中文
- 百度ernie
- bert学不到实体或短语信息:mask实体
- 清华ernie
- 引入:词汇、句法和知识信息
- entity embedding作为ERNIE模型的输入(知识图谱中的)
- mask实体并从知识图谱中找实体对齐
- 百度ernie
- xlnet:https://blog.csdn.net/u012526436/article/details/93196139
- mask:finetune和训练时不一致
- mask之间的顺序不考虑
- 排列组合所有顺序
- albert:https://blog.csdn.net/chaojianmo/article/details/104061718/
- 因式分解embedding:EH1H2
- 跨层参数共享(fc/multihead)\
- NSP->SOP:同个文档里负采样,避免学习到主题
5.2.2任务改进
- MASS:Masked Sequence to Sequence Pre-training for Language Generation
- encoder-att-decoder:mask encoder的部分词,decoder出来这些词
- UNILM:UNIfied pre-trained Language Model
- 3种mask
- mask后文
- mask seq2–学习生成
- 仅mask padding
- 3种mask
5.3 参数量
https://zhuanlan.zhihu.com/p/144582114
5.3 transformer
5.3.1 多头注意力机制
q=torch.matmul(W_q, x)
k=torch.matmul(W_k,x)
v=torch.matmul(W_v,x)
q=q.reshape(batch,n,head,dk).permute(0,2,1,3)
k=k.reshape(batch,n,head,dk).permute(0,2,1,3)
v=v.reshape(batch,n,head,dk).permute(0,2,1,3)# batch,head,n,dk
torch.matmul(
torch.softmax(torch.matmul(q, k.permute(0, 1, 3, 2)) / sqrt(dk) ), v).permute(0, 2, 1, 3).reshape(batch, n, self.dim_v)
6.搜索
6.1pagerank
https://blog.csdn.net/csdn_lzw/article/details/79733962
核心思想:认为万维网中一个页面的重要性取决于指向它的其他页面的数量和质量。
- 如果一个网页被很多其他网页链接到的话说明这个网页比较重要,也就是PageRank值会相对较高
- 如果一个PageRank值很高的网页链接到一个其他的网页,那么被链接到的网页的PageRank值会相应地因此而提高
- 问题
- 终止点问题:有些网站没有出边,迭代后,所有的pagerank->0
- 陷阱:有的节点存在指向自己的路径,多次迭代后,他自己为1,其他为0
- 解决
- 遇见以上情况,关闭当前,随机调到其他网址上
- 遇见以上情况,关闭当前,随机调到其他网址上
6.2 文本匹配
https://blog.csdn.net/ling620/article/details/95468908
- 传统文本匹配
- 词汇相似度,词汇层面
- 词义局限,结构局限,知识局限
- 主题模型–词汇分布
- LSA:SVD
- PLSA:概率
- LDA:
- 词:词的分布代表主题,不同主题的词的分布不同
- 文章的含义:同一主题在不同文章中,出现的概率不同
- 确定好主题与词汇的分布、主题与文章的分布:
- 随机生成文章的各个主题比例
- 再根据主题生成词
- –这是LDA的文章生成过程。忽略了词的顺序,所以不用来生成
- 做主题分析
- 主题模型可做用户画像
- 深层语义
- 表现型:word embedding,之类的,得到向量
- 交互型:判定两个句子的相似度
- 应用
- 短-短:得到两个文本的额向量;求相似度(余弦,欧式)
- 短-长:获得长的主题模型;求该主题模型生成短文本的概率为其相似度
- 长-长:分别求两者的主题模型;计算两个多项式分布之间的距离作为其相似度(海林哥距离)
7.神经网络基础
7.1Norm
原因:
1.网络的各层输入数据的分布则会不断变化。
2.会逐渐使得激活函数趋于饱和,导致梯度消失
https://zhuanlan.zhihu.com/p/74516930
https://www.cnblogs.com/shuimuqingyang/p/14007260.html
(bs,seq_len,embedding_size)
batchnorm:bs
layernorm:embedding_size(神经元)
-
BatchNorm
- why:原始数据分布不一致;经过每层计算后分布也不一致
- why不每层直接变为均值0,方差1的分布?学不到数据特征–所以之后再加上可训练参数变为另一个y(x->均值0方差1的x1->y)
- 训练阶段
- 滑动平均值、方差:x’ = (1-momentum)x + momentumx’’
- 测试阶段
-
batchNorm是在batch上,对NHW做归一化,对小batchsize效果不好;
- layerNorm在通道方向上,对CHW归一化,主要对RNN作用明显;
- instanceNorm在图像像素上,对HW做归一化,用在风格化迁移; GroupNorm将channel分组,然后再做归一化;
- SwitchableNorm是将BN、LN、IN结合,赋予权重,让网络自己去学习归一化层应该使用什么方法
7.2 LSTM
7.2.1结构
- 结构
7.2.2公式
- 公式
7.2.3 计算参数
- 计算参数
7.2.4 why解决了梯度消失/梯度消失
- 没有解决 、
- 多条链路
- 梯度消失得原因:Sigmoid函数有一个缺点:当x较大或较小时,导数接近0或者1;并且Sigmoid函数导数的最大值是0.25
- 链式法则求导时,多个导数同时大于或小于1
- 解决
- 好的参数初始化方式:HE
- 非饱和的激活函数relu,导数为1
- 残差/多路:一条路挂了,其他仍可走
- BATCH NORMAL:梯度消失、内部协方差位移,分布变化
- 梯度裁剪
- 更快的优化器
- 正则化
7.2.5初始化方法,免于梯度消失
https://blog.csdn.net/xxy0118/article/details/84333635
https://zhuanlan.zhihu.com/p/40175178
Xavier:输入和输出可以保持方差相同的正态分布,适用于tanh
He:正向传播时,状态值的方差保持不变;反向传播时,关于激活值的梯度的方差保持不变。
为什么weights初始化要非对称?
如果对称初始化,假设weights全是1,则对于每个神经元的输出结果相同;经历过BP反向传播后,weights的各个位置得到的是相同的更新。
因此无论网络训练多少轮,对于每一层中的各个神经元,weights都是相同的,无法学习(提取)到不同的特征。
为什么weights初始化不能全为0?
原因同上。
为什么初始化值不能太大?
对于sigmoid、tanh激活函数,初始化值太大,使得流入激活函数的值过大,造成饱和现象,当反相传播时,会使得梯度极小,导致梯度弥散。(ReLU函数不受此影响)
为什么初始化值不能太小?
初始化太小时,经过多层网络,输出值变得极小,在反向传播时也会使得梯度极小,导致梯度弥散。(ReLU函数也受此影响!)
7.3 归一化
什么不需要归一化:决策树
归一化的用处:
1.使不同量纲的特征处于同一数值量级,减少方差大的特征的影响,使模型更准确。
2.加快学习算法的收敛速度
归一化:1)把数据变成(0,1)或者(1,1)之间的小数。主要是为了数据处理方便提出来的,把数据映射到0~1范围之内处理,更加便捷快速。2)把有量纲表达式变成无量纲表达式,便于不同单位或量级的指标能够进行比较和加权。归一化是一种简化计算的方式,即将有量纲的表达式,经过变换,化为无量纲的表达式,成为纯量。
标准化:在机器学习中,我们可能要处理不同种类的资料,例如,音讯和图片上的像素值,这些资料可能是高维度的,资料标准化后会使每个特征中的数值平均变为0(将每个特征的值都减掉原始资料中该特征的平均)、标准差变为1,这个方法被广泛的使用在许多机器学习算法中(例如:支持向量机、逻辑回归和类神经网络)。
中心化:平均值为0,对标准差无要求
作者:brucep3
链接:https://www.jianshu.com/p/95a8f035c86c
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
7.4 optim
- SGD,Momentum,Adagard,Adam原理
-
SGD为随机梯度下降,每一次迭代计算数据集的mini-batch、batch、单个的梯度,然后对参数进行更新。随机应该是指单个数据的梯度
-
Momentum参考了物理中动量的概念,前几次的梯度也会参与到当前的计算中,但是前几轮的梯度叠加在当前计算中会有一定的衰减。
-
Adagard在训练的过程中可以自动变更学习的速率,设置一个全局的学习率,而实际的学习率与以往的参数模和的开方成反比。
-
Adam利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率,在经过偏置的校正后,每一次迭代后的学习率都有个确定的范围,使得参数较为平稳。
-
1.1 随机梯度下降
- x=x-lr*g
- 随机:每次算一个数据的梯度
- mini-batch:每次算一批数据的梯度(平均、求和)
optim
- 这里调整的是梯度–但tf是调整的学习率
- 不会因为梯度很大而导致学习率(步长)也变得很大,参数的值相对比较稳定。
8.常见函数
8.1 softmax
- word2vec里因为分母涉及整个词典,因此使用negative sample和层次softmax
softmax
8.2损失函数
8.2.1交叉熵和平方损失
- 交叉熵
- 平方损失:线性回归
- 逻辑回归:极大似然估计
- 交叉熵:分类
- 分类why不用平方损失
-
平方差的函数是凸函数,分类器用了sigmoid,不是凸函数,不利于优化
-
直观上,对特定的分类问题,平方差的损失有上限(所有标签都错,损失值是一个有效值),但交叉熵则可以用整个非负域来反映优化程度的程度。
-
但也可以用。
-
从本质上看,平方差的意义和交叉熵的意义不一样
- 概率理解上,平方损失函数意味着模型的输出是以预测值为均值的高斯分布,损失函数是在这个预测分布下真实值的似然度,softmax损失意味着真实标签的似然度。
- 在分类问题下大部分时候误差并不服从高斯分布。
- 分类问题中的标签,是没有连续的概念的。1-hot作为标签的一种表达方式,每个标签之间的距离也是没有实际意义的,所以预测值和标签两个向量之间的平方差这个值不能反应分类这个问题的优化程度。
- 还有个原因应该是softmax带来的vanishing gradient吧。预测值离标签越远,有可能的梯度越小。李龙说的non-convex问题,应该是一种体现形式
-
作者:北野寺僧人
链接:https://www.zhihu.com/question/319865092/answer/717476767
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- 下面这个解释有个问题:y*f会大于1吗?
8.2.2交叉熵是怎么来的
-
满足伯努利分布,所以用sigmoid
- 可从伯努利分布推导出来:https://zhuanlan.zhihu.com/p/360717173
-
来自KL散度https://blog.csdn.net/tsyccnh/article/details/79163834
-
KL散度用以描述两个分布的差异(真实分布和预测分布)
-
KL=H§+交叉熵
-
DKL(p∣∣q)=∑i=1np(xi)log(p(xi))−∑i=1np(xi)log(q(xi))=−H(p(x))−∑i=1np(xi)log(q(xi))D_{KL}(p||q) \\ = \sum_{i=1}^np(x_i)log(p(x_i))-\sum_{i=1}^np(x_i)log(q(x_i))\\ = -H(p(x))-\sum_{i=1}^np(x_i)log(q(x_i))DKL(p∣∣q)=i=1∑np(xi)log(p(xi))−i=1∑np(xi)log(q(xi))=−H(p(x))−i=1∑np(xi)log(q(xi))
8.2.3分类的损失函数
hinge损失
交叉熵损失
0-1损失
感知器损失
8.2.4 交叉熵的梯度
https://blog.csdn.net/qian99/article/details/78046329
=ai-yi在这里插入图片描述
8.2.5 BP
https://blog.csdn.net/u010916338/article/details/83310442
8.2.6 KL散度
9.word2vec
- cbow.,skip-gram
- 层次softmax:哈希曼树,频率高的路径短
- 负采样:
- 这里还有一种解决问题的思路,我们最后的softmax分出来的类是整个词袋的大小,那么是不是可以把词袋大小减小,因为有些出现概率低的词我们根本可以不考虑。这就是负采样的核心思想。
那么怎么选取频率较高的词,构成最后softmax要分的类呢
只计算正例和负例的loss
负例的选择
https://www.cnblogs.com/pinard/p/7249903.html
作者:吴祺育的笔记
链接:https://www.jianshu.com/p/d8bfaae28fa9
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
https://www.jianshu.com/p/d8bfaae28fa9
10.训练
10.1如何调整学习率
11.python语言基础
11.1 迭代器和生成器
- 迭代器一次性取出全部
- 生成器:yield ,一次取一部分,然后暂停,遇见send和next再继续,一次只取一部分,对内存友好。
11.2 垃圾回收机制
https://blog.csdn.net/xiongchengluo1129/article/details/80462651
- 计数
- 当指向该对象的内存的引用计数器为0的时候,该内存将会被Python虚拟机销毁
- 缺点:
- 无法解决循环引用的问题。A和B相互引用而再没有外部引用A与B中的任何一个,它们的引用计数都为1,但显然应该被回收。
- 标记-清除
- 第一阶段是标记阶段,GC会把所有的『活动对象』打上标记,第二阶段是把那些没有标记的对象『非活动对象』进行回收。
- 如何判断:
- 对象之间通过引用(指针)连在一起,构成一个有向图,对象构成这个有向图的节点,而引用关系构成这个有向图的边。从根对象(root object)出发,沿着有向边遍历对象,可达的(reachable)对象标记为活动对象,不可达的对象就是要被清除的非活动对象(4,5)。根对象就是全局变量、调用栈、寄存器。
- 对象之间通过引用(指针)连在一起,构成一个有向图,对象构成这个有向图的节点,而引用关系构成这个有向图的边。从根对象(root object)出发,沿着有向边遍历对象,可达的(reachable)对象标记为活动对象,不可达的对象就是要被清除的非活动对象(4,5)。根对象就是全局变量、调用栈、寄存器。
- GC
- 对于程序,存在一定比例的内存块的生存周期比较短;而剩下的内存块,生存周期会比较长,甚至会从程序开始一直持续到程序结束。生存期较短对象的比例通常在 80%~90% 之间,这种思想简单点说就是:对象存在时间越长,越可能不是垃圾,应该越少去收集。这样在执行标记-清除算法时可以有效减小遍历的对象数,从而提高垃圾回收的速度。
12 sql
12.1 阿里的留存量问题
电话,讲了下思路
- table A: userid | dt
- userid:用户id
- dt:上次登录时间,登录覆盖,2021-04-13
- 留存率:
- 昨天登录100人
- 今天这100人里只有70人登录
- 留存率:70%
- 解决方法
- 备份昨日的表–临时表
- 每日计算留存率
select *,concat(round(100*count2/count1,2),'%') 留存率
from(SELECTA.dt,count(distinct A.userid) count1,count(distinct B.userid) count2FROMtableA AS ALEFT JOINtableA_copy1 AS BON A.userid = B.useridandDATEDIFF(A.dt,B.dt)group byA.dt)
https://zhuanlan.zhihu.com/p/123292172
13. 评价指标
13.1 F1,P,R,AUC
-
https://zhuanlan.zhihu.com/p/69771204
-
acc=(TP+TN)/(P+N)
-
错误率=(FP+FN)/(P+N)
-
precision=TP/(TP+FP)=TP/len(predict)
-
recall=TP/(TP+FN)=TP/len(gold)=sensitivity
-
真正例率:TPR是 TP/P=TP/(len(gold))=TP/(TP+FN)=recall
-
假正例率:FPR=FP/N=FP/(FP+TN)
-
AUC=ROC的面积,面积大,模型泛化能力强
-
ROC
-
如何画roc
- 调整阈值画的
13.2 验证集recall和p都高,测试集recall和auc没下降,prec下降很厉害
- 原因可能是阈值太低了
- 但序列标注那种有阈值吗?argmax的?
- 可能最高的那个概率也很低,所以矮子里拔高个
- 可以让设置如果最大值很小的话,就不要了
- 阈值低:p高,r低
- 阈值高:p低,r高
- 还有可能是没学好负例。
14 . 算法题:
14.1n*m的01矩阵,做q次翻转(0->1,1->0),每次翻转后输出行内最长的1序列
???感觉题目理解有点问题
输入:
n=5 m=4 q=5
矩阵:
0 1 1 0
1 0 0 1
0 1 1 0
1 0 0 1
0 0 0 0
1 1
1 4
3 1
4 2
4 3
14.2 .二叉树,每个节点为原点有一个左子树集合,将每个集合的节点向前平移n格,输出层次遍历
输入:
2
7 1
7 2
输出:
2 4 6 1 5 3 7
4 1 3 2 5 6 7
.二叉树,每个节点为原点有一个左子树集合,将每个集合的节点向前平移n格,输出层次遍历
他怎么说怎么加,或者做数学题……,数学题应该O(n),但边界怎么处理?边界还是要算一遍?
res = list(range(1,7+1))
move=2
flag=[0]*7
for n in range(7):if(flag[n]!=1):now=nr=[now]while(2*now+1<7):now=2*now+1r.append(now)flag[now]=1# res[r[len(r)]]if(len(r)>1):for i in range(len(r)):now = i-moveres[r[now]] = r[i]+1print(r)print(res)flag[n]=1
15. 智力题
https://www.nowcoder.com/discuss/tiny/694863?channel=666&source_id=feed_index_nctrack&fromIframe=true
16 机器学习
16.1 决策树:
https://blog.csdn.net/qq_22194315/article/details/83752321
16.1.1 分类树
loss:信息增益、增益率、gini_index
16.1.1.1 ID3:信息增益划分
D:数据集,pk:数据集中第k类占比
信息增益=划分前的熵-划分后
划分后熵越低,纯度越高,划分前一定,信息增益越大越好
缺点:它倾向于选取取值数目多的属性,因为这样的属性计算出来的信息增益最大,但往往会导致泛化能力变弱。比如样本集有100个样本,然后样本有一个属性“编号”,100个样本的编号各不相同,如果按编号属性划分则对新样本的预测很不友好,因为编号对label的影响太小了。
基于此,下面就有C4.5的最优属性选取方式就减轻了信息增益的倾向带来的不足。
16.1.1.2 C4.5:增益率
V(a)称为属性a的固有值,如果属性a的取值数目过多,那么IV(a)会变得很大,那么增益率就会变得很小。但是C4.5并不是单纯地选取增益率最大的属性作为最优属性,而是先比较信息增益,也就是说我们在信息增益高于平均水平的属性集合中再选取增益率最大的属性。
16.1.1.3 CART
16.1.2 回归树
16.1.2.1 提升树
- 损失函数(这里是MSE)
- CART回归树:
- 每次找使得loss最小的属性j和划分s,得到回归树
- 计算残差,得到新的数据集(x, r)(r = yi- predict_i)
- 首先遍历数据集的属性集,对于每一个属性j,我们优化上述目标。由于属性j有很多取值,那么从这些取值中先计算划分点,一般是相邻两个值的中间数作为划分点,这样我们的到划分点s的集合。举个例子,假如j有10个取值,那么先从小到大排序,然后可以计算10个取值中的划分点,相邻两个取值的平均值作为一个划分点,我们就可以得到9个划分点。
- 上述优化目标也就是,遍历每一个可能的j和s,寻找使得上述目标最小的j,s来划分当前结点。其中c1、c2是各分支的预测label(一般取分支结点的数据集的均值),R1、R2是各分支的样本子集。注意这里是用CART回归树举例,对于结点的划分只能产生两个分支。划分之后,递归地对子结点利用上述优化目标进行划分,直至到达递归边界(一般是限定叶子个数,最大深度等)。
- 得到这样的回归树之后,我们利用步骤©更新提升树的模型fm,并再次计算残差,又得到新的数据集(x,r),继续拟合生成新的回归树直至迭代到M。
GBDT:提升树基础上的改进
- 初始化
- 残差
- x与负梯度组合成新的数据集,用回归树去拟合,然后更新提升树的模型,这就是GBDT。
16.2 线性回归
16.3 word2vec
skip-gram ,cbow
16.3.1 negative sampling
https://zhuanlan.zhihu.com/p/56106590
1.把常见的词组作为一个单词。
2.少采样常见的词 (比如:A the)
词出现的越多越容易不容易被采样到
3.修改优化目标函数,这个策略称之为“Negative Sampling(负采样)“,使得每个训练样本只去更新模型中一小部分的weights。
出现越多的词越容易被更新
https://www.cnblogs.com/pinard/p/7243513.html
层次softmax
沿着霍夫曼树走
16.4 处理过拟合
https://www.jianshu.com/p/97aafe479fa1
- 数据增强
- Early stopping
- 增加噪声
- 简化网络结构
- Dropout
- 贝叶斯方法:正则化:L1,L2
- BN:
batch normalization
这句话什么意思呢?意思就是同样一个样本的输出不再仅仅取决于样本本身,也取决于跟这个样本属于同一个mini-batch的其它样本。同一个样本跟不同的样本组成一个mini-batch,它们的输出是不同的(仅限于训练阶段,在inference阶段是没有这种情况的)。我把这个理解成一种数据增强:同样一个样本在超平面上被拉扯,每次拉扯的方向的大小均有不同。不同于数据增强的是,这种拉扯是贯穿数据流过神经网络的整个过程的,意味着神经网络每一层的输入都被数据增强处理了。
相比于Dropout、L1、L2正则化来说,BN算法防止过拟合效果没那末明显。
17. 任务
17.1 ner序列标注
17.1.1 边界错误
增大边界错误的loss,便捷预测错给更大的惩罚