基于汉字字频特征实现99.99%准确率的新闻文本分类器(五)
基于汉字字频特征实现99.99%准确率的新闻文本分类器(一)
基于汉字字频特征实现99.99%准确率的新闻文本分类器(二)
基于汉字字频特征实现99.99%准确率的新闻文本分类器(三)
基于汉字字频特征实现99.99%准确率的新闻文本分类器(四)
基于汉字字频特征实现99.99%准确率的新闻文本分类器(五)
基于汉字字频特征实现99.99%准确率的新闻文本分类器(六)
回顾
上 一节中,通过走读源代码,分析了常用汉字的字频,及每个新闻文本的特征向量的归一化。SVM已经可以达到比常用的词频特征向量更好的分类成绩。本节,将分析五层神经网络的源代码。
人工神经网络
关于人工神经网络的定义等相关知识,请参阅相关资料。
源代码
在五层神经网络分类器的源代码项目中,Program.cs中的代码主要做简单的特征数据加载工作。在加载完毕后,调用神经网络进行分类工作。
所以这里主要分析NN.cs的代码。NN.cs包含三个类,一个是NN类,表示神经网络的加载器。它会从数据流中加载输出层。OutLevel类会从数据流中加载输出层权值矩阵,并采用序列化的方式,加载后续的其它MidLevel权值。
public class NN{...} public class OutLevel{...} public class MidLevel{...}
在它们的Run函数中,我们可以到
internal void Run(double[] inputs) { if (nextLevel != null) { nextLevel.Run(inputs); int thiscount = o.Length; int nextcount = nextLevel.o.Length; int id = 0; for (int i = 0; i < thiscount; i++) { double sum = 0; for (int j = 0; j < nextcount; j++) sum += nextLevel.o[j] * w[id++]; sum += thta[i]; o[i] = 1 / (1 + Math.Exp(-sum)); } } else o = inputs; }
这里先对下层的输出o和本层的w进行乘积求和,然后采用神经元的标准非线性作用函数Sigmoid函数计算本层的神经元输出o。
通过递归的加载,即可加载完整五层神经网络权值数据。例如,加载的首层的权值w矩阵有(部分值):
-0.036 -0.203 0.025 0.035 -0.017 0.011 -0.295 -0.010 -0.018 -0.117 -0.021 0.134 0.110 0.302 0.154 -0.646 0.025 0.081 0.047 -0.098 0.032 0.129 0.021 -0.200 0.097 0.138 0.094 -0.102 -0.206 0.083 -0.126 0.103 -0.077 0.098 -0
这些权值,即是神经元之间传递激活值的依据。与下图所示的类似:
对于神经网络来说,二分类的单个神经元输出层运算输出的是一个0-1的实数。它(这个实数)描述了一个输入向量是否是一个分类(0 否,1是,中间值 一定比率的是否)。
if (Math.Abs(res - wanted) > 0.4)
所以,在判断一个文本特征向量是否是军事类的新闻的时候,我们采用区间法,即,输出值在0-0.4的认为不是军事类新闻,输出值在0.6-1的,认为是军事类新闻。0.4-0.6的不置可否。例如甲乙两个新闻,甲的输出0.9999,乙的输出0.6123,很明显神经网络认为甲是军事类的新闻的可能性比乙要高的多,甚至有些量子理论中的这个新闻是某种概率的(61.23%)属于某个分类的意思。神经网络的这种0-1连续输出的方式,有一种天生的模糊逻辑的意味。
我无法用数学语言描述为什么五层神经网络的泛化能力为什么比三层神经网络强。
这里是临近输入层的权值向量(就是吐舌头那一层,取前20个),它们蕴藏了一个秘密!
-0.326 0.153 -0.086 -0.526 -0.642 -0.692 0.034 -0.295 -0.182 0.027 -0.489 -0.069 -0.226 -0.293 0.089 -0.335 -0.129 -0.137 0.072 0.102
下节预告
下节,我会为大家揭开一个秘密,一个关于神经网络的神奇用法的秘密。