ชั้นเอาท์พุทพิเศษในเครือข่ายประสาทเทียม (ทศนิยมให้เป็นไบนารี)


17

ฉันทำงานผ่านคำถามจากหนังสือออนไลน์:

http://neuralnetworksanddeeplearning.com/chap1.html

ฉันสามารถเข้าใจได้ว่าถ้าเลเยอร์เอาต์พุตเพิ่มเติมเป็น 5 เซลล์ประสาทเอาท์พุทฉันอาจตั้งค่าไบอัสที่ 0.5 และน้ำหนัก 0.5 แต่ละเซลล์สำหรับเลเยอร์ก่อนหน้า แต่คำถามนี้ขอเลเยอร์ใหม่สี่เซลล์ประสาทส่งออก - ซึ่งเป็นมากกว่าเพียงพอที่จะเป็นตัวแทนของ 10 ผลที่เป็นไปได้ที่ 424

ใครช่วยแนะนำขั้นตอนในการทำความเข้าใจและการแก้ปัญหานี้ได้บ้าง

คำถามการออกกำลังกาย:

มีวิธีการพิจารณาการแสดงตัวเลข bitwise ของหลักโดยการเพิ่มเลเยอร์พิเศษให้กับเครือข่ายสามชั้นด้านบน เลเยอร์พิเศษจะแปลงเอาต์พุตจากเลเยอร์ก่อนหน้านี้เป็นการแทนแบบไบนารี่ดังแสดงในรูปด้านล่าง ค้นหาชุดของน้ำหนักและอคติสำหรับเลเยอร์เอาท์พุทใหม่ สมมติว่าเซลล์ประสาท 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

หากคุณมีการเปิดใช้งาน sigmoid ที่นี่อคตินั้นไม่เกี่ยวข้องกัน คุณเพียงแค่ต้องการทำให้เซลล์ประสาทแต่ละเซลล์เปียกโชกไปหรือปิด คำถามช่วยให้คุณสามารถรับสัญญาณที่ชัดเจนมากในเลเยอร์เอาท์พุทเก่า

ดังนั้นการยกตัวอย่างการเป็นตัวแทน 3 และใช้การทำดัชนีศูนย์สำหรับเซลล์ประสาทตามลำดับที่ฉันแสดง (ตัวเลือกเหล่านี้ไม่ได้ตั้งคำถาม) ฉันอาจมีน้ำหนักเพิ่มขึ้นจากการเปิดใช้งานเอาต์พุตเก่า , A Oผม=3A3Oล.dZJยังไม่มีข้อความอีWZJยังไม่มีข้อความอีW=Σผม=0ผม=9WผมJ* * * *AผมOล.d

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 ไปยัง logit ของเอาต์พุตใหม่ ZNewj โดยที่ ZNewj = Σi = 9i = 0Wij ∗ AOldi ดังนี้: W3,0 = −10 W3,1 = −10 W3 , 2 = + 10 W3,3 = + 10 "
Victor Yip

Aผม=(Zผม)

@NeilSlater - ตัวอย่างน้ำหนักของคุณจะทำงานสำหรับผลลัพธ์ที่ไม่ใช่ 3 หรือไม่ ฉันไม่เห็นว่าพวกเขาจะ กรุณาอธิบายอย่างละเอียด ขอบคุณ
FullStack

A3โอล.d

1
@ Rrz0: เพราะฉันสมมติว่าเป็น sigmoid layer บนเอาท์พุทเนื่องจากเป็นการจำแนกแบบไบนารี่ - บิตนั้นเปิดหรือปิด ในตัวอย่างของคุณคุณจะได้sigmoid((0 * 10) * 1)0.5 ด้วยการเลือกตัวเลขที่มีขนาดใหญ่คุณจะมั่นใจได้ว่าเอาต์พุตที่สูงหรือต่ำมากก่อน sigmoid ซึ่งจะให้ผลลัพธ์ใกล้เคียงกับ 0 หรือ 1 นี่คือ IMO ที่แข็งแกร่งกว่า IMO เชิงเส้นที่สมมติในคำตอบของ FullStack แต่ไม่สนใจว่า สองคำตอบเหมือนกัน
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)

โปรดทราบว่านี่ใช้ชุดน้ำหนักสำหรับเลเยอร์เอาต์พุตเชิงเส้น ในทางตรงกันข้ามคำตอบของฉันถือว่าการเปิดใช้งาน sigmoid ในชั้นเอาท์พุท มิฉะนั้นคำตอบทั้งสองนั้นจะเทียบเท่ากัน
Neil Slater

อินพุตมีความหมายeye(10,10)อย่างไร
Rrz0

ใช่มันใช้งานได้อย่างมีเสน่ห์เพียงลองใช้งานใน Octave Online และได้รับการยืนยันขอบคุณ !! ... PS: คำอธิบายเล็กน้อยก็ดีเช่นกันถ้ามีคนติดอยู่ :)
Anaximandro Andrade

1
@ Rrz0 เป็นฟังก์ชั่น Matlab / Octave สำหรับสร้างเมทริกซ์เอกลักษณ์ (มีเพียงตัวเดียวในแนวทแยงหลัก)
Anaximandro Andrade

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

0

การปรับเปลี่ยนเล็กน้อยในคำตอบของFullStackเกี่ยวกับความคิดเห็นของNeil Slaterโดยใช้ 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')
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.