notes

召回&排序

特征

从分布类型看,分为连续类型、离散类型、序列类型。从特征主体划分,可以分为User特征、Item特征、Scene特征、交叉特征。

特征预处理通常有归一化、标准化、截断等方法,归一化标准化需要对数据计算/保存最大最小值/方差均值,而且容易随着数据集变化产生较大波动。截断容易损失信息。可取对数等方法。

特征交叉:自动交叉如deepFM,autoint,dcn等,可以剔除不需要交叉的特征,同时做一部分人工交叉,如该用户对某个作者的点击率等。

共线冗余特征:可根据相关性和auc变化剔除部分;也有对其增加gate层学习权重的。

序列特征:可用w2v,bert?得embedding作为特征。

点击率预测模型的校准

不仅需要排序,还需要精确得到点击率。偏差来源有:训练样本采样(尽量不采样)、冷启动(均值为零的随机初始化参数使预测结果接近0.5)、数据分布迁移(及时更新模型or在线学习)、模型收敛到局部最优(减少参数,避免过拟合)。常用的校准方案有Isotonic Regression和Platt Calibration,还有《Practical Lessons from Predicting Clicks on Ads at Facebook》中的校准。

在线学习

在线batch有较大随机性,而且随时间漂移,也不能整体shuffle,不能简单load旧模型去train。可以进行参数冻结(冻结交叉层和fc层,embedding层可训练)、样本回放(当前是1点,取昨天1点以后的样本与当前样本混合训练,因为1点之前的当天样本已经训练过了)、蒸馏学习(以离线模型为teacher,实时模型为student,在 loss 上除了student的Logloss损失,添加了teacher与student之间的交叉熵损失,两个损失的权重比为 1:0.2,目的就是让student模型不要离 teacher太远)

召回评价指标

HR@K, MRR

排序评价指标

auc

AB测试

分为按设备分流和按流量分流。按设备分流需做AA测试,避免个别特例的存在影响AB分组的均衡。按流量分流可能导致一个设备不能保证分在某组,难以长期观测。

auc提升但线上ctr不涨?

base auc:去掉item特征和交叉特征,只保留user和context,auc也可能比较高,但是这时的预测结果是没有意义的,这个auc可以作为base auc,突破了这个值后的auc提升对于线上效果提升是有明显帮助的。

GAUC:每个用户算一个AUC,然后加权平均,需要每个用户行为足够丰富(至少2个曝光,1个点击)。权重一般可以设为每个用户view的次数,或click的次数,而且一般计算时,会过滤掉单个用户全是正样本或负样本的情况。

线上线下特征不一致:上线前一致性校验:生成一批样本离线在线打分查看是否一致;线上线下使用同一套特征抽取框架;监控空值率,取值分布,时效性等;强偏置特征建模是否正确:比如pos bias,一般放到wide侧,线上置为0,这对于只求相对排序的模型来讲没问题,但在一些需要预测点击率的场景,比如广告等,结果就会有很大的偏差。一个可行解:先用0计算所有内容的分数,排序得到预估pos,再按预估pos跑一遍模型打分。

训练过程:训练集测试集重叠、特征穿越、过拟合

线上结果可信度:统计时间长度、ab分组是否正确、serving是否正常

数据分布变化:训练时未有足够曝光的数据、新数据等导致;比如baseline是热门模型,则训练模型的数据集中很少其他样本的数据,训练效果就不好,但是迭代一段时间会逐渐改变,模型本身会影响样本数据,对照组数据也会慢慢发生变化。可行经验:新老模型加权融合逐渐替换、过采样探索型流量得到的样本。

上下游变化、产品变化、特殊时间节点的变化等。

LR&SVM&FM

lr:线性+sigmoid,人工特征组合引入非线性,解释性强,但人工特征成本很高。

svm:用核函数增加高阶特征组合,训练数据中不存在的特征组合没法被训练,泛化能力弱,大规模稀疏特征下尤其严重;求解将涉及m阶矩阵的计算(m为样本个数), 因此SVM不适用于大数据集。

FM:同样是二阶特征组合,但用的是embedding的方式,泛化能力更强,即使训练数据中没有某个特征组合,依然可以用embedding内积来计算其权重。y=w_0+\displaystyle \sum^{n}_{i=1}{w_ix_i}+\displaystyle \sum^{n}_{i=1}{\displaystyle \sum^{n}_{j=i+1}{<v_i,v_j>x_ix_j}}。n为特征数量,k为embedding维度。交叉项可改写为\frac{1}{2}\displaystyle \sum^{k}_{f=1}{((\displaystyle \sum^{n}_{i=1}{v_{i,f}x_i})^2-\displaystyle \sum^{n}_{i=1}{v_{i,f}^2x_i^2})},复杂度由O(kn^2)变为为O(kn)。

MF:矩阵分解,等价于FM的特例,只有user和item的id特征,通过矩阵分解进行embedding化,FM相当于引入side info embedding。

协同过滤:user/item-based(按相似度求加权和),矩阵分解也可以做。

Word2vec

w2v

模型包括一层输入embedding,一层隐层,一层输出softmax。CBOW使用上下文预测当前词,Skip-gram使用当前词预测上下文。softmax计算花销大,有基于哈夫曼树的层次softmax和负采样方法。cbow训练快但低频词效果不好,skip-gram训练慢效果更好。

负采样方法:有N个词,按出现频率作为每个词的线段长度,拼成一个单位长度的线段,取M>>N,把该线段作M等分,可得每个词所在的小线段对应的哪些m_i段。从[0,M]中生成随机整数r,即可得对应哪个词。其中,每个词的频率可取\alpha次幂,len(w_i)=\frac{count(w_i)^{\alpha}}{sum(count(w)^{\alpha})},若\alpha取0即所有词等权重,取1则按词频赋权重。Word2vec中\alpha=0.75,M=1e8,如果采样到w_i自己则跳过。

DeepWalk

cf方法只能用item的共现来学习,很难学到序列和图结构中item间更高阶的相似性;同时随机游走可以增加训练样本。RandomWalk是一种可重复访问已访问节点的深度优先遍历算法。DeepWalk对每个节点多次使用RandomWalk得到一系列节点序列,随后进行Word2vec。

Line

基于广度优先的领域构造,只能使用于无向图。根据权重定义一阶相似度,根据共同邻接节点的一阶相似度定义二阶相似度。模型中使用embedding内积进行sigmoid和softmax来推理一二阶相似度。节点负采样:按节点出度决定选择概率;边负采样:alias。

alias采样:时间复杂度O(1)的离散事件抽样算法。有n个候选,把概率分布画成柱状图,底边为1n,高为概率,高乘以n,再把高的矩形切分到低的,每个列最多两个候选,得到面积1n的大矩形,每个小矩形面积为1*1,维护两个数组分别保存每列原始概率和被挪过来的候选,生成2次随机数得到最终候选。

node2vec

比起deepwalk,node2vec改变了randomwalk时的节点采样路径。前一个节点为t,当前节点为v,后续节点为x;x==t则采样概率为1/p;d_{tx}=1则采样概率为1;d_{tx}=2则采样概率为1/q;p控制返回原来节点的概率,q控制偏向于dfs还是bfs,q越大则更倾向于在当前节点的附近进行采样,也即BFS和结构性。在采样节点路径的时候使用了alias采样。

同质性指item之间性质相近,结构性指item在图结构中所处地位相近。dfs更能学到同质性,bfs更能学到结构性。dfs中更倾向于在一个大类中深度挖掘,bfs虽然在当前节点附近来回走但仍有概率走出当前大类。同质性的相似,是簇内的item在内容属性上的相似;结构性相似的item则是各簇中的热门item。实际推荐中同质性即dfs更有意义,pq的设置可以兼顾结构性。

airbnb embedding

  1. 训练民宿embedding用于短期实时个性化推荐;2.训练民宿类型、用户类型embedding用于长期个性化推荐。分别使用点击/预订序列进行Skip-gram负采样训练,监督训练也尝试过似乎不如无监督的好。

民宿embedding使用点击序列训练,两次点击超过半小时即为新序列。除了全局负采样外,还增加了同城随机样本做负样本,增加了预订民宿做正样本,相当于在无监督的基础上引入了业务上的监督信息。冷启动方面,根据side info选择距离最近的三个民宿embedding取平均,得到新民宿的embedding。

检验结果:k-means聚类,在地图上观察同地区的民宿被聚类到一起;对不同side info的民宿求余弦相似,观察同类型是否相似度更高。

长期推荐使用的embedding根据用户预订行为做推荐,由于样本量少序列短,根据side info对民宿和用户归类,训练类别的embedding。构造序列为(u1,i1,u2,i2...),使得两种embedding在同一向量空间。增加房东拒绝订单的样本做负样本。类型embedding在训练好后和其他特征一起作为gbdt的输入进行训练。

EGES

eges

为了缓解冷启动问题,使用side info参与建模。在GES中,item embedding和side info(种类,店铺,品牌,价格,性别年龄等)embeddings取平均作为item的最终embedding;在EGES中为每个side info赋予可训练的权重,每个item都有自己的权重,权重取softmax归一化,一般item自己的权重最大。离线评价指标:预测被人为去掉的边,取auc、embedding可视化;线上A/B评价ctr。在线上冷启动时,取side info embeddings平均作为item的最终embedding。

构造数据集:有向带权图,边的流向为用户点击顺序,权重为共现次数。用户历史序列按时间窗口截取。点击后停留时间小于1s的、过度活跃用户的数据进行过滤。边权重较小的可能是噪声可以考虑过滤。

doc2vec

word2vec提供了词向量,对于句子向量可以用lda,tfidf带权平均wordvec等方法。doc2vec在word2vec基础上增加句子的embedding矩阵,包含两种方法:PV-DM(使用cbow)和PV-DBOW(使用skip-gram)。PV-DM对句子向量与词向量拼接输入,PV-DBOW使用句子向量来预测其中的几个词。推理时新句子会重新初始化向量并训练模型,其他参数不变直到收敛。

YoutubeDNN召回/排序

召回
排序

召回部分:特征经过embedding送入三层relu,最后一层输出user vector,训练时与item vectors(全连接层的参数,不同于输入层的embedding矩阵,维度大小也不一定一样)内积并softmax得到每类概率,serving时用user vector从item矩阵中取最近邻topN。

排序部分:历史video做embedding平均,上次看此频道/先前看过此视频次数特征做开方和平方,三层relu,训练时按播放时长做weighted logistic,serving时用exp(wx+b)得到期望播放时长。

召回softmax分类数目很大,如何实现?负采样并根据重要性加权、层次softmax(达不到精度,因为遍历树的每个节点时经常要判别不相关的类)。

召回的example age?日志发生距离训练/推理的时间,推理时置为零。比如某个视频点击集中在7天前(比如7天前点击率10%),训练前这个时间点点击率比较低(训练前10分钟点击率3%),模型学出来之后预测的时候把Example Age置为0去预测,预测出这个视频点击率就会更接近3%。同理如果某视频以前不火,训练前突然火了,预测的时候Example Age置为0就可以预测到更高的点击率。如果不带Example Age,模型学出来的该视频点击率更接近于这个训练区间下这个视频平均点击率。

对每个用户采用同样数量的样本的原因?减少高度活跃用户的过度影响。

模型中没有采用rnn结构去建模用户历史浏览?文中说到避免过拟合,案例:用户看过泰勒的视频结果后面全推她的视频导致效果不好。实际上后面谷歌也出了其他rnn的方案。

做video embedding时为何把大量长尾video直接用0向量代替?节省资源,这些video也不好训练,算是一种trade-off。

weighted logistic和期望播放时长?p=sigmoid(\theta x) => exp(\theta x)=\frac{p}{1-p},对于weighted logistic,有exp(\theta x)=\frac{wp}{1-wp}\approx wp=t_{play}p

对部分特征开方和平方共同作为特征输入的原因?引入非线性,从实验看离线效果有提升。

Youtube双塔召回

Youtube双塔召回

双塔结构,Queries特征\{x_i\}_{i=1}^N,item特征\{y_j\}_{j=1}^M
二者内积为s(x,y)=<u(x,\theta),v(y,\theta)>,其中\theta为模型参数,
训练集为T=\{(x_i,y_i,r_i)\}_{i=1}^T,其中r_i为用户反馈,如用户观看时长。

通过query x,从M个item检索得到y的概率为P(y|x;\theta)=\frac{e^{s(x,y)}}{\displaystyle \sum_{j \in [M]}{e^{s(x,y_j)}}}

对数似然函数作为损失函数L_T(\theta)=-\frac{1}{T}\displaystyle \sum_{i \in [T]}{r_i log(P(y_i|x_i;\theta))}

当M很大,考虑计算效率,通常从中选取一个子集作为负样本,在训练MLP模型中负样本通常从固定的语料中做采样得到,对于流数据这里只用batch内的其他正样本item做负样本。在一个mini batch \{(x_i,y_i,r_i)\}_{i=1}^B中,对于每个i,softmax为P_B(y_i|x_i;\theta)=\frac{e^{s(x_i,y_i)}}{\displaystyle \sum_{j \in [B]}{e^{s(x_i,y_j)}}}

batch内item通常服从幂律分布,导致热门item经常出现在负样本中,被过度惩罚了,对s做修正:s^c(x_i,y_j)=s(x_i,y_j)-log(p_j)

估算y_j的出现概率p_j的算法:大小为H的数组A,B,输出空间为[H]的哈希函数h,A表示上次y被采样的时刻,B表示每隔多少步y可以被采样一次,迭代第t步:B[h(y)]=(1-\alpha)B[h(y)]+\alpha(t-A[h(y)]),A[h(y)]=tp_j=1/B[h(y)]

为了减少哈希冲突的影响,设置多套哈希函数h和对应的AB数组,取B的最大值(如果冲突了,B会频繁出现,取值会较小)。

线上推理时会事先计算好item的向量,再根据线上的user向量去找最近邻。

对u,v做归一化、同时用温度系数效果更好。神经网络常用向量内积,但向量内积不满足非负、三角不等式,通过归一化将其转化为距离度量,映射到欧式空间。而归一化之后交叉熵变得难以学习,即\hat{y}接近y时交叉熵仍较大,loss也就仍较大,\hat{y}y相反时loss仍较小,训练变得很难进行;对内积结果放大之后,交叉熵的结果分布更尖锐更接近1和0,对应正确分类的样本loss就很小,错分的就很大,更容易训练。换个角度来说,温度系数对类心附近的简单样本学习力度小,对边界样本和难样本力度大。温度系数也可以按epoch迭代变化,当其接近于0时,得到的分桶概率分布接近于one-hot,当其接近于无穷时,得到的分桶概率分布近似于均匀分布。

在in-batch负采样中有两个问题:selection bias(长尾内容不能被选为样本)和采样分布与实际分布不符,解决的方法是增大batch大小以及减小采样分布与真实分布的偏差。后续谷歌在google play中使用了mixed negative sampling,即在in-batch采样基础上增加一些全局采样的负例。

对于全局采样,如果按曝光概率p作为负采样概率,则热门内容会被过度打压,如果每个内容均等概率,则又没有打压,实际采样概率可以取p^k,k \in [0,1]

腾讯并联双塔召回

对item侧和user侧的输入,分别给到数个分类模型(mlp,dcn,fm,cin),再对每个模型的结果分别做哈达玛积(对应元素相乘),通过lr得到最终分数,lr的参数作为推理时每个子模型结果的权重。

召回的降维查看

对于embedding的效果衡量,可以降维可视化,pca和t-SNE在sklearn和tensorborad都有。pca通过正交变换得到一组方差最大的线性不相关的变量,t-SNE通过仿射变换把数据映射到概率分布上,使低维数据的局部结构接近原始数据。

senet

v2-eb33a772a6029e5c8011a5ab77ea2f74_720w.png

图中的Ftr是传统的卷积结构,X和U是Ftr的输入(C'xH'xW')和输出(CxHxW),这些都是以往结构中已存在的。SENet增加的部分是U后的结构:对U先做一个Global Average Pooling(图中的Fsq(.),作者称为Squeeze过程),输出的1x1xC数据再经过两级全连接(图中的Fex(.),作者称为Excitation过程),最后用sigmoid(论文中的self-gating mechanism)限制到[0,1]的范围,把这个值作为scale乘到U的C个通道上, 作为下一级的输入数据。这种结构的原理是想通过控制scale的大小,把重要的特征增强,不重要的特征减弱,从而让提取的特征指向性更强。

wide&deep

wide&deep

GBDT

DSSM

DSSM

SDM

召回模型。融合用户长期短期偏好。

定义两次浏览间隔少于10分钟则为同一个session,且一个session最大长度为50。短期行为指最近的session,长期行为指最近session前7天以内的session。

文章核心贡献:1.同一个session中可能存在多个兴趣倾向,利用多头自注意力机制对短期兴趣行为建模;2.当前session的兴趣可能会受长期偏好的影响,分别建模长短期行为,利用gated fusion模块进行融合。

SDM

item embedding:id,类别,商店,品牌等concat;user embedding:年龄性别等concat;短期兴趣:用户行为序列->lstm->multihead_self_att->和user做attention;长期兴趣:不同维度行为序列分别与user做att,拼接过fc;gated fusion:G=sigmoid(W_1User+W_2Long+W_3Short+b), out=(1-G)Long+GShort

DIN, DIEN

din用target对用户历史做attention,dien用gru处理用户历史,并和target做attention。

warm up

参考

模型蒸馏

参考

point/pair/list wise

重排序

聚类

数据增强

dropout: 随机丢弃部分神经元,以此来避免在训练过程中的过拟合,每次丢弃后产生的子模型都不一样,所以 Dropout 一定程度上使得训练后的模型是多个子模型的组合约束。

对比学习/r-drop: 对每个样本两次前向传播,得到的两次输出预测P_1,P_2是两个不同子网络的两个预测值,对P_1,P_2的KL散度加权作为一项损失。直观地说,在训练时,Dropout 希望每一个子模型的输出都接近真实的分布,然而在测试时,Dropout 关闭使得模型仅在参数空间上进行了平均,因此训练和测试存在不一致性。而 R-Drop 则在训练过程中通过刻意对于子模型之间的输出进行约束,来约束参数空间,让不同的输出都能一致,从而降低了训练和测试的不一致性。

对抗训练: 在输入或embedding处加小扰动。

mix-up: 对两个样本的x和y按权重\lambda线性相加,组合出新的样本,\lambda服从beta分布。

transformer, bert

transformer详解

multihead transformer:中对多个head的结果concat后过线性变换。举个例子 如果输入是 token64 ,分为8 head, 每个head 输出 为 token8 , 8个 head concate 成 token* 64, 因为不同head 之间信息缺乏交流,需要再用一个矩阵把不同head信息进行融合。其实关于这个8,苏神也有理论的解释,最小熵原理。

position emb提供语义顺序关系,论文里是利用写死的周期函数,不过后面有很多改进方案。

bert开源模型为什么序列上限512? BERT中的Positional Embedding和Transformer中的Positional Embedding实现方式并不一样,后者是通过三角函数公式计算得到,而前者本质上则是一个可学习的embedding层。在开源模型训练时为了加速训练,90%的step用长度128训练,10%用512训练。如果要突破该限制,可以扩大Positional Embedding层,前512个向量沿用开源参数,后面的参数自己训练;也可以对文本做滑动窗口多次计算。

bert做语义相似度计算,可以用[SEP]分开两句,标签用0/1,也可以做成双塔/孪生网络在顶层交互两个句子的特征;前者两句更早交互,更容易学习到深层的语义信息,但由于样本对数多导致训练时间更长。

其他

RNN系列

rnn梯度消失/爆炸。lstm加门控遗忘过久信息,cell state保存长期信息。gru和lstm性能类似但参数少可视为简化版,选择可由实验决定。参考。rnn模型需要序列训练,相当耗时,可用attention/transformer代替。

神经网络为什么归一化

参考。数值问题,一个w过大,x稍微变化导致结果变化很大;训练会走z字形,w大小范围不同的参数训练速度不一样,影响收敛速度;评价标准归一化更好比较;用了sigmoid等函数的不容易饱和;数值小的参数和特征不容易被埋没掉。

auc和gauc

参考

知识蒸馏

参考

EE算法

基础冷启动算法,看作躲避老虎机问题,每个臂是一个item,该臂的收益是点击率,对臂的排序即算法输出。

汤普森采样

假设每个臂收益分布符合beta(win,lose)分布,win,lose分别是试验中点击和不点它的次数。每次选择臂的方法是:每个臂按beta分布生成随机数b,选择结果最大的去摇。

beta分布:f=c*x^{\alpha-1}{(1-x)}^{\beta-1},均值为\alpha / (\alpha + \beta)\alpha + \beta越大曲线越窄,生成的随机数越接近均值。

初始化:新item要进行探索,可以设置公式为beta(1+win,1+lose),即点击率初始化为1。也可以根据先验知识,比如item平均点击率3%,可设置为beta(3+win,97+lose),可能更贴合实际情况。

UCB

score_{i}=\frac{Click_{i}}{Show_{i}}+\sqrt{\frac{2ln(Show_{u})}{Show_{i}}}

前一项是点击率,当item试验次数很大时,后一项接近0,反之点击率置信度不高,后一项分数用来优先探索。

初始化:对于新item,初始Show_{i}设置越小探索概率越大。

Embedding 扰动

主要考虑模型在小扰动下的稳健性,一种正则化方法。max-min game。cv和nlp用的多。
1.往x里加上\Delta x,使loss越大越好;满足||\Delta x|| \leq \epsilon
2.用(x+\Delta x,y)作为样本训练模型最小化损失;
3.循环直到收敛。
Fast Gradient Method(FGM):\Delta x取上升梯度,标准化避免它过大。

GAN

接受随机信号的生成器G,分类模型判别器D,先固定G训练k次D分辨输入来自G还是真实样本,再固定D训练1次G使得G的结果更接近真实样本。当D无法分辨时,即输出0.5左右则收敛。

类别不平衡问题

过采样欠采样,损失加权,数据增强,度量学习

新item或长尾item的曝光

它们早期点击率不稳定,后期只有点击率高的曝光量才会大,可取曝光量前20%内容的平均点击率做默认点击率,与实际点击率加权,权重取曝光量。算法层面有冷启动、多样性、EE(UCB、汤普森采样)等方法。

loss上升原因?

学习率过大、优化带惯性(一段时间后应该下降)、召回数据集采样范围内(潜在的)正样本多。

能否用一个统一的模型代替多路召回?

不能,面对海量物料库,模型召回结果很可能集中在头部内容(可头部数据降采样,针对重要特征做dropout等),多路召回时每一路靠硬性截断,可以保证某类内容总能召回。

是否可以用一个模型统一召回和排序?

不能,海量数据,线上跑模型有耗时要求;数据分布也不一样,召回是面向全部数据,排序面向曝光数据。

Batch Norm & Layer Norm

BN的提出?

在深度学习中,第L+1层的输入,也可能随着第L层参数的变动,而引起分布的变动。这样每一层在训练时,都要去适应这样的分布变化,使得训练变得困难。这种层间输入分布变动的情况,就是ICS(Internal Covariate Shift)。而BN提出的初衷就是为了解决这一问题。另外ICS可能导致在过激活层的时候,容易陷入激活层的梯度饱和区,降低模型收敛速度。同时BN还有一定的正则作用,避免极端数据造成的过拟合。

模型推理时的处理?

推理时的方差和均值,可以用训练数据做无偏估计,或者用移动平均的方法求running mean/var。

为什么BN里要引入Scale和Shift?

当时论文作者在设计BN 的时候,默认将BN加在了激活函数之前,所以才有此话,不管激活函数时sigmoid、tanh、还是relu, 如果做完Normalize之后不加个线性变换,那么将导致大部分输入处于激活函数的线性部分,或者一半的输入处于relu 的dead部分。为了避免这种情况,作者在BN里加入了Scale和shift。可是之后很多人做BN并不一定是这样做了,也有直接放在激活函数之后的,效果也不差。所以这个design个人感觉是个历史原因。

BN一般不适用什么场景?

batch size较小,rnn和nlp(不同长度)。推荐系统里面长尾分布与bn的假设也不符。

nlp中为什么用Layer Norm?

句子长短不一,有些位置没有足够的数据,测试集中甚至可能出现比训练集长的句子。训练到的均值和方差可能有偏差。另外,batch的分布对图像可能是有意义的,但对不同的句子没什么意义,我们只需要每句话内的分布一致。

优化器

SGD

batch GD, mini-batch GD, SGD。可能收敛在最小值、极小值、鞍点。

w = w - alpha * g

动量

v = momentum * v - alpha * g

w = w + v

AdaGrad

参数的更新越频繁,学习率越低。更新频繁说明接近最优解了。适合稀疏数据。与动量类似,也是减弱梯度下降时在陡峭方向来回摆动的现象。

r = r + g*g

w = w - alpha * g / (sqrt(r) + eps)

RMSProp

AdaGrad的改进,增加一个衰减系数控制历史信息的保留,丢弃遥远的历史。

r = rho * r + (1-rho) * g*g

Adam

m和v分别是梯度的一阶动量项和二阶动量项
m = beta1 * m + (1-beta1) * g

v = beta2 * v + (1-beta2) * g^2

偏置修正,t为迭代轮数:

m = m / (1 - beta1^t), v = v / (1 - beta2^t)

更新参数:

w = w - alpha * m / (sqrt(v) + epsilon)

Adam和RMSProp很像,除了m使用平滑版,以及偏置修正。

偏置修正是为了去除初始的m_0和v_0的影响,比如m_0 = 0(keras默认初始化值),修正前{m_1}=(1-beta1) * g \approx 0,修正后{m_1}=(1-beta1) * g / (1-beta1) =g。这两个bias修正本质上是对学习率的修正,在keras和tf中,都是在lr上直接修正(lr=lr*sqrt(1-{beta2}^t)/(1-{beta1}^t))以代替对m和v的计算。

在bert中使用了adamW且不做de-bias。如果模型中计算了l2正则,正常情况下权重越大的惩罚会越大。但对于adam来说,权重大对应的梯度也会比较大,梯度平方在分母中会使得惩罚更小。所以adamW不把l2正则算在损失函数(原始的梯度)里面(g_t=g_{t-1}+\lambda{\theta}_{t-1}),而是在更新权重的时候做weight decay({\theta}_t={\theta}_{t-1}-\alpha * ...+\lambda\theta_{t-1})。因此使用了adamW就不必再另外加l2正则了。

bert中还对学习率做了warm-up,即从0线性增加到 init_learning_rate,然后lr又从 init_learning_rate 线性衰减到0(完成所有steps)。这是为了避免较早的对mini-batch过拟合,即较早的进入不好的局部最优而无法跳出。同时Adam中的bias correct也同理去掉了。由于bert预训练时有足量的样本并迭代足够的epoch,使得这种有偏估计与无偏区别不大,并且bert推荐在fine-tune中使用同样的优化器。但有文章认为在小样本fine-tune中,不de-bias会导致学习率不稳定并影响训练效果。

Loss

无损编码事件信息的最小平均编码长度,混乱程度,不确定性,惊奇程度不可预测性,信息量等等。

对于有n种可能性的场景,编码一个信息的最小编码长度=log2(n)=-log2(1/n)=-log2(p)。

Entropy=平均最小编码长度=-sum(p*log2(p))

相对熵(KL散度)

有一个真实但未知的分布p,使用分布q去预测它。

KL(p,q)=-sum(plog2(q-p))=sum(plog2(p-q))=sum(p*log2(p/q))

交叉熵和softmax

由于E(p)是固定的,略去这一项,得到交叉熵CrossEntropy=-sum(p*log(q)),也可以理解为用q表示p的编码长度,则kl散度为两种编码长度的位数差。

CE(p,q)>=E(p),只有在完美估计的情况下才能相等。

二分类交叉熵因为两种情况概率相加为1,所以有BCE=-plog(q)-(1-p)log(1-q)

为什么比mse好?从计算上看,假如模型只有一层线性一层sigmoid,对参数w求导,ce的结果为x(y'-y),mse结果为-|y-y'|sigmoid'(z)x,mse在sigmoid的饱和区求导结果接近0,而ce可以做到求导与y'和y的差成比例。

sigmoid' = sigmoid * (1 - sigmoid)

mse的含义是输出概率分布服从高斯分布。二分类/多分类交叉熵则是服从两点分布/二项分布。

极大似然函数的形式也是-sum(plogq),但它衡量的是模型输出的结果作为一个数据分布(多项式分布),对样本集里的y分布的解释程度,而交叉熵直接衡量的是两个模型(训练的模型和真实世界模型)的分布之间的差异。参考

softmax可以理解为arg max的一种平滑近似;也可以理解为将输入向量归一化映射到n个类别上的概率分布。softmax是sigmoid的一般性情况,对于二分类问题,搭建模型时选取softmax或sigmoid则在logit和输出上略有不同,前者是二维输出,后者是一维输出,即sigmoid只对一个类别建模,softmax对两个类别建模。

多标签分类损失

log(1+\sum_{i \in \Phi_{neg}}{e^{s_i}}) + log(1+\sum_{j \in \Phi_{pos}}{e^{s_j}})

多标签分类的label_smoothing

Float in [0, 1]. If > 0 then smooth the labels. For example, if 0.1, use 0.1 / num_classes for non-target labels and 0.9 + 0.1 / num_classes for target labels.

概率,odds与logits

发生比odds=p/(1-p),logits=log(odds)。当概率大于或小于0.5时,odds的取值范围并不对称。当概率从0.1增加到0.2,时,odds增加了0.139;当概率从0.8增加到0.9时,odds却增加了5,当概率从0.2减少至0.1时,logits的增量是-0.811;当概率从0.8增加到0.9时,logits的增量也是0.811,我们可以直观地感受到logits增量也是对称的。

lr是非线性模型(具体是广义线性模型),但是可以转成线性模型求解(如果你的训练集是x1,x2,...,xn, y或者说p,你用logistic回归来求解,可以先转换成 x1,x2,...,xn, ln(y/(1-y)或者说logits,经过sigmoid又变成p),然后用线性回归来求解)。logistic回归本质上是线性回归,只是在特征到结果的映射中加入了一个sigmoid函数,即先把特征线性求和,然后使用非线性的函数将连续值映射到0与1之间。

另外,y=ax+bx^2+c也是线性模型,令x_1=x,x_2=x^2,则有y=ax_1+bx_2+c

sampled-softmax-loss

在分类网络中,最后一层每个神经元输出分别代表各类别的logits,logits代表各类别未经归一化的概率分布,网络就是学习映射关系f_{\theta}(x)=logits。logits经过softmax进行归一化,后使用交叉熵计算损失。当类别数量很大时,可以从中采样部分类别做softmax和交叉熵。

Q为采样算法,C为采样所得类别子集,K为与类别无关的常数,经过推算,有f_{\theta}(x,y|C)=f_{\theta}(x,y)-log(Q(y|x))+K。K不影响分类结果,即对于计算出来的f_{\theta}(x),减去log(Q(y|x))就得到采样后子集的logits,把它f_{\theta}(x,y|C)作为softmax的输入。

如果我们采用随机采样,则log(Q(y|x))也可认为是与类别无关的常量,那么像DSSM中直接用原始logits代替采样后的logits也是可以的。

NCE loss

与sampled-softmax loss一样是用于多标签分类时提升计算效率的方法,采样部分负样本,每个样本分别做二分类损失。理论上,负样本数量越大,则越接近真实情况。实际使用中取1个正样本,其他都是负样本作为batch。

Activation

sigmoid & tanh

sigmoid(x)=1/(1+e^-x), tanh(x)=2sigmoid(2x)-1=(ex-e-x)/(ex+e-x)

共同优点:平滑易求导,共同缺点:导数小于1链式法则下易梯度消失,饱和区导数趋于0更新缓慢,幂运算耗时。

sigmoid值域(0,1),优点:作为概率输出有解释性,缺点:不以0为中心,可能导致模型收敛慢(比如w1,w2分别需要变大变小,Loss对f导数相同,上一层的x恒为正值,则w1,w2的变化方向相同,模型会走Z字优化,参考)。

relu

线性整流函数,=max(x,0)。

优点:单侧抑制,稀疏性(防过拟合),没有sigmoid的饱和区和梯度消失,计算简单。

缺点:一个大梯度可能导致权重更新后该神经元进入负半轴,不会再次激活(对异常值敏感)。设置不过大的学习率能一定程度避免。leaky relu=max(\alpha x,x)也可能改善该问题。Prelu中\alpha是可学习参数。Random relu中\alpha在训练时是随机的,推理时固定,有点像一种dropout。Elu=\alpha(e^x-1) if x<0。Selu=\lambda elu,可归一化数据使得权重和偏差的均值为0方差为1,它假设输入服从高斯分布,需搭配lecun_normal初始化。另外,BN的归一化基本不会有异常输入,就不会有神经元死亡问题。

参考

阿里SDM召回
阿里DSIN排序
tf1.x教程
tfDataset
tfRecord
美团点评搜索相关性模型演进
谷歌双塔研究:顶层参数共享使双塔在同一个向量空间
训练深度学习网络时候,出现NaN是什么原因,怎么避免
多目标
多目标
GCN
GCN
阿里EGES召回
hash embedding
deep hash embedding
senet
esmm
mmoe
mmoe
连续变量离散化的原因

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,951评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,606评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,601评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,478评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,565评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,587评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,590评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,337评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,785评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,096评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,273评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,935评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,578评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,199评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,440评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,163评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,133评论 2 352

推荐阅读更多精彩内容