前提
入力が [batch, seq_len, features]
として features
が複数。つまりセンサーがたくさんあるとする。
Input Embedding
各 feature 毎に Embedding(みたいなもの)を行う。
具体的には、値を nn.Linear() に通してベクトルにする。
X, y = next(iter(train_loader))
X.shape # [batch, seq_len, features]
emb1 = nn.Linear(input_size, output_size)
emb2 = nn.Linear(input_size, output_size)
emb3 = nn.Linear(input_size, output_size)
...
embed_1 = [emb1(X[:, i, 0]) for i in range(X.shape[1])] # [batch, seq_len, output_size]
embed_2 = [emb2(X[:, i, 1]) for i in range(X.shape[1])]
embed_3 = [emb3(X[:, i, 2]) for i in range(X.shape[1])]
...
embed = torch.cat([embed_1, embed_2, ... ]) # [batch, seq_len, output_size, features]
作成した embed
に Positional Encoding を行う。
PE = positional_encording()
input_tensor = embed + PE
各featureを別々に MultiHeadAttention
に与える。
class Typhoon(nn.Module):
def __init__(self):
super(Typhoon, self).__init__()
self.attentions = nn.ModuleList([
MultiHeadAttentionANDFeedForward,
MultiHeadAttentionANDFeedForward,
MultiHeadAttentionANDFeedForward,
...
])
self.selector = MultiHeadAttention() # or Attention
self.classification = ClassificationModule()
def forward(self, x):
output = self.attentio(x)
output = torch.cat( ... ) # con cat したり色々
output = self.selector(output)
output = self.classification(output)
return output
流れは、
- センサーの次元毎に
MultiHeadAttention
を行う
- 1 を複数回行う。
- どのセンサーの情報に注目すべきかを指定するために、2 の出力に
Self-Attention
or MultiHeadAttention
を行う。
- 3 の結果を元に分類を行う。
Note,
MultiHeadAttention
はHeadをたくさん切れば長期間の依存性を学習しやすくなるはずなので、ハイパーパラメータは
input embedding
の次元数
MultiHeadAttention
の頭の数
が重要になってくるはず。