Почему я получаю предсказуемый результат от случайной нейронной сети? - PullRequest
0 голосов
/ 29 мая 2020

Нейронные сети были для меня самой популярной c в последнее время, хотя у меня не было формального образования по ним, поэтому все, что я знаю, я узнал из rnet.

Это Насколько я понимаю, нейронная сеть после достаточного обучения может выводить приближение любой заданной функции. Выход нейронной сети со случайно сгенерированными весами и смещениями должен тогда выглядеть очень случайным.

Чтобы опровергнуть это мое предположение, я запрограммировал очень рудиментарную сеть в Matlab с двумя входами, один выход и три полностью случайных восьми скрытых слоя нейронов. Количество входов и выходов было выбрано так, чтобы я мог построить трехмерный график результата в виде поверхности, где (x, y) - это вход, а z - выход.

% Hidden layers
L1 = 8;
L2 = 8;
L3 = 8;

% Weight matrices
A = randi([ -500,  500], [L1, 2]) / 10000;
B = randi([ -500,  500], [L2,L1]) / 10000;
C = randi([ -500,  500], [L3,L2]) / 10000;
D = randi([ -500,  500], [01,L3]) / 10000;
% Biases
a = randi([-2000, 2000], [L1, 1]) / 10000;
b = randi([-2000, 2000], [L2, 1]) / 10000;
c = randi([-2000, 2000], [L3, 1]) / 10000;
d = randi([-2000, 2000], [ 1, 1]) / 10000;

x = -ran:ran/plotn:ran;
y = -ran:ran/plotn:ran;
z = zeros(length(x),length(y));

for i = 1:length(x)
    for j = 1:length(y)
        z(i,j) = NN([x(i); y(j)],A,B,C,D,a,b,c,d);
    end
end

function y = NN(x,A,B,C,D,a,b,c,d)
sig = @(x) 2*exp(x) ./ (exp(x) + 1) -1;

x = A*x+a;
x = sig(x/1);

x = B*x+b;
x = sig(x/1);

x = C*x+c;
x = sig(x/1);

x = D*x+d;
x = sig(x/1);

y = x;
end

Построив z vs x и y, к своему удивлению, я обнаружил, что результат оказался более регулярным и предсказуемым, чем я мог подумать, как видно на следующих изображениях.

random network 1 output random network 2 output

Даже при увеличении количества нейронов в скрытых слоях до абсурдных величин наблюдается то же поведение: поверхность состоит из горизонтальных плоскостей с разными значениями z, причем все эти странные складки пересекаются в ( 0,0).

Это заставляет меня задаться вопросом, как, даже при достаточном обучении, результат может следовать любой заданной функции (скажем, 1 / (1 + x ^ 2 + y ^ 2)), не говоря уже о любой другой шаблон, для которого аналитическое выражение неясно (где вы бы применили нейронную сеть).

Я был бы благодарен, если бы кто-нибудь мог объяснить мне, где я не понимаю нейронные сети

...