рдирдорд╕реНрддреЗ,
рдореИрдВ рдпрд╣рд╛рдБ рдХреЗ рд░реВрдк рдореЗрдВ Gumbel рд╢реЛрд░ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ, рд▓реЗрдХрд┐рди рдХреЛрдИ рд╕рдлрд▓рддрд╛ рдирд╣реАрдВред
рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдИ рдореЙрдбреНрдпреВрд▓ рдЕрднреА рднреА рдЧрд╛рдпрдм рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмреБрдирд┐рдпрд╛рджреА рдЪрд░ рдХрд╛рд░реНрдп рдЬреИрд╕реЗ nn.Uniform ()), рдпрд╛ рдХреНрдпрд╛ рдореИрдВ рдЧрд▓рдд рд╣реВрдВ? рдЖрдк pytorch рдореЗрдВ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗ рдЬреИрд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐рдпрд╛рдБ:
``` -- рд╢реЛрд░ рдкреИрджрд╛ рдХрд░реЗрдВ рдирдореВрдирд╛ рдореЙрдбреНрдпреВрд▓
рд╕реНрдерд╛рдиреАрдп рд╢реЛрд░ рдореЙрдбреНрдпреВрд▓ = рдПрдирдПрдиред рдЕрдиреБрдХреНрд░рдорд┐рдХ ()
рдирд╣реАрдВ iseModule: рдЬреЛрдбрд╝реЗрдВ (рдПрдирдПрдиред рд╡рд░реНрджреА (0, 1)) - рдпреВ рд╕реЗ рдирдореВрдирд╛ (0, 1)
- рдПрдХ рд╕рдорд╛рди рдирдореВрдиреЗ рдХреЛ рдЧрдВрдмреЗрд▓ рдирдореВрдиреЗ рдореЗрдВ рдмрджрд▓рдирд╛
no iseModule:add (nn.AddConstant(1e-9, true)) -- рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╕реНрдерд┐рд░рддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░реЗрдВ
рдХреЛрдИ iseModule рдирд╣реАрдВ: рдЬреЛрдбрд╝реЗрдВ (nn.Log ())
рдХреЛрдИ iseModule рдирд╣реАрдВ: рдЬреЛрдбрд╝реЗрдВ (nn.MulConstant(-1, true))
no iseModule:add (nn.AddConstant(1e-9, true)) -- рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рд╕реНрдерд┐рд░рддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░реЗрдВ
рдХреЛрдИ iseModule рдирд╣реАрдВ: рдЬреЛрдбрд╝реЗрдВ (nn.Log ())
рдХреЛрдИ iseModule рдирд╣реАрдВ: рдЬреЛрдбрд╝реЗрдВ (nn.MulConstant(-1, true))
- рдирдореВрдирд╛ рдмрдирд╛рдПрдВ q(z) = G(z) = softmax((log(╧А) + ╬╡)/╧Д) (рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдЯреНрд░рд┐рдХ)
рд╕реНрдерд╛рдиреАрдп рдирдореВрдирд╛ = nn. рдЕрдиреБрдХреНрд░рдорд┐рдХ ()
рд╕реНрдерд╛рдиреАрдп рдирдореВрдирд╛ рдЖрдВрддрд░рд┐рдХ = nn.ConcatTable ()
рдирдореВрдирд╛ rInternal: рдЬреЛрдбрд╝реЗрдВ (nn.Identity ()) - рдЕрд╕рд╛рдорд╛рдиреНрдп рд▓реЙрдЧ рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рд▓реЙрдЧ (╧А)
рдирдореВрдирд╛ rInternal: рдЬреЛрдбрд╝реЗрдВ (noiseModule) -- рд╢реЛрд░ рдмрдирд╛рдПрдБ
рдирдореВрдирд╛: рдЬреЛрдбрд╝реЗрдВ (рдирдореВрдирд╛ рдЖрдВрддрд░рд┐рдХ)
рдирдореВрдирд╛: рдЬреЛрдбрд╝реЗрдВ (nn.CAddTable ())
self.temperature = nn.MulConstant(1 / self.tau, true) -- рд╕реЙрдлреНрдЯрдореИрдХреНрд╕ рдХреЗ рд▓рд┐рдП рддрд╛рдкрдорд╛рди
рдирдореВрдирд╛: рдЬреЛрдбрд╝реЗрдВ (рд╕реНрд╡рдпрдВ рддрд╛рдкрдорд╛рди)
рдирдореВрдирд╛: рдЬреЛрдбрд╝реЗрдВ (nn.View(-1, self.k)) - k . рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдХрд╛рд░ рдмрджрд▓реЗрдВ
рдирдореВрдирд╛: рдЬреЛрдбрд╝реЗрдВ (nn.SoftMax ())
рдирдореВрдирд╛: рдЬреЛрдбрд╝реЗрдВ (nn.View(-1, self.N * self.k)) - рд╡рд╛рдкрд╕ рдЖрдХрд╛рд░ рдмрджрд▓реЗрдВ
```
рд╣реЗрдпрд░ рдпреВ рдЧреЛред рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкрдардиреАрдп рдФрд░ рдХреЛрдИ рдореЙрдбреНрдпреВрд▓ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ:
import torch.nn.functional as F
from torch.autograd import Variable
def sampler(input, tau, temperature):
noise = torch.rand(input.size())
noise.add_(1e-9).log_().neg_()
noise.add_(1e-9).log_().neg_()
noise = Variable(noise)
x = (input + noise) / tau + temperature
x = F.softmax(x.view(input.size(0), -1))
return x.view_as(input)
рд╣рдо рдХреЗрд╡рд▓ рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдЧрд┐рдЯрд╣рдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдпрджрд┐ рдЖрдкрдХреЗ рдХреЛрдИ рдкреНрд░рд╢реНрди рд╣реИрдВ рддреЛ рдХреГрдкрдпрд╛ рд╣рдорд╛рд░реЗ рдордВрдЪреЛрдВ рдкрд░ рдкреЛрд╕реНрдЯ рдХрд░реЗрдВред
рд╢реАрдШреНрд░ рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!, рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЕрдЧрд▓реА рдмрд╛рд░ рдордВрдЪ рдкрд░ рд▓рд┐рдЦреЗрдВрдЧреЗред
рдЬрд╡рд╛рдм рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рд╣реЗрдпрд░ рдпреВ рдЧреЛред рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкрдардиреАрдп рдФрд░ рдХреЛрдИ рдореЙрдбреНрдпреВрд▓ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ:
рд╣рдо рдХреЗрд╡рд▓ рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдЧрд┐рдЯрд╣рдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдпрджрд┐ рдЖрдкрдХреЗ рдХреЛрдИ рдкреНрд░рд╢реНрди рд╣реИрдВ рддреЛ рдХреГрдкрдпрд╛ рд╣рдорд╛рд░реЗ рдордВрдЪреЛрдВ рдкрд░ рдкреЛрд╕реНрдЯ рдХрд░реЗрдВред