Я пытаюсь понять реализацию механизма Внимание в Julia в пакете Transformers.jl.
В примерах пакета используется макрос nntopo для настройки стека Flux.Я вижу следующие комментарии в файле реализации макроса (src / stacks / topology.jl).Я понятия не имею, на чем это основано.Я ценю любую помощь в определении основной идеи этого макроса.
#=
examples
x => b => c ==> b = m[1](x) ; c = m[2](b)
x => 3 ==> x => a => a => a ==> x = m[1](a); a = m[1](a); a = m[1](a)
(x, m) => a => b => c ==> a = m[1](x , m); b = m[2](b); c = m[3](b)
((x, m) => x) => 3 ==> (x = m[1](x, m)); (x = m[2](x, m)); (x = m[3](x, m))
(((x, m) => x:(x, m)) => 3) ==> (x = m[1](x,m)); (x = m[2](x,m)) ;(x = m[3](x,m))
=#
Пример использования макроса:
const decoder = gpu(Stack(
@nntopo((e, m, mask):e → pe:(e, pe) → t → (t:(t, m, mask) → t:(t, m, mask)) → $N:t → c),
PositionEmbedding(512),
(e, pe) -> e .+ pe,
Dropout(0.1),
[TransformerDecoder(512, 8, 64, 2048) for i = 1:N]...,
Positionwise(Dense(512, length(labels)), logsoftmax)
))