世界属于ai吧 关注:107贴子:435
  • 39回复贴,共1

神经网络从头讲(一)

只看楼主收藏回复

我输入验证码怎么办?


1楼2014-01-15 22:41回复
    无法使用涂鸦功能


    2楼2014-01-15 22:42
    回复
      线性回归

      如图,横坐标表示一个班20个学生的【身高】,纵坐标表示【体重】,它们之间存在某种相关关系。任务:如果给出第21个学生的身高,如何预测其体重?


      换一种说法,如果在一个测试集中,【真实体重】为y,【预测体重】为z,那么预测的误差为(y-z)的绝对值。任务等同于使成本函数(cost function)=sum((y-z).^2)最小化。


      如果我们假设z=ax+b,线性回归的任务等同于通过变动参数a,b,使cost function
      J(a,b)=sum((y-ax-b).^2)最小化。
      我们可以通过最小二乘法求其解析解:因为J(a,b)对于a和b是凸函数,δJ([a,b])/δ([a,b])=0的解析解即为线性回归的最优解。(见最小二乘法的推导)
      另外一种方法是梯度下降算法,这种算法可以用含有4个神经元的人工神经网络来描述和求解。

      神经元z的激活量为z=a*x+b,其中a,b为权重。每次训练都对a和b进行微调,a微调的幅度delta_a=-ebsilon*x*(y-z),直到数值收敛。


      3楼2014-01-15 23:11
      收起回复
        clc
        clear
        close all
        num=20;%样本数量
        ebsilon_a=0.0001;%x神经元权重迭代速率
        ebsilon_b=0.001;%y神经元权重迭代速率
        x=rand(1,num)*0.3+1.5;%x神经元每次的激活量=样本身高
        e=randn(1,num)*1;%某误差
        a0=10;
        b0=40;
        y=a0*x+b0+e;%y神经元每次的激活量=样本体重
        a=0;
        b=0;
        for n=1:1000
        z=a*x+b;%z神经元的激活量
        theta=z-y;%theta神经元的激活量
        cost=sum((z-y).^2);%cost function
        delta_a=-ebsilon_a*sum((z-y).*x);%权重的调整量=cost function对于权重的导数
        delta_b=-ebsilon_b*sum(z-y);%权重的调整量=cost function对于权重的导数
        a=a+delta_a;%调整权重
        b=b+delta_b;%调整权重
        xscale=linspace(1.4,2,1000);%用于画样本的参数
        yscale=a*xscale+b;%用于画样本的参数
        plot(x,y,'.')% 样本
        hold on
        plot(xscale,yscale)%每一轮的参数估计
        hold off
        drawnow
        end


        4楼2014-01-15 23:11
        收起回复
          @wswlll


          6楼2014-01-16 23:17
          收起回复
            太好了,pw回归


            来自iPhone客户端8楼2014-01-17 08:58
            收起回复
              可以看一下sigmoid(x)和log(sigmoid(x))的形状
              figure
              x=linspace(-20,20,1000);
              y=1./(1+exp(-x));
              plot(x,y);
              figure
              y1=log(1./(1+exp(-x)));
              plot(x,y1)


              11楼2014-01-17 15:22
              收起回复
                %感知机demo(matlab)
                clc
                clear
                close all
                %__________________________________________________________
                %% 生成训练集代码(无意义,不用看)
                num=20;%样本数量
                height1=rand(1,num)*30+170;%女身高
                height2=rand(1,num)*33+180;%男身高
                e1=randn(1,num)*2;%某误差
                e2=randn(1,num)*2;%某误差
                a1=.1;
                a2=.12;
                b1=40;
                b2=37;
                weight1=a1*height1+b1+e1;%女体重
                weight2=a2*height2+b2+e2;%男体重
                sex1=ones(1,num)*0;%性别女
                sex2=ones(1,num)*1;%性别男
                M=[1:num*2;height1,height2;weight1,weight2;sex1,sex2];%列表生成 三行依次是身高、体重、性别
                %plot(height1,weight1,'r.',height2,weight2,'.')
                %__________________________________________________________
                %% 参数初始化(不用看)
                e=10e-23;
                b=30;
                x=M(2:3,:);
                x=[x;ones(1,length(x))];
                l=M(4,:);
                w=[-1,-1,-2000]';%如果初始点太离谱,可能陷入平原,收敛不了
                ebsilon=0.0001;
                %__________________________________________________________
                %% 神经网络(重点)
                for n=1:100 %重复迭代
                %cost=-sum(l.*log(1./(1+exp(-w'*x/b)))+(1-l).*log(1-1./(1+exp(-w'*x/b))+e));
                delta_w=-ebsilon*((1./(1+exp(-w'*x/b))-l)*x'); %根据hebb定律,权重改变量 正比于两边神经元的激活强度
                w=w+delta_w';
                %__________________________________________________________
                %% 即时显示分界线(不用看)
                xs=linspace(0,200,100);
                ys=-(w(1)*xs+w(3))/w(2);
                figure(1)
                plot(height1,weight1,'r.',height2,weight2,'.')
                hold on
                plot(xs,ys)
                hold off
                %axis([120,200,40,70])
                drawnow
                end
                figure(2)
                xs=linspace(0,200,100);
                ys=-(w(1)*xs+w(3))/w(2);
                plot(height1,weight1,'r.',height2,weight2,'.')
                hold on
                plot(xs,ys)
                hold off
                axis([160,200,40,70])
                drawnow


                13楼2014-01-17 15:35
                回复
                  用神经网络做SVM?


                  14楼2014-01-17 16:03
                  回复
                    ㄟ( ▔, ▔ )ㄏ被删贴了~这里言论也不自由啊。中国还有能说话的地方不。


                    17楼2014-01-17 16:37
                    回复


                      19楼2014-01-21 22:23
                      收起回复
                        21楼2014-01-23 17:08
                        回复
                          BP 神经网络 demo (matlab)
                          clc
                          clear
                          close all
                          % edited from Andrew Ng machine learning class homework
                          %% 尺寸
                          input_layer_size = 400; % 20x20 Input Images of Digits
                          hidden_layer_size = 25; % 25 hidden units
                          num_labels = 10; % 10 labels, from 1 to 10
                          %% 设定 训练集 和 测试集
                          load('ex4data1.mat');
                          testset=X(4801:5000,:);%测试集
                          testy=y(4801:5000);%测试集标准答案
                          X=X(1:4800,:);%训练集
                          y=y(1:4800);%训练集标准答案
                          m = size(X, 1);%训练集样本数量
                          Theta1=randn(25,401)/10;%第一层权重初始化
                          Theta2=randn(10,26)/10;%第二层权重初始化
                          nn_params = [Theta1(:) ; Theta2(:)];%写成一坨
                          %% Training
                          lambda=1;
                          costFunction = @(p) nnCostFunction(p, ...
                          input_layer_size, ...
                          hidden_layer_size, ...
                          num_labels, X, y, lambda);%定义costfunction,及其对nn_params的偏导
                          options = optimset('MaxIter', 50);%迭代次数
                          [nn_params, cost] = fmincg(costFunction, nn_params,options);%快速梯度下降函数
                          %% 显示权重
                          T1 = reshape(nn_params(1:hidden_layer_size * (input_layer_size + 1)), ...
                          hidden_layer_size, (input_layer_size + 1));
                          T2 = reshape(nn_params((1 + (hidden_layer_size * (input_layer_size + 1))):end), ...
                          num_labels, (hidden_layer_size + 1));
                          figure
                          displayData(T1(:, 2:end));
                          figure
                          displayData(T2(:, 2:end));
                          %% 测试
                          % Obtain Theta1 and Theta2 back from nn_params
                          Theta1 = reshape(nn_params(1:hidden_layer_size * (input_layer_size + 1)), ...
                          hidden_layer_size, (input_layer_size + 1));
                          Theta2 = reshape(nn_params((1 + (hidden_layer_size * (input_layer_size + 1))):end), ...
                          num_labels, (hidden_layer_size + 1));
                          h1 = sigmoid([ones(m, 1) X] * Theta1');
                          h2 = sigmoid([ones(m, 1) h1] * Theta2');
                          [~, pred] = max(h2, [], 2);
                          fprintf('\nTraining Set Accuracy: %f\n', mean(double(pred == y)) * 100);
                          h1 = sigmoid([ones(size(testset,1), 1) testset] * Theta1');
                          h2 = sigmoid([ones(size(testset,1), 1) h1] * Theta2');
                          [~, pred] = max(h2, [], 2);
                          fprintf('\nTest Set Accuracy: %f\n', mean(double(pred == testy)) * 100);
                          %% SVM测试
                          break
                          svmmodel=svmtrain(y,X);
                          yy=svmpredict(testy,testset,svmmodel);


                          23楼2014-02-04 19:24
                          收起回复
                            function [J grad] = nnCostFunction(nn_params,...
                            input_layer_size, ...
                            hidden_layer_size, ...
                            num_labels, ...
                            X, y, lambda)
                            %%
                            Theta1 = reshape(nn_params(1:hidden_layer_size * (input_layer_size + 1)), ...
                            hidden_layer_size, (input_layer_size + 1));% unroll theta
                            Theta2 = reshape(nn_params((1 + (hidden_layer_size * (input_layer_size + 1))):end), ...
                            num_labels, (hidden_layer_size + 1));% unroll theta
                            m = size(X, 1);%样本数量
                            X=[ones(m,1),X];%增加常数神经元
                            Theta1_temp=Theta1(:,2:end);%非-常数权重
                            Theta2_temp=Theta2(:,2:end);
                            a{1}=X;
                            a{2}=sigmoid(a{1}*Theta1');
                            a{2}=[ones(size(a{2},1),1),a{2}];%5000*26,每次训练中的中间层激活值,0-1
                            a{3}=sigmoid(a{2}*Theta2');%5000*10,每次训练中第三层激活值,0-1
                            for j=1:m
                            yy(j,y(j))=1;%真实值用第三层细胞激活值表示,如[0,0,0,0,0,0,0,0,0,1]
                            end
                            %J=1/m*sum(sum((-yy.*log(a{3}))-(1-yy).*log(1-a{3})))+lambda/2/m*(sum(sum(Theta1_temp.^2))+sum(sum(Theta2_temp.^2)));
                            %形如logistic regression的cost function,无实际作用
                            cost1=1/m*sum(sum((yy-a{3}).^2));%BP神经网络cost,a3与正确标签差异的平方
                            cost2=lambda/2/m*(sum(sum(Theta1_temp.^2))+sum(sum(Theta2_temp.^2)));%用于限制【非常数】权重的绝对值,避免过大
                            J=cost1+cost2; %BP神经网络中真正的cost function,迭代中无实际作用
                            delta{3}=a{3}-yy;%5000*10,第三层误差
                            delta{2}=(delta{3}*Theta2).*(a{2}.*(1-a{2}));%5000*26,第二层误差
                            tri{2}=zeros(size(Theta2));
                            tri{2}=tri{2}+delta{3}'*a{2};%10*26, theta1的偏导
                            tri{1}=zeros(size(Theta1));
                            tri{1}=tri{1}+delta{2}(:,2:end)'*a{1};%25*401,theta2的偏导
                            Theta1_grad=zeros(size(Theta1));
                            Theta1_grad(:,1)=1/m*tri{1}(:,1);% 常数神经元权重偏导
                            Theta1_grad(:,2:end)=1/m*tri{1}(:,2:end)+lambda/m*Theta1(:,2:end);% 非常数神经元权重偏导
                            Theta2_grad=zeros(size(Theta2));
                            Theta2_grad(:,1)=1/m*tri{2}(:,1);% 常数神经元权重偏导
                            Theta2_grad(:,2:end)=1/m*tri{2}(:,2:end)+lambda/m*Theta2(:,2:end);
                            % Unroll gradients
                            grad = [Theta1_grad(:) ; Theta2_grad(:)];
                            end


                            24楼2014-02-04 19:24
                            收起回复
                              你好,我看了你这个帖子,写的非常好,很多注释把我某些问题都解决了,就是这个完整代码运行只可以测试准确率,但在手写体识别的时候,最终不是要实现给定一个图像特征矩阵,通过这个训练最终把预测结果表示出来吗。代码里的display函数只能把mnsit数据库自动截取一部分图片预测显示出来。但是怎么能人为控制预测,就比如我想预测单幅图片,看看结果对不对怎么实现。用bp神经网络实现手写体识别最终不是要对单个数字进行识别吗?


                              26楼2016-05-20 15:22
                              回复