Pytorch: рдЧрдВрдмреЗрд▓ рд╢реЛрд░

рдХреЛ рдирд┐рд░реНрдорд┐рдд 30 рдЬрдире░ 2017  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: pytorch/pytorch

рдирдорд╕реНрддреЗ,

рдореИрдВ рдпрд╣рд╛рдБ рдХреЗ рд░реВрдк рдореЗрдВ 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)

рд╣рдо рдХреЗрд╡рд▓ рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдЧрд┐рдЯрд╣рдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдпрджрд┐ рдЖрдкрдХреЗ рдХреЛрдИ рдкреНрд░рд╢реНрди рд╣реИрдВ рддреЛ рдХреГрдкрдпрд╛ рд╣рдорд╛рд░реЗ рдордВрдЪреЛрдВ рдкрд░ рдкреЛрд╕реНрдЯ рдХрд░реЗрдВред

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╣реЗрдпрд░ рдпреВ рдЧреЛред рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкрдардиреАрдп рдФрд░ рдХреЛрдИ рдореЙрдбреНрдпреВрд▓ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ:

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)

рд╣рдо рдХреЗрд╡рд▓ рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП рдЧрд┐рдЯрд╣рдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдпрджрд┐ рдЖрдкрдХреЗ рдХреЛрдИ рдкреНрд░рд╢реНрди рд╣реИрдВ рддреЛ рдХреГрдкрдпрд╛ рд╣рдорд╛рд░реЗ рдордВрдЪреЛрдВ рдкрд░ рдкреЛрд╕реНрдЯ рдХрд░реЗрдВред

рд╢реАрдШреНрд░ рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!, рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЕрдЧрд▓реА рдмрд╛рд░ рдордВрдЪ рдкрд░ рд▓рд┐рдЦреЗрдВрдЧреЗред

рдЬрд╡рд╛рдм рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

keskarnitish picture keskarnitish  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

kuangliu picture kuangliu  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

rajarshd picture rajarshd  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

SeparateReality picture SeparateReality  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

soumith picture soumith  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ