Dodatkowa warstwa wyjściowa w sieci neuronowej (dziesiętna do binarnej)

17

Pracuję nad pytaniem z książki online:

http://neuralnetworksanddeeplearning.com/chap1.html

Rozumiem, że jeśli dodatkowa warstwa wyjściowa składa się z 5 neuronów wyjściowych, prawdopodobnie mogłabym ustawić odchylenie na 0,5 i wagę 0,5 dla każdej poprzedniej warstwy. Ale pytanie wymaga teraz nowej warstwy czterech neuronów wyjściowych - co jest więcej niż wystarczające do przedstawienia 10 możliwych wyników przy .2)4

Czy ktoś może przeprowadzić mnie przez kroki związane ze zrozumieniem i rozwiązaniem tego problemu?

Pytanie ćwiczeniowe:

Istnieje sposób ustalenia bitowej reprezentacji cyfry poprzez dodanie dodatkowej warstwy do trójwarstwowej sieci powyżej. Dodatkowa warstwa przekształca dane wyjściowe z poprzedniej warstwy w reprezentację binarną, jak pokazano na poniższym rysunku. Znajdź zestaw wag i odchyleń dla nowej warstwy wyjściowej. Załóżmy, że pierwsze 3 warstwy neuronów są takie, że prawidłowe wyjście w trzeciej warstwie (tj. Starej warstwie wyjściowej) ma aktywację co najmniej 0,99, a nieprawidłowe wyjścia mają aktywację mniejszą niż 0,01.

wprowadź opis zdjęcia tutaj

Victor Yip
źródło

Odpowiedzi:

16

Pytanie wymaga wykonania następującego mapowania między starą reprezentacją a nową reprezentacją:

Represent    Old                     New
0            1 0 0 0 0 0 0 0 0 0     0 0 0 0 
1            0 1 0 0 0 0 0 0 0 0     0 0 0 1 
2            0 0 1 0 0 0 0 0 0 0     0 0 1 0 

3            0 0 0 1 0 0 0 0 0 0     0 0 1 1 
4            0 0 0 0 1 0 0 0 0 0     0 1 0 0 
5            0 0 0 0 0 1 0 0 0 0     0 1 0 1 

6            0 0 0 0 0 0 1 0 0 0     0 1 1 0 
7            0 0 0 0 0 0 0 1 0 0     0 1 1 1 
8            0 0 0 0 0 0 0 0 1 0     1 0 0 0 

9            0 0 0 0 0 0 0 0 0 1     1 0 0 1

Ponieważ stara warstwa wyjściowa ma prostą formę, jest to dość łatwe do osiągnięcia. Każdy neuron wyjściowy powinien mieć dodatnią wagę między sobą a neuronami wyjściowymi, które powinny być włączone, aby je reprezentować, oraz ujemną wagę między sobą a neuronami wyjściowymi, które powinny być wyłączone. Wartości powinny być łączone, aby były wystarczająco duże, aby czysto włączyć lub wyłączyć, więc użyłbym dużych wag, takich jak +10 i -10.

Jeśli masz tutaj aktywacje sigmoidalne, uprzedzenie nie jest tak istotne. Chcesz po prostu nasycić każdy neuron w kierunku włączenia lub wyłączenia. Pytanie pozwoliło ci przyjąć bardzo wyraźne sygnały w starej warstwie wyjściowej.

ja=3)ZA3)OlreZjotN.miwZjotN.miw=Σja=0ja=9W.jajotZAjaOlre

W.3),0=-10
W.3),1=-10
W.3),2)=+10
W.3),3)=+10

Powinno to wyraźnie dawać wynik zbliżony do 0 0 1 1wyjścia, gdy aktywny jest tylko neuron starej warstwy wyjściowej reprezentujący „3”. W pytaniu możesz założyć aktywację 0,99 jednego neuronu i <0,01 dla konkurencyjnych w starej warstwie. Tak więc, jeśli użyjesz tej samej wielkości wag przez cały czas, wówczas stosunkowo małe wartości pochodzące od + -0,1 (0,01 * 10) z innych starych wartości aktywacji warstwy nie będą miały poważnego wpływu na wartość + -9,9 i wyniki w nowej warstwie będzie nasycony bardzo blisko 0 lub 1.

Neil Slater
źródło
Dziękuję Ci. Nie mogłem do końca śledzić tej części, czy mógłbyś rozwinąć tę kwestię, proszę? - "Mogę mieć wagi przechodzące od aktywacji starego wyjścia i = 3, AOld3 do logowania nowych wyjść ZNewj, gdzie ZNewj = Σi = 9i = 0Wij ∗ AOldi w następujący sposób: W3,0 = −10 W3,1 = −10 W3 , 2 = + 10 W3,3 = + 10 "
Victor Yip
ZAja=fa(Zja)fa
@NeilSlater - czy twoje przykładowe wagi będą działać dla wyników, które nie są 3? Nie widzę tego. Proszę opracować. Dzięki.
FullStack
@FullStack: Tak, zadziała, ponieważ jeśli ZA3)olre
1
@ Rrz0: Ponieważ zakładam sigmoidalną warstwę na wyjściu, ponieważ jest to klasyfikacja binarna - bit jest włączony lub wyłączony. Tak więc w twoim przykładzie dostajesz sigmoid((0 * 10) * 1)0,5. Wybierając odpowiednio duże liczby, zapewniasz bardzo wysoką lub niską moc wyjściową przed sigmoidem, która następnie wyniesie bardzo blisko 0 lub 1. Jest to bardziej niezawodny IMO niż liniowy wynik przyjęty w odpowiedzi FullStacka, ale ignorując to, zasadniczo nasze dwie odpowiedzi są takie same.
Neil Slater
4

Poniższy kod z SaturnAPI odpowiada na to pytanie. Zobacz i uruchom kod na https://saturnapi.com/artitw/neural-network-decimal-digits-to-binary-bitwise-conversion

% Welcome to Saturn's MATLAB-Octave API.
% Delete the sample code below these comments and write your own!

% Exercise from http://neuralnetworksanddeeplearning.com/chap1.html
% There is a way of determining the bitwise representation of a digit by adding an extra layer to the three-layer network above. The extra layer converts the output from the previous layer into a binary representation, as illustrated in the figure below. Find a set of weights and biases for the new output layer. Assume that the first 3 layers of neurons are such that the correct output in the third layer (i.e., the old output layer) has activation at least 0.99, and incorrect outputs have activation less than 0.01.

% Inputs from 3rd layer
xj = eye(10,10)

% Weights matrix
wj = [0 0 0 0 0 0 0 0 1 1 ;
      0 0 0 0 1 1 1 1 0 0 ;
      0 0 1 1 0 0 1 1 0 0 ;
      0 1 0 1 0 1 0 1 0 1 ]';

% Results
wj*xj


% Confirm results
integers = 0:9;
dec2bin(integers)
FullStack
źródło
Zauważ, że implementuje to zestaw wag dla liniowej warstwy wyjściowej. Natomiast moja odpowiedź zakłada aktywację sigmoidalną w warstwie wyjściowej. W przeciwnym razie dwie odpowiedzi są równoważne.
Neil Slater,
Co oznaczają dane wejściowe eye(10,10) ?
Rrz0
tak, to naprawdę działa jak urok, właśnie wypróbowałem to w Octave Online i potwierdziłem, dziękuję !! ... PS: Trochę o wyjaśnienie byłoby również dobre, gdyby ktoś utknął :)
Anaximandro Andrade
1
@ Rrz0 jest to funkcja Matlab / Octave do tworzenia matrycy tożsamości (tylko te w głównej przekątnej)
Anaximandro Andrade
0

Pythoniczny dowód na powyższe ćwiczenie:

"""
NEURAL NETWORKS AND DEEP LEARNING by Michael Nielsen

Chapter 1

http://neuralnetworksanddeeplearning.com/chap1.html#exercise_513527

Exercise:

There is a way of determining the bitwise representation of a digit by adding an extra layer to the three-layer network above. The extra layer converts the output from the previous layer into a binary representation, as illustrated in the figure below. Find a set of weights and biases for the new output layer. Assume that the first 3 layers of neurons are such that the correct output in the third layer (i.e., the old output layer) has activation at least 0.99, and incorrect outputs have activation less than 0.01.

"""
import numpy as np


def sigmoid(x):
    return(1/(1+np.exp(-x)))


def new_representation(activation_vector):
    a_0 = np.sum(w_0 * activation_vector)
    a_1 = np.sum(w_1 * activation_vector)
    a_2 = np.sum(w_2 * activation_vector)
    a_3 = np.sum(w_3 * activation_vector)

    return a_3, a_2, a_1, a_0


def new_repr_binary_vec(new_representation_vec):
    sigmoid_op = np.apply_along_axis(sigmoid, 0, new_representation_vec)
    return (sigmoid_op > 0.5).astype(int)


w_0 = np.full(10, -1, dtype=np.int8)
w_0[[1, 3, 5, 7, 9]] = 1
w_1 = np.full(10, -1, dtype=np.int8)
w_1[[2, 3, 6, 7]] = 1
w_2 = np.full(10, -1, dtype=np.int8)
w_2[[4, 5, 6, 7]] = 1
w_3 = np.full(10, -1, dtype=np.int8)
w_3[[8, 9]] = 1

activation_vec = np.full(10, 0.01, dtype=np.float)
# correct number is 5
activation_vec[3] = 0.99

new_representation_vec = new_representation(activation_vec)
print(new_representation_vec)
# (-1.04, 0.96, -1.0, 0.98)
print(new_repr_binary_vec(new_representation_vec))
# [0 1 0 1]

# if you wish to convert binary vector to int
b = new_repr_binary_vec(new_representation_vec)
print(b.dot(2**np.arange(b.size)[::-1]))
# 5
NpnSaddy
źródło
0

Mała modyfikacja FullStack dotyczącej komentarzy Neila Slatera za pomocą Octave:

% gzanellato
% Octave

% 3rd layer:
A = eye(10,10);

% Weights matrix:

fprintf('\nSet of weights:\n\n')

wij = [-10 -10 -10 -10 -10 -10 -10 -10 10 10;
       -10 -10 -10 -10 10 10 10 10 -10 -10;
       -10 -10 10 10 -10 -10 10 10 -10 -10;
       -10 10 -10 10 -10 10 -10 10 -10 10]

% Any bias between -9.999.. and +9.999.. runs ok

bias=5

Z=wij*A+bias;

% Sigmoid function:

for j=1:10;
  for i=1:4;
    Sigma(i,j)=int32(1/(1+exp(-Z(i,j))));
  end
end

fprintf('\nBitwise representation of digits:\n\n')

disp(Sigma')
gzanellato
źródło