Lớp đầu ra bổ sung trong mạng nơ ron (Số thập phân thành nhị phân)


17

Tôi đang làm việc thông qua một câu hỏi từ cuốn sách trực tuyến:

http://neuralnetworksanddeeplearning.com/chap1.html

Tôi có thể hiểu rằng nếu lớp đầu ra bổ sung là 5 nơ ron đầu ra, tôi có thể đặt sai lệch ở mức 0,5 và trọng lượng 0,5 cho mỗi lớp trước đó. Nhưng câu hỏi bây giờ yêu cầu một lớp mới gồm bốn nơ ron đầu ra - quá đủ để thể hiện 10 đầu ra có thể có ở .24

Ai đó có thể hướng dẫn tôi qua các bước liên quan đến việc hiểu và giải quyết vấn đề này không?

Câu hỏi tập thể dục:

Có một cách để xác định biểu diễn bitwise của một chữ số bằng cách thêm một lớp bổ sung vào mạng ba lớp ở trên. Lớp bổ sung chuyển đổi đầu ra từ lớp trước thành biểu diễn nhị phân, như được minh họa trong hình dưới đây. Tìm một tập hợp các trọng số và độ lệch cho lớp đầu ra mới. Giả sử rằng 3 lớp tế bào thần kinh đầu tiên sao cho đầu ra đúng trong lớp thứ ba (nghĩa là lớp đầu ra cũ) có kích hoạt ít nhất 0,99 và đầu ra không chính xác có kích hoạt nhỏ hơn 0,01.

nhập mô tả hình ảnh ở đây

Câu trả lời:


16

Câu hỏi là yêu cầu bạn thực hiện ánh xạ sau đây giữa biểu diễn cũ và biểu diễn mới:

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

Bởi vì lớp đầu ra cũ có một hình thức đơn giản, điều này khá dễ dàng để đạt được. Mỗi nơ-ron đầu ra phải có trọng lượng dương giữa chính nó và các nơ-ron đầu ra nên được biểu thị cho nó, và một trọng lượng âm giữa chính nó và các nơ-ron đầu ra nên tắt. Các giá trị nên kết hợp đủ lớn để bật hoặc tắt sạch, vì vậy tôi sẽ sử dụng các trọng số lớn, chẳng hạn như +10 và -10.

Nếu bạn có kích hoạt sigmoid ở đây, sự thiên vị không liên quan. Bạn chỉ muốn đơn giản là bão hòa từng nơ-ron về phía trước hoặc tắt. Câu hỏi đã cho phép bạn giả sử các tín hiệu rất rõ ràng trong lớp đầu ra cũ.

Vì vậy, lấy ví dụ về đại diện cho 3 và sử dụng chỉ số 0 cho các nơ-ron theo thứ tự tôi đang hiển thị chúng (các tùy chọn này không được đặt trong câu hỏi), tôi có thể có trọng số từ việc kích hoạt đầu ra cũ , để đăng nhập các kết quả đầu ra mới , trong đó như sau:Tôi= =3Một3ÔitôidZjNewZjNew= =ΣTôi= =0Tôi= =9WTôij*MộtTôiÔitôid

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

Điều này rõ ràng sẽ tạo ra gần với 0 0 1 1đầu ra khi chỉ có nơ ron của lớp đầu ra cũ đại diện cho "3" đang hoạt động. Trong câu hỏi, bạn có thể giả sử kích hoạt 0,99 một tế bào thần kinh và <0,01 cho các đối thủ cạnh tranh trong lớp cũ. Vì vậy, nếu bạn sử dụng cùng một cường độ trọng lượng trong suốt, thì các giá trị tương đối nhỏ đến từ + -0.1 (0,01 * 10) từ các giá trị kích hoạt lớp cũ khác sẽ không ảnh hưởng nghiêm trọng đến giá trị + -9,9 và các đầu ra trong lớp mới sẽ được bão hòa ở mức rất gần với 0 hoặc 1.


Cảm ơn bạn. Tôi không thể làm theo phần này, bạn có thể giải thích thêm không? - "Tôi có thể có trọng số từ việc kích hoạt đầu ra cũ i = 3, AOld3 đến logit của đầu ra mới ZNewj, trong đó ZNewj = Σi = 9i = 0Wij ∗ AOldi như sau: W3,0 = −10 W3,1 = −10 W3 , 2 = + 10 W3,3 = + 10 "
Victor Yip

MộtTôi= =f(ZTôi)f

@NeilSlater - trọng lượng ví dụ của bạn có hoạt động cho các đầu ra không phải là 3 không? Tôi không thấy rằng họ sẽ. Xin hãy giải thích. Cảm ơn.
FullStack

Một3otôid

1
@ Rrz0: Bởi vì tôi giả sử một lớp sigmoid trên đầu ra, vì nó là một phân loại nhị phân - bit là bật hoặc tắt. Vì vậy, trong ví dụ của bạn, bạn nhận sigmoid((0 * 10) * 1)được 0,5. Bằng cách chọn số lớn phù hợp, bạn đảm bảo đầu ra rất cao hoặc thấp trước sigmoid, sau đó sẽ xuất ra rất gần 0 hoặc 1. Đây là IMO mạnh hơn so với đầu ra tuyến tính được giả định trong câu trả lời của FullStack, nhưng bỏ qua điều đó, về cơ bản là Hai câu trả lời giống nhau.
Neil Slater

4

Mã dưới đây từ SaturnAPI trả lời câu hỏi này. Xem và chạy mã tại 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)

Lưu ý rằng điều này thực hiện một tập các trọng số cho lớp đầu ra tuyến tính. Ngược lại, câu trả lời của tôi giả định kích hoạt sigmoid trong lớp đầu ra. Nếu không, hai câu trả lời là tương đương.
Neil Slater

Đầu vào có nghĩa là eye(10,10)gì?
Rrz0

vâng, nó thực sự hoạt động như một bùa mê, chỉ cần thử nó trong Octave Online và xác nhận, cảm ơn !! ... PS: Một chút giải thích cũng sẽ tốt, nếu ai đó bị mắc kẹt :)
Anaximandro Andrade

1
@ Rrz0 đó là hàm Matlab / Octave để tạo ma trận danh tính (chỉ với các ma trận trong đường chéo chính)
Anaximandro Andrade

0

Bằng chứng Pythonic cho bài tập trên:

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

Một sửa đổi nhỏ cho câu trả lời của FullStack liên quan đến ý kiến ​​của Neil Slater bằng 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')
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.