Дополнительный выходной слой в нейронной сети (от десятичного до двоичного)

17

Я работаю над вопросом из онлайн-книги:

http://neuralnetworksanddeeplearning.com/chap1.html

Я могу понять, что если дополнительный выходной слой состоит из 5 выходных нейронов, я мог бы, вероятно, установить смещение в 0,5 и вес 0,5 для каждого предыдущего слоя. Но теперь возникает вопрос о новом слое из четырех выходных нейронов - этого более чем достаточно, чтобы представить 10 возможных выходов при .24

Может ли кто-нибудь провести меня через шаги, связанные с пониманием и решением этой проблемы?

Вопрос об упражнении:

Существует способ определения побитового представления цифры путем добавления дополнительного уровня в трехслойную сеть выше. Дополнительный уровень преобразует выходные данные предыдущего уровня в двоичное представление, как показано на рисунке ниже. Найдите набор весов и смещений для нового выходного слоя. Предположим, что первые 3 слоя нейронов таковы, что правильный выход в третьем слое (т. Е. Старый выходной слой) имеет активацию не менее 0,99, а неправильные выходы имеют активацию менее 0,01.

введите описание изображения здесь

Виктор Ип
источник

Ответы:

16

Вопрос просит вас сделать следующее отображение между старым представлением и новым представлением:

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

Поскольку старый выходной слой имеет простую форму, этого довольно легко достичь. Каждый выходной нейрон должен иметь положительный вес между собой и выходными нейронами, которые должны быть включены, чтобы представлять его, и отрицательный вес между собой и выходными нейронами, которые должны быть выключены. Значения должны объединиться, чтобы быть достаточно большими, чтобы аккуратно включить или выключить, поэтому я бы использовал большие веса, такие как +10 и -10.

Если у вас есть сигмовидная активация здесь, смещение не так важно. Вы просто хотите просто насытить каждый нейрон в направлении включения или выключения. Этот вопрос позволил вам предположить очень четкие сигналы в старом выходном слое.

язнак равно3A3ОLdZJNевесZJNевесзнак равноΣязнак равно0язнак равно9WяJ*AяОLd

W3,0знак равно-10
W3,1знак равно-10
W3,2знак равно+10
W3,3знак равно+10

Это должно ясно показывать близость к 0 0 1 1выводу, когда активен только нейрон старого выходного слоя, представляющий «3». В этом вопросе можно предположить, что активация одного нейрона составляет 0,99, а в старом слое - <0,01. Таким образом, если вы используете одинаковую величину весов во всем, то относительно небольшие значения, приходящиеся на + -0,1 (0,01 * 10) от других значений активации старого слоя, не будут серьезно влиять на значение + -9,9, и выходные данные в новом слое будет насыщен очень близко к 0 или 1.

Нил Слэйтер
источник
Спасибо. Я не мог полностью следовать этой части, не могли бы вы продолжить, пожалуйста? - «У меня могут быть веса, идущие от активации старого выхода i = 3, AOld3 к логиту новых выходов ZNewj, где ZNewj = Σi = 9i = 0Wij ∗ AOldi следующим образом: W3,0 = −10 W3,1 = −10 W3 , 2 = + 10 W3,3 = + 10 "
Виктор Ип
Aязнак равное(Zя)е
@NeilSlater - будут ли весы вашего примера работать для выходов, которые не равны 3? Я не вижу, что они будут. Пожалуйста, дополните. Благодарю.
FullStack
A3оLd
1
@ Rrz0: потому что я предполагаю сигмоидальный слой на выходе, так как это двоичная классификация - бит либо включен, либо выключен. Таким образом, в вашем примере вы получите sigmoid((0 * 10) * 1)что 0,5. Выбирая достаточно большие числа, вы гарантируете либо очень высокий, либо низкий выход до сигмоида, который затем будет выводить очень близко к 0 или 1. Это более надежный IMO, чем линейный вывод, предполагаемый в ответе FullStack, но игнорируя это, по сути, наш два ответа одинаковы.
Нил Слэйтер
4

Код ниже от SaturnAPI отвечает на этот вопрос. Посмотрите и запустите код по адресу 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
источник
Обратите внимание, что это реализует набор весов для линейного выходного слоя. Напротив, мой ответ предполагает активацию сигмоида в выходном слое. В противном случае два ответа эквивалентны.
Нил Слэйтер
Что подразумевается под входами eye(10,10)?
Rrz0
да, это действительно работает как очарование, только что попробовал это в Octave Online и подтвердил, спасибо !! ... PS: Немного о объяснении было бы также хорошо, если бы кто-то застрял :)
Anaximandro Andrade
1
@ Rrz0 это функция Matlab / Octave для создания единичной матрицы (только с основными в диагонали)
Анаксимандро Андраде
0

Pythonic доказательство для вышеупомянутого упражнения:

"""
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
источник
0

Небольшая модификация ответа FullStack относительно комментариев Нила Слейтера с использованием 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
источник