基于深度迁移学习进行时间序列分类
本文是法国上阿尔萨斯大学发表于 IEEE Big Data 2018 上的工作。
论文动机
通常来说,用传统的机器学习方法(例如 KNN、DTW)进行时间序列分类能取得比较好的效果。但是,基于深度网络的时间序列分类往往在大数据集上能够打败传统方法。另一方面,深度网络必须依赖于大量的训练数据,否则精度也无法超过传统机器学习方法。在这种情况下,进行数据增强、收集更多的数据、使用集成学习模型,都是提高精度的方法。这其中,迁移学习也可以被用在数据标注不足的情况。
从深度网络本身来看,有研究者注意到了,针对时间序列数据,深度网络提取到的特征,与 CNN 一样,具有相似性和继承性。因此,作者的假设就是,这些特征不只是针对某一数据集具有特异性,也可以被用在别的相关数据集。这就保证了用深度网络进行时间序列迁移学习的有效性。
论文方法
本文基本方法与在图像上进行深度迁移一致:先在一个源领域上进行 pre-train,然后在目标领域上进行 fine-tune。 然而,与图像领域有较多的经典网络结构可选择不同,时间序列并没有一个公认的经典网络架构。因此,作者为了保证迁移的效果不会太差,选择了之前研究者提出的一种全卷积网络(FCN,Fully Convolutional Neural Network)。这种网络已经在之前的研究中被证明具有较高的准确性和鲁棒性。
网络结构如下图所示。
网络的输入是一个可变长度的时间序列。网络的输出是数据集中C个可能类的概率分布。第一层、第二层、第三层为卷积层,以Rectified Linear Unit (ReLU)
为激活函数。每个卷积层后面都有一个batch normalization
。其中,第一个卷积层由128个长度为8的滤波器组成。第二个卷积由256个长度为5的滤波器组成。最后一个卷积层包含128个长度为3的滤波器,三个卷积操作的步长都为1。
网络第四层由一个全局平均池操作组成,该操作接受第三个卷积的输入,并对时间轴上的每个时间序列进行平均。这种平均操作大大减少了模型中的参数数量,同时启用了类激活映射,它允许解释所学习的特性。
最后一层是softmax层,其中C个神经元与数据集中的类数相等。
- 网络迁移适配
Fine-tune 的基本方法就是,不改变除 softmax 层以外的层的结构,只改变 softmax 层的构造。例如,预训练好的网络可能是一个分 5 类的网络,而目标领域则是一个 10 类的分类问题。这时候,就需要改变预训练网络的 softmax 层,使之由原来的 5 层变为 10 层,以适应目标领域的分类。
因此,源领域和目标领域的网络相比,除最后一层外,其他都相同。当然,相同的部分,网络权重也相同。
作者对整个网络都在目标领域上进行了fine-tune,而不是只fine-tune最后一层。因为以往的研究标明,在整个网络上进行 fine-tune,往往会比只 fine-tune 某些层效果好。
- 选择合适的源领域:数据集间相似性
在进行迁移学习前,一个重要的问题就是:给定一个目标域,如何选择合适的源领域,如果选择的源域与目标域相似性过小,则很可能造成负迁移。
度量时间序列相似性的另一个问题是,如何度量不同维度的时间序列的相似性。作者提出把多维时间序列规约成每类由一维序列构成,然后利用 DTW(Dynamic Time Warping)来度量两个时间序列的相似性。
在进行规约时,作者利用了之间研究者提出的 DTW Barycenter Averaging (DBA) 方法进行了时间序列的规约。经过规约后,两个数据集便可度量相似性。
算法分为数据规约和距离计算两部分。
数据规约步骤如下:
data reduction step
1: for i = 1 to N do
2: C = D[i].classes
3: for c = 1 to length(C) do
4: avg_init = medoid(C[c])
5: C[c] = DBA(C[c]; avg_init)
6: end for
7: end for
其中 D
表示 UCR
数据集中的所有数据集的集合, N
表示集合 D
中的 N
个时间序列数据集。
使用
k-means
算法依据DTW
求出的距离对每个数据集中的每个类别进行聚类,从聚类结果中找出每个类别时间序列C
的cluster
,每个类的cluster
中包含若干条时间序列,对应于第2
行。例如:对于UCR
数据集中的ShapeletSim
数据集,该数据集种有两类数据,通过k-means
算法聚类结果C
中包含2
个cluster
,每个cluster
中包含若干条时间序列。遍历某一数据集的所有
cluster
,对应第3
行。对每个类别的cluster
(里面包含若干条时间序列)使用DBA
算法将这若干条时间序列规约为1
条时间序列(最具有代表性)。对应于第4, 5
行。
距离计算步骤如下:
distance calculation step
8 : for i = 1 to N do
9 : C_i = D[i].classes
10: for j = 1 to N do
11: C_j = D[j].classes
12: dist = 9999999
13: for c_i = 1 to length(C_i) do
14: for c_j = 1 to length(C_j) do
15: cdist = DTW(C_i[c_i], C_j[c_j ])
16: dist = minimum(dist, cdist)
17: end for
18: end for
19: M[i; j] = dist
20: end for
21: end for
22: return M
- 遍历所有的数据集对组合,对应于第
8
行到第10
行。 - 遍历每个数据集的每个类(在这个阶段,由于数据规约步骤,每个类由一个平均时间序列表示),对应于第
13
行到第14
行。其中length(C_i)
表示该类经过规约之后包含多少个平均时间序列即多少类。 - 将两个数据集之间的距离设置为它们对应的类之间的最小
DTW
距离,对应于第15行到第19行。
经过相似度计算,可以针对n
个数据集,得到一个n×n
的相似性矩阵。此矩阵表示了不同数据集之间的相似度。相似度高的两个数据集,迁移效果最好。
实验
作者利用了 UCI 机器学习仓库中的 85 个时间序列分类数据集,构建了 7140 对迁移学习任务。为了进行如此大量的实验,他们用了来自英伟达的 60 个 GPU。
实验非常充分,这里简要说一下部分结论:
利用迁移往往效果比不迁移好;
同一个目标域,不同的源域,产生的迁移效果千差万别:总能找到一些领域,迁移效果比不迁移好;
在选择正确的源域上,有时,随机选择的效果不一定会比经过作者的方法计算出来的要差。这说明,计算领域相似性的方法还有待加强。
[参考][https://www.jiqizhixin.com/articles/2018-11-15-17]
[作者论文源码][https://github.com/hfawaz/bigdata18]
原文地址:https://www.cnblogs.com/kanjian2016/p/11451195.html
- .NET Core全新路线图
- jboss eap 6.2+ 版本中 加密datasource密码等敏感信息
- WordPress自定义栏目运用实例II:添加文章Meta标签(keywords /description)
- 《Deep Learning with Python》第一章 1.1 人工智能、机器学习和深度学习
- boost::function的用法
- rpc框架之 thrift 学习 1 - 安装 及 hello world
- WordPress自定义栏目运用实例Ⅰ:添加文章来源
- ZooKeeper 笔记(5) ACL(Access Control List)访问控制列表
- 算法:支持重复元素的二分查找
- .NET 异常处理的动作策略(Action Policy)
- 如何在mac本上安装android sdk
- Fityk-曲线拟合工具
- maven: 打包可运行的jar包(java application)及依赖项处理
- Effective java 第2版 - 笔记(01) 单例(Singleton)的枚举(enum)实现
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android登录注册功能 数据库SQLite验证
- CMQ消费者报错,无法获取本机ip地址问题排查
- 腾讯云TKE-Metrics-Server案例: TKE中自建Metrics-Server问题
- (建议收藏)关于JS事件循环, 这一篇就够啦
- TensorFlow2 开发指南 | 02 回归问题之汽车燃油效率预测
- 腾讯云TKE-Ingress案例: TKE-Ingress与Nginx-Ingress共存
- 玩转Kotlin 彻底弄懂Lambda和高阶函数
- leetcode之仅仅反转字母
- 3分钟短文:Laravel的“南天门”,过滤掉七七八八的数据
- 【1024,Serverless】maimai_DX 查分器
- TRTC/MLVB/IM案例:SDK用户日志提取与管理的一种实现方案
- 从 1 到 0 构建博客项目(3) --LNMP--WordPress
- 4. Validator校验器的五大核心组件,一个都不能少
- leetcode之罗马数字转整数
- B站签到-云函数