激活函数总结

ReLU及其变种

RELU

RELU6

为啥是6呢,很玄学。

ELU

在负数范围内的操作1。

PReLU

学习a,在负数范围内的操作2。

LeakyRELU

β不变,在负数范围内的操作3。

Threshold

tanh及其变种

Hardtanh

tanh

sigmoid及其变种

sigmoid用作二元分类问题,softmax用作k元分类问题。

Sigmoid

Softmax

LogSigmoid

LogSoftmax

其他

Softplus

Softplus函数是ReLU函数的平滑逼近,Softplus函数可以使得输出值限定为正数。
为了保证数值稳定性,线性函数的转换可以使输出大于某个值。

Softshrink

Softsign

Tanhshrink

19KDD AccuAir Winning Solution to Air Quality

目的:用空气质量、meteorology (气象学)、spatial topology (空间拓扑)、天气预报、站点信息、时间信息来预测空气质量。

难点:影响因素多,参量之间的影响是非线性的且具有时空特性,突变的噪声性质,有未知参量的影响。

解决方案:建立了LightGBM、spatial-temporal gated DNN、Seq2Seq model三个模型,分别用现有数据集训练;再训练一个线性模型将上述三个模型的结果合并起来作为预测的输出。

related work

介绍了气象学模型,静态学习模型,深度学习模型(基于时间序列)来解决空气质量预测的问题。提出完成此任务要提出融合多种时空信息的策略,这是解决问题的关键。

提出的方法

LightGBM:特征选择器,比较稳定

spatial-temporal gated DNN:有处理时空响应的能力

Seq2Seq model:编码输入,解码输出

LightGBM

LightGBM是基本的baseline,spatial-temporal gated DNN提取时空信息。Seq2Seq model做编解码,能对快速变化的输入产生良好的反应。本文分为了四个步骤训练LightGBM。第一步使用72h的气象学数据训练模型,得到的效果很差。第二步加入天气预测数据,效果比第一次好。第三步加入了历史空气质量数据,效果提示明显。第四步加入城市中12个站的数据,效果又得到提升。

Spatial-temporal Gated DNN

为了解决深度神经网络对于时间信息的不敏感性,本文提出时空门的概念,可以控制信号的长度。

ps:swish是一个激活函数:swish(x)=x*sigmoid(bx)

有缺失的数据?通过mask进行预处理?

Sequence to Sequence Model

用GRU做循环单元。

历史数据72h,预测未来48h。

对于缺失数据用了另一篇文章提到的方法。

result

4.1先介绍了评测指标。4.2和别的参赛队伍的比较。4.3用控制变量法分析输入特征的作用,并说明了用线性回归模型来整合三个模型的输出结果。

19IJCAI Multi-Group Encoder-Decoder Networks to Fuse Heterogeneous Data for Next-Day Air Quality Prediction

本文提出multi-group Encoder-Decoder networks (MGED-Net) 模型融合多种输入特征,解决预测一天后预测给定站点,给定污染物种类(PM2.5)的污染程度的问题。

难点:时空数据都存在,面临异构数据融合的问题;需要进行较长时间(一天)的预测。针对这些难点,本文提出了一个多组数据的Encoder-Decoder模型,主要贡献有三点。

  • 将空间网格的天气数据(包括历史与未来的)通过卷积核(根据先验得出的)变换成观测站附近的天气数据。
  • 按照皮尔斯相关系数进行特征分组。
  • 利用组间互相关进行encoder后的特征融合。

感觉(2)(3)步共同构成了类似集成学习的一个算法。

用到的数据类型:用到k个空气污染物种类,历史和预测的天气数据都用。还用到地理环境(道路信息和海拔数据)、时间戳信息。

总体解决方案:作者主要从数据的角度入手,利用经典的Encoder-Decoder网络模型,加上提出的三点创新性的数据融合算法,来解决此预测问题。下面是本文提出的网络架构图:

structure

本文创新点

特征表示

此方法在文中仅仅针对天气数据。天气特征是网格化的,而我们针对的是站点的空气质量预测。所以要将网格化的数据转换为与某一站点有关的数据,采用了三种方法结合:

  • 选取站点所在的网格的天气数据。
  • 取周围k×k网格天气数据的平均。
  • 用各种代表天气状态(比如风向)的卷积核卷积k×k的网格天气数据。

特征分组

本文提到了3种不同的分组方法:

  • 每个特征一组
  • 每个领域的特征一组。(天气特征一组,空气质量特征一组)
  • 相关性分组

相关性分组是重点。本文的分组思想是最大化类内相关性并且最小化类间相关性。用到了皮尔逊相关系数来表示相关性。采用枚举把特征分为2,3,4个组,来找出符合最大化类内相关性和最小化类间相关性的分组方法。

融合架构

  • 特征融合(在encoder之前)
  • encoder之后融合(在网络结构图中fusion位置)
  • encoder之后与相关性结合的融合(在网络结构图中fusion位置)

实验结果对比

  • 特征表示的三种方案对比
  • 特征分组三种方案对比
  • 三种融合架构的对比
  • 和其他模型的对比

由这些对比论证了模型的合理性。

dijkstra算法针对稠密图和稀疏图的两种不同策略

迪杰斯特拉(dijkstra)算法是一种普遍用于求两点之间(或者说一个给定点到图中其他任意点)的最短路径的算法。但当图的连接较为稠密或者较为稀疏的时候,采用两种不同的思路,可以优化算法的执行速度。

应用于稠密连接图的dijkstra算法

所谓稠密连接就是指图之间的连接路径趋近于n的平方(n为图中节点的个数)。在稠密连接的条件下,dijkstra算法的算法复杂度是O(n^2)。

算法思想是分两步走:

  • 从起点开始,依次找到距离起点最近且没有被遍历过的点。
  • 更新与这个点直接连接的点的最短距离值。

其中,更新最短距离值的状态转移方程为:

其中,x是指当前正在遍历的点,y是指和当前正在遍历的点直接连接的点,map(x,y)是指x和y的距离。

所以很容易得到,第一步的算法复杂度是O(n),第二步也是O(n)。由于两个步骤嵌套执行,所以算法复杂度是O(n^2)。

此算法的伪代码:

1
2
3
for([1:n]):
for([1:n]):找出距离起点最近且没有被遍历过的点
for([1:n]):更新与这个点直接连接的点的最短距离值

应用于稀疏连接图的dijkstra算法

稀疏连接和稠密连接界限的界定没有那么明显,但是在很多问题场景下,节点的数量远远大于与一个节点连接的边的数量。对于这种稀疏连接的图,我们可以将算法复杂度优化到O(mlogn)。其中m为图中边的个数,n为图中节点的个数。

算法思想总体思想和稠密图的类似,但是实现细节上有些不同。

在第一步找距离起点最近且没有被遍历过的点的时候,我们需要用到优先队列,就是在执行第二步更新节点值的时候,将与当前节点直接连接的节点(也就是可能被更新的节点)放入优先队列中,然后在下一步用优先队列直接取出距离最近的节点。我们知道优先队列的增删改查算法复杂度都在O(logn)之内。

在第二步更新当前遍历点直接连接节点的最短距离值的时候,就不用遍历所有节点了。

所以算法思想如下:

  • 从起点开始,依次遍历优先队列中的点。
  • 取与此节点相连接的边,并更新另一头连接节点的距离最小值。
  • 将相连的节点放入优先队列。

此算法的伪代码:

1
2
3
for(q:Queue):优先队列里与原点距离最短的点
for(e:Edge):与此点直接相连的边
将相连的节点放入优先队列;

此算法前两个循环实际上是遍历了m条边,再加上循环内优先队列的开销,可知此算法复杂度都是O(mlogn)。

pytorch学习笔记

官方文档链接

pytorch提供了一种数据结构tensor可以和numpy相互转化。

variable:网络中的节点数据,在网络中的节点可以自动求梯度。(当前版本好像和tensor合并了,也就是说不用variable了。)

pytorch搭建的神经网络只处理二维的数据结构,所以要把一维的数组用转换成二维。

pytorch搭建神经网络要定义一个类,并继承torch.nn.module。类里面要定义两个函数:一个是__init__函数,功能是初始化,要继承父类的__init__函数。另一个是forward函数,用于组合前向传播网络的结构。

主成分分析(PCA)算法的介绍、解释和证明

算法的目标

主成分分析(PCA)算法的目标是将一组p维的样本数据降为d维;需要满足两个条件:

  • 样本数据各点与其映射到d维中的点的距离尽量近。
  • 样本数据映射到d维之后,他们的投影之间的相互距离尽可能远。

(其实这两个条件是等价的。)

举个例子,如果p=2,d=1,则PCA算法可以由下图表示:

PCA

算法的步骤

  • 对所有的样本进行中心化操作,如果有m个样本数据,中心化操作如下:
  • 计算样本矩阵X的协方差矩阵,并做特征值分解。
  • 取最大的d个特征值所对应的特征向量作为维度变换的投影矩阵W*。所以PCA算法的结果为:

解释和证明

为什么要对输入数据进行中心化操作呢?

很显然,我们求协方差的时候,先会将每个样本减去平均值,再进行取平方再平均的运算。中心化的操作可以看成求协方差的一部分。如果没有进行中心化操作,效果可以见https://blog.csdn.net/fisherming/article/details/80236631。

为什么计算样本的协方差矩阵,并做特征值分解?

这就是PCA的核心证明问题了,有一定的数学功底而且想弄明白PCA算法原理的读者可以往下继续看。

首先,设降维映射后的坐标系的标准正交基为:

这里要解释一下,如果我们输入的样本是在普通的p维直角坐标系下表示的,那么降维变换后,映射到新的d为空间很有可能不是与以前的p维空间的某d和坐标轴重合,通俗的讲,这个d维空间往往是个斜的,就像把2维的数据映射到1维的直线的那个图一样,直线是斜的。所以就需要d为空间的基进行变换,从而达到用d维的数据就可以进行表示的目的。

所以,降维变换之后的一个d维向量可以表示为z(z1,z2,…,zd)。注意这个坐标的基已经进行了变换。所以:

(1) 考虑样本数据各点与其映射到d维中的点的距离尽量近

我们这时候要算降维变换前后对应点之间的距离,将其最小化就好了。可是我们发现降维变换前后的维度都不一样了,该如何算距离呢?这时我们要将降维变换后的坐标反变换回原来的p维空间内就好了。计算操作如下:

所以所有降维变换前后的样本点之间的对应欧式距离就可以计算了,计算公式如下:

上式应该被最小化,化简的步骤参照南瓜书,我就直接贴图了:

f1

所以PCA算法让我们转换成了一个典型的最优化问题:

(2) 考虑样本数据映射到d维之后,他们的投影之间的相互距离尽可能远

换成数学语言描述这个条件,就可以描述为最大化类内方差。也就是降维变换之后,使得样本在各个维度的方差最大化。这个思路似乎可以更简单的用数学表达式来描述。如果降维映射的标准正交基组成的矩阵为W,则:

所以也可以转化成一个典型的最优化问题:

我们可以发现,和(1)中的结果是等价的。

求解此最优化问题的步骤参照南瓜书,我这里也直接贴图了:

f2

学过线性代数的同学就会发现,证明的结果就是输入样本协方差矩阵的特征向量的定义式。所以我们需要计算协方差矩阵并对协方差矩阵进行特征值分解。

为什么要取最大的d个特征值所对应的特征向量作为维度变换的投影矩阵?

如果我们将原先的p为向量降维到d维,则需要取最大的d个特征值对应的特征向量构成d维空间的基向量,证明如下:

降维后的损失

既然是数据降维,就不可避免的损失一些东西。那么如何衡量损失的大小呢?可以通过特征值分解后最大的d个特征值之和与所有p个特征值之和的比值来反映损失的大小,即:

参考文献

《机器学习》周志华

https://datawhalechina.github.io/pumpkin-book/#/

吴恩达深度学习--卷积神经网络

卷积神经网络

一般的经典卷积神经网络是由卷积层、池化层和全连接层组成。其中卷积层和池化层交替出现,全连接层都在最后。

一个卷积层运算的细节:#卷积运算后输出图片的像素大小:

其中,输入图片像素为n×n,滤波器大小为f×f,p为padding大小,s为步长。这个公式也可以用于算池化层的输出图片像素。

如果严格按照数学定义的话,卷积操作应该先将卷积核翻转一次,如何不进行翻转应该叫做互相关操作。但为了操作简便,深度学习中的卷积不进行卷积核翻转。

ResNet

残差网络(ResNet)就是在普通的卷积神经网络中,加入短路连接。短路连接就是讲第i层直接连到i+n层,作为i+n层的一个输入。这种操作可以起到加深网络层数,而有效抑制使得随着网络层数的增加而产生的梯度爆炸、梯度消失的现象。

1×1卷积

我们知道池化层可以压缩数据长和宽的尺寸,而1×1卷积可以用来的压缩(改变)图像通道的维度。比起比较大的卷积核,1×1卷积改变通道的维度的计算量较小,速度更快。

例如,如果想将28×28×192的数据变为28×28×32,就可以用32个1×1×192的卷积核对其进行卷积操作。

在inception网络中用到1×1卷积来压缩图像通道的维度用来提升计算速度。

Inception

Inception模块是用多个不同大小的卷积核和池化层同时处理某一层的输入,再将处理的结果叠加起来进行输出。这样就不用人为的选定卷积核的大小了。

迁移学习

下载已经在大数据集上训练好的网络权重,只根据自己的业务进行少量层数(后面几层)的训练。通常是数据越多,应该训练的层数也越多。

YOLO

将一张图片分成n×n个网格,如果一个物体的中点落在某个网格里,则那个网格就认为有物体存在,然后再后面跟着物体的中点坐标和宽高还有表示物体种类的量,他们构成一个的p维向量。但是这个算法在一个格子里只能检测出一个物体。

所以说YOLO网络输入一张n×n像素的图片,输出的是一个n×n×p维向量。其中p维向量第一个数是表示有无物体(物体的中点是否落在此单元格内)。2-5个数分别表示物体的x,y坐标和宽高占比,其中,定义n×n方格内的左上角为(0,0),右下角为(1,1),所以x,y坐标必然属于[0,1],但是宽高占比可能大于1,因为物体边缘可能会跳出这个单元格。

在运行YOLO算法时,由于网格大小较小,往往会产生多个矩形框重叠在一个物体上。非极大值抑制(NMS)算法就是保留其中有目标物体可能性最高的矩形框,而舍弃与这个矩形框的IoU值较高的其他矩形框。

YOLO是you only look once的缩写,只用了一步来解决物体区域检测问题,而R-CNN、Fast R-CNN、Faster R-CNN则将物体区域检测任务分为了检测候选区域和对候选区域进行识别这两个步骤。

物体检测评价指标

Intersection over Union(IoU)就是计算预测区域和实际区域的交集和并集的比。

人脸识别

人脸识别的挑战是one-shot learning problem,就是只用一张图片作为训练集就能成功的识别出对应的人。

线性代数常用知识点总结

矩阵的四个基本子空间

矩阵的四个基本子空间分别是列空间、零空间、行空间、左零空间。

对于m×n维的矩阵A:

  • 列空间C(A),是方程Ax=b中b的解空间。可以理解为有列向量组成的矩阵A的线性组合。维数是rank(A)。
  • 零空间N(A),是方程Ax=0中x的可行解空间。维数是n-rank(A)。
  • 行空间C(A^T),是A转置的列空间。维数是rank(A)。
  • 左零空间N(A^T),是A转置的零空间。维数是m-rank(A)。

可以把行空间和零空间看做一组,列空间和左零空间看做一组,利用Gauss-Jordan消元法可以方便的同时求解两个空间的基。

正交矩阵

实矩阵A满足:

A为正交矩阵其中E为单位矩阵。正交矩阵是标准正交基)按列排列起来得到的矩阵。

正交矩阵是酉矩阵的在实数域的一种特殊形式。

特征向量&特征值

A是n阶方阵,如果存在数λ和非零向量ε,使得:

则称λ为方阵A特征值,ε称为方阵A的特征向量

相似矩阵

AB都是n阶矩阵,如果存在可逆矩阵P,使得:

则称AB相似。

相似矩阵有相同的特征多项式,也就是说AB有相同的特征值和相同的行列式(det),这是相似矩阵的一个重要性质。下面给出证明:

矩阵对角化

对于一个矩阵来讲,对角矩阵在各种计算上比较简单,比如二次型中的标准型就可以用对角矩阵表示。所以如果能将矩阵对角化,就可以方便计算。

n阶方阵A可对角化的充要条件是它有n个线性无关的特征向量。则有:

P由特征向量组成,Λ由特征值组成,即:

A实对称矩阵,则有:

其中QA的特征向量经过施密特正交化和单位化后得到正交矩阵。

奇异值分解(SVD)

当矩阵A不为方阵的时候,如果仍然想将矩阵A变为对角化的形式,则需要用到奇异值分解(SVD)的方法。

直接说结论。矩阵A可以分解为下面的形式:

其中:

如果矩阵A为m×n维矩阵,那么矩阵U为m×m维矩阵,矩阵D为m×n维矩阵,矩阵V为n×n维矩阵。

介绍一个用到奇异值分解的PCA算法:

主成分分析(PCA)

  • 去平均值,即每一位特征减去各自的平均值。
  • 计算协方差矩阵。
  • 通过SVD计算协方差矩阵的特征值与特征向量。(因为是方阵,我觉的也可以直接求特征值和特征向量再归一化。)
  • 对特征值从大到小排序(计算时往往已经排好),选择其中最大的k个。然后将其对应的k个特征向量分别作为列向量组成特征向量矩阵。
  • 将数据转换到k个特征向量构建的新空间中,即取矩阵U或矩阵V的前k行或前k列与原矩阵相乘。

具体证明过程

LU分解

矩阵的LU分解常用于解方程组。

将矩阵A(方阵)分解为:

其中L为下三角矩阵,U为上三角矩阵。

LU分解可以理解为对矩阵A构成的行列式进行初等变换(消元),如果这样理解的话,矩阵U可以看成简化后的行列式矩阵。

假设A为三阶方阵,将A消元的过程可以写成下式:

其中,E21是指消元第二行第一列的操作,形式如下:

所以,E21A执行的初等变化为r2=r2+kr1。即第二行更新为第二行加k倍的第一行。E31、E32的作业以此类推。

所以:

至于为什么是A=LU的形式,而不是EA=U的形式,可能是因为对E矩阵求逆后的乘法运算较为简便。

其实,这些矩阵的逆矩阵很好求解,如:

二次型

二次型表示的是二次齐次多项式,用矩阵表示。二次型常用来表示求二阶偏导数的情况。

二次齐次多项式形式如下:

令:

所以函数f可以写成矩阵的形式:

只含有平方项的二次型称为标准型。一般的二次型可以通过正交矩阵对角化变换得到标准型。

对于非零向量x∈R,如果总有f(x)>0,则称这个二次型为正定二次型,A为正定矩阵

对于非零向量x∈R,如果总有f(x)>=0,则称这个二次型为半正定二次型,A为半正定矩阵

行列式

行列式的研究对象是方阵

行列式的四条基本性质

  • 单位阵的行列式等于1。
  • 交换行列式的两行,行列式符号取反。
  • 矩阵某行的元素都乘以一个系数t,它的行列式是原先的t倍。即:
  • 矩阵某行的元素都加任意一个数,它的行列式等于原先的行列式加用被加数替换的矩阵的行列式。即:

由以上四条基本性质可以推导出以下几条常用的性质:

  • 矩阵存在任意两行相等时,其行列式为0。
  • 经过行初等变换的矩阵,其行列式不变。
  • 若有一行全为0,则其行列式为0。
  • 矩阵为奇异矩阵时,其行列式为0。
  • 一个矩阵和它的转置矩阵行列式相等。
  • 上三角矩阵(下三角矩阵)的行列式等于对角线元素的乘积。
  • 两个矩阵相乘的行列式等于两个矩阵的行列式相乘。即det(AB)=det(A)×det(B)。

吴恩达深度学习--序列模型

循环序列模型

模型的输入

每一条输入x^(i)包括一些有时间差异的序列数据,如x^(i,t)表示输入样例i在时刻t时的数据;以及表示这条序列的总长度T_x^(i)。

网络结构

每个时刻对应一层网络。每层网络的输入有两部分,分别是时刻输入数据和前一层网络的输出。第一层的前层网络输入(也就是T=0时刻的值)一般设为0。
网络中每一层的参数是共享的。
从网络结构可以看出,循环网络可以实现通过当前时刻之前的输入预测当前时刻的输出。

RNN有多种网络结构,包括一对多,多对一,多对多(分为输入序列长度与输出序列长度相同或者不同)。

前向传播

在每一层网络中,前向传播的方式如下:

激活函数g一般采用tanh函数;有时候也用ReLU函数。层与层之间的参数是共享的。

反向传播

循环神经网络的损失函数如下:

前向传播和反向传播的大致过程如下图所示(Tx=Ty的情况):
RNN

(在课程作业中,反向传播似乎没有更新Wya和by的值。)

梯度消失

RNN中,梯度消失问题主要是由于网络深度的增加,靠后的网络层的损失难以传播到靠前的网络层来影响其权重。下面介绍的GRU和LSTM可以一定程度上解决这个问题。

GRU

GRU(Gate Recurrent Unit)可以很好的捕获深层连接,改善RNN中梯度消失的问题。(某种程度上可以看做LSTM的简化版本)

GRU中的门函数的取值在0-1之间,往往接近0或者1,作用是选择保留或遗忘此时刻的数据。

GRU相比基本的RNN网络,加入了能起到记忆或者遗忘作用的门函数,如果这个时刻需要被记忆,则门函数的值为1,不需要被记忆则为0。GRU单层网络的公式如下:

其中:

LSTM

LSTM(Long Short-Term Memory)也能很好的捕获深层连接,每一层的网络结构比GRU要复杂一些,有三个门结构,分别是更新门(update)、遗忘门(forget)、输出门(output)。LSTM单层网络的公式如下:

LSTM单层网络的示意图如下:

LSTM

双向RNN&深层RNN

双向RNN比普通的RNN加入了沿时间序列反向计算的模块,所以双向RNN的输出公式为:

当然在GRU和LSTM中也可以实现双向传播。双向传播的缺点是需要完整的序列输入。

深层RNN就是加深在同一时刻RNN网络纵向的深度(也可以在GRU和LSTM的网络单元上进行加深,也可以变成双向传播的结构),加深出的单元可以与相邻时刻同一深度的单元横向连接,也可以不连接。感觉像是在每一时刻上都拥有一个深层的全连接网络。

attention机制

注意力机制(attention)就是提供一个表示某时刻的输出应该注意哪个时刻的输入的一个权重矩阵。其中:

网络结构如下图:

att

attn

词嵌入

词嵌入是对单词之间的相似度进行评价的一个矩阵,每个单词对应矩阵的一个高维的向量。如果两个单词关联相近,那么两个向量的距离就相近。

船舰识别比赛总结

最近参加了中科星图杯的遥感图像船舰识别的比赛,在此总结一下。

数据

组委会只给了10张遥感图像数据,所以我们要对数据进行扩增。

数据扩增的大概步骤为:

  • 截取原始图片的船舰
  • 将船舰贴到新的海港图片中并标记标签

截取原始图片的船舰

根据提供的数据集中船的坐标,可以用脚本将船单独截取出来。注意有的船不是正的矩形而是旋转过的矩形或者四边形,所以要将四边形外的像素点设置成透明(PNG格式的图片第四个通道表示透明度)。

这个算法需要通过四个点的坐标计算其围成的四边形所包含的像素。我采用的方法是先将四边形的四条边旋转绕一个顶点旋转为竖直和水平,记录旋转角度θ,再将所有像素点旋转θ后与边界比较,即可判断某一像素点是否在四边形内了。

将船舰贴到新的海港图片中并标记标签

这一步可以采用了两种扩增方式:

  • 用PS+labelme软件手动打标签

    由于船舰的位置一般靠近码头,所有手动添加可以使得扩增的数据维持这个特性。做法是先用PS将截取的船只放到靠近码头的海域,再用labelme软件打上标签。这种方法虽然能维持船舰的位置靠近码头这一特性,但是效率较低。

  • 寻找海港图片的海洋区域,随机把船贴到海洋上

    首先,我们先寻找海港图片的海洋区域。我采用的方法是对于每个海港图片,取一块海洋区域,计算RGB通道的平均值,设置阈值来寻找图片的海洋区域。

    提取出海洋区域后,就可以随机的往上面放船了。

模型

用了R2CNN-FPN网络,源代码链接
用这个结果训练和测试自己随机生成的数据效果还不错,但是跑组委会的数据效果不好,有待改进和分析。