Sinir ağında ekstra çıkış katmanı (Ondalıktan ikiliye)


17

Çevrimiçi kitaptan bir soru üzerinde çalışıyorum:

http://neuralnetworksanddeeplearning.com/chap1.html

Ek çıkış katmanı 5 çıkış nöronuysa, muhtemelen bir önceki katman için 0.5 ve ağırlıkça 0.5 ağırlık sapması ayarlayabildiğimi anlayabilirim. Ancak soru şimdi dört çıkış nöronunun yeni bir katmanını soruyor - bu da 10 olası çıkışı temsil etmek için fazlasıyla yeterli .24

Birisi bana bu sorunu anlama ve çözme adımlarını atabilir mi?

Alıştırma sorusu:

Yukarıdaki üç katmanlı ağa fazladan bir katman ekleyerek bir basamağın bitsel temsilini belirlemenin bir yolu vardır. Ek katman, aşağıdaki şekilde gösterildiği gibi önceki katmandan çıktıyı ikili bir gösterime dönüştürür. Yeni çıktı katmanı için bir dizi ağırlık ve sapma bulun. Nöronların ilk 3 katmanının, üçüncü katmandaki doğru çıktının (yani eski çıktı katmanı) en az 0,99 aktivasyona ve yanlış çıkışların 0,01'den az aktivasyona sahip olacağı varsayın.

resim açıklamasını buraya girin

Yanıtlar:


16

Soru, eski temsil ile yeni temsil arasında aşağıdaki eşleştirmeyi yapmanızı istiyor:

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

Eski çıktı katmanının basit bir formu olduğundan, bunu başarmak oldukça kolaydır. Her çıkış nöronu, kendisi ve onu temsil etmek için olması gereken çıkış nöronları arasında pozitif bir ağırlığa ve kendisi ile kapalı olması gereken çıkış nöronları arasında negatif bir ağırlığa sahip olmalıdır. Değerler, temiz bir şekilde açılıp kapanacak kadar büyük olmalıdır, bu yüzden +10 ve -10 gibi büyük ağırlıklar kullanırım.

Burada sigmoid aktivasyonlarınız varsa, önyargı o kadar alakalı değildir. Sadece her nöronu açık veya kapalı olarak doyurmak istersiniz. Soru, eski çıktı katmanında çok net sinyaller almanıza izin verdi.

i=3A3OldZjNewZjNew=Σi=0i=9WijAbenÖld

W3,0=-10
W3,1=-10
W3,2=+10
W3,3=+10

Bu 0 0 1 1, yalnızca "3" ü temsil eden eski çıkış katmanının nöronu aktif olduğunda , çıkışa yakın bir şekilde üretilmelidir . Soruda, bir nöronun 0.99 aktivasyonunu ve eski tabakadaki rakip olanlar için <0.01 aktivasyonunu varsayabilirsiniz. Bu nedenle, aynı ağırlıkları kullanırsanız, diğer eski katman etkinleştirme değerlerinden + -0.1'den (0.01 * 10) gelen nispeten küçük değerler + -9.9 değerini ve yeni katmandaki çıktıları ciddi şekilde etkilemez. 0 veya 1 değerine çok yakın bir şekilde doymuş olacaktır.


Teşekkür ederim. Bu bölümü tam olarak takip edemedim, lütfen daha fazla ayrıntıya girer misiniz? - "Eski çıkış i = 3, AOld3'ün etkinleştirilmesinden yeni ZNewj çıkışlarının logitine kadar ağırlıklar olabilir, burada ZNewj = Σi = 9i = 0Wij ∗ AOldi aşağıdaki gibidir: W3,0 = −10 W3,1 = −10 W3 , 2 = + 10 W3,3 = + 10 "
Victor Yip

@VictorYip: Denklem sadece normal ileri beslemeli ağ denklemidir, ancak bunu kullanmak için terimlerimi dikkatli bir şekilde tanımlamam gerekiyordu (çünkü sorunuzda referans matematik yok). "Logit" Z değeri, aktivasyon fonksiyonları uygulanmadan önce nöronda hesaplanan değerdir (ve genelliklebirben=f(Zben) nerede förneğin sigmoid fonksiyonudur). Örnek ağırlıklar, yeni çıkış katmanı nöronlarını eski olanlara bağlamak için kullanacağım değerlerdir, ancak sadece yeni çıkış katmanındaki 4 nöronu eski çıkış katmanındaki nöronlardan birine ("3" çıkışı için) bağlayan değerlerdir. )
Neil Slater

@NeilSlater - örnek ağırlıklarınız 3 olmayan çıktılar için çalışır mı? Göreceklerini görmüyorum. Lütfen detaylandırın. Teşekkürler.
FullStack

@FullStack: Evet işe yarayacak, çünkü eğer bir3Öldetkin değil (aktivasyon 0), o zaman örnekteki ağırlıkların hiçbirinin bir etkisi yoktur. Eski katmandaki her bir çıkış nöronundan bağlantılar için benzer haritalar oluşturmalısınız - her biri yeni katmandaki ikili gösterimi ile çok basit bir şekilde ilişkilidir ve hepsi bağımsızdır.
Neil Slater

1
@ Rrz0: Çünkü ikili bir sınıflandırma olduğu için çıkışta sigmoid bir katman olduğunu varsayıyorum - bit ya açık ya da kapalı. Yani örneğinizde sigmoid((0 * 10) * 1)0.5 olanı elde edersiniz . Uygun büyük sayıları seçerek, sigmoidden önce çok yüksek veya düşük bir çıktı elde edersiniz, bu da daha sonra 0 veya 1'e çok yakın bir çıktı sağlar. iki cevap aynı.
Neil Slater

4

Satürnapi'den aşağıdaki kod bu soruyu cevaplıyor. Kodu https://saturnapi.com/artitw/neural-network-decimal-digits-to-binary-bitwise-conversion adresinde görün ve çalıştırın.

% 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)

Bunun doğrusal çıktı katmanı için bir ağırlık seti uyguladığını unutmayın. Buna karşılık cevabım, çıktı katmanında sigmoid aktivasyon olduğunu varsayar. Aksi takdirde iki cevap eşdeğerdir.
Neil Slater

Girdilerle kastedilen nedir eye(10,10)?
Rrz0

Evet, gerçekten bir cazibe gibi çalışıyor, sadece Octave Online'da denedi ve onayladı, teşekkürler !! ... PS: Birisi sıkışmışsa, biraz o açıklama da iyi olurdu :)
Anaximandro Andrade

1
@ Rrz0 kimlik matrisi oluşturmak için bir Matlab / Octave işlevidir (sadece ana diyagonalde olanlar ile)
Anaximandro Andrade

0

Yukarıdaki egzersiz için pitonik kanıt:

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

Neil Slater'in Octave kullanarak yaptığı yorumlarla ilgili FullStack'ın cevabında küçük bir değişiklik :

% 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')
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.