Проблема понимания поведения функции потерь с использованием Flux.jl. в Юлии - PullRequest
2 голосов
/ 06 августа 2020

Итак. Прежде всего, я новичок в нейронной сети (NN). В рамках своей докторской степени я пытаюсь решить какую-то проблему через NN. Для этого я создал программу, которая создает некоторый набор данных, состоящий из набора входных векторов (каждый с 63 элементами) и соответствующих им выходных векторов (каждый с 6 элементами).

Итак, моя программа выглядит так: это:

Nₜᵣ            = 25;   # number of inputs in the data set
xtrain, ytrain = dataset_generator(Nₜᵣ); # generates In/Out vectors: xtrain/ytrain
datatrain      = zip(xtrain,ytrain);     # ensamble my data

Теперь оба xtrain и ytrain относятся к типу Array{Array{Float64,1},1}, что означает, что если (скажем) Nₜᵣ = 2, они выглядят так:

julia> xtrain    #same for ytrain
2-element Array{Array{Float64,1},1}:
 [1.0, -0.062, -0.015, -1.0, 0.076, 0.19, -0.74, 0.057, 0.275, ....]
 [0.39, -1.0, 0.12, -0.048, 0.476, 0.05, -0.086, 0.85, 0.292, ....]

Первые 3 элемента каждого вектора нормализованы к единице (представляют координаты x, y, z), а следующие 60 чисел также нормализованы к единице и соответствуют некоторым измеримым атрибутам.

Программа продолжается следующим образом:

layer1 = Dense(length(xtrain[1]),46,tanh); # setting 6 layers
layer2 = Dense(46,36,tanh)            ;
layer3 = Dense(36,26,tanh)            ;
layer4 = Dense(26,16,tanh)            ;
layer5 = Dense(16,6,tanh)             ;
layer6 = Dense(6,length(ytrain[1]))   ;

m = Chain(layer1,layer2,layer3,layer4,layer5,layer6); # composing the layers

squaredCost(ym,y) = (1/2)*norm(y - ym).^2; 
loss(x,y)         = squaredCost(m(x),y); # define loss function

ps  = Flux.params(m);         # initializing mod.param. 
opt = ADAM(0.01, (0.9, 0.8)); # 

и, наконец:

trainmode!(m,true)
itermax = 700;    # set max number of iterations
losses = [];     
for iter in 1:itermax
    Flux.train!(loss,ps,datatrain,opt);
    push!(losses, sum(loss.(xtrain,ytrain)));
end

Он работает отлично, однако я обращаю внимание на то, что когда я тренирую свою модель с увеличивающимся набором данных (Nₜᵣ = 10,15,25, и т. Д. 1053 * ...), функция потерь будет увеличиваться. См. Изображение ниже: y1: 10, y2=15, y3=25

Where: y1: Nₜᵣ=10, y2: Nₜᵣ=15, y3: Nₜᵣ=25. So, my main question:

  1. Why is this happening?. I can not see an explanation for this behavior. Is this somehow expected?

Remarks: Note that

  • All elements from the training data set (input and output) are normalized to [-1,1].
  • I have not tryed changing the activ. functions
  • I have not tryed changing the optimization method
  1. Соображения: мне нужен набор обучающих данных из почти 10000 входных векторов, поэтому я ожидаю еще худшего сценария ...

  2. Некоторые личные мысли:

  • Правильно ли я размещаю свой тренировочный набор данных ?. Скажем, если каждый вектор данных состоит из 63 чисел, правильно ли сгруппировать их в массив? а затем сложите их в ´´´Array {Array {Float64,1}, 1} ´´´ ?. У меня нет опыта использования NN и flux . Как я могу по-другому создать набор данных из 10000 векторов ввода-вывода? Может в этом проблема ?. (Я очень к этому склоняюсь)
  • Может ли такое поведение быть связано с выбранными функциями act. ? (Я не склонен к этому)
  • Может ли такое поведение быть связано с алгоритмом opt. ? (Я не склонен к этому)
  • Я неправильно тренирую свою модель ?. Является ли итерация l oop на самом деле итераций или это эпох . Я изо всех сил пытаюсь применить (различить) эту концепцию «эпох» и «итераций» на практике.

1 Ответ

0 голосов
/ 06 августа 2020
loss(x,y)         = squaredCost(m(x),y); # define loss function

Ваши потери не нормализуются, поэтому добавление дополнительных данных может только увеличить эту функцию затрат. Однако стоимость данных, похоже, не увеличивается. Чтобы избавиться от этого эффекта, вы можете использовать нормализованную функцию стоимости, например, используя среднеквадратичную стоимость.

...