activation_layer

make_activation_layer

layer make_activation_layer(int batch, int inputs, ACTIVATION activation)
{
    layer l = {0};
    l.type = ACTIVE;

    l.inputs = inputs;
    l.outputs = inputs;
    l.batch=batch;

    l.output = calloc(batch*inputs, sizeof(float*));
    l.delta = calloc(batch*inputs, sizeof(float*));

    l.forward = forward_activation_layer;
    l.backward = backward_activation_layer;

    l.activation = activation;
    fprintf(stderr, "Activation Layer: %d inputs\n", inputs);
    return l;
}

ํ•จ์ˆ˜ ์ด๋ฆ„: make_activation_layer

์ž…๋ ฅ:

  • batch: ๋ฐฐ์น˜ ํฌ๊ธฐ

  • inputs: ์ž…๋ ฅ์˜ ํฌ๊ธฐ

  • activation: ํ™œ์„ฑํ™” ํ•จ์ˆ˜

๋™์ž‘: ์ž…

  • ์ž…๋ ฅ๊ฐ’์„ ๋ฐ›์•„ ํ™œ์„ฑํ™” ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•œ ์ถœ๋ ฅ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ ˆ์ด์–ด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

์„ค๋ช…:

  • layer ๊ตฌ์กฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , ํ•„๋“œ์— ์ž…๋ ฅ๊ฐ’์„ ์„ค์ •ํ•œ๋‹ค.

  • ์ถœ๋ ฅ๊ฐ’๊ณผ delta๋ฅผ ์ €์žฅํ•  ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๋™์ ์œผ๋กœ ํ• ๋‹นํ•œ๋‹ค.

  • forward_activation_layer ๋ฐ backward_activation_layer ํ•จ์ˆ˜๋ฅผ ์„ค์ •ํ•œ๋‹ค.

  • activation ํ•จ์ˆ˜๋ฅผ ์„ค์ •ํ•˜๊ณ , ์ดˆ๊ธฐํ™”๋œ layer ๊ตฌ์กฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  • ํ™œ์„ฑํ™” ๋ ˆ์ด์–ด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ, ์ž…๋ ฅ๊ฐ’์˜ ํฌ๊ธฐ(inputs)์™€ ํ™œ์„ฑํ™” ํ•จ์ˆ˜์˜ ์ข…๋ฅ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

forward_activation_layer

void forward_activation_layer(layer l, network net)
{
    copy_cpu(l.outputs*l.batch, net.input, 1, l.output, 1);
    activate_array(l.output, l.outputs*l.batch, l.activation);
}

ํ•จ์ˆ˜ ์ด๋ฆ„: forward_activation_layer

์ž…๋ ฅ:

  • l: layer ๊ตฌ์กฐ์ฒด

  • net: network ๊ตฌ์กฐ์ฒด

๋™์ž‘:

  • ํ˜„์žฌ ์ธต(layer)์˜ ์ถœ๋ ฅ ๊ฐ’์„ ๋„คํŠธ์›Œํฌ(network)์˜ ์ž…๋ ฅ ๊ฐ’์œผ๋กœ ๋ณต์‚ฌํ•œ ๋’ค, ํ™œ์„ฑํ™” ํ•จ์ˆ˜(activation function)๋ฅผ ์ด์šฉํ•ด ์ถœ๋ ฅ ๊ฐ’์„ ๋ณ€๊ฒฝ

์„ค๋ช…:

  • ๋”ฅ๋Ÿฌ๋‹ ์‹ ๊ฒฝ๋ง์˜ ์ˆœ์ „ํŒŒ(forward propagation) ๊ณผ์ • ์ค‘, ํ˜„์žฌ ์ธต์˜ ์ถœ๋ ฅ ๊ฐ’์„ ๋‹ค์Œ ์ธต์˜ ์ž…๋ ฅ ๊ฐ’์œผ๋กœ ์ „๋‹ฌํ•˜๊ธฐ ์ „์— ํ™œ์„ฑํ™” ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•ด ์ถœ๋ ฅ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

  • ๋จผ์ €, l.outputs*l.batch ํฌ๊ธฐ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ net.input์—์„œ l.output์œผ๋กœ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

  • ์ดํ›„, l.activation์œผ๋กœ ์ง€์ •๋œ ํ™œ์„ฑํ™” ํ•จ์ˆ˜๋ฅผ l.output์— ์ ์šฉํ•ด ์ถœ๋ ฅ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

backward_activation_layer

void backward_activation_layer(layer l, network net)
{
    gradient_array(l.output, l.outputs*l.batch, l.activation, l.delta);
    copy_cpu(l.outputs*l.batch, l.delta, 1, net.delta, 1);
}

ํ•จ์ˆ˜ ์ด๋ฆ„: backward_activation_layer

์ž…๋ ฅ:

  • layer l: ์—ญ์ „ํŒŒ๋ฅผ ์ˆ˜ํ–‰ํ•  activation layer

  • network net: ์—ญ์ „ํŒŒ์˜ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•  ๋„คํŠธ์›Œํฌ

๋™์ž‘:

  • l.output์˜ gradient๋ฅผ l.delta๋กœ ๊ณ„์‚ฐ

  • l.delta๋ฅผ net.delta๋กœ ๋ณต์‚ฌ

์„ค๋ช…:

  • Activation layer์—์„œ๋Š” ์ž…๋ ฅ๊ฐ’์„ ํ™œ์„ฑํ™” ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ณ€ํ™˜ํ•œ ๋’ค ์ถœ๋ ฅ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  • ์ด๋•Œ, ์—ญ์ „ํŒŒ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ถœ๋ ฅ๊ฐ’์— ๋Œ€ํ•œ gradient๋ฅผ ๊ณ„์‚ฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • backward_activation_layer ํ•จ์ˆ˜๋Š” l.output์— ๋Œ€ํ•œ gradient๋ฅผ l.activation ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ณ„์‚ฐํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ l.delta์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

  • ๋งˆ์ง€๋ง‰์œผ๋กœ, l.delta๋ฅผ ๋„คํŠธ์›Œํฌ์˜ ์ „์ฒด delta๊ฐ’์ธ net.delta๋กœ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

Last updated

Was this helpful?