机器学习周报24周

摘要

本周开启了Transformer的学习,初步理解了Transformer编码器的原理以及解码器自回归的解码方式,基于所学的基本原理,实现了一个简单的Transformer编码器,输出的结果为编码器输出张量的形状。本周还阅读了一篇基于Transformer的论文,了解了一种新的基于Transformer的预测模型TFT,还了解了一种新的超参数优化方式:自适应差分进化算法。

Abstract

This week, we began studying Transformers and gained a preliminary understanding of the principles behind the Transformer encoder and the autoregressive decoding mechanism of the decoder. Based on the fundamental principles learned, we implemented a simple Transformer encoder, and the output is the shape of the encoder’s output tensor. we also read a paper based on Transformers, learning about a novel prediction model called Temporal Fusion Transformers (TFT). Additionally, we familiarized ourself with a new method for hyperparameter optimization: the Adaptive Differential Evolution(ADE) algorithm.

一、文献阅读:Interpretable wind speed prediction with multivariate time series and temporal fusion transformers

论文摘要:

本研究提出了一种独特的预测方法,该方法融合了著名的分解技术、多因子可解释预测模型和优化算法。在所提出的模型中,采用变分模态分解(Variational Mode Decomposition, VMD)将原始风速序列分解为一组固有模态函数(Intrinsic Mode Functions, IMF)。然后利用自适应差分进化(Adaptive Differential Evolution, ADE)对时间融合Transformers(Temporal Fusion Transformers, TFT)的多个参数进行优化,以获得令人满意的预测性能。TFT是一种新的基于注意力的深度学习模型,它将高性能多视界预测和对时间动态的可解释见解结合在一起。

论文模型:

本研究提出一种基于VMD、ADE和TFT的模型(VMD-ADE-TFT),以实现正确、可解释的风速预测。VMD-ADE-TFT同时考虑历史风速序列和多个气象变量,并区分其对风速预报的重要性。VMD将原始风速数据分解为多个带限固有模式函数。为了获得更好的预测结果,通过应用ADE优化了TFT的六个关键参数。VMD分解的风速子模态作为历史输入。然后将气象数据和时间日期(例如“月”、“日”和“小时”)作为已知的未来输入输入到TFT模型中。

TFT:

TFT由谷歌云AI团队提出,是一种固有的可解释深度学习模型,用于预测多视界时间序列。TFT的解释能力强于一般黑盒模型。神经网络或复杂集成模型等黑盒模型通常具有很高的准确性。但是,内部工作机制并不容易理解,无法估计每个输入特征对模型预测结果的重要性,也无法理解不同输入特征之间的相互作用。而TFT具有上述内容的解释。同时,TFT是最新的方法,它超越了以前使用LSTM和CNN的时空方法。

TFT使用已建立的组件成功地为每种输入类型(即静态、已知未来和观察输入)构建特征表示,从而确保在各种预测问题中的高预测性能。TFT包括五个主要组成部分,即门控机制(Gating Mechanisms),变量选择网络(Variable Selection Networks),静态协变量编码器(Static Covariate Encoders),时间处理(Temporal Processing)和预测区间(Prediction Intervals)。
在这里插入图片描述
门控机制:为了使模型能够在变量和目标之间灵活地应用非线性处理,使用了门控残差网络(GRN)。GRN包含两种类型的输入,即主输入a和可选上下文向量c。GRN描述如下:
在这里插入图片描述
其中ELU是指数线性单元的激活函数,\eta _{1},\eta _{2}\in\mathbb{R}^{dmodel}表示中间层,LayerNorm是标准层规范化,同时,\omega代表权重共享。采用基于门控线性单元(GLU)的组件门控层,以灵活地抑制给定数据集不必要架构的任何部分。GLU描述如下:
在这里插入图片描述
其中\gamma \in \mathbb{R}^{dmodel}是输入,\sigma (\cdot )是sigmoid激活函数,b(\cdot ) \in \mathbb{R}^{dmodel}与W(\cdot ) \in \mathbb{R}^{dmodel\times dmodel}是偏移量与权重,dmodel隐藏状态大小,\bigodot是element-wise Hadamard product。GLU允许TFT控制GRN对原始输入的贡献程度。如有必要,可以完全跳过这一层,因为GLU的输出可能都接近于零,以抑制非线性贡献。

变量选择网络:变量选择网络可以提供对哪些变量对预测问题最关键的见解。它们还允许TFT消除任何可能降低预测性能的不必要噪声输入。让\left [ I \right ]_{t}=\left [ \xi {(1){\tau }} {t},…, \xi {(m){\tau }} {t} \right ]^{\tau }表示所有历史输入的平展向量,其中\xi ^{(j)} {t}转换后的输入j第个变量。如下图公式所示,扁平输入\left [ I \right ]{t}和外部上下文向量c{s}输入到GRN中,然后通过Softmax层以派生可变选择权重V{xt}。可变选择权重为TFT的结果提供可解释性。在下图等式第二行中,每个\xi ^{(j)} _{t}由其GRN非线性处理。最后,通过可变选择权重对处理后的特征进行加权,并按下图等式第三行公式进行组合。
在这里插入图片描述

自适应差分进化:差分进化(DE)是一个随机模型,通过重复迭代来复制生物进化。该模型可以有效地解决非线性和全局优化问题。为了平衡DE的全局搜索能力和收敛效率,构建了自适应差分进化(ADE)。也就是在DE算法中引入S形自适应突变因子。TFT的关键参数包括时间步长数、批量大小数、学习率、隐藏层数、注意力头数和隐藏层神经元数。所有这些参数都会显著影响TFT的性能。但是,在某些应用中,为这些参数设置适当的值具有挑战性。因此,使用ADE算法来确定这6个关键参数的最优值。

二、seq2seq

Seq2Seq模型是输出的长度不确定时采用的模型,它的输入和输出都是Sequence,只是输出的Sequence的长度是由机器自己决定的。Seq2seq模型能够用来处理很多NLP任务,比如说语音识别(Speech Recognition)、机器翻译(Machine Translation)、语音翻译(Speech Translation)等等。
在这里插入图片描述
Seq2seq模型还能用来解决Q&A(Question&Answering)任务,通过一篇文章向机器询问相关问题,机器能准确地根据文章的上下文输出结果。值得注意的是,这些问题可以是文章内已有的答案,也可以是机器自己学习到的答案(比如说语句情感分析)。
在这里插入图片描述

三、实现代码

import torch
import torch.nn as nn
import torch.nn.functional as F
 
# 定义Transformer编码器层
class TransformerEncoderLayer(nn.Module):
    def __init__(self, d_model, nhead, dim_feedforward=2048, dropout=0.1):
        super(TransformerEncoderLayer, self).__init__()
        # 自注意力机制
        self.self_attn = nn.MultiheadAttention(d_model, nhead, dropout=dropout)
        # 前馈神经网络层
        self.linear1 = nn.Linear(d_model, dim_feedforward)
        self.dropout = nn.Dropout(dropout)
        self.linear2 = nn.Linear(dim_feedforward, d_model)
        self.norm1 = nn.LayerNorm(d_model)
        self.norm2 = nn.LayerNorm(d_model)
        self.dropout1 = nn.Dropout(dropout)
        self.dropout2 = nn.Dropout(dropout)
 
    def forward(self, src, mask=None):
        # 多头自注意力机制
        src2 = self.self_attn(src, src, src, attn_mask=mask)[0]
        # 添加残差连接和层归一化
        src = src + self.dropout1(src2)
        src = self.norm1(src)
        # 前馈神经网络层
        src2 = self.linear2(self.dropout(F.relu(self.linear1(src))))
        # 添加残差连接和层归一化
        src = src + self.dropout2(src2)
        src = self.norm2(src)
        return src
 
# 定义Transformer编码器
class TransformerEncoder(nn.Module):
    def __init__(self, encoder_layer, num_layers, norm=None):
        super(TransformerEncoder, self).__init__()
        self.layers = nn.ModuleList([encoder_layer for _ in range(num_layers)])
        self.num_layers = num_layers
        self.norm = norm
 
    def forward(self, src, mask=None):
        output = src
 
        # 通过多个编码器层进行前向传播
        for mod in self.layers:
            output = mod(output, mask)
 
        # 应用最终归一化
        if self.norm is not None:
            output = self.norm(output)
 
        return output
 
# 参数设置
d_model = 512
nhead = 8
dim_feedforward = 2048
dropout = 0.1
num_layers = 6
 
# 示例使用
encoder_layer = TransformerEncoderLayer(d_model, nhead, dim_feedforward, dropout)
transformer_encoder = TransformerEncoder(encoder_layer, num_layers)
src = torch.rand(10, 32, d_model)
out = transformer_encoder(src)
print(out.shape)

运行结果如下:
在这里插入图片描述

  • 19
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值