1.非线性模型的意义
Neural Network 神经网络这一类非线性模型是机器学习非常重要的一部分,线性回归和逻辑回归存在局限性,并非是说他们在一些问题上不能进行拟合,而是比较难找到合适的多项式组合进行拟合。在性别分类的例子中使用三个特征身高,体重,胸围的简单组合可能就可以达到比较高的准确率了,但是在复杂情况,例如50×50像素图片的识别,每个像素点是一个特征就有2500个特征,如果是RGB彩色图片,每个像素点又有RGB三个特征一共有7500个特征,如果使用线性组合,1次项有7500个,2次项就有7500的平方个,这还不一定能够比较好的拟合数据。所以在特征数上升到一定规模后,需要使用复杂的非线性模型对数据进行拟合,拟合的结果如果用线性表示也许是一些8次幂项,6次幂项,5次幂项的组合,但是如果使用线性模型去做,去找到合适的多项式就要花费非常多的时间。
2.人工神经网络的来源
神经网络源于对人的神经细胞的模拟,构成大脑的神经细胞普遍性具有多树突(输入路径)单一轴突(输出路径)的结构,虽然大脑学习知识的过程仍然是迷,但起码可以仿照神经元的结构设计机器学习系统。人工神经网络的最小结构就是神经元,具备多输入,单输出的特点。大量神经元被分层后组织成神经网络,下一层的每个神经元都将上一层每个神经元的输出作为自己的输入。典型的神经网络具备三层结构,第一层是输入层,即数据集的特征,第二层是隐层,即若干个神经元,第三层是输出层,即决定模型的输出,输出层可以是单个神经元,也可以有多个神经元,取决于数据集的真实值y的特性。
3.神经网络的直观理解
如果把每个神经元看作一个函数,将多个输入映射到一个输出上,那么神经网络就是函数的嵌套:隐层每个神经元上有不同的函数,输出层上又有
。如果举性别分类的例子,隐层节点1也许注重身高体重的身材比例,隐层节点2也许注重胸围与体重的身材比例,在通过两种身材比例的关系在输出层最终判定性别。
4.神经网络的前向传播与反向传播
前向传播就是迭代的函数求值过程,以,
,
为例,
为自变量,
为输出,给定
,
,前向传播就是先求出
,
,再得出
。
反向传播有些难以理解,但其本质是导数的链式法则。仍以上述为例,有
and
如果要求对
的偏导,可以先求出各中间节点的偏导,然后再相加。对应于反向传播的公式,
的过程是求解嵌套函数的偏导的过程,
的过程是各偏导项相加的过程。反向传播的思路是自上而下,存储中间计算过程,避免了自下而上的重复路径求导的问题(上例中如果直接求a,b偏导的话
要求两次),其实质是存储空间换计算时间。
5.反向传播算法的验证
反向传播是较为复杂的算法,必须使用一些验证方法保证其正确性。反向传播是求偏导,由于神经网络的复杂性,整体cost function可能不是全局凸函数,而且cost function的计算也远比回归模型开销大,观察迭代过程中的cost function的变化曲线并不靠谱。为验证反向传播,可以使用导数的数值计算方法进行验证:。
6.随机初始化
参数如果全部初始化为0,在正向传播过程中可能造成隐层节点的对称性。举例来说,,
,
,
,如果初始化
,那么
,求偏导时
,这在反向传播的梯度下降中可能造成无法打破的对称性。在神经网络中还略不同,因为每个节点的初始映射的假设是一致的,节点差异性基本全部来自参数theta,因此对称性问题更难以打破,需要在初始化时进行随机化处理。
神经网络的编程作业ex4比前几个的难度有所加大,这次作业,关键在于正向传播和反向传播
Y=zeros(num_labels,m); % 10*5000 for i=1:num_labels Y(i,y==i)=1; end
Note:数据集中的真实值是1-10的数字,所以输出层必须有10个节点代表1-10用于分类,相应地,需要转换成这样的向量,上述实现是向量实现,因为一般数据集样本数量大于分类数量,找到为1的
的索引,在这些索引的列上相应位置赋值1,如果在样本数量上使用for循环相对较慢。
X=[ones(m,1) X]; a1=X; %5000*401 z2=a1*Theta1'; %5000*25 a2=sigmoid(z2); %5000*25 a2=[ones(m,1) a2]; %5000*26 z3=a2*Theta2'; %5000*10 h=sigmoid(z3); %5000*10
Note:前向传播的实现,按照公式实现,无难点
theta1=Theta1; theta1(:,1)=0; theta2=Theta2; theta2(:,1)=0; J=sum(sum(-Y.*log(h')-(1-Y).*log(1-h')))./m+lambda/2/m*(sum(sum(theta1.*theta1))+sum(sum(theta2.*theta2))); delta_3=h-Y';%5000*10 Delta2 = delta_3'*a2; %10*26 Theta2_grad = (Delta2+lambda.*theta2)./m; delta_2=delta_3*Theta2.*a2.*(1-a2);%5000*26 delta_2(:,1)=[];%5000*25 Delta1 = delta_2'*a1; %25*401 Theta1_grad = (Delta1+lambda.*theta1)./m;
Note:cost function以及偏导数。theta1和theta2是正则化项的技巧,delta_2(:,1)=[];是向量化的技巧,这么做是因为正向传播时每层第一个节点是常数项,并无前一层的输入,其导数不必继续反向传播。
p = zeros(size(X, 1), 1); h1 = sigmoid([ones(m, 1) X] * Theta1'); h2 = sigmoid([ones(m, 1) h1] * Theta2'); [~, p] = max(h2, [], 2);
Note: 已知Theta和X,求模型拟合结果。前三行为正向传播,最后一行直接找每行最大值的索引,直接得到1-10的数字,每个样本输入得到的输出实际上是含10个元素的向量,转换成预测值1-10正对应着最大值索引。
神经网络没有严格的定义,也不像朴素贝叶斯等方法存在严格的数学和概率理论支持,但是神经网络后续发展出的深度学习已经被广泛应用并得到有价值的产出。
文章评论