使用 Flux.jl 理解损失函数行为时遇到问题。在朱莉娅

Problem understanding Loss function behavior using Flux.jl. in Julia

所以。首先,我是神经网络 (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

现在,xtrainytrain 都是 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,等等)训练我的模型时,损失函数接缝增加。见下图:

其中:y1:Nₜᵣ=10,y2:Nₜᵣ=15,y3:Nₜᵣ=25。 所以,我的主要问题是:

  1. 为什么会这样?。我看不到对此行为的解释。这是某种预期吗?

备注:注意

  1. 注意事项:我需要一个包含近 10000 个输入向量的训练数据集,所以我预计会出现更糟糕的情况...

  2. 一些个人想法:

loss(x,y)         = squaredCost(m(x),y); # define loss function

您的损失未标准化,因此添加更多数据只会增加此成本函数。但是,每个数据的成本似乎并没有增加。要消除这种影响,您可能希望通过使用均方成本之类的操作来使用归一化成本函数。