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

2017年11月28日 9337点热度 1人点赞 0条评论

之前在看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

RangerWolf

保持饥渴的专注,追求最佳的品质

文章评论