为什么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.