Я пытаюсь воспроизвести бумажное НЛП (почти) с нуля с помощью deeplearning4j. Я сделал следующие шаги:
- загрузить векторы слова SENNA
- напишите итератор для набора данных CoNLL'03: для каждого слова я формирую вектор признаков слова путем конкатенации векторов слов его соседних слов (с размером окна = 5)
- используйте указанный выше итератор набора данных для обучения простого уровня регрессии, например:
MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder()
.seed(seed).iterations(iterations)
.learningRate(1e-8f)
.optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT)
.list(2)
.layer(0, new DenseLayer.Builder()
.nIn(wordVecLayers * windowSize).nOut(hiddenSize)
.activation("relu")
.weightInit(WeightInit.DISTRIBUTION)
.dist(new UniformDistribution(-2.83 / Math.sqrt(hiddenSize), 2.83 / Math.sqrt(hiddenSize)))
.biasInit(0.0f).build())
.layer(1, new OutputLayer.Builder(LossFunction.NEGATIVELOGLIKELIHOOD)
.nIn(hiddenSize).nOut(types.size())
.activation("softmax").weightInit(WeightInit.DISTRIBUTION)
.dist(new UniformDistribution(-2.83 / Math.sqrt(hiddenSize), 2.83 / Math.sqrt(hiddenSize)))
.biasInit(0.0f).build())
.backprop(true).pretrain(false)
.build();
Я пробовал много разных конфигураций, но ни одна из них у меня не сработала. Модель продолжает предсказывать все слова с меткой «О». Буду признателен, если вы укажете, что не так с моим подходом? И какие шаги мне делать дальше? Спасибо!