Neural network 使用Flux.jl理解损失函数行为的问题。在朱莉娅

Neural network 使用Flux.jl理解损失函数行为的问题。在朱莉娅,neural-network,julia,Neural Network,Julia,所以。首先,我是神经网络(NN)的新手。 作为我博士学位的一部分,我试图通过NN解决一些问题。 为此,我创建了一个程序,创建了一些由 输入向量的集合(每个有63个元素)及其对应的 输出向量(每个有6个元素) 因此,我的程序如下所示: Nₜᵣ = 25; # number of inputs in the data set xtrain, ytrain = dataset_generator(Nₜᵣ); # generates In/Out vectors: xtrain

所以。首先,我是神经网络(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等),损失函数将增加。见下图:

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

  • 为什么会发生这种情况?。我无法解释这种行为。这是意料之中的事吗
  • 备注:请注意

    • 训练数据集中的所有元素(输入和输出)都被标准化为[-1,1]
    • 我没有试着改变这个动作。功能
    • 我没有尝试改变优化方法
  • 注意事项:我需要一个近10000个输入向量的训练数据集,因此我预计会出现更糟糕的情况

  • 一些个人想法:

    • 我是否正确安排了培训数据集?。比如说,如果每个数据向量由63个数字组成,那么将它们分组到一个数组中是否正确?然后将它们堆成一个´´´数组{Array{Float64,1},1}´´´´?。我没有使用NN和通量的经验。如何以不同的方式创建10000个I/O向量的数据集?这就是问题所在吗?。(我非常倾向于此)
    • 这种行为是否与所选择的行为有关。功能?(我不倾向于此)
    • 此行为是否与opt相关。算法?(我不倾向于此)
    • 我的模特训练错了吗?。迭代循环是真正的迭代还是时代。我正在努力将“时代”和“迭代”的概念付诸实践

    您的损失没有正常化,因此添加更多数据只能增加此成本函数。然而,每个数据的成本似乎没有增加。为了消除这种影响,您可能希望通过使用均方成本之类的方法来使用标准化成本函数。

    谢谢您的回复。这是有道理的!。现在(这给我带来了问题),我从各种通量示例中看到(并复制)了这部分代码(进行训练的部分),我看不出在每次迭代中对函数
    loss(x,y)
    的值进行求和有什么用。这个函数不是
    loss(x,y)
    返回一个值吗?。在每次迭代中添加了什么?。再次感谢您的回复!顺便说一句:我在《我忘了@you》上发了一篇类似的帖子。我希望在其他地方发布同样的问题不会有问题。我只是觉得这个网站可能是针对一个更具体的流量观众
    loss(x,y)         = squaredCost(m(x),y); # define loss function