数学基础
- 线性代数
- 概率论与随机过程
- 数值计算
- 蒙特卡洛方法与 MCMC 采样
- 机器学习方法概论
统计学习
- 线性模型
- 支持向量机
- 朴素贝叶斯
- 决策树
- knn
- 集成学习
- 梯度提升树
- 数据预处理
- 模型评估
- 降维
- 聚类
- 半监督学习
- EM 算法
- 最大熵算法
- 隐马尔可夫模型
- 概率图与条件随机场
- 边际概率推断
- 主题模型
深度学习
- 深度学习简介
- 深度前馈网络
- 反向传播算法
- 正则化
- 深度学习中的最优化问题
- 卷积神经网络
- CNN:图像分类
- 循环神经网络 RNN
- Transformer
- 一、Transformer [2017]
- 二、Universal Transformer [2018]
- 三、Transformer-XL [2019]
- 四、GPT1 [2018]
- 五、GPT2 [2019]
- 六、GPT3 [2020]
- 七、OPT [2022]
- 八、BERT [2018]
- 九、XLNet [2019]
- 十、RoBERTa [2019]
- 十一、ERNIE 1.0 [2019]
- 十二、ERNIE 2.0 [2019]
- 十三、ERNIE 3.0 [2021]
- 十四、ERNIE-Huawei [2019]
- 十五、MT-DNN [2019]
- 十六、BART [2019]
- 十七、mBART [2020]
- 十八、SpanBERT [2019]
- 十九、ALBERT [2019]
- 二十、UniLM [2019]
- 二十一、MASS [2019]
- 二十二、MacBERT [2019]
- 二十三、Fine-Tuning Language Models from Human Preferences [2019]
- 二十四 Learning to summarize from human feedback [2020]
- 二十五、InstructGPT [2022]
- 二十六、T5 [2020]
- 二十七、mT5 [2020]
- 二十八、ExT5 [2021]
- 二十九、Muppet [2021]
- 三十、Self-Attention with Relative Position Representations [2018]
- 三十一、USE [2018]
- 三十二、Sentence-BERT [2019]
- 三十三、SimCSE [2021]
- 三十四、BERT-Flow [2020]
- 三十五、BERT-Whitening [2021]
- 三十六、Comparing the Geometry of BERT, ELMo, and GPT-2 Embeddings [2019]
- 三十七、CERT [2020]
- 三十八、DeCLUTR [2020]
- 三十九、CLEAR [2020]
- 四十、ConSERT [2021]
- 四十一、Sentence-T5 [2021]
- 四十二、ULMFiT [2018]
- 四十三、Scaling Laws for Neural Language Models [2020]
- 四十四、Chinchilla [2022]
- 四十七、GLM-130B [2022]
- 四十八、GPT-NeoX-20B [2022]
- 四十九、Bloom [2022]
- 五十、PaLM [2022] (粗读)
- 五十一、PaLM2 [2023](粗读)
- 五十二、Self-Instruct [2022]
- 句子向量
- 词向量
- 传统CTR 预估模型
- CTR 预估模型
- 一、DSSM [2013]
- 二、FNN [2016]
- 三、PNN [2016]
- 四、DeepCrossing [2016]
- 五、Wide 和 Deep [2016]
- 六、DCN [2017]
- 七、DeepFM [2017]
- 八、NFM [2017]
- 九、AFM [2017]
- 十、xDeepFM [2018]
- 十一、ESMM [2018]
- 十二、DIN [2017]
- 十三、DIEN [2019]
- 十四、DSIN [2019]
- 十五、DICM [2017]
- 十六、DeepMCP [2019]
- 十七、MIMN [2019]
- 十八、DMR [2020]
- 十九、MiNet [2020]
- 二十、DSTN [2019]
- 二十一、BST [2019]
- 二十二、SIM [2020]
- 二十三、ESM2 [2019]
- 二十四、MV-DNN [2015]
- 二十五、CAN [2020]
- 二十六、AutoInt [2018]
- 二十七、Fi-GNN [2019]
- 二十八、FwFM [2018]
- 二十九、FM2 [2021]
- 三十、FiBiNET [2019]
- 三十一、AutoFIS [2020]
- 三十三、AFN [2020]
- 三十四、FGCNN [2019]
- 三十五、AutoCross [2019]
- 三十六、InterHAt [2020]
- 三十七、xDeepInt [2023]
- 三十九、AutoDis [2021]
- 四十、MDE [2020]
- 四十一、NIS [2020]
- 四十二、AutoEmb [2020]
- 四十三、AutoDim [2021]
- 四十四、PEP [2021]
- 四十五、DeepLight [2021]
- 图的表达
- 一、DeepWalk [2014]
- 二、LINE [2015]
- 三、GraRep [2015]
- 四、TADW [2015]
- 五、DNGR [2016]
- 六、Node2Vec [2016]
- 七、WALKLETS [2016]
- 八、SDNE [2016]
- 九、CANE [2017]
- 十、EOE [2017]
- 十一、metapath2vec [2017]
- 十二、GraphGAN [2018]
- 十三、struc2vec [2017]
- 十四、GraphWave [2018]
- 十五、NetMF [2017]
- 十六、NetSMF [2019]
- 十七、PTE [2015]
- 十八、HNE [2015]
- 十九、AANE [2017]
- 二十、LANE [2017]
- 二十一、MVE [2017]
- 二十二、PMNE [2017]
- 二十三、ANRL [2018]
- 二十四、DANE [2018]
- 二十五、HERec [2018]
- 二十六、GATNE [2019]
- 二十七、MNE [2018]
- 二十八、MVN2VEC [2018]
- 二十九、SNE [2018]
- 三十、ProNE [2019]
- Graph Embedding 综述
- 图神经网络
- 一、GNN [2009]
- 二、Spectral Networks 和 Deep Locally Connected Networks [2013]
- 三、Fast Localized Spectral Filtering On Graph [2016]
- 四、GCN [2016]
- 五、神经图指纹 [2015]
- 六、GGS-NN [2016]
- 七、PATCHY-SAN [2016]
- 八、GraphSAGE [2017]
- 九、GAT [2017]
- 十、R-GCN [2017]
- 十一、 AGCN [2018]
- 十二、FastGCN [2018]
- 十三、PinSage [2018]
- 十四、GCMC [2017]
- 十五、JK-Net [2018]
- 十六、PPNP [2018]
- 十七、VRGCN [2017]
- 十八、ClusterGCN [2019]
- 十九、LDS-GNN [2019]
- 二十、DIAL-GNN [2019]
- 二十一、HAN [2019]
- 二十二、HetGNN [2019]
- 二十三、HGT [2020]
- 二十四、GPT-GNN [2020]
- 二十五、Geom-GCN [2020]
- 二十六、Graph Network [2018]
- 二十七、GIN [2019]
- 二十八、MPNN [2017]
- 二十九、UniMP [2020]
- 三十、Correct and Smooth [2020]
- 三十一、LGCN [2018]
- 三十二、DGCNN [2018]
- 三十三、AS-GCN
- 三十四、DGI [2018]
- 三十五、DIFFPOLL [2018]
- 三十六、DCNN [2016]
- 三十七、IN [2016]
- 图神经网络 2
- 图神经网络 3
- 推荐算法(传统方法)
- 一、Tapestry [1992]
- 二、GroupLens [1994]
- 三、ItemBased CF [2001]
- 四、Amazon I-2-I CF [2003]
- 五、Slope One Rating-Based CF [2005]
- 六、Bipartite Network Projection [2007]
- 七、Implicit Feedback CF [2008]
- 八、PMF [2008]
- 九、SVD++ [2008]
- 十、MMMF 扩展 [2008]
- 十一、OCCF [2008]
- 十二、BPR [2009]
- 十三、MF for RS [2009]
- 十四、 Netflix BellKor Solution [2009]
- 推荐算法(神经网络方法 1)
- 一、MIND [2019](用于召回)
- 二、DNN For YouTube [2016]
- 三、Recommending What Video to Watch Next [2019]
- 四、ESAM [2020]
- 五、Facebook Embedding Based Retrieval [2020](用于检索)
- 六、Airbnb Search Ranking [2018]
- 七、MOBIUS [2019](用于召回)
- 八、TDM [2018](用于检索)
- 九、DR [2020](用于检索)
- 十、JTM [2019](用于检索)
- 十一、Pinterest Recommender System [2017]
- 十二、DLRM [2019]
- 十三、Applying Deep Learning To Airbnb Search [2018]
- 十四、Improving Deep Learning For Airbnb Search [2020]
- 十五、HOP-Rec [2018]
- 十六、NCF [2017]
- 十七、NGCF [2019]
- 十八、LightGCN [2020]
- 十九、Sampling-Bias-Corrected Neural Modeling [2019](检索)
- 二十、EGES [2018](Matching 阶段)
- 二十一、SDM [2019](Matching 阶段)
- 二十二、COLD [2020 ] (Pre-Ranking 模型)
- 二十三、ComiRec [2020](https://www.wenjiangs.com/doc/0b4e1736-ac78)
- 二十四、EdgeRec [2020]
- 二十五、DPSR [2020](检索)
- 二十六、PDN [2021](mathcing)
- 二十七、时空周期兴趣学习网络ST-PIL [2021]
- 推荐算法之序列推荐
- 一、FPMC [2010]
- 二、GRU4Rec [2015]
- 三、HRM [2015]
- 四、DREAM [2016]
- 五、Improved GRU4Rec [2016]
- 六、NARM [2017]
- 七、HRNN [2017]
- 八、RRN [2017]
- 九、Caser [2018]
- 十、p-RNN [2016]
- 十一、GRU4Rec Top-k Gains [2018]
- 十二、SASRec [2018]
- 十三、RUM [2018]
- 十四、SHAN [2018]
- 十五、Phased LSTM [2016]
- 十六、Time-LSTM [2017]
- 十七、STAMP [2018]
- 十八、Latent Cross [2018]
- 十九、CSRM [2019]
- 二十、SR-GNN [2019]
- 二十一、GC-SAN [2019]
- 二十二、BERT4Rec [2019]
- 二十三、MCPRN [2019]
- 二十四、RepeatNet [2019]
- 二十五、LINet(2019)
- 二十六、NextItNet [2019]
- 二十七、GCE-GNN [2020]
- 二十八、LESSR [2020]
- 二十九、HyperRec [2020]
- 三十、DHCN [2021]
- 三十一、TiSASRec [2020]
- 推荐算法(综述)
- 多任务学习
- 系统架构
- 实践方法论
- 深度强化学习 1
- 自动代码生成
工具
- CRF
- CRF ++
- lightgbm
- xgboost
- xgboost 使用指南
- scikit-learn
- spark
- numpy
- matplotlib
- matplotlib 使用指南
- pandas
- huggingface_transformer
- 一、Tokenizer
- 二、Datasets
- 三、Model
- 四、Trainer
- 五、Evaluator
- 六、Pipeline
- 七、Accelerate
- 八、Autoclass
- 九、应用
- 十、Gradio
Scala
- 环境搭建
- 基础知识
- 函数
- 类
- 样例类和模式匹配
- 测试和注解
- 集合 collection(一)
- 集合collection(二)
- 集成 Java
- 并发
二、反向传播
2.1 前向传播
-
考虑计算单个标量 $ MathJax-Element-123 $ 的计算图:
- 假设有 $ MathJax-Element-81 $ 个输入节点: $ MathJax-Element-82 $ 。它们对应的是模型的参数和输入。
- 假设 $ MathJax-Element-83 $ 为中间节点。
- 假设 $ MathJax-Element-123 $ 为输出节点,它对应的是模型的代价函数。
- 对于每个非输入节点 $ MathJax-Element-124 $ ,定义其双亲节点的集合为 $ MathJax-Element-86 $ 。
- 假设每个非输入节点 $ MathJax-Element-124 $ ,操作 $ MathJax-Element-88 $ 与其关联,并且通过对该函数求值得到: $ MathJax-Element-89 $ 。
通过仔细排序(有向无环图的拓扑排序算法),使得可以依次计算 $ MathJax-Element-95 $ 。
-
前向传播算法:
-
输入:
- 计算图 $ MathJax-Element-332 $
- 初始化向量 $ MathJax-Element-121 $
-
输出: $ MathJax-Element-123 $ 的值
-
算法步骤:
-
初始化输入节点: $ MathJax-Element-94 $ 。
-
根据计算图,从前到后计算 $ MathJax-Element-95 $ 。对于 $ MathJax-Element-96 $ 计算过程为:
- 计算 $ MathJax-Element-118 $ 的双亲节点集合 $ MathJax-Element-98 $ 。
- 计算 $ MathJax-Element-118 $ : $ MathJax-Element-100 $ 。
-
输出 $ MathJax-Element-123 $ 。
-
-
2.2 反向传播
-
计算 $ MathJax-Element-428 $ 时需要构造另一张计算图 $ MathJax-Element-127 $ : 它的节点与 $ MathJax-Element-332 $ 中完全相同,但是计算顺序完全相反。
计算图 $ MathJax-Element-127 $ 如下图所示:
-
对于图中的任意一非输出节点 $ MathJax-Element-118 $ (非 $ MathJax-Element-123 $ ),根据链式法则:
$ \frac{\partial u_n}{\partial u_j}=\sum_{(\partial u_i,\partial u_j) \in \mathcal B}\frac{\partial u_n}{\partial u_i}\frac{\partial u_i}{\partial u_j} $其中 $ MathJax-Element-108 $ 表示图 $ MathJax-Element-127 $ 中的边 $ MathJax-Element-112 $ 。
- 若图 $ MathJax-Element-127 $ 中存在边 $ MathJax-Element-112 $ ,则在图 $ MathJax-Element-332 $ 中存在边 $ MathJax-Element-114 $ ,则 $ MathJax-Element-124 $ 为 $ MathJax-Element-118 $ 的子节点。
- 设图 $ MathJax-Element-332 $ 中 $ MathJax-Element-118 $ 的子节点的集合为 $ MathJax-Element-119 $ ,则上式改写作:
-
反向传播算法:
-
输入:
- 计算图 $ MathJax-Element-332 $
- 初始化参数向量 $ MathJax-Element-121 $
-
输出: $ MathJax-Element-428 $
-
算法步骤:
-
运行计算 $ MathJax-Element-123 $ 的前向算法,获取每个节点的值。
-
给出一个
grad_table
表,它存储的是已经计算出来的偏导数。$ MathJax-Element-124 $ 对应的表项存储的是偏导数 $ MathJax-Element-128 $ 。
-
初始化 $ MathJax-Element-126 $ 。
-
沿着计算图 $ MathJax-Element-127 $ 计算偏导数。遍历 $ MathJax-Element-217 $ 从 $ MathJax-Element-445 $ 到 $ MathJax-Element-447 $ :
-
计算 $ MathJax-Element-434 $ 。其中: $ MathJax-Element-128 $ 是已经存储的 $ MathJax-Element-129 $ , $ MathJax-Element-333 $ 为实时计算的。
图 $ MathJax-Element-332 $ 中的边 $ MathJax-Element-132 $ 定义了一个操作,而该操作的偏导只依赖于这两个变量,因此可以实时求解 $ MathJax-Element-333 $ 。
-
存储 $ MathJax-Element-133 $ 。
-
-
返回 $ MathJax-Element-453 $ 。
-
-
-
反向传播算法计算所有的偏导数,计算量与 $ MathJax-Element-332 $ 中的边的数量成正比。
其中每条边的计算包括计算偏导数,以及执行一次向量点积。
-
上述反向传播算法为了减少公共子表达式的计算量 ,并没有考虑存储的开销。这避免了重复子表达式的指数级的增长。
- 某些算法可以通过对计算图进行简化从而避免更多的子表达式。
- 有些算法会重新计算这些子表达式而不是存储它们,从而节省内存。
2.3 反向传播示例
-
对于 $ MathJax-Element-136 $ ,将公式拆分成 $ MathJax-Element-146 $ 和 $ MathJax-Element-138 $ ,则有:
$ \frac{\partial q}{\partial x}=1,\quad \frac{\partial q}{\partial y}=1,\quad \frac{\partial f}{\partial q}=z,\quad \frac{\partial f}{\partial z}=q $根据链式法则,有 $ MathJax-Element-144 $ 。
假设 $ MathJax-Element-140 $ ,则计算图如下。其中:绿色为前向传播的值,红色为反向传播的结果。
-
前向传播,计算从输入到输出(绿色);反向传播,计算从尾部开始到输入(红色)。
-
在整个计算图中,每个单元的操作类型,以及输入是已知的。通过这两个条件可以计算出两个结果:
- 这个单元的输出值。
- 这个单元的输出值关于输入值的局部梯度比如 $ MathJax-Element-141 $ 和 $ MathJax-Element-142 $ 。
每个单元计算这两个结果是独立完成的,它不需要计算图中其他单元的任何细节。
但是在反向传播过程中,单元将获取整个网络的最终输出值(这里是 $ MathJax-Element-143 $ )在单元的输出值上的梯度,即回传的梯度。
链式法则指出:单元应该将回传的梯度乘以它对其输入的局部梯度,从而得到整个网络的输出对于该单元每个输入值的梯度。如: $ MathJax-Element-144 $ 。
-
-
在多数情况下,反向传播中的梯度可以被直观地解释。如:加法单元、乘法单元、最大值单元。
假设: $ MathJax-Element-145 $ ,前向传播的计算从输入到输出(绿色),反向传播的计算从尾部开始到输入(红色)。
-
加法单元 $ MathJax-Element-146 $ ,则 $ MathJax-Element-147 $ 。如果 $ MathJax-Element-153 $ ,则有:
$ \frac{\partial f}{\partial x}=m,\quad \frac{\partial f}{\partial y}=m $这表明:加法单元将回传的梯度相等的分发给它的输入。
-
乘法单元 $ MathJax-Element-149 $ ,则 $ MathJax-Element-150 $ 。如果 $ MathJax-Element-153 $ ,则有:
$ \frac{\partial f}{\partial x}=my,\quad \frac{\partial f}{\partial y}=mx $这表明:乘法单元交换了输入数据,然后乘以回传的梯度作为每个输入的梯度。
-
取最大值单元 $ MathJax-Element-152 $ ,则:
$ \frac{\partial q}{\partial x}=\begin{cases}1,&x>=y\\0,&x=x\\0,&y 如果 $ MathJax-Element-153 $ ,则有: $ \frac{\partial f}{\partial x}=\begin{cases}m,&x>=y\\0,&x =x\\0,&y 这表明:取最大值单元将回传的梯度分发给最大的输入。
-
-
通常如果函数 $ MathJax-Element-154 $ 的表达式非常复杂,则当对 $ MathJax-Element-155 $ 进行微分运算,运算结束后会得到一个巨大而复杂的表达式。
- 实际上并不需要一个明确的函数来计算梯度,只需要如何使用反向传播算法计算梯度即可。
- 可以把复杂的表达式拆解成很多个简单的表达式(这些表达式的局部梯度是简单的、已知的),然后利用链式法则来求取梯度。
- 在计算反向传播时,前向传播过程中得到的一些中间变量非常有用。实际操作中,最好对这些中间变量缓存。
2.4 深度前馈神经网络应用
-
给定一个样本,其定义代价函数为 $ MathJax-Element-492 $ ,其中 $ MathJax-Element-503 $ 为神经网络的预测值。
考虑到正则化项,定义损失函数为: $ MathJax-Element-510 $ 。其中 $ MathJax-Element-188 $ 为正则化项,而 $ MathJax-Element-160 $ 包含了所有的参数(包括每一层的权重 $ MathJax-Element-312 $ 和每一层的偏置 $ MathJax-Element-162 $ )。
这里给出的是单个样本的损失函数,而不是训练集的损失函数。
-
计算 $ MathJax-Element-503 $ 的计算图为:
-
前向传播用于计算深度前馈神经网络的损失函数。算法为:
-
输入:
-
网络层数 $ MathJax-Element-335 $
-
每一层的权重矩阵 $ MathJax-Element-180 $
-
每一层的偏置向量 $ MathJax-Element-181 $
-
每一层的激活函数 $ MathJax-Element-182 $
也可以对所有的层使用同一个激活函数
-
输入 $ MathJax-Element-183 $ 和对应的标记 $ MathJax-Element-518 $ 。
-
隐层到输出的函数 $ MathJax-Element-539 $ 。
-
-
输出:损失函数 $ MathJax-Element-170 $
-
算法步骤:
-
初始化 $ MathJax-Element-171 $
-
迭代: $ MathJax-Element-172 $ ,计算:
- $ MathJax-Element-204 $
- $ MathJax-Element-174 $
-
计算 $ MathJax-Element-537 $ , $ MathJax-Element-547 $ 。
-
-
-
反向传播用于计算深度前馈网络的损失函数对于参数的梯度。
梯度下降算法需要更新模型参数,因此只关注损失函数对于模型参数的梯度,不关心损失函数对于输入的梯度 $ MathJax-Element-178 $ 。
-
根据链式法则有: $ MathJax-Element-196 $ 。
考虑到 $ MathJax-Element-728 $ ,因此雅可比矩阵 $ MathJax-Element-200 $ 为对角矩阵,对角线元素 $ MathJax-Element-803 $ 。 $ MathJax-Element-805 $ 表示 $ MathJax-Element-774 $ 的第 $ MathJax-Element-199 $ 个元素。
因此 $ MathJax-Element-742 $ ,其中 $ MathJax-Element-195 $ 表示
Hadamard
积。 -
因为 $ MathJax-Element-204 $ ,因此:
$ \nabla_{\mathbf{\vec b}_k}J=\nabla_{\mathbf{\vec a}_k}J,\quad \nabla_{\mathbf W_k}J=(\nabla_{\mathbf{\vec a}_k}J) \mathbf{\vec h}^{T}_{k-1} $上式仅仅考虑从 $ MathJax-Element-830 $ 传播到 $ MathJax-Element-852 $ 中的梯度。 考虑到损失函数中的正则化项 $ MathJax-Element-188 $ 包含了权重和偏置,因此需要增加正则化项的梯度。则有:
$ \nabla_{\mathbf{\vec b}_k}J=\nabla_{\mathbf{\vec a}_k}J+\lambda \nabla_{\mathbf{\vec b}_k}\Omega(\vec\theta)\\ \nabla_{\mathbf W_k}J=(\nabla_{\mathbf{\vec a}_k}J) \mathbf{\vec h}^{T}_{k-1}+\lambda \nabla_{\mathbf W_k}\Omega(\vec\theta) $ -
因为 $ MathJax-Element-204 $ ,因此: $ MathJax-Element-205 $ 。
-
-
反向传播算法:
-
输入:
- 网络层数 $ MathJax-Element-335 $
- 每一层的权重矩阵 $ MathJax-Element-180 $
- 每一层的偏置向量 $ MathJax-Element-181 $
- 每一层的激活函数 $ MathJax-Element-182 $
- 输入 $ MathJax-Element-183 $ 和对应的标记 $ MathJax-Element-561 $
-
输出:梯度 $ MathJax-Element-185 $
-
算法步骤:
-
通过前向传播计算损失函数 $ MathJax-Element-186 $ 以及网络的输出 $ MathJax-Element-566 $ 。
-
计算输出层的导数: $ MathJax-Element-655 $ 。
这里等式成立的原因是:正则化项 $ MathJax-Element-188 $ 与模型输出 $ MathJax-Element-566 $ 无关。
-
计算最后一层隐单元的梯度: $ MathJax-Element-689 $ 。
-
迭代: $ MathJax-Element-190 $ ,迭代步骤如下:
每一轮迭代开始之前,维持不变式: $ MathJax-Element-191 $ 。
-
计算 $ MathJax-Element-698 $ : $ MathJax-Element-871 $ 。
-
令: $ MathJax-Element-194 $ 。
-
计算对权重和偏置的偏导数:
$ \nabla_{\mathbf{\vec b}_k}J=\mathbf{\vec g}+\lambda \nabla_{\mathbf{\vec b}_k}\Omega(\vec\theta)\\ \nabla_{\mathbf W_k}J=\mathbf{\vec g} \mathbf{\vec h}^{T}_{k-1}+\lambda \nabla_{\mathbf W_k}\Omega(\vec\theta) $ -
计算 $ MathJax-Element-897 $ : $ MathJax-Element-905 $ 。
-
令: $ MathJax-Element-910 $ 。
-
-
-
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论