为什么Keras之中NLP使用的都是浅层神经网络?

我是创始人李岩:很抱歉!给自己产品做个广告,点击进来看看。  

为什么Keras之中NLP使用的都是浅层神经网络?

之前在看Keras Example的时候, 发现对于NLP相关的任务使用的NN都非常浅。

没有很严谨的去数, 但是基本上都是一两层网路就结束了。

具体可以参考Keras Example 之中IMDB相关的代码。

当然, 效果也不差。 一直对这一块很奇怪。 偶然从知乎上面的一篇文章获得解答。

参考:

如何评价Word2Vec作者提出的fastText算法?深度学习是否在文本分类等简单任务上没有优势?

简要观点:

项亮:

文本分类基本还是个偏线性的问题。多层的网络相对单层的没有太多优势。但这不是说多层的没用,而是单层的就够了。但有些别的非线性的问题,多层的就有优势。所以本质是问题不同,不是方法的问题.

另外, 就像上面提到的, FastText之中提到DAN,其作用主要就是根据单词向量, 使用加权平均的方式生成句子向量。 使用平均的句子向量进行预测。

这种方式, 对情感分析等任务, 确实不够精确, 目前似乎也没有其他更好的方式。

具体可以看FastText源码之中的getSentenceVector()函数:

				void FastText::getSentenceVector(
				    std::istream& in,
				    fasttext::Vector& svec) {
				  svec.zero();
				  if (args_->model == model_name::sup) {
				    std::vector<int32_t> line, labels;
				    dict_->getLine(in, line, labels, model_->rng);
				    for (int32_t i = 0; i < line.size(); i++) {
				      addInputVector(svec, line[i]);
				    }
				    if (!line.empty()) {
				      svec.mul(1.0 / line.size());
				    }
				  } else {
				    Vector vec(args_->dim);
				    std::string sentence;
				    std::getline(in, sentence);
				    std::istringstream iss(sentence);
				    std::string word;
				    int32_t count = 0;
				    while (iss >> word) {
				      getWordVector(vec, word);
				      real norm = vec.norm();
				      if (norm > 0) {
				        vec.mul(1.0 / norm);
				        svec.addVector(vec);
				        count++;
				      }
				    }
				    if (count > 0) {
				      svec.mul(1.0 / count);
				    }
				  }
				}
			
End.

转载请注明来自36大数据(36dsj.com): 36大数据 » 为什么Keras之中NLP使用的都是浅层神经网络

随意打赏

stanford神经网络算法卷积神经网络keras
提交建议
微信扫一扫,分享给好友吧。