GoogleのDeepMind社は最近、Perceiverと呼ばれる最先端のディープラーニングモデルをリリースした。これは、人間の脳がマルチモーダルデータを認識するのと同じように、音声から画像までの複数の入力データを受信して処理するものである。
Perceiverは、複数の入力データ型、つまり点群、音声、画像を受信して分類できる。この目的のために、深層学習モデルは、入力データ型についての前提を置かないトランスフォーマー(別名、アテンション)に基づいている。
通常、トランスフォーマーを使用する際のボトルネックは、アルゴリズムに必要な2次の演算数である。たとえば、224ピクセル×224ピクセルの画像を処理すると、50,000を超える224の2乗の演算が発生する可能性がある。これは膨大な計算オーバーヘッドになる。この問題を分類するために、DeepMindの研究者は、トランスフォーマーでSelf-AttentionレイヤーをCross-Attentionレイヤーに置き換えたため、線形アルゴリズムが複雑になった。
出典: Perceiver:反復的なアテンションを伴う一般的な知覚
さらに、Cross-Attentionの計算に使用される入力データはバイト配列に変換される。これは、このモデルがデータ型に依存しないことを意味する。
このモデルの大きな進歩は、入力データ型についての前提を置かないことである。たとえば、既存の畳み込みニューラルネットワークは画像に対してのみ機能する。
出典: Perceiver:反復的なアテンションを伴う一般的な知覚
画像分類に対して、このモデルはImageNetで76.4%の最先端の精度を達成する(ResNetでは39.4%を達成)。
出典: Perceiver:反復的なアテンションを伴う一般的な知覚
Perceiverはソーシャルメディアで注目を集めた。YouTubeで数千回の視聴があり、Redditでのスレッドで議論があり、Twitterで議論が続いている。Redditスレッドに興味深いコメントがあり、この新しいモデルとの関連性を示している。
基本的な考え方は、私が理解しているように、トランスフォーマーを使用してMLPを再作成することにより、クロスドメインの一般性を実現することです。
- 「ニューロン」と活性化はスカラーではなくベクトルである
- 中間層の重みは動的であり、固定でない
学習されたベクトルの固定の集合にCross-Attentionを適用することにより、入力の次元数を減らすこともできます。かなりクールです。
さらに、Twitterスレッドには研究者の考察がある。
これは本当に素晴らしい取り組みです。コミュニティの実装もあります。
...github.com/lucidrains/per...
間違いなくこれで遊んでいるつもりです。ありがとう。
最後に、ディープラーニングコミュニティのメンバーによるPyTorchのオープンソース実装がある。これを使用するには、次のスニペットを使用できる。
import torch
from perceiver_pytorch import Perceiver
model = Perceiver(
input_channels = 3, # number of channels for each token of the input
input_axis = 2, # number of axis for input data (2 for images, 3 for video)
num_freq_bands = 6, # number of freq bands, with original value (2 * K + 1)
max_freq = 10., # maximum frequency, hyperparameter depending on how fine the data is
depth = 6, # depth of net
num_latents = 256, # number of latents, or induced set points, or centroids. different papers giving it different names
latent_dim = 512, # latent dimension
cross_heads = 1, # number of heads for cross attention. paper said 1
latent_heads = 8, # number of heads for latent self attention, 8
cross_dim_head = 64,
latent_dim_head = 64,
num_classes = 1000, # output number of classes
attn_dropout = 0.,
ff_dropout = 0.,
weight_tie_layers = False # whether to weight tie layers (optional, as indicated in the diagram)
)
img = torch.randn(1, 224, 224, 3) # 1 imagenet image, pixelized
model(img) # (1, 1000)