from 小火炉
一、深度学习简介
- 历史
- 1940-1960:ANN(人工神经网络),从仿生的角度模拟人类的大脑。但是只是对人脑的结构(神经元、连接、激活)进行模仿,并不知道其感知和学习的具体机制(即不知道该如何训练)
- 1980年代:提出back-propagation(反向传播)算法对神经网络进行训练,学习到真正的知识;1990年代,RNN和LSTM问世解决序列数据;1998年提出CNN解决图像数据。但是这一阶段的软硬件、数据跟不上导致很难训练,学不到东西
- 2006年提出deep belief network(深度置信网络)解决了训练难的问题;2012年AlexNet;2015年ImageNet大赛图像分类准确率超过了人类;2016年AlphaGo…
- 崛起原因
- 数据集的增加(训练需要大量数据)
- 模型复杂度增加
- 硬件的发展(卡)
深度学习的本质是特征提取
二、机器学习基础
2.1 简介
- 机器学习目标: 从数据中学会预测
- 与传统编程的区别:算法根据数据产生规则
- 术语
特征向量(feature map):表示数据的特性
标签(label/ground truth):预测的目标
模型(model):生成预测的规则
算法(algorithm):生成模型的代码 - 数据(data)
数据分为训练数据(training data用于学习)和测试数据(test data用于检测模型的好坏)
训练过程中不能使用测试数据
一个数据实例称为样本(sample) - 如何工作:与人脑工作类似,通过经验(数据)学习
2.2 机器学习分类
(1)监督学习(supervised learning):有样本及其标签
-
分类(classification):分类的标签是离散的(discreate),标签的类别称为class;分为二分类(binary classification)和多分类(multiclass classification)。
-
回归(regression)
标签是连续的(股票、天气、房价等预测) -
应用:逻辑回归(logistics regression)、SVM、神经网络(neural network)、决策树(decision tree)、LDA、朴素贝叶斯(naive bayes)、集成方法(ensemble methods)…
(2)无监督学习(unsupervised learning):训练过程中不知道标签
- 应用:聚类:分组、图像分割、异常检测
- k-means、混合模型(mixture models)、PCA(用于降维)、autoencoder(用于压缩)…
(3)强化学习(reinforcement learning):对动作进行奖惩,从人类学习方式得到的启发。
- 应用:游戏
2.3 线性模型(Linear model)
(1)数据集表示
通常用x表示特征,y表示标签,第i个样本的表达如下:
数据集表示如下:
(2)模型
- 模型表示,w表示权重,b表示偏置,二者一起统称参数
- 线性模型的目标是找到合适的参数使得损失函数(loss function)最小,下图展示了均方误差(MSE)的部分计算例子
2.4 梯度下降
- 求参数关于loss function的梯度
- 将参数沿着负梯度方向更新,η为学习率,表示参数学习的快慢。有陷入局部最优的风险
- η过大容易发散不收敛;η过小训练太慢
比较经典的方法是一开始将η设置得比较大,然后在发散的时候逐步减小
2.5 逻辑回归(logistics regression)
- 线性回归预测的值在(-∞,+∞),而分类问题预测的类别概率在(0,1)。使用非线性函数将(-∞,+∞)映射到(0,1)以解决分类问题。
- ps:逻辑回归本质上还是线性模型。若分类平面是线性的如
x
1
+
x
2
=
0
x_1+x_2=0
x1+x2=0,则逻辑回归关于特征x及参数θ都是线性的;若分类平面是非线性的如
x
1
2
+
x
2
=
0
x_1^2+x_2=0
x12+x2=0,则关于特征是非线性的,关于参数是线性的。(详见逻辑回归到底是线性的还是非线性的)
- sigmod激活函数
- 交叉熵损失Cross-Entropy
损失函数必须可导
整体损失:
损失定义
- 求梯度
链式法则
2.6 神经网络
- 线性回归模型被限制,处理不了线性不可分的问题,如 x 1 ∗ x 2 、 异 或 x_1*x_2、异或 x1∗x2、异或等
- 处理线性不可分的问题:将问题映射到新的空间(线性可分),在新的空间使用线性模型。如下
但是将表达式展开后合并同类项发现仍然是线性的(线性乘以线性还是线性的)
因此需要在线性函数外层加上非线性函数(激活函数),如sigmod、ReLU
- 多层感知机(MLP)
如果将新的空间中的分类平面映射回来可能会有多条线
- 神经网络处理分类问题
(1)二分类问题:最后一层输出一个节点,通过激活函数将其映射为概率表示0和1
(2)多分类问题:最后一层输出节点个数为类别数,输出值为属于各个类别的概率(通过softmax函数计算),取最大值
softmax函数定义:
多分类问题的交叉熵损失:
ps:当分类问题为二分类时,softmax就退化成sigmod函数,softmax实质上是sigmod函数在多类上的推广
计算例子
2.7 反向传播(Back-propagation)
从后往前进行梯度更新,本质上就是链式法则
具体推导
例子:求
w
22
w_{22}
w22的梯度
代码例子
- 传统机器学习特征提取和模型构建是分开的,且特征依赖于经验。而深度学习的本质是特征学习,通过一种端到端的学习方式在学习分类器的同时学习特征。
学到特征例子如下。神经网络其实是将特征不断地映射到新的特征空间,最后的特征空间称为语义空间,表示一定的特征含义。
2.8 模型选择(调参)
- 两个策略
- K折交叉验证(k-fold cross validation):将训练数据集分为k份,选其中一份作为验证集,剩下作为训练集。循环k次不同的验证集
- 固定验证集:从训练集中拨出一部分数据作为验证集进行调参。数据集通常采用8-1-1作为训练-验证-测试
- 参数选择:对于多个参数,通常使用网格搜索(选择组合),更为普遍的做法是固定其余参数对剩下的一个参数进行调整
- 模型评估
混淆矩阵(Confusion Matrix):表示真实值和预测值之间差距的矩阵
- 准确率(Accuracy)
- 精度(Precision)
所有预测为阳性中预测正确的比例,更加注重预测的准确性,不在乎漏了的(越谨慎精度越高,例如只预测了一个且正确,则精度为1) - 召回率(Recall)
所有阳性样本中预测正确的比例。召回在乎不漏,不在乎犯错 - F1值(F1 score)
结合了精度和召回,调和平均数。只有当精度和召回都高的情况下,F1值才高,但凡精度或召回低了,F1就会偏低。
- AUC
三. 正则化和优化
3.1 过拟合
- 过拟合和欠拟合
- 泛化(generalization):指机器在没见过的数据上是表现(泛化误差即测试误差)
- 过拟合(overfitting):一般情况下模型较为复杂,在训练数据上表现很好,但是测试数据上表现很差(large gap between training error and test error,类似于死记硬背)
- 欠拟合(underfitting):一般模型简单,学习能力不够强,在训练集和测试集上表现都不好(类似于一问三不知)
- 拟合程度与模型复杂度关系
模型复杂度可以人为控制:体现在隐层的层数、每层神经元的个数。即参数个数
训练误差随着模型的复杂度升高而降低,因为模型越复杂能够记住的训练样本越多,训练本身是让模型在训练样本上进行优化。而测试误差在模型复杂到一定的程度之后逐渐上升
- 正则化(regularization)
-
正则化主要目的是降低测试误差(可能导致训练误差会有一定的上升),主要方法是限制模型能力
-
增加惩罚项
将 Ω ( θ ) Ω(θ) Ω(θ)作为惩罚项加入损失函数中,训练过程中会同时最小化训练误差和模型复杂度
λ是正则化参数(超参),用于权衡训练损失和惩罚项
(1)二范正则( L 2 L^2 L2 Regularization, aka L 2 L^2 L2 norm )
最常用
加入二范正则后的梯度计算实质上是梯度反向传播的基础上,减小了参数(即将 w w w变成了 ( 1 − η λ ) w (1-ηλ)w (1−ηλ)w)
加入二范正则的例子以及参数λ的选择
(2)1范正则( L 1 L^1 L1 Regularization, aka L 1 L^1 L1 norm)
参数绝对值之和,表达式如下
损失函数
求梯度之后变成参数的符号( s i g n ( w ) sign(w) sign(w)表示w的符号)
(3) L 1 L^1 L1和 L 2 L^2 L2的区别和应用 -
L 1 L^1 L1倾向于得到稀疏(sparse)向量。
从数值的角度考虑, L 2 L^2 L2对于较小值的容忍度较高,而对较大值的容忍度较低,因为经过平方之后小的会更小,而大的会更大。但是对于 L 1 L^1 L1来讲0.1和0.6是一个量级,它会将较小的都变成0,只允许个别数字较大。
从几何的角度解释,将正则化表示为带条件的优化问题:
L 1 L^1 L1在二维平面得到的是一个菱形,而 L 2 L^2 L2得到的是圆形,目标函数的等高线更容易接触到 L 2 L^2 L2,且各处概率分布均匀;而 L 1 L^1 L1则更容易接触到的是顶点
稀疏性的好处:特征选择(feature selection)和模型可解释性(model interpretation)
1)特征选择(Feature Selection):
大家对稀疏规则化趋之若鹜的一个关键原因在于它能实现特征的自动选择。一般来说,xi的大部分元素(也就是特征)都是和最终的输出yi没有关系或者不提供任何信息的,在最小化目标函数的时候考虑xi这些额外的特征,虽然可以获得更小的训练误差,但在预测新的样本时,这些没用的信息反而会被考虑,从而干扰了对正确yi的预测。稀疏规则化算子的引入就是为了完成特征自动选择的光荣使命,它会学习地去掉这些没有信息的特征,也就是把这些特征对应的权重置为0。
2)可解释性(Interpretability):
另一个青睐于稀疏的理由是,模型更容易解释。例如患某种病的概率是y,然后我们收集到的数据x是1000维的,也就是我们需要寻找这1000种因素到底是怎么影响患上这种病的概率的。假设我们这个是个回归模型:y=w1x1+w2x2+…+w1000x1000+b(当然了,为了让y限定在[0,1]的范围,一般还得加个Logistic函数)。通过学习,如果最后学习到的w就只有很少的非零元素,例如只有5个非零的wi,那么我们就有理由相信,这些对应的特征在患病分析上面提供的信息是巨大的,决策性的。也就是说,患不患这种病只和这5个因素有关,那医生就好分析多了。但如果1000个wi都非0,医生面对这1000种因素,累觉不爱。
来源机器学习中的范数和稀疏性
(4)在激活上加正则
让激活的值不要太大
在激活上加
L
1
L^1
L1正则的例子
3. 数据增广(Data Augmentation)
- 翻转(flipping),水平方向竖直方向
- 旋转(Rotating)
- 缩放(Zooming and scaling)
- 裁剪(Cropping)
- 平移(Translating)
- 增加高斯噪声
- 噪声鲁棒性(Noise Robustness)
- 给网络权重加噪声
- 给数据标签加噪声(label smoothing):降低目标的标准,例如预测目标为1则0.7也算正确
- 多任务学习(Multi-Task Learning)
共享底层,在顶层做不同的任务。使得模型不会对某一个特定的任务过拟合
- Early Stopping
使用验证集辅助判断训练停止的时刻。每训练n轮用验证集进行验证,保存验证集中损失最小的参数模型
优点:
- 不用再模型上动手脚;
- 可以与其他防止过拟合的方法(如正则化)一起使用
缺点:
- 需要验证集。
解决方案:使用验证集找到停止位置之后重新用完整的训练集训练(但是停止位置可能不准);或者停止之后将验证集放入模型继续训练(难以把握停止时刻)
- Dropout
在训练的时候临时去掉一些神经元,通过概率激活下一层的神经元,一般丢弃神经元的概率设置为0.8,即留下20%的神经元
Dropout 在训练时采用,是为了减少神经元对部分上层神经元的依赖,类似将多个不同网络结构的模型集成起来,减少过拟合的风险。由于在训练阶段神经元保持q概率,在测试阶段必须仿真出在训练阶段使用的网络集的行为。所以在测试阶段使用整个模型的时候需要将参数乘以p使用
- 对抗训练(Adversarial Training)
- 当神经网络功能过于强大(过拟合)会对噪声很敏感
- 解决思路:在训练过程中加入对抗样本,类似上图
3.2 优化(optimization)
计算所有训练数据集中的损失不太现实(训练集过大),而且样本方差和总体方差的差距是根号级别,因此选择一批一批训练(例如1000个样本和10个样本的方差是10倍) σ / n σ/\sqrt n σ/n
- 概念
- batch:指一整个数据集。
- minibatch:指样本划分的一批。即我们通常讲的“batch”
- epoch:所有样本训练完一次称一个epoch
注意:通常我们讲的“batch”是指minibatch,而“batch size”也是指minibatch的size,使用的SGD优化也是minibatch SGD
大batch更精准,小batch有正则化的效果 - 经验误差最小化( minimize the empirical risk,ERM):最小化训练误差
- 优化遇到的问题
- 局部最优(Local Minima):当目标函数是非凸的,会存在很多局部最优解。深度学习并不是很care
- 鞍点:在其中一维是最小值,而在另一未是最大值,且梯度为0
- 梯度爆炸:当神经网络非常复杂的时候,优化超平面也会很复杂,会存在很平坦的区域(梯度较小)也会存在非常陡峭的区域(梯度很大),当梯度非常大的时候,参数下一步就会走到非常远的位置。
解决方法:梯度裁剪(gradient clipping),限制梯度的最大值
- SGD
每次取一个batch的数据进行梯度的计算和参数的更新
- learning rate
逐步衰减的策略,一开始比较大,然后逐步衰减,直到指定的轮数之后不变
k表示训练的轮数,当k超过τ,学习率就恒定为 ε τ ε_τ ετ,通常 ε τ ε_τ ετ设置为0.01 ε 0 ε_0 ε0
- 动量(Momentum)
普通的SGD在以下情况下效果不好:
- 平面曲率很高
- 小梯度
- 噪声
动量是考虑了历史的梯度
α表示历史梯度对当前梯度的影响程度,通常设置为0.8或0.9
5. 自适应学习率方法
(1)AdaGrad
基本思想:将历史梯度存下来,若历史梯度较大,则当前学习率减小,反之增大
⊙
⊙
⊙表示向量中的每一维做乘积,向量大小不变,
r
r
r表示历史梯度信息,
ε
ε
ε是学习率,
δ
δ
δ放在分母的位置是防止分母为0
(2)RMSProp
- AdaGrad存在问题:历史梯度一直在分母累加,学习率一直减小,导致最终的学习率非常小。或者说所有的历史梯度的重要性不应该是一样的。
- RMSProp的基本思想:非常久远的历史梯度并不是十分重要,将久远的梯度丢弃。
(3)Adam
类似RMSProp+Momentum
总结
一般使用SGD+0.9Momentum
- Batch Normalization
- 深度学习在训练的时候可能不经意会学偏了,这个现象被称为internal covariate shift
- 例如sigmod,当激活都集中在左右两边,梯度接近0,不容易传递;而ReLU当梯度都在右边,退化成线性(非线性的功能消失),若都在左边,则梯度为0
- Batch Normalization 的主要思想就是将学偏了的部分拉回来,将输入集中在正常梯度的范围内(0附近的位置)
- 针对minibatch,通常加在线性层和激活层中间,但是归一化之后模型的表达能力会受损,所以需要再加一层线性层来增加表达能力
优势 - 可以不用太关注learning rate(对learning rate不那么敏感了)
- 加快训练效率
- 有正则化的效果
加BN与不加的对比
- 参数初始化策略
- 基本原则:break symmetry,不能都初始化为一个值(所有节点学到的东西都会一样)。但是从正态分布或均匀分布随机取值初始化后经过不断的矩阵运算(神经网络的优化实质上是矩阵运算)会炸;若乘上小于0的系数会收敛到0
(1)Xavier Initialization
m表示上一层神经元的个数,n表示下一层神经元的个数。有理论证明不会炸或收敛到0,但是在ReLU上表现不好(会衰减到0)
(2)Kaiming Initialization
解决了Xavier Initialization初始化的问题
五、CNN
5.1 CNN应用(主要在视觉方面)
- 图像分类
- 图像检索(image )
- 目标检测
- 语义分割(对像素点进行分类)
- 实例分割
- 姿态估计(Pose estimation)
- …
5.2 卷积
直接展平的缺点:传统的MLP直接将图像展平成一维丢失了二维图像的空间特征(邻居信息),卷积则是考虑保证图像的二维结构。
方法:将一维向量乘法(矩阵乘法)扩展为二维卷积运算。隐藏成的输出被称为特征图( feature map.)
- 卷积实例
相同颜色相乘再相加 - padding
用于保证输入和输出的大小匹配
- Stride
相邻的卷积之间有重叠,使用stride来减少一定的冗余
- 输入与输出尺寸计算
- 对于多通道(channel)图像,对每个通道卷积然后相加成为一个通道(对平面做卷积,对通道做求和)
- 补充:多于3通道的图像如卫星图像、遥感图像等
- 一组卷积核(多个通道的卷积核)对应 一个通道
每组卷积核代表了不同的特征的提取能力,其对应的通道则为图像对应的特征信息(例如边缘信息、色彩信息、纹理信息) - 加入通道后的输入输出尺寸计算
注意:输出的通道数只与卷积核的个数有关,与输入的通道数无关,因为输入的通道无论多少都会被求和最终成为输出的一个通道 - MLP与CNN的对比
MLP中输入、隐层以及输出都是向量(一维),而CNN中每一层都是三维的张量(width、height、depth),width、height由卷积核的size、padding、stride决定,depth由卷积核的数量决定。
MLP可以看成是卷积核与输入一样大的CNN
随着卷积的不断加深,size逐渐减小,通道逐渐增多到最后size减小到1*1,每一个通道代表一个高阶特征
-
卷积使连接具有稀疏性,MLP可以看成是卷积核与输入一样大的CNN
-
参数共享。卷积核是用于实现提取图像某一特征的功能,在任何位置都能够使用。因此不需要对每一个像素的位置都设置不同的卷积核,而是所有位置共享一个卷积核提取某种特征(卷积核与位置不相关)。大大减小了参数的量级
-
CNN学习的就是卷积核(提取图像各种特征的能力)中的参数
一般底层提取的是边缘信息和色彩信息,中层是对底层进行卷积提取的是纹理信息和局部信息,而高阶特征是对中层特征进行卷积得到的一般是具有语义信息。最后一层一般称为表征(representation) -
感受野
若想用一个小的卷积核识别的一个较大像素区域需要多层叠加以增大感受野
-
空洞卷积(dilated convolution):既能减少相邻卷积的冗余,也能增加感受野
-
1D卷积
卷积的概念与纬度无关,也可以在1维、3维或者更高维做卷积,实质是将邻域的信息做内积。
例如信号、文本、时序等,一维信息也可以有多通道,例如空间中的点(xyz轴)卷积核宽度+通道数
实例
-
3D卷积
针对三维数据,例如视频、高光谱、医学影像
5.3 可形变卷积(Deformable Convolutional Networks)
- 基本思想:传统卷积核的shape是固定的(方方正正),但是目标的形状是多样的,因此设计形状可以改变的卷积核,考虑了卷积核的位置信息(形状是学习得来的)
p n p_n pn表示 p 0 p_0 p0的领域, △ p n △p_n △pn表示学习的位置信息 - 代码见notebook
5.4 池化(Pooling)
种类
- 最大池化(MaxPooling)最常用
- 最小池化
- 平均池化
作用
-
增加感受野。使用相同尺寸的卷积核对池化后的图像的感受野更大
-
提供了不变性。(对不同的旋转平移缩放选择最大的激活值)
-
保留主要特征的同时降维
ps:代码见notebook,通常stride设置为2
- CNN架构
- 卷积是线性的,池化是非线性的,但池化的主要目的是缩小图像尺寸而非提供非线性,因此在卷积之后通常会加一层ReLU提供非线性
- 模型的最终目标并不是得到特征图,而是使用特征图用于下游任务(例如分类等)提取特征,因此在得到特征之后需要全连接层进行映射
一般最后一层不会直接展平,这样会损失很多信息;而是做平均池化 global average pooling (GAP),一来不会丢失信息,二来可以定位激活值高的关键区域,作为模型的可解释性表达
- CNN的一般结构
做池化要慎重,因为池化会丢失信息,并且这种丢失不可逆 - 卷积核尺寸
3个 3 ∗ 3 3*3 3∗3的卷积核与1个 7 ∗ 7 7*7 7∗7的卷积核的感受野是一样的,且小卷积核的效果更好。
小卷积核的好处 - 参数量更小
- 多了更多的非线性信息(拟合各种复杂的超平面,抽取图像特征)
因此建议使用小卷积核多次叠加取代大卷积核
设置建议:
- 输入层的尺寸一般设置为2的倍数(方便做pooling)
- 卷积核尺寸一般设置为 3 ∗ 3 3*3 3∗3,最多 5 ∗ 5 5*5 5∗5,stride通常设置 1 ∗ 1 1*1 1∗1,padding一般使用0填充
- pooling一般使用
2
∗
2
2*2
2∗2,stride一般设置为
2
∗
2
2*2
2∗2
六、CNN架构
6.1 AlexNet
第三层分成两部分是要使用两张卡(当然现在不需要这样设计网络,只需要一句命令,但是当时深度学习框架还没有发展起来)
细节
固定学习率手动调参数:在一开始使用一个较大的学习率学习,在验证集上观察收敛效果,当不再变化的时候,手动降低学习率(除以10)。
ReLU vs Sigmod
- sigmod缺点:sigmod函数求导之后两端的激活值几乎为0,当激活值过小或过大都会导致梯度消失,梯度无法向后传,无法学习特征,只有中间区段的梯度比较好(这也是使用batch nomalization的重要原因)
- ReLU优点:计算简单。收敛很快,可以解决梯度消失的问题。稀疏性,让很多激活值为0。
- ReLU缺点:当负值的时候激活值为0(dying ReLU),意味着这部分将永远无法更新。梯度的范围是 ( 0 , + ∞ ) (0,+∞) (0,+∞),可能会出现梯度爆炸(可以使用梯度截断进行限制)
- 总结:ReLU的主要问题在于小于零部分,优点在于提供了非线性和稀疏性,缺点在于会将很多神经元die掉
对ReLU的改进
- Leaky ReLU
将负数部分设置为一个斜率很小的线性函数: y = 0.01 x y=0.01x y=0.01x - Parametric ReLU (PReLU)
将Leaky ReLU泛化, y = α x y=αx y=αx
ps:Leaky ReLU并不一定比ReLU好,这也属于调参的范围 - Exponential Linear (ELU, SELU)
Leaky在负数部分的函数是线性的,当x非常小的时候,激活值的绝对值也可能非常大,ELU的基本思想是当x趋近于 − ∞ -∞ −∞的时候,激活值趋近于0。(使用指数函数)
但是求导复杂
6.2 VGG
主要思想:用小卷积核,深的网络( small filters, deeper networks)
提出了3个
3
∗
3
3*3
3∗3的小卷积核堆叠和1个
7
∗
7
7*7
7∗7的卷积核的感受野是相同的,但是更深的网络拥有更多的非线性层和更少的参数
ps:ZFNet主要是在AlexNet基础上选择了一组最佳参数(最佳调参)
细节:
FC7得到的特征层在其他任务上的泛化能力很强
随着网络的不断加深,特征图的尺寸(size)不断减小(存储减小),通道数(depth)不断增加(参数量增加)。
6.3 GoogLeNet
- motivation
提高神经网络能力最直接的方式:扩大模型尺寸
* 深度(depth):增加网络层数
* 宽度(width):增加每一层的神经元数目
存在的问题:
* 可能会过拟合
* 难以计算(计算资源消耗大)
* 难以训练(很难学习到真正的知识)
解决方案:引入稀疏性(Sparsity),将卷积核变得稀疏并不能减少计算,因此考虑在结构上引入稀疏性。将大的稀疏矩阵上的计算转换为小的局部稠密矩阵上的运算
- Inception Module
用并行的 1 ∗ 1 1*1 1∗1、 3 ∗ 3 3*3 3∗3、 5 ∗ 5 5*5 5∗5的卷积核取代大的 7 ∗ 7 7*7 7∗7卷积核来引入(模拟)稀疏性
ps:naive表示这个只是体现idea的基本思路,之后还需要提出一个标准版。vanilla表示原始的(不加改进的)。SOTA是state of the art的缩写,表示当前最好的
但是参数量还是很大!(通道数过多)
- 引入1*1卷积对通道(相当于语义信息)进行重组,对每个通道进行线性加权然后进行非线性变换
优点:对通道进行线性重组,在保留了特征的同时实现了通道数的降维,而且参数量很小
做法:在卷积操作之前加上 1 ∗ 1 1*1 1∗1的卷积(称为 Bottleneck )将通道数压缩。Inception Module的正式版如下
在网络中将Inception Module模块进行堆叠
- GoogLeNet解决梯度消失:在中间部分加上了分类层(当网络很深的时候很容易梯度消失),计算loss用于优化前面的参数。但是这个涉及之后并没有广泛使用,主要是使用其他防止梯度消失的策略例如batch normalization。一个不太好的地方在于中间的分类层打乱了低阶特征和高阶特征的关系,因为低阶的特征主要是边缘、颜色等不具备语义的特征,如果在低阶特征之后加上一个分类层则是要求低阶特征具备分类的信息,这是矛盾的
- 引入全局平均池化(global average pooling,GAP)代替了之前的直接展平。现在也是基本上在最后一层进行GAP
- 总结
优点:参数量小,高效,好训练(在保证深度的同时)
方法:Inception Module引入稀疏性
6.4 ResNet
- 模型并非越深越好
深的模型学习能力更强,但是深的模型在训练上和测试上效果比浅的模型差的原因在于无法学会identity mapping。identity mapping是指输入和输出一样的神经网络层(什么都不干),卷积核如下
考虑到最终的值还需要经过通道相加,所以剩下的通道的卷积核应该都为0,这样的卷积核难以学会 - ResNet Building Block
提供了跳过卷积层的方式
引入残差,将难以学会的1转换成容易学会的0 - Bottleneck Architectures
使用 1 ∗ 1 1*1 1∗1卷积减少参数量(通道数过多),在ResNet-50, -101, and -152中使用。50和101常常作为特征提取网络的backbone(骨干) - ResNet Architectures
- 训练细节
ResNet总结:让深层的网络模型更加灵活
ps:有研究指出加了BN之后就可以不用dropout
- ResNet Performance
加上残差之后深层网络优于浅层网络 - 模型比较
6.5 SENet
- 主要思想
传统方法是对通道相加,SENet对通道进行加权(每个通道对特征层的贡献可能并不相同),即学习权重
即插即用,在任何模型上都可以使用,在特征层之间进行加权 - CBAM
SENet进阶版,不仅对通道加权,也对平面进行加权
热力图展示效果
加上了SENet或CBAM的模型的激活区域更准确
6.6 基于精度的改进模型
-
Wide ResNet
将ResNet加宽,增加通道数。相对于加深计算更方便,减少了梯度计算
50层的Wide ResNet可以超越原来152层的ResNet -
ResNeXt
对Wide ResNet改进,Wide ResNet加宽增加了参数量。ResNeXt通过Inception的方式加宽,减少参数
-
DenseNet
主要思想:残差虽然好,但是有很多层被跳过浪费了;但是加宽又增加了参数量,引入密集残差 Dense residual ,强调特征重用(feature reuse)
ResNet是每两层搭一个桥,DenseNet是从当前block出发,向其后的所有block搭桥
优点:参数量少;鼓励特征重用;减少了信息流失,容易训练
50层的DenseNet可以超越152层的ResNet
实验证明(特征重用的有效性,出发层到到达层的激活值)
实验要说明论文解决的问题
6.7 基于速度的改进模型
- MobileNet
将三维的卷积核拆成二维和一维的卷积核(参数量从相乘变成相加),但是通道之间的相关性丢失
- ShuffleNet
对MobileNet的改进,MobileNet组与组之间缺少了关联,ShuffleNet既可以分组减少参数,也可以在组与组之间进行交互。在减少参数与标准神经网络之间折中
- 模型结构搜索
- NAS(neural architecture searching)
学习一种最优的模型框架
强化学习例子
涉及较广,如强化学习、元学习、自动学习等 - EfficientNet
将模型结构搜索看作优化问题
- 预训练模型Pre-Trained Models
- 迁移学习(Transfer Learning)
传统的学习是在不同的数据集上训练不同的模型,迁移学习是将训练好的模型的知识迁移到另一个模型训练新的数据集。可以解决类别更新且新类别样本数量和原始数据集不平衡的情况
在深度学习领域中最常用的迁移学习方法就是使用预训练模型,先在大型数据集中进行训练提取特征,然后在不同的任务上继续训练 - 微调(Fine-Tuning)
先在大的数据集上进行预训练,然后将最后的分类层扔掉,在预训练模型(已经拥有了特征提取能力)的基础上训练新的任务
- 训练策略
训练全部或者一部分
根据新样本选择训练策略
- 少且相似:对最后的分类层进行训练
- 多且相似:可以多训练几层如高阶特征和分类层
- 多且不相似:训练更多的层
- 少且不相似:不建议用迁移学习,需要数据增广等
七、RNN
7.1 RNN应用
- 情感分析(Sentiment analysis)
根据文字判断情感正负性 - 股价预测(Stock price prediction)
但是不实用,因为股价的影响因素众多 - 机器翻译(Machine translation)
- 异常值检测(Anomaly detection)
- 语音识别(Speech recognition)
- 图像描述(Image Captioning)
7.2 序列数据(Sequential Data)
Example: 语音(speech)、文字(text)等
- 序列数据上的任务
一个样本的输入定义
t表示时刻,但不一定是时间 - 将序列数据用于MLP存在的问题
- 序列之间的顺序相关性丢失
- 在一个任务中不同的序列样本长度不同,而MLP的输入长度是固定的
7.3 RNN结构
- 隐层 hidden layer
t时刻的隐层是通过t-1时刻的隐层和t时刻的输入以及参数 θ θ θ学习得到的, f f f是函数,在CNN中表示卷积,MLP中表示权重,RNN中表示权重。隐层不是参数,是特征,对应CNN中的特征图
h ( t − 1 ) h^{(t-1)} h(t−1)代表了t时刻之前的所有信息的浓缩 - 优点
- 与序列长度无关
- 参数共享, f f f的参数是一样的,在每一步的参数都是相同的,有更好的泛化能力。参数如果不同则无法适应不同长度的样本
- 框架
o ( t ) o^{(t)} o(t):对应输入的输出
L ( t ) L^{(t)} L(t):t时刻输出与预测的输出之间的loss
参数:
U U U:输入到隐层的映射
W W W:隐层到隐层的映射
V V V:隐层对输出的映射 - RNN计算
初始化 h ( 0 ) h^{(0)} h(0)
从 t = 1 t=1 t=1开始到 t = τ t=τ t=τ在每一步执行下列步骤
a ( t ) a^{(t)} a(t)表示将上一步隐层和这一步输入做线性变换得到的中间结果,对 a ( t ) a^{(t)} a(t)做非线性变换得到 h ( t ) h^{(t)} h(t)(没有使用ReLU是因为当时没有发现)。通过高阶特征 h ( t ) h^{(t)} h(t)和相应参数得到输出 o ( t ) o^{(t)} o(t)。如果任务是多分类,将输出做softmax得到预测值,最后将预测值与真实输出计算loss。 c c c和 b b b表示偏置 - 序列数据的反向传播Backpropagation Through Time (BPTT).
t时刻的loss与之后的所有step都有关,即当前隐层的评估与当前以及之后的所有loss都有关。
如 h ( 3 ) h^{(3)} h(3)的更新与 h ( 4 ) h^{(4)} h(4)、 h ( 4 ) h^{(4)} h(4)… h ( τ ) h^{(τ)} h(τ)的loss有关
推导如下
- 双向RNN(Bidirectional RNNs)
传统RNN是后面的神经元依赖于前面的神经元,但是它们可能是相互依赖的,后面的信息可能对当前信息的预测是有帮助的
当前的输出是综合了从前往后的RNN和从后往前的RNN的隐层得到的。( h ( t ) h^{(t)} h(t)表示从强往后, g ( t ) g^{(t)} g(t)表示从后往前) - 将RNN加深
在参数之间加层
7.4 RNN结构
- RNN: Many-to-Many
每个输入对应一个输出
应用:词性预测( Part-of-Speech (POS) tagging)
- RNN: Many-to-One
整个序列只有一个输出(只需对最后一个隐层做预测)
应用:情感分析( Sentiment analysis)
- RNN: One-to-Many
第一个输入的预测作为下一个step的输入
应用:- 下一个单词预测
注意,One-to-Many的训练与测试是不同的,训练时是有标签的(Many-to-Many的框架) - 图像描述
将图像经过CNN处理得到高阶特征向量作为隐层的初始值
- 下一个单词预测
7.5 Sequence to Sequence
Many-to-One的RNN作为encoder编码输入的特征,得到的特征向量作为One-to-Many的RNN的隐层初始值进行解码
动画展示,位置40分钟左右
- 存在问题
当输入序列的长度很长的时候,得到的特征向量包含的信息不均匀,对较近的信息包含较多,而很久之前的信息较少(之前的信息容易遗忘)。改进策略:attention
7.6 Attention Models
仿生物学原理:人眼获取的视觉信息并不是全部扫描,而是会将注意力放在一部分关键区域
将所有信息都记住是耗时耗力的,在翻译当前词汇的时候将注意力放在最关键的部分(与上一步预测的值最相关的部分)
s
i
s_i
si是decoder的隐层,
c
i
c_i
ci是encoder的隐层,
a
i
j
a_{ij}
aij是对
e
i
j
e_{ij}
eij求softmax,
e
i
j
e_{ij}
eij是对
s
i
−
1
s_{i-1}
si−1和
h
j
h_j
hj求相似度。即当前词的翻译对所有输入词汇的关注度取决于encoder对应隐层与上一步预测值的相似度
注意力机制的实质是学习一组权重(这里是decoder上一步隐层与encoder隐层的相关性),然后进行带权组合
学习到的权重可视化
- 将注意力应用在图像中
可以知道对应单词所关注的图像区域(可解释性)
7.7 LSTM
RNN对于久远的记忆容易遗忘,LSTM引入两条记忆线(长短程记忆),长程记忆用于保存较为久远的信息(全局信息),短程记忆用于保存较近的信息(细节信息)
ps:将
h
t
−
1
h_{t-1}
ht−1和
X
t
X_t
Xtconcate一起,与之前的公式无差别,计算更方便(参数也进行concate)
- Cell State
用于长期记忆的存储,是一个向量,与hidden state类似。只进行线性变换(相乘和相加),不做非线性,因此可以实现长程记忆,不容易遗忘。
- Gates
实质上是sigmod函数(0-1),起着开或闭的作用,某个隐层是否需要。通过这个门之后得到0表示不要,得到1表示要- 遗忘门 Forget gate
决定了长期记忆的某些维被忘记,某些维被留下
- 输入门Input gate
根据当前输入和上一步隐层需要学习的新知识
cell state的更新:遗忘+学习新的知识
- 输出门 Output Gate
- 遗忘门 Forget gate
总结: C t C_t Ct负责长期记忆, h t h_t ht负责短期记忆,目前在做什么
- GRU
LSTM的简化版,在LSTM中 h t h_t ht仅仅是个工具人,GRU将 C t C_t Ct和 h t h_t ht合二为一,将遗忘门和更新门合在一起
- 递归神经网络(Recursive Neural Network)
树状结构(tree-like structure),相较于链状结构(chain-like)的RNN,可以将 l l l的复杂度降到 l o g ( l ) log(l) log(l),但是可拓展性差,结构被定死,因此使用并不广泛
7.8 PyTorch中的使用
见notebook
八、语言模型
8.1 NLP任务
* Question answering(QA)
![在这里插入图片描述](https://img-blog.csdnimg.cn/166e92ca6a3d44b7bf67ea6e2e4f49d8.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAaGVpX2hlaV9oZWlf,size_18,color_FFFFFF,t_70,g_se,x_16)
* Textual Entailment (文字蕴含TE)
判断给定的前提和结论之间的关系(有关系、没关系、矛盾的三分类任务)
* 情感分析( Sentiment analysis)
* 语义决策标注( Semantic role labeling)
提取出谓词及其相关的主语宾语等
* 代词消解( Coreference resolution)
明确代词代指的任务人物
* 命名实体识别 Named entity recognition (NER)
区分不同名词的种类,如人名、地名、物品等
* 机器翻译( Machine translation)
- NLP难点:语言文字的歧义性( ambiguity),相同的文字在不同的语境上下文
8.2 词向量 Word2vec
- 使用字典的缺点
- 近义词之间也会有差异
- 具有歧义性
- 词汇的演变是一个动态的过程,无法处理新词(如网络新词)
- 需要专家标注和更新字典
用向量的方式表示单词:one-hot编码
存在问题:无法知道单词的含义之间的相似性
词向量:为单词赋予高阶特征使得相近含义的单词特征也相似
ps:在深度学习中embedding、representation、feature都表示高阶特征
Word2vec基本思想:利用上下文信息训练,中心词可以通过其周围词进行描述
- 单词使用一个稠密向量来表示
- 在文本中的每个位置选择一个中心词(center word
c
c
c)和一些周围词(context words
o
o
o)
- 通过中心词和周围词的相似性来计算梯度
-
Skip-gram
条件概率最大化,使用最大似然
损失函数
ps: T T T表示一段文本,t表示每个位置,c表示窗口半径,p表示中间词预测周围词的概率概率p的计算:向量内积作为相似度的衡量。
V V V表示词库所有单词模型总览:
输入是 V ∗ 1 V*1 V∗1的one-hot编码,表示词典中的某一个单词; W W W表示作为中心词的词库embedding编码; W ′ W' W′是作为周围词的词库embedding编码。
从中心词词库中取其embedding;与周围词词库中所有词计算相似度,并做softmax求相似概率;通过与周围词概率的相似性来进行学习。存在问题:与所有词计算距离的计算量较大
解决问题:负样本采样,随机选择样本作为周围词(因为周围词在整个词库中的概率较小所以可以采用随机的方式)词向量得到的信息:高阶特征
ps:这是高维投影到二维的展示
总结:Word2vec实质上是监督学习,中心词是输入,周围词是标签。只要能找到相关的样本对就可以进行训练
XXX2vec:不止适用于word,只需要pair信息(定义相似性)便可学习到它们的embedding
注意embedding是参数
8.3 ELMo
词向量无法解决歧义性(上下文相关)的问题,通过LSTM使得同一个单词在不同的句子中可能有不同的含义。使用训练好的词向量作为LSTM的初始值,通过双向的LSTM来学习改词在句子中的含义;最终的词向量由每一层学习到的东西进行表达
h
k
,
j
h_{k,j}
hk,j表示第j层LSTM的第k个词
最终该词的embedding表达计算为:
x
k
x_k
xk表示输入(初始化embedding)
对每一层进行加权
总结:初始词向量输入多层LSTM得到中间层的词向量,包含了上下文信息,最后将所有层线性组合得到最终的词向量表达
用途:(1)可以当做特征抽取器( feature extractor)。(2)也可以作为预训练模型
8.4 transformer
RNN存在的问题:
- 当文本序列很长的时候,无法记忆很久之前的信息,对距离很远的两个单词之间的联系容易遗忘
- 训练无法实现并行,之后的状态依赖于前面的隐层
总体结构
transformer丢弃CNN和RNN,仅仅使用attention;在encoder-decoder结构中使用self-attention取代了RNN
- Self-Attention
之前的attention是使用decoder的隐层与encoder的隐层算相似,而Self-Attention是用自己的隐层和自己算距离,然后再进行加权求和
不受距离干扰,每一个词对于it的“距离”都是一样的
计算
输入为512维的词向量,然后经过Self-Attention得到包含了上下文信息的新的向量,再将新的向量进行非线性变换(MLP)之后输入到下一层。相同的做法多次堆叠
- 将初始向量通过三个映射矩阵映射到三个向量中,分别为Query vector(Q),Key vector(K), and Value vector(V)
Q
Q
Q和
K
K
K是用来算相似度的,Q用于乘,K用于被乘(类似于中心词和周围词的概念,例如it作为中心词和周围词的作用和意义是不一样的),
V
V
V这里理论上应该是输入,猜测是为了和QK保持一致的纬度做了线性变换,同时也提高了模型的泛化能力
这里的
Q
K
V
QKV
QKV类似于特征图,
W
Q
W^Q
WQ
W
K
W^K
WK
W
V
W^V
WV是参数,将输入映射到
Q
K
V
QKV
QKV上
表达式(
d
k
d_k
dk表示K的纬度,这里的分母是为了平衡量纲)
ps:计算Self-Attention时会将所有输入单词放在一个矩阵中进行计算
-
Multi-Head Attention
一个Self-Attention可能不足以表达单词的多重层面的信息(例如it作为主语和代词是不同的),而Self-Attention的一组QKV参数只能表达一个层面的信息,Multi-Head Attention指在attention中设置多组QKV,在文中是8组
总体表达
得到的输出 Z i Z_i Zi全部concate一起经过非线性变换得到最终输出(包含了上下文信息和multi-head信息) -
Positional Encoding
句子中每个单词的位置信息也是很重要的,例如下面两个例子在Self-Attention看来就是一样的(RNN的缺点在于顺序学习而不是位置)
在初始的embedding中加入位置编码,为初始embedding加入一定的扰动,使得不同位置的相同单词存在一定的不同,但是差异不能过大
ps:这里的 P E ( p o s , 2 i PE_{(pos,2i} PE(pos,2i中pos表示位置,2i表示输入纬度
-
Encoder-Decoder Architecture
encoder部分表示残差,decoder部分的 masked multi-head attention是指只与当前词前面的部分做attention,后面的部分是masked。因为transformer是为机器翻译设计的,在实际情况中翻译到当前词的时候只知道之前的单词,而无法见到之后的单词
这里使用的是传统的attention,用decoder的Q和encoder的K做相似然后乘以encoder的V作为输出。编码和解码的时候用self-attention,翻译的时候用传统attention,小动画展示见小火炉视频1:26左右
机器翻译指标BLEU with n-gram.(n个连续的词是对的,一般取4)
W
t
W_t
Wt表示翻译的句子中单词的总个数;
m
m
m表示
-Transformer-XL
transformer只考虑了句子里的单词相关性,句子之外的信息也很重要。
Transformer-XL是在每个句子单独训练的基础上,在预测的时候将所有东西进行融合
-Vision Transformer
将transformer用于CV领域
将一张图分成9块,每一块作为一个单词,然后使用transformer
小细节
- 训练与测试中decoder的输入:在训练中,为了并行和加快收敛,使用了teacher forcing。decoder中输入的是真实的标签,由于在翻译的时候无法看到当前单词后面的句子,所以使用的是masked self-attention。在测试的时候,则是使用串行的预测的输出作为decoder的输入。
- 关于mask:实现中使用了两种mask。一种是padding mask,为了使用矩阵运算将所有句子统一到同一个长度,多余的部分丢弃,少的部分使用padding。另一种是masked self-attention,使用的是上三角为0的矩阵。
- self-attention:在传入参数的时候需要传入pad_mask,和att_mask。pad_mask的实质是将S_k中需要padding的部分设置为true,然后延S_q纬度复制(复制S_q次,如果是Batched,则需要延N纬度复制)。而att_mask则是使用一个上三角为true的矩阵表示。(理解:以N=1为例,S_q中的每一个元素都需要与每一行的S_k计算相似度,所以是对S_k复制)
- self-attention在计算score的时候,需要将为零的位置置为负无穷(masked_fill_函数)以便在使用softmax之后的权值为0
8.5 BERT
强大的预训练模型,使用自监督模型
主要思路:将ELMo结合上下文的方法和transformer提取特征的方式(只用了transformer的encoder部分进行特征提取)结合在一起。
每个输入样本都是两个用[sep]分隔开的句子,其embedding是初始embedding加上分隔embedding再加上位置embedding(是参数,没有用正余弦函数)
通过两个训练任务进行训练
Task 1: Masked LM
将一句话中某些单词遮挡住,通过其他单词进行预测
Task 2: Next Sentence Prediction
预测一个句子是否是下一句
8.6 GPT-3
用transformer的decoder部分做预训练模型
十一、Graph
实质:相关性
11.1 GNN应用
- 用户画像( User profiling):用户与用户之间建立关系
- 文本分类( Text classification):用图描述词与词之间的关系
- 关系抽取(Relation extraction):通过图的方式将一个句子的内容抽取出来
- Zero-shot image classification:预测训练集中未出现的类,将该类与其他类建立联系
- Point cloud semantic segmentation:构建一张图中点与点之间的关系
- Visual question answering:通过给定图像回答问题
- Physics systems:学习现实中的形态
- 分子指纹( Molecular fingerprints):分析分子的结构(例如各种基)
- 蛋白质结构预测( Protein interface prediction)
- 药物副作用预测( Polypharmacy side effects)
11.2 图表征学习(Graph Representation Learning)
学习图中节点的embedding
-
应用&&基础知识
- 节点分类(Node classification):根据一致信息对未知节点进行类别预测
- 边预测(Link prediction):预测节点与节点之间的关系
目标:通过图中的结构学习到每个节点的embedding(d维稠密向量,每一维都表示一种特征)
- 节点分类(Node classification):根据一致信息对未知节点进行类别预测
-
传统方法
- Locally Linear Embedding:使节点与其周围节点相似度最大化
- Laplacian Eigenmaps:想法类似。在该特征空间上,相邻的节点特征相近
- 图矩阵分解( Graph Factorization)
- 传统方法存在问题:无法大规模计算
- 解决思路:有边相连的节点的表征相似
- Locally Linear Embedding:使节点与其周围节点相似度最大化
-
Deepwalk
随机游走固定长度的路径作为一个样本,丢给Skipgram学习embedding
Deepwalk与Word2vec的区别:Word2vec中每个词有作为中心词和周围词的表征,而在Deepwalk中无向图没有方向,因此二者相同
存在问题:不是专门为图设计的方法,而是方法的迁移;无法处理有向图和带权图 -
LINE
提出二阶相连(有很多相同邻居的两个节点也是相似的)也很重要。如下图5和6也应该是相似的
无向图:
ps: p 1 ( v i , v j ) p_1({v_i},{v_j}) p1(vi,vj)表示预测i,j之间有边的概率; p ∧ 1 ( v i , v j ) {p^∧}_1({v_i},{v_j}) p∧1(vi,vj)表示真实值(用边的权重表示标签)
有向图:
做法类似 Word2vec,i->j和j->i是不同的,有两个矩阵(出发和到达)
二阶近似计算
ps:
∣
V
∣
|V|
∣V∣表示所有一阶邻居和二阶邻居
二阶权重计算(标签):
,
d
k
d_k
dk表示
v
k
v_k
vk的出度,
N
(
i
)
N(i)
N(i)表示
v
k
v_k
vk的邻居;一阶权重即为边的权值
最小化KL距离
总结: Deepwalk像dfs但是可回头; LINE像bfs,但并不是全局而是只到二阶
- Node2vec
将Deepwalk和LINEcombine,既考虑局部相似,也考虑全局相似(结构上)
计算走到下一个节点的概率
对于dfs和bfs来说,第一步的概率时相同的,都是边的权值, π v x = w v x π_{vx}=w_{vx} πvx=wvx;第二步之后的概率计算如下,其中t表示上一步,v表示当前步, d t x d_{tx} dtx表示t和下一步的最短距离, p p p和 q q q是两个超参,决定了路径的倾向(更像bfs还是dfs)
ps: p p p表示回头的概率, q q q决定了是否走得更远还是走得更广
例子
dfs是走过了远方知道自己与他人的区别;而bfs只知道自己与周围的区别
如何使用embedding
- 聚类
- 节点分类
- 预测两个点是否有边相连
缺点
- 没有参数共享。
- 对于没有见过的节点无法做预测。
- 无法使用节点本身的特征。
- 与下游任务是分离的。
解决:GNN
11.3 图神经网络( Graph Neural Networks)
对任务建立节点和边构成图,然后使用GNN挖掘顶点之间的关系。学习映射关系去生成embedding(借鉴CNN的思路)而不是直接学习embedding
- GCN
主要思路:节点先吸收(学习)邻接节点的信息,然后再吸收邻接节点的邻接节点的信息,吸收过程是做聚合。通过邻接信息生成计算图。
ps:只能用于有监督学习
初始设定(条件):
- 节点集合
V
V
V
- 邻接矩阵
A
A
A
- 节点的初始特征
X
X
X,也可以没有但需要初始化
方法概要:
举例A:A的第一层特征是通过A的邻居节点的初始特征通过某一种聚合方式聚合得到(与CNN的思路类似)。其他节点类似通过其邻居节点的初始特征聚合。然后一层一层往下走。聚合通过下图“方块”中的参数学习
ps:这里的embedding不是参数,而是参数学习得到的特征;灰色方块中的聚合关系才是参数,是需要学习的东西
参数共享:
所有节点每一层的聚合参数都是相同的,例如所有节点聚合的第0层参数是相同的,第k层参数也是相同的;但是不同层不同
参数计算:
h
v
k
h^k_v
hvk表示节点v第k层的embedding;其计算是通过相邻节点上一层embedding求均值并做线性变换再加上自身上一层的embedding的线性变换,在进行非线性激活。其中
W
k
W_k
Wk和
B
k
B_k
Bk是参数。其等价的矩阵表达式如下
训练:对得到的节点表征之后接MLP做预测或分类。例如预测药物是否有毒
- GraphSAGE
在聚合方式上进行改进,将原来的求均值换成一个聚合函数
聚合方式:- 平均聚合
- LSTM:将所有邻居拉成一个时间序列,学习隐层的信息并作为下一轮使用的信息。且为了去除序列相关性在函数中加入随机(做很多次LSTM)
- 取最大值等等
- 平均聚合
可以用于半监督学习,没有标签的节点也参与了训练。半监督可以分为两类:
- Transducrtive:训练时可以使用测试数据的特征,但不能使用其标签
- Inductive:训练时不可以使用测试数据
GNN优点:
- 可以实现新节点的embedding生成。当新节点出现,对其建立边,然后使用GCN/GraphSAGE即可得到其embedding
- 可以处理全新的网络。可以在旧的Graph上训练得到模型参数,然后将其应用的新的Graph进行预测(前提是两个Graph属于同一领域)。
- GAT
思路:一个节点的所有邻居对其的贡献可能是不同的,这里可以使用attention来学习邻居对节点的权重
具体计算方法:
- 将节点u和节点v通过过线性变化后输入一个简单的神经网络
a
a
a,得到其权重
e
v
u
e_{vu}
evu
- 对
e
v
u
e_{vu}
evu做softmax处理,得到u到v的权重
a
v
u
a_{vu}
avu
- 最后进行加权求和
11.4 近几年工作改进
- HGCN:将原始的欧式空间换为双曲线空间
- GTN:引入transformer
- Relational Graph:神经网络之间的联系本质上也是图的结构,用图神经网络解释神经网络