神经网络中的额外输出层(十进制到二进制)


17

我正在研究在线书中的一个问题:

http://neuralnetworksanddeeplearning.com/chap1.html

我可以理解,如果额外的输出层是5个输出神经元,那么我可能会将前一层的偏倚设置为0.5,权重分别为0.5和0.5。但是现在的问题是需要新的四个输出神经元层-足以代表处的10个可能的输出。24

有人可以指导我完成理解和解决此问题的步骤吗?

练习题:

通过在上面的三层网络中增加一个额外的层,可以确定数字的按位表示。额外的层将前一层的输出转换为二进制表示,如下图所示。查找新输出层的一组权重和偏差。假设神经元的前3层是这样,即第三层(即旧的输出层)中的正确输出具有至少0.99的激活,而错误的输出具有小于0.01的激活。

在此处输入图片说明

Answers:


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。

如果您在这里有S型激活,则偏差就不那么重要了。您只想简单地使每个神经元朝开或关饱和。这个问题使您可以在旧的输出层中假设非常清晰的信号。

因此,以代表3并以我向它们显示的顺序对神经元使用零索引(这些选项未在问题中设置)为例,我的权重可能来自激活旧输出,新输出,其中如下:ø d 3 ž Ñ ë 瓦特 Ĵ Ž Ñ Ê 瓦特 Ĵ = Σ = 9 = 0 w ^ Ĵ * ö di=3A3OldZjNewZjNew=Σi=0i=9WijAiOld

w ^ 3 1 = - 10 w ^ 3 2 = + 10 w ^ 3 3 = + 10

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的logit的权重,其中ZNewj =Σi= 9i = 0Wij ∗ AOldi如下:W3,0 = −10 W3,1 = −10 W3 ,2 = + 10 W3,3 = + 10“
Victor Yip)

@VictorYip:该方程只是正常的前馈网络方程,但是要使用它,我必须仔细定义我的术语(因为您的问题中没有参考数学)。“ logit” Z值是在应用激活函数之前在神经元处计算的值(通常,其中例如是S型函数)。权重示例是我用来将新的输出层神经元连接到旧神经元的值,但是只是将新的输出层中的4个神经元连接到旧的输出层中的一个神经元的值(输出“ 3”的那个) )fAi=f(Zi)f
尼尔·斯莱特

@NeilSlater-您的示例权重是否可用于非3的输出?我看不到他们会的。请详细说明。谢谢。
FullStack

@FullStack:是的,它将起作用,因为如果未处于活动状态(激活0),则示例中的权重均不起作用。您必须为旧层中每个输出神经元的连接构建相似的映射-每个新神经元都非常简单地与其二进制表示形式相关联,并且它们都是独立的。A3old
尼尔·斯莱特

1
@ Rrz0:因为我假设输出是S型层,因为它是二进制分类-该位是打开还是关闭。因此,在您的示例中您得到的sigmoid((0 * 10) * 1)是0.5。通过选择适当的大数字,可以确保在S型信号之前输出很高或很低的信号,然后输出非常接近0或1的信号。这比FullStack答案中假定的线性输出要强得多,但忽略了IMO,两个答案是相同的。
尼尔·斯莱特

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)

请注意,这为线性输出层实现了一组权重。相反,我的答案假设输出层中有S型激活。否则,这两个答案是等效的。
尼尔·斯莱特

输入是什么意思eye(10,10)
Rrz0

是的,它确实确实像一种魅力,只是在Octave Online上尝试并确认了,谢谢!! ... PS:如果有人被卡住,请稍作解释也很好:)
Anaximandro Andrade

1
@ Rrz0,这是一个Matlab / Octave函数,用于创建单位矩阵(主对角线中只有一个)
Anaximandro Andrade

0

以上练习的Python证明:

"""
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关于使用Octave的Neil Slater的评论的答案进行了一些修改:

% 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')
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.