之前在看Keras Example的时候, 发现对于NLP相关的任务使用的NN都非常浅。
没有很严谨的去数, 但是基本上都是一两层网路就结束了。
具体可以参考Keras Example 之中IMDB相关的代码。
当然, 效果也不差。 一直对这一块很奇怪。 偶然从知乎上面的一篇文章获得解答。
参考:
如何评价Word2Vec作者提出的fastText算法?深度学习是否在文本分类等简单任务上没有优势?
简要观点:
项亮:
文本分类基本还是个偏线性的问题。多层的网络相对单层的没有太多优势。但这不是说多层的没用,而是单层的就够了。但有些别的非线性的问题,多层的就有优势。所以本质是问题不同,不是方法的问题.
另外, 就像上面提到的, FastText之中提到DAN,其作用主要就是根据单词向量, 使用加权平均的方式生成句子向量。 使用平均的句子向量进行预测。
这种方式, 对情感分析等任务, 确实不够精确, 目前似乎也没有其他更好的方式。
具体可以看FastText源码之中的getSentenceVector()
函数:
[code lang=python]
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);
}
}
}
[/code]
本文原创,原文链接
http://www.flyml.net/2017/11/28/deepnlp-shallow-nn-is-enough-for-nlp
文章评论