总结下自己这段时间看的神经网络结构,主要介绍的算法是FP/BP 算法的推导的过程和对课程的总结。
会涉及到,FP/BP算法,正则优化,基础推导。
一、神经网路(Neural Networks)
为什么要用NN:之前介绍的回归和逻辑回归,都有一个缺点,就是特征太多的时候计算负荷大。所以这个时候神经网络出现了。
什么是NN:找出大脑的学习算法,然后在计算机上执行大脑学习算法或与之相似的算法。
NN的结构:每一个神经元都可以被认为是一个处理单元/神经核( processing unit/Nucleus),它含有许多输入/树突( input/Dendrite),并且有一个输出/轴突( output/Axon)。
1、神经网络结构
如下:
其中x1、x2、x3是输入单元,我们将原始数据输入给他们。a1、a2、a3是中间单元,呈递到下一层。最后是输出单元,负责计算。
2、前向传播算法(FP)
计算过程中,每一层都会添加一个偏差单位(bias unit):
其中,代表的是第j层的第i个激活单元。
代表从第j层映射到第j+1层的权重(weight)。
计算上述模型的,激活单元和输出(第二层的计算):
把x,theta,a分别用举证表示,a=theta*X。
计算的过程:
%%%%利用权重算出的中间值
%%%%第二层的值
正向传播算法从左到右一点一点计算出假设函数。
代价函数:
回顾逻辑回归的cost function:
逻辑回归中,只有一个输出变量,一个因变量。而NN中有什么输出变量,代价函数会复杂一些。
解释下代价函数的组成,第一个部分是和逻辑回归一样的,是h函数与真实值之间的距离每个样本,每个类输出相加之和,后面的是正则化后的去掉每一层theta0(bias unit)后的,theta矩阵的和。
3、反向传播算法(BP)
之前我们用FP算法,从第一层计算到第二层,直到最后的。现在,为了计算代价函数的偏导数,
,我们采用一种反向传播算法。
FP算法:
BP算法:
从右到左,这里y值要先匹配和a(4)一样维度。
倒数第二层的delta。
倒数第三层的delta。注意这里得delta2 = delta2(2:end);也就是说是去除了第一列的。
求出大delta的值。
求出J的偏导数。
反向传播算法求得是J 得偏导,也就是梯度得值。
算法的第一步:计算每一层的激活单元a,求出最后一层的误差。(记住每层要加偏置单位)
第二步:利用反向传播计算直到第二层的误差delta。(要去除每层的delta的偏执单位)
第三步:然后计算出Delta的值。
第四步:计算J偏导的值D。(这里要注意把矩阵向量化,得到梯度矩阵)
最后返回的两个值:一个是【J,gradient】。
到这而有几个重点要介绍下:
第一个是:正则化已经在FP/BP时都用了。
第二个是:注意FP的加bias unit 而在计算误差的时候要remove bias unit。
第三点是:梯度检验
总体就是这些。我们在拿到一个数据集的时候要怎么去利用这个算法很重要,选择多少的NN。
(第五周)matlab 代码
y = eye(num_labels)(y,:);
%这里的意思是,我的10*10单位矩阵,每一行的1的位置是y的值。5000*10.共10列 5000个样本
%%part1 这里利用FP去计算a1 /a2 /a3
a1 = [ones(m,1) X];%5000*401
z2 = a1 * Theta1';
a2 = sigmoid(z2) ;
n = size(a2,1);
a2 = [ones(n,1) a2];%%%5000*26
a3 = sigmoid(a2 * Theta2');%%%5000*10
J = 1/m*sum(sum(-y.* log(a3) - (1-y).*log(1-a3)));%%计算正向传播算法的J函数。
%%%%正则化表示
regularized = lambda/(2*m) * (sum(sum(Theta1(:,2:end).^2)) + sum(sum(Theta2(:,2:end).^2)) );%%%Theta1 /Theta2的累加的和。
%%%正则化后
J = J+regularized ;
%%%%part2计算反向传播算法的的delta的值;
delta3 = a3 -y;%
delta2 = delta3 * Theta2 ;
delta2 = delta2(:,2:end); %%去除第一列,因为第一列对我们有没有用,这才是真正的delta2
delta2 = delta2 .*sigmoidGradient(z2);%%5000*25
%%%
Delta_1 = zeros(size(Theta1));
Delta_2 = zeros(size(Theta2));%%
%%%大delta
Delta_1 = Delta_1 + delta2' *a1;
Delta_2 = Delta_2 + delta3' *a2;
%%%%%%计算theta梯度
Theta1_grad = 1/m*Delta_1;
Theta2_grad = 1/m*Delta_2;
regularized_1 = lambda/m * Theta1;
regularized_2 = lambda/m * Theta2;
regularized_1(:,1) = zeros(size( regularized_1, 1),1);
regularized_2(:,1) = zeros(size( regularized_2, 1),1);
Theta1_grad = Theta1_grad + regularized_1;
Theta2_grad = Theta2_grad + regularized_2;
% -------------------------------------------------------------
% =========================================================================
% Unroll gradients
grad = [Theta1_grad(:) ; Theta2_grad(:)];