Neural NILM Deep Neural Networks Applied to Energy Disaggregation

论文代码地址:https://github.com/JackKelly/neuralnilm

摘要

能源分解通过单个仪表估算设备的电力消耗,该仪表测量整个家庭的电力需求。最近,深度神经网络工作在相邻机器学习领域(例如图像分类和自动语音识别)中的分类性能方面取得了显着的改进。

 在本文中,我们将三种深度神经网络结构应用于能量分解:1)一种称为“长期短期记忆”(LSTM)的递归神经网络; 2)去噪自动编码器; 3)网络,其回归每个设备激活的开始时间,结束时间和平均功率需求。

我们使用七个指标来测试这些算法在五个设备的实际总功率数据上的性能。对培训期间未见的房屋和培训期间看到的房屋进行测试。我们发现所有三个神经网络都比组合优化或因子隐马尔可夫模型获得更好的F1分数(在所有五个设备上平均),并且我们的神经网络算法很好地概括为一个看不见的房子。

绪论:

哈特[1,2]在20世纪80年代中期。哈特描述了特征的“特征分类法”[2],他从1984年开始的最早的工作描述了提取更详细特征的实验1。

然而,哈特决定专注于仅提取稳态之间的过渡。针对低频数据(1 Hz或更慢)设计的许多NILM算法遵循Hart的领先优势,仅提取少量特征。

在合同中,在高频率NILM(以kHz或甚至MHz采样)中,手动工程丰富的特征提取器(例如[3,4])的文献中有许多例子。人类可以学习通过眼睛检测聚合数据中的器具,尤其是具有功能丰富的签名的设备,如图1中所示的洗衣机签名。

人类几乎可以肯定地利用各种功能,例如电机的快速开关循环(产生快速〜200瓦的振荡),当洗衣机开始快速旋转衣服等时,斜坡朝向末端。

我们可以考虑手工工程特征提取器来实现这些丰富的功能。但这将是耗时的并且所得到的特征检测器可能对噪声和伪像不稳健。出现了两个关键的研究问题:算法能否自动学会检测这些特征?

我们可以从邻近机器学习领域学到任何东西,比如图像分类吗?

 在2012年之前,提取图像分类特征的主要方法是手工设计特征检测器,如尺度不变特征变换[5](SIFT)和高斯差分(DoG)。然后,在2012年,Krizhevsky等人在ImageNet大规模视觉识别挑战中的获胜算法[6]获得了比第二最佳方法(26%)低得多的错误分数(15%)。

     Krizhevsky等人的方法没有使用手工设计的特征检测器。相反,他们使用深度神经网络,自动学习从原始图像中提取特征层次结构。深度学习现在不仅是图像分类的主导方法,而且也是这样的领域

    作为自动语音识别[7],机器翻译[8],甚至学习从头开始玩电脑游戏[9]!

  在本文中,我们研究深层神经网络是否可以适用于能源分解。在NILM上使用“小”神经网至少可以追溯到Roos等人。 1994年[10](尽管该文件只是一项提案)并继续

[11,12,13,14],但这些小网似乎没有学习特征检测器的层次结构。当计算能力(由GPU提供)可用于训练大量数据的深度神经网络时,图像分类取得了重大突破。在目前的研究中,我们想看看深层神经网络是否能够在能量分解方面提供良好的性能。

我们的主要贡献是使三种深度神经网络架构适应NILM。对于每个架构,我们为每个目标设备培训一个网络。我们将两个基准分解算法(组合优化和因子隐马尔可夫模型)与使用七个度量的三个深度神经网络的分解性能进行比较。

   我们还研究了我们的神经网络在培训中看不到的房屋中的设备的概括程度,因为最终,当“在现场”使用NILM时,我们很少有我们想要分解的房屋的地面真实设备数据。因此,NILM算法可以概括为看不见的房屋。请注意,经过训练,我们的神经网络不需要每个房屋的地面真实设备数据!最终用户只需要提供汇总数据。这是因为每个神经网络都应该学习其目标设备的“本质”,以便它可以推广到该设备的看不见的实例。以类似的方式,训练进行图像分类的神经网络在每个类别(狗,猫等)的许多示例上进行训练,并推广到每个类别的看不见的示例。

为了提供更多背景信息,我们将简要介绍我们的神经网络如何在野外大规模部署。每个网络都将接受有关其目标设备类型的许多示例的监督培训,因此每个网络都学会很好地概括为看不见的设备。

    训练计算成本很高(在快速GPU上处理的天数)。但培训不必经常进行。一旦训练了这些网络,推理便宜得多(对于一周的聚合数据,在快速GPU上每个网络处理大约一秒钟)。来自看不见的房屋的汇总数据将通过每个网络提供。每个网络都应过滤掉其目标设备的电力需求。在智能电表或家用显示器内的嵌入式处理器上运行该处理可能计算成本太高。相反,聚合数据可以从智能仪表发送到云。每十秒钟对一个16位整数样本(0-64 kW,1瓦步长)的存储要求是每天17千字节未压缩。这个信号应该很容易压缩,因为国内总电力需求有很多时期,很少或没有变化。压缩比为5:1,并且忽略日期时间索引,来自1000万用户的一年数据的总存储要求为13TB(可能适用于两个8TB磁盘)。如果可以在每个家庭一秒钟内处理一周的聚合数据(这应该可以进行进一步优化),那么来自1000万用户的数据可以由16个GPU计算节点处理。或者,可以在每个家庭内的计算设备上执行分解(现代笔记本电脑或移动电话或专用的'分解中心'可以处理分解)。分解不需要GPU,但它使速度更快。

网络:

在实践中,通常在一批随机选择的输入向量上计算前向通过。 在我们的工作中,除了最大的递归神经网络(RNN)实验之外,我们使用每批64个序列的批量大小。 在我们最大的RNN中,我们使用批量大小为16(允许网络适应我们GPU上的3GB RAM)。

MSE提供平滑的误差表面,激活函数是可微分的,因此我们可以使用梯度下降。第一步是通过计算目标函数相对于每个权重的导数来计算当前批次位置处的误差表面的梯度。然后我们通过添加梯度乘以'学习率'标量参数来修改每个权重。在我们的所有实验中,我们使用随机梯度下降(SGD),Nesterov动量为0.9。

考虑识别照片中的对象的任务。无论我们是手工设计特征探测器还是从数据中学习特征探测器,事实证明有用的“低级”特征涉及图像的小块,并包括不同方向,角落,斑点等边缘等特征。我们想要构建少量特征检测器(一个用于水平线,一个用于斑点等),具有小的感知区域(输入图像的重叠子区域),并在整个图像上滑动这些特征检测器。卷积神经网络(CNNs)[20,21,22]构建了少量的滤波器,每个滤波器都具有一个小的感知场,并且这些滤波器在整个输入上被复制(具有共享权重)。

与计算机视觉任务类似,在时间序列问题中,我们经常希望提取少量低级特征,在整个输入中具有小的感知域。我们所有的网都在输入端使用至少一个1D卷积层。

  • 数据

深度神经网络需要大量的训练数据,因为它们具有大量可训练的参数(网络权重和偏差)。 本文描述的网具有100万至1.5亿个可训练参数。 大型训练数据集很重要。 深度学习中的常见做法是通过多次复制训练数据并对每个副本应用真实的变换来增加训练集的有效大小。 例如,在图像分类中,我们可能会水平翻转图像或应用轻微的仿射变换。

创建大型训练数据集的相关方法是生成模拟数据。例如,Google DeepMind在计算机游戏上训练他们的算法[9],因为它们可以生成有效的无限量的训练数据。逼真的合成语音音频数据或自然图像更难以产生。

   在能量分解中,我们的优势在于,通过随机组合真实设备激活,有效地生成无限量的合成聚合数据相对容易。 (我们将'设备激活'定义为单个设备在该设备的一个完整周期内所消耗的功率。例如,图1显示了洗衣机的单个激活。)我们在合成聚合数据和实际汇总数据的比例为50:50。我们发现合成数据可以作为常规用户。换句话说,对合成和实际汇总数据的混合而不仅仅是真实数据的培训似乎可以提高网络推广到看不见的房屋的能力。对于验证和测试,我们只使用真实数据(非合成)

我们使用UK-DALE [23]作为源数据集。 UK-DALE中的每个子表每6秒采样一次。 所有房屋每6秒钟记录一次总表观电源。 房屋1,2和5还每秒记录一次有功和无功电源。 在这些房屋中,我们将1秒的有源电源下采样到6秒,以便与子计量数据保持一致,并将其用作这些房屋的实际汇总数据。 假设短于3分钟的设备数据中的任何间隙都是由RF问题引起的,因此由前向填充填补。 假设超过3分钟的任何间隙是由于设备和仪表被关闭而因此填充零。    

我们手动检查了每个房屋随机选择的设备激活情况。 UK-DALE元数据显示House 4的微波炉和洗衣机共用一米(我们手动验证的事实),因此House 4中的这些设备未用于我们的培训数据。

我们为每个目标设备培训一个网络。目标(即网络的期望输出)是目标设备的功率需求。我们在本文中描述的每个网络的输入是总功率需求的窗口。窗口宽度根据设备逐项确定,从水壶的128个样本(13分钟)到洗碗机的1536个样本(2.5小时)不等。我们发现增加窗口大小会损害短时间设备的分解性能(例如,对于冰箱使用1024的序列长度导致自动编码器(AE)无法学习任何有用的东西,并且'矩形'网获得了F1分数0.68;将序列长度减少到512允许AE得到0.87的F1得分,'矩形'得分为0.82)。另一方面,重要的是确保窗口宽度足够长以捕获大多数设备激活。

    对于每个房屋,我们保留了上周的测试数据,并使用其余数据进行培训。器具培训激活次数如表1所示,测试激活次数如表2所示。用于培训和测试的具体房屋如表3所示。

3.1设备的选择

我们在所有实验中使用了五种目标设备:冰箱,洗衣机,洗碗机,水壶和微波炉。我们选择这些设备是因为每个设备都出现在英国DALE的至少三个房屋中。这意味着,对于每个设备,我们可以在至少两个房屋上训练我们的网并在不同的房屋上进行测试。这五种设备消耗了相当大比例的能量,五种设备代表了从水壶简单开/关到洗衣机所示复杂图案的各种不同功率“特征”(图1)。

游戏机和手机充电器等“小型”设备对许多NILM算法都存在问题,因为小型设备对总功率需求的影响往往会在噪声中丢失。根据定义,小家电不会单独消耗太多能量,但是现代家庭往往拥有大量这样的家用电器,因此它们的总消耗量可能很大。因此,使用NILM检测小型设备会很有用。我们还没有探究我们的神经网络是否能在“小型”设备上表现良好,但我们计划在未来使用。

3.2设备的激活

使用NILMTK的[24] Electric.get_activations()方法提取设备激活。 我们传递给每个设备的get_activations()的参数如表4所示。在简单的设备(如烤面包机)上,我们通过严格查找高于某个阈值功率的连续样本来提取激活。 然后,我们丢弃任何短于某个阈值持续时间的激活(忽略虚假尖峰)。 对于更复杂的设备,例如洗衣机的电源需求在一个周期内短时间内可能低于阈值,NILMTK忽略了短期的亚阈值电力需求

3.3窗口大小

 (约束条件是必须在显示到网络的数据窗口中完全捕获激活,除非窗口太短而不能包含整个激活)。

实际聚合数据的相应时间窗口也被加载并显示给网络及其输入。如果目标设备的其他激活碰巧出现在聚合数据中,则这些激活不包括在目标序列中;网络经过培训,专注于聚合数据中第一个完整的目标设备激活。

3.4合成数据

为了创建合成聚合数据,我们首先为所有培训机构中的五个设备提取一套设备激活:水壶,洗衣机,洗碗机,微波炉和冰箱。为了创建单个合成数据序列,我们从两个零向量开始:一个向量将成为网络的输入;另一个将成为目标。每个向量的长度定义网络看到的数据的“窗口宽度”。我们通过五个设备类来决定是否在训练序列中添加该类的激活。

目标设备有50%的可能性出现在序列中,相互之间“分心器”设备的概率为25%。对于每个选定的设备类,我们随机选择设备激活,然后随机选择在输入向量上添加该激活的位置。 Distractor设备可以出现在序列中的任何位置(即使这意味着只有部分激活将包含在序列中)。目标设备激活必须完全包含在序列中(除非它太大而不适合)。

   当然,这种相对天真的合成聚合数据的方法忽略了实际聚合数据中出现的大量结构。例如,水壶和烤面包机可能经常在实际数据中出现在几分钟之内,但我们简单的“模拟器”完全没有意识到这种结构。我们期望更真实的模拟器可以提高深度神经网络在能量分解方面的性能

  • 网络结构

4.1 rnn 和lstm

RNN的另一个增强是使用双向层。 在双向RNN中,实际上存在两个并行的RNN,一个向前读取输入序列,另一个向后读取输入序列。

在每个时间步,网络都会看到单个总功率数据样本,并为目标设备输出单个功率数据样本。(输出输入都是序列)

原则上,卷积层不应该是必要的(因为LSTM应该能够记住所有上下文)。 但我们发现添加卷积层可以略微提高性能(转换层在时间轴上卷积)。 我们也尝试添加CONV。 两个LSTM层之间的层,步幅> 1,以实现分层次采样[28]。 这显示了希望,但我们没有将它用于我们的最终实验。 在向后传球时,我们按照[29]中的Alex Graves将[~10,10]处的渐变剪辑。 为了加快计算速度,我们向后传播梯度最多500个时间步长。

4.2 dAE

迫使网络发现数据的紧凑表示的最简单方法是使代码层的尺寸小于

输入。在这种情况下,AE正在减少维数。实际上,具有单个隐藏层的线性AE几乎等同于PCA。但是,AE可以是深度和非线性的。去噪自动编码器(dAE)[30]是自动编码器,其尝试从有噪声的输入重建清洁目标。 dAE通常通过在信号进入网络输入之前人为地破坏信号并使用干净信号作为网络目标进行训练。

 在NILM中,我们认为腐败是其他设备的电力需求。所以我们不会人为地添加噪音。相反,我们使用总功率需求作为网络的(噪声)输入,并要求网络重建目标设备的清洁功率需求。

我们的NILM dAE的第一层和最后一层是1D卷积层。我们使用卷积层,因为我们希望网络学习低水平的特征检测器,这些检测器在整个输入窗口中均匀应用(例如,1000瓦的阶跃变化可能是一个有用的提取功能,无论在哪里找到它输入)。目的是为输入窗口中激活的确切位置提供一些不变性。最后一层做'去卷积'

整个dAE一次性进行端对端训练(我们不进行分层预训练,因为我们发现它没有提高性能)。 我们没有将权重绑定,因为我们发现这似乎也没有增强NILM的性能。

4.3 Regress Start Time, End Time & Power

能量分解的许多应用不需要对器具功率需求进行详细的逐秒重建。相反,对于每个设备激活,大多数能量分解用例需要识别开始时间,结束时间和消耗的能量。 换句话说,我们希望在聚合数据中围绕每个设备激活绘制一个矩形,其中矩形的左侧是开始时间,右侧是结束时间,高度是设备之间的平均功率需求。 开始和结束时间.

深度神经网络已经在相关任务中取得了巨大成功。例如,Nouri使用深度神经网络来估计面部图像中“面部关键点”的2D位置[31]。示例'关键点'是'左眼中心'或'嘴中心上唇'。 Nouri神经网络的输入是面部的原始图像。网络的输出是一组x;每个关键点的y坐标。

    我们的想法是训练神经网络来估计三个标量的实值输出:第一个设备激活的起始时间,结束时间和平均功率需求出现在总功率信号中。如果聚合数据中没有目标设备,则所有三个输出都应为零。如果聚合信号中有多个激活,则网络应忽略除第一个之外的所有激

。所有输出都在[0,1]范围内。开始和结束时间编码为输入时间窗口的一部分。例如,时间窗口的开始被编码为0,结束被编码为1,并且时间窗口的一半被编码为0.5。例如,考虑输入窗口宽度为10分钟且设备激活从窗口开始1分钟并在窗口结束前1分钟结束的情况。该激活将被编码为具有0.1的起始位置和0.9的结束位置。示例输出在图2中的两个“矩形”行中显示。

我们手动定义了在每个实验的培训期间执行的重量更新次数。 对于RNN,我们执行了10,000次更新,对于我们执行100,000次的去噪自动编码器,对于回归网络,我们执行了300,000次更新。 无论是RNN还是AE都没有继续学习这些更新。无论我们执行多少次更新,回归网络似乎都会继续学习!

最大的dAE网络范围从1M到150M(取决于输入大小); RNN都有1M个参数,回归网的参数从28M到120M不等(取决于输入大小)。 我们所有的网络权重都是使用Lasagne的默认初始化随机初始化的。 本文中提出的所有实验均通过随机初始化(无分层预训练)进行端到端训练。

五 分解

考虑到每个网络的输入窗口持续时间最多只有几个小时,我们如何分解任意长的聚合数据序列?我们首先用零填充输入的开头和结尾。然后我们沿着输入序列滑动网络。因此,我们向网络展示的第一个序列将全部为零。然后我们将输入窗口STRIDE样本向右移动,其中STRIDE是手动定义的正,非零整数。如果STRIDE小于网络输入窗口的长度,则网络将看到重叠的输入序列。这允许网络多次尝试处理聚合信号中的每个设备激活,并且在每次尝试时,每个激活将由STRIDE样本向左移动。

在分解过程中,网络为每个时间步产生多个估计值,因为我们给网络重叠的输入段。

 对于我们的前两个网络架构,我们只需采用均值即可将每个时间步长的多个值组合在一起。

梳理我们的第三个网络的输出有点复杂。我们将每个预测的“设备矩形”叠加在一起。我们测量重叠并将重叠标准化为[0,1]。这为每个设备的电力需求提供了概率输出。要将此转换为每个设备的单个矢量,我们会对功率和概率进行阈值处理。

6实验结论

我们的LSTM结果表明LSTM对于两种器具效果最好,但在洗碗机和洗衣机等多态设备上表现不佳。一个可能的原因是,对于这些设备,功率信号中的信息“事件”可以相隔许多时间步长(例如,对于洗衣机,在第一加热器激活和旋转之间可能存在超过1,000个时间步长周期)。原则上,LSTM具有任意长的存储器。但是,信息事件之间的这些长期差距可能对LSTM构成挑战。需要进一步的工作才能理解为什么LSTM在多状态设备上挣扎我们所期望的LSTM结果的一个方面是LSTM不需要处理聚合数据的重叠窗口,因为它们总是输出相同的估计值,无论输入窗口的偏移量是多少(见图2)。

6.1训练更多数据

UK-DALE有数百天的数据,但只有五个房子。 任何机器学习算法只能在训练集中给出足够的变化时进行推广。 例如,House 5的洗碗机有时会对其加热器进行四次激活,但两个训练室(1和2)中的洗碗机只有两个峰值。 因此,自动编码器完全忽略了House 5洗碗机的前两个峰值! 如果神经网要学会很好地概括,那么我们必须训练大量的电器(数百或数千)。 这应该有助于网络在某些类别的设备中看到广泛的变化。

6.2 无监督

在NILM中,我们通常可以访问比标记数据更多的未标记数据。 神经网络的一个优点是,在对标记数据进行微调之前,它们原则上可以在未标记数据上进行“预训练”。 “预训练”应允许网络开始从数据中识别有用的功能,但不允许网络学习标记设备。 (预训练很少用于现代图像分类任务,因为非常大的标记数据集可用于图像分类。但在NILM中,我们有比标记数据更多的未标记数据,因此预训练可能很有用。)

   在无人监督的预训练之后,每个网都将接受有监督的培训。对所有可用的未标记数据进行预培训,而不是(或同样)进行预培训,尝试预培训主要是针对我们希望分解的每个房屋的未标记数据也可能很有意思。

  • 6
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Deep Recurrent Neural Networks(深度循环神经网络)是一种适用于序列数据处理的深度神经网络模型,常用于语音识别、自然语言处理等任务。如果你想使用Deep Recurrent Neural Networks模型,可以使用深度学习框架来实现,比如TensorFlow、PyTorch等。 以下是使用TensorFlow实现Deep Recurrent Neural Networks模型的示例代码,供你参考: ```python import tensorflow as tf # 定义模型参数 input_dim = 10 # 输入维度 hidden_dim = 64 # 隐层维度 output_dim = 2 # 输出维度 num_layers = 3 # RNN层数 # 定义输入张量 inputs = tf.placeholder(tf.float32, shape=[None, None, input_dim]) # 定义RNN单元 cell = tf.nn.rnn_cell.BasicLSTMCell(hidden_dim) # 堆叠多层RNN stacked_rnn = tf.nn.rnn_cell.MultiRNNCell([cell] * num_layers) # 初始化RNN状态 initial_state = stacked_rnn.zero_state(tf.shape(inputs)[0], tf.float32) # 计算RNN输出 output, state = tf.nn.dynamic_rnn(stacked_rnn, inputs, initial_state=initial_state) # 定义输出层 weights = tf.Variable(tf.random_normal([hidden_dim, output_dim])) bias = tf.Variable(tf.random_normal([output_dim])) logits = tf.matmul(output[:, -1, :], weights) + bias # 定义损失函数和优化器 labels = tf.placeholder(tf.int32, shape=[None]) loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(labels=labels, logits=logits)) optimizer = tf.train.AdamOptimizer().minimize(loss) # 训练模型 with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for i in range(num_epochs): # 获取批次数据 batch_inputs, batch_labels = get_batch_data(batch_size) # 训练模型 _, loss_val = sess.run([optimizer, loss], feed_dict={inputs: batch_inputs, labels: batch_labels}) print('Epoch %d, loss: %f' % (i, loss_val)) ``` 在这个示例代码中,我们使用了TensorFlow来实现一个三层的LSTM模型用于序列分类任务。具体来说,我们定义了模型的输入张量、RNN单元、RNN层数、输出层、损失函数和优化器,并在训练过程中动态输入数据进行模型的训练。 注意,这只是一个示例代码,实际的Deep Recurrent Neural Networks模型实现可能会更加复杂和庞大,需要根据具体的任务和数据进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值