机器学习——吴恩达第4~5周总结(神经网路)

总结下自己这段时间看的神经网络结构,主要介绍的算法是FP/BP 算法的推导的过程和对课程的总结。

会涉及到,FP/BP算法,正则优化,基础推导。

一、神经网路(Neural Networks)

为什么要用NN:之前介绍的回归和逻辑回归,都有一个缺点,就是特征太多的时候计算负荷大。所以这个时候神经网络出现了。

什么是NN:找出大脑的学习算法,然后在计算机上执行大脑学习算法或与之相似的算法。

NN的结构:每一个神经元都可以被认为是一个处理单元/神经核( processing unit/Nucleus),它含有许多输入/树突( input/Dendrite),并且有一个输出/轴突( output/Axon)。

                                                                           

1、神经网络结构

如下:

 其中x1、x2、x3是输入单元,我们将原始数据输入给他们。a1、a2、a3是中间单元,呈递到下一层。最后是输出单元,负责计算h_{\Theta }\left ( x \right )

2、前向传播算法(FP)

计算过程中,每一层都会添加一个偏差单位(bias unit):

 其中,a^{_{i}^{\left ( j \right )}}代表的是第j层的第i个激活单元。\Theta ^{\left ( j \right )}代表从第j层映射到第j+1层的权重(weight)。

计算上述模型的,激活单元和输出(第二层的计算):

把x,theta,a分别用举证表示,a=theta*X。

计算的过程:

z^{\left ( 2 \right )}=\Theta ^{\left ( 1 \right )}.x%%%%利用权重算出的中间值

a^{\left ( 2 \right )} = g\left ( z^{\left ( 2 \right )} \right )%%%%第二层的值

正向传播算法从左到右一点一点计算出假设函数。

代价函数:

回顾逻辑回归的cost function:

逻辑回归中,只有一个输出变量,一个因变量。而NN中有什么输出变量,代价函数会复杂一些。

解释下代价函数的组成,第一个部分是和逻辑回归一样的,是h函数与真实值之间的距离每个样本,每个类输出相加之和,后面的是正则化后的去掉每一层theta0(bias unit)后的,theta矩阵的和。

3、反向传播算法(BP)

之前我们用FP算法,从第一层计算到第二层,直到最后的h_{\Theta }\left ( x \right )。现在,为了计算代价函数的偏导数,,我们采用一种反向传播算法。

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(:)];

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值