신경망의 추가 출력 레이어 (십진에서 이진으로)


17

온라인 서적에서 질문을하고 있습니다.

http://neuralnetworksanddeeplearning.com/chap1.html

추가 출력 레이어가 5 개의 출력 뉴런 인 경우 이전 레이어에 대해 바이어스를 각각 0.5 및 가중치 0.5로 설정할 수 있음을 이해할 수 있습니다. 그러나이 문제는 이제 에서 10 개의 가능한 출력을 표현하기에 충분한 4 개의 출력 뉴런 레이어를 요구합니다 .24

누군가이 문제를 이해하고 해결하는 단계를 안내해 줄 수 있습니까?

운동 문제 :

위의 3 계층 네트워크에 추가 계층을 추가하여 숫자의 비트 별 표현을 결정하는 방법이 있습니다. 여분의 레이어는 아래 그림과 같이 이전 레이어의 출력을 이진 표현으로 변환합니다. 새로운 출력 레이어에 대한 가중치 및 바이어스 세트를 찾으십시오. 뉴런의 처음 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과 같은 느린 가중치를 사용합니다.

여기에 시그 모이 드 활성화가있는 경우 바이어스가 그와 관련이 없습니다. 당신은 단순히 각 뉴런을 온 또는 오프로 포화시키기를 원합니다. 이 질문을 통해 이전 출력 레이어에서 매우 명확한 신호를 가정 할 수 있습니다.

따라서 3을 나타내는 예제를 보여주고 내가 보여주는 순서대로 뉴런에 대해 0 인덱싱을 사용하는 경우 (이 옵션은 질문에 설정되어 있지 않음) 이전 출력 , 에서 새 출력 . 여기서 는 다음과 같습니다.O L D 3 Z N의 E w J Z N의 E w j는 = Σ는 = 9 = 0 W I J * O L 개의 차원 I을나는=A3Old제이이자형제이이자형=Σ나는=0나는=9나는제이나는영형

,0=10
,1=10
,2=+10
,=+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 "
Victor Yip

나는=에프(나는)에프

@ NeilSlater-예제 가중치가 3이 아닌 출력에 대해 작동합니까? 나는 그들이 볼 수 없습니다. 정교하게 작성하십시오. 감사.
FullStack

영형

1
@ Rrz0 : 출력에서 ​​시그 모이 드 레이어를 가정하고 있기 때문에 바이너리 분류이므로 비트가 켜져 있거나 꺼져 있습니다. 따라서 귀하의 예 sigmoid((0 * 10) * 1)에서는 0.5입니다. 적절하게 큰 수를 선택하면 S 자형 이전에 매우 높거나 낮은 출력을 보장 할 수 있으며, 그 결과 0 또는 1에 매우 가깝게 출력됩니다. 이는 FullStack의 답변에서 가정 된 선형 출력보다 더 강력한 IMO이지만 본질적으로 두 개의 답변이 동일합니다.
Neil Slater

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)

이것은 선형 출력 레이어에 대한 가중치 세트를 구현합니다. 대조적으로, 내 대답은 출력 레이어에서 시그 모이 드 활성화를 가정합니다. 그렇지 않으면 두 답변이 동일합니다.
Neil Slater

입력이란 무엇입니까 eye(10,10)?
Rrz0

예, 그것은 참으로 단지가, 감사 옥타브 온라인에서 그것을 시도하고 확인, 마법처럼 작동합니다! ... PS를 : 설명 오 조금도, 좋은 것 사람이 붙어 있어야한다 :
Anaximandro 엔드 레데

1
@ Rrz0 그것은 (주 대각선에 하나만있는) 항등 행렬을 만들기위한 Matlab / Octave 함수입니다
Anaximandro Andrade

0

위의 운동에 대한 파이썬 증거 :

"""
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

0

Octave를 사용한 Neil Slater 의 의견 에 관한 FullStack 의 답변 을 약간 수정했습니다 .

% 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')
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.