机器学习4---浅谈神经网络

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/aBIT_Tu/article/details/82456016

1. 神经元模型    

神经网络是一个多学科交叉的领域,比较常见的定义是:“”神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能模拟生物神经系统对真实世界物体做出的交互反应“”。

神经网络中最基本的成分是神经元模型,典型的为m-p神经元模型,从生物角度可以形象的理解为下图。

从模型角度而言,m-p神经元接收n个输入信号x_{i},并通过权重\omega^{_{i}}连接形成总输入值,将总输入值与神经元的阈值\theta相比较,然后通过激活函数(activation function)处理以产生神经元的输出y=f(\sum^{n}_{i=1}w_{i}x_{i}-\theta )

神经网络就是将多个神经元按照一定的层次结构连接起来。

2. 感知器与多层网络

    感知器由两层神经元组成,即输入层和输出层。单个感知器通过设置连接权重就可以实现“与”,“或“,”非”等线性问题,两层感知器可以解决“异或”问题,中间一层叫做隐含层。具体而言,在感知器学习时,将阈值视为“哑节点”,权重总为-1,即可采用“负反馈”的修正思想统一学习权重:\Delta w_{i}=\eta (y-y^{*})x_{i},其中\eta为学习率,控制修正权值的步长。

    虽然单个感知器可以有效解决线性可分问题,但是解决非线性可分问题需要使用多层功能神经元,即拥有激活函数的神经元。更一般的,若每层神经元只与下一层神经元互连,同层或跨层之间没有互连,则可称之为“多层前馈神经网络”(multi-layer feedorward neural networks)。

分享一段单个感知器的代码段,来源:https://blog.csdn.net/xmu_jupiter/article/details/21884501

function [ w,b ] = original_style( training_set,study_rate )
%training_set是一个m*n维矩阵,其中第一行是y_i,剩下的行的x_i
%选取初始值w_0,b_0
w=0;
b=0;
count=0;            %每一次正确分类点个数
iteration_count=0;  %迭代次数
fprintf('迭代次数\t误分类点\t\t权值w\t\t偏置b\t\n');%输出结果标题
while count ~= size(training_set,2)
    count=0;
    %在训练集中选取数据(x_i,y_i)
    for i=1:size(training_set,2)
        count = count+1;
        %如果y_i(w*x_i+b)<=0,则对w和b进行相应的更新
        if training_set(1,i)*(w'*training_set(2:size(training_set,1),i)+b)<=0
            w = w + study_rate*training_set(1,i)*training_set(2:size(training_set,1),i);
            b = b + study_rate*training_set(1,i);
            iteration_count=iteration_count+1;
            count=count-1;%不是正确分类点,减一
            fprintf('\t%u\t',iteration_count);%输出迭代次数
            fprintf('\t\t%u\t',i);%输出误分类点
            fprintf('\t(%2.1g,%2.1g)''\t',w);%输出w
            fprintf('\t%4.1g\n',b);%输出b        
        end  
        if w(2,1) ~= 0 
            x = [-5:0.1:5];
            y = (-w(1,1)*x-b)/w(2,1); 
            plot(x, y); pause;
        end
    end
end
end

主函数:

 clear all; 
 training_set=[1,-1,1,-1;3,1,4,2;3,1,3,2];
 hold on; xlim([-5,5]);
 ylim([-5,5]); 
 plot(training_set(2,1),training_set(3,1),'*r'); 
 plot(training_set(2,2),training_set(3,2),'*b');
 plot(training_set(2,3),training_set(3,3),'*r'); 
 plot(training_set(2,4),training_set(3,4),'*b'); 
 study_rate=1;
 [w,b]=original_style( training_set,study_rate ); 
 hold off; 

3. 误差反向传播(error BackPropagation)

3.1 标准BP算法和累积BP算法    

BP算法是迄今最为成功的神经网络学习算法。为了详细解释BP算法,假设有训练集D={(xi,yi)| i=1...m},简单的前馈神经网络只有一层输入层(d个节点,某一个点为i),一层隐含层(q个节点,某一个点为h),一层输出层(l个节点,某一个点为j),记输入层到隐层的某一连接权重为v_{ih},隐层到输出层的某一连接权重为w_{hj},隐层的某一阈值为r_{h},输出层的某一阈值为\theta {j},隐层的某一节点的输入值为\alpha _{h},输出值为b_{h},输出层的某一节点的输入值为\beta _{j},输出值为\hat{y}_{j}.

如图:明天来了补图,今天来不及画了,有点晚

根据向前传播的公式可知:

\alpha _{h}=\sum_{i=1}^{d}v_{ih}x_ib_{h}=f(\alpha _{h}-r_{h}) (f(*)为激活函数),\beta _{j}= \sum _{h=1}^{q}w_{hj}b_{h}\hat{y^{k}_{j}}=f(\beta _{j}-\theta _{j})  (f(*)为激活函数).

误差采用均方误差计算,则有:E_{k}=\frac{1}{2} \sum^{l}_{j=1}( \hat{y^{k}_{j}}-y^{k}_{j})^{2}

向后修正误差:

基于梯度下降法(gradient descent),即以负梯度方向对目标函数进行调节,则有

v\leftarrow v+\Delta v,   w\leftarrow w+\Delta w,   \thetar类似,

以w的推导为例:

\Delta w_{hj}=-\eta \frac{\partial E_{k}}{\partial w_{hj}},  其中k表示第k个样本。

根据链式法则,有:

\frac{\partial E_{k}}{\partial w_{hj}}=\frac{\partial E_{k}}{\partial \hat{y_{j}^{k}}}.\frac{\partial \hat{y_{j}^{k}}}{\partial \beta _{j}}.\frac{\partial \beta _{j}}{\partial w_{hj}},

容易知道,b_{h}=\frac{\partial \beta _{j}}{\partial w_{hj}},记g_{j}=-\frac{\partial E_{k}}{\partial \hat{y_{j}^{k}}}.\frac{\partial \hat{y_{j}^{k}}}{\partial \beta _{j}}为输出层神经元的梯度项,后续可以根据数学求偏导继续计算,因每一个激活函数不同而不同

简单可以写成\Delta w_{hj}=\eta g_{j}b_{h}\Delta \theta_{j}=-\eta g_{j},\Delta v_{ih}=\eta e_{h}x_{i},\Delta r_{h}=-\eta e_{h}, 其中e_{h}=-\frac{\partial E_{k}}{\partial b_{h}}.\frac{\partial b_{h}}{\partial \alpha _{h}}为隐层神经元的梯度项。

至此标准BP算法的推导基本结束,总结一下就是:

输入训练数据集,确定学习率,随机初始化连接权重和阈值,开始训练:

repeat:

      对每一个样本有:

      step1. 根据前向传播公式计算当前样本的输出\hat{y}_{j}

      step2. 计算输出层神经元的梯度项;

      step3. 计算隐层神经元的梯度项;

      step4. 更新链接权重和阈值;

达到终止条件,保存权重和阈值。

以上是标准BP算法的步骤和推导,还有一个相像的称为“累积BP算法”,它通过计算整个训练集上的累积误差进行学习(即每读取整个训练集一遍后才更新阈值权重),而非每一个训练样本的误差,因此目标函数为:

E=\frac{1}{m} \sum_{k=1}^{m}E_{k},累积BP算法可以缓解标准BP算法在准样本修正中出现的反复无效修正等问题,但在误差下降到一定程度后,进一步下降的速度明显减慢,此时应该选用标准BP算法。

3.2 处理过拟合

    一种策略是“早停”,即将训练集分为训练数据集和验证数据集,当训练数据集的误差降低而验证数据集的误差上升时,停止训练,并保存最小的验证集对应的权重阈值。

    另一种策略是“正则化” (regularization),基本思想是增加一个用于描述网络复杂度的部分,对于误差和复杂度做以折中,如修正目标函数为,

E=\lambda \frac{1}{m} \sum^{m}_{k=1}E_{k}+(1-\lambda)\sum_{i}w^{2}_{i}

3.3 处理局部极小

(1)使用多组值初始化。

(2)使用模拟退火算法,每一步都部分接收次优值。也有使用遗传算法的。·

(3)使用随机梯度下降法,即加入随机因素,扰乱陷入局部极小值的可能。

猜你喜欢

转载自blog.csdn.net/aBIT_Tu/article/details/82456016