geradoras de rede resultados incorretos neurais que estão ao redor da média de saídas

votos
4

Eu estou trabalhando em um sistema de rede neural para realizar encaixe SED como parte de um projeto studentship da Universidade da Austrália Ocidental.

Eu criei um conjunto de cerca de 20.000 corre através de um programa de adaptação SED conhecido como MAGPHYS . Cada corrida tem o 42 de entrada valores e 32 valores de saída que estamos interessados em (existem mais saídas do sistema, mas não precisamos deles)

Estive a experimentar ao redor com o pacote de rede neural Keras, a fim de criar uma rede para aprender essa função.

Meu projeto atual rede usa 4 camadas ocultas, totalmente interligados, com 30 conexões entre cada camada. Cada camada é usando funções de activação tanh. Também tem uma camada 42 dimensão de entrada e de saída 32 camada dimensão, ambos também usando activação tanh, para um total de 6 camadas.

model = Sequential()
loss = 'mse'
optimiser = SGD(lr=0.01, momentum=0.0, decay=0, nesterov=True)

model.add(Dense(output_dim=30, input_dim=42, init='glorot_uniform', activation='tanh'))

for i in range(0, 4):
    model.add(Dense(output_dim=30, input_dim=30, init='glorot_uniform', activation='tanh'))

model.add(Dense(output_dim=32, input_dim=30, init='glorot_uniform', activation='tanh'))
model.compile(loss=loss, optimizer=optimiser)

Tenho vindo a utilizar min normalização / max dos meus dados de entrada e saída para esmagar todos os valores entre 0 e 1. Eu estou usando uma descida optimiser gradiente estocástico e Eu experimentei com várias funções de perda, como erro quadrado médio, média erro absoluto, o erro médio absoluto percentagem etc.

A questão principal é que, independentemente de como eu estruturar minha rede, ele simplesmente gera valores de saída que estão em torno da média de todos os valores de saída de formação. Ele não aparece como através da rede tem realmente aprendeu a função corretamente, ele só gera valores em torno da média. Pior ainda, alguns projetos de rede Eu experimentei com, particularmente aqueles que usam funções de ativação lineares, vai gerar apenas a média dos valores de saída e não irá variar em tudo.

Exemplo (para uma das 32 saídas):

Output   Correct
9.42609868658  =   9.647
9.26345946681  =   9.487
9.43403506231  =   9.522
9.35685760748  =   9.792
9.20564885211  =   9.287
9.39240577382  =   8.002

Observe como todas as saídas estão ao virar da 9.2 - valor 9,4, embora estes valores são bastante incorreta.

Com tudo isso em mente, o que faz com que uma rede como a minha para gerar esses tipos de saídas que são todos em torno da média?

Que tipo de coisas que eu posso tentar remediar este problema e criar uma rede, de alguma sorte, para realmente gerar saídas correctas?

Publicado 10/01/2016 em 23:37
fonte usuário
Em outras línguas...                            


1 respostas

votos
5

Eu só quero jogar fora algumas reflexões sobre este problema específico, além de comentário de CAFEBABE:

  1. 42 recursos de entrada não é uma tonelada de recursos para trabalhar. Não é algo que você pode necessariamente corrigir, mas isso significa que você vai querer ter mais amplas camadas ocultas (ou seja, mais nós), para ajudar com a separabilidade das classes / etiquetas. Além disso, 20K observações não é exatamente um grande conjunto de dados. Se você pode obter mais dados, você deve. Isso é muito bonito sempre o caso.

  2. Se você tem uma razão concreta para min normalização / max, então ignorar este ponto, mas você poderia considerar BatchNormalizing sua entrada, o que tende a ajudar a capacidade da rede para prever com precisão. Isto permite essencialmente que a activação ter entradas ocorrendo mais perto do meio da função de, em vez das extremidades.

  3. Você deve experimentar mais com a sua otimização. Por exemplo:

    • Quantas épocas você estiver executando o treinamento para? Uma passagem sobre os dados não é suficiente.
    • Tente diferentes otimizadores, como rmspropou adamou taxas de aprendizagem.
    • Você também pode usar um agendador taxa de aprendizagem, como aqui , onde você diminuir a sua taxa de aprendizagem ao longo das épocas, para que você não atirar mínimos passado de sua função de perda.
  4. Tente algumas funções de ativação diferentes. Uma pesquisa recente inclui: Relu, ELU, PReLU, SReLU. Todos os disponíveis no keras.

  5. Além disso, tente incluindo alguns regularização, para evitar overfitting. Olhe para Dropout, ou L2 / L1

  6. Apesar de ter um modelo mais profundo (ou seja, mais camadas) que muitas vezes ajudam, reduzindo as dimensões de dados de 42 características, até 30, é provável ferir a sua capacidade de separar os dados. Tente algo maior, como 100 ou 500, ou 1000.

Um modelo de exemplo, você poderia tentar seria algo como:

# imports 
from sklearn.cross_validation import train_test_split
from keras.models import Sequential
from keras.layers.core import Dense, Activation, Dropout
from keras.layers.normalization import BatchNormalization
from keras.layers.advanced_activations import ELU     

# data shapes
n_obs, n_feat = 20000, 42
n_hidden = 500 # play with this, bigger tends to give better separability
n_class = 32

# instantiate model
model = Sequential()

# first layer --- input
model.add(Dense(input_dim = n_feat, output_dim = n_hidden))
model.add(BatchNormalization())
model.add(ELU())
model.add(Dropout(p=0.2)) # means that 20% of the nodes are turned off, randomly

# second layer --- hidden
model.add(Dense(input_dim = n_hidden, output_dim = n_hidden))
model.add(BatchNormalization())
model.add(ELU())
model.add(Dropout(p=0.2))

# third layer --- output
model.add(Dense(input_dim = n_hidden, output_dim = n_class))
model.add(BatchNormalization())
model.add(Activation('softmax'))

# configure optimization
model.compile(optimizer = 'rmsprop', loss = 'categorical_crossentropy', metrics = ['accuracy'])

# split your data, so you test it on validation data
X_train, X_test, Y_train, Y_test = train_test_split(data, targets)

# train your model
model.fit(X_train, Y_train, validation_data = (X_test, Y_test))

Melhor da sorte!

Respondeu 15/07/2016 em 21:35
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more